From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id BA24122A51 for ; Fri, 28 Dec 2018 04:34:59 -0500 (EST) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Ts5Hicka4FMd for ; Fri, 28 Dec 2018 04:34:59 -0500 (EST) Received: from smtp40.i.mail.ru (smtp40.i.mail.ru [94.100.177.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 0DE5F22A83 for ; Fri, 28 Dec 2018 04:34:59 -0500 (EST) From: Nikita Pettik Subject: [tarantool-patches] [PATCH 4/8] sql: replace affinity with field type for func Date: Fri, 28 Dec 2018 11:34:48 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: tarantool-patches@freelists.org Cc: v.shpilevoy@tarantool.org, Nikita Pettik Lets use field_type instead of affinity as a type of return value of user function registered in SQL. Part of #3698 --- src/box/lua/lua_sql.c | 12 +++---- src/box/sql/date.c | 17 ++++----- src/box/sql/expr.c | 7 ++-- src/box/sql/func.c | 91 +++++++++++++++++++++++-------------------------- src/box/sql/main.c | 4 +-- src/box/sql/sqliteInt.h | 6 ++-- 6 files changed, 67 insertions(+), 70 deletions(-) diff --git a/src/box/lua/lua_sql.c b/src/box/lua/lua_sql.c index ab0b7f37c..386da43df 100644 --- a/src/box/lua/lua_sql.c +++ b/src/box/lua/lua_sql.c @@ -149,18 +149,18 @@ lbox_sql_create_function(struct lua_State *L) lua_isfunction(L, 3) && lua_isnumber(L, 4) && lua_isboolean(L, 5))) return luaL_error(L, "Invalid arguments"); - enum affinity_type type = AFFINITY_UNDEFINED; + enum field_type type; const char *type_arg = lua_tostring(L, 2); if (strcmp(type_arg, "INT") == 0 || strcmp(type_arg, "INTEGER") == 0) - type = AFFINITY_INTEGER; + type = FIELD_TYPE_INTEGER; else if (strcmp(type_arg, "TEXT") == 0) - type = AFFINITY_TEXT; + type = FIELD_TYPE_STRING; else if (strcmp(type_arg, "FLOAT") == 0) - type = AFFINITY_REAL; + type = FIELD_TYPE_NUMBER; else if (strcmp(type_arg, "NUM") == 0) - type = AFFINITY_REAL; + type = FIELD_TYPE_NUMBER; else if (strcmp(type_arg, "BLOB") == 0) - type = AFFINITY_BLOB; + type = FIELD_TYPE_SCALAR; else return luaL_error(L, "Unknown type"); /* -1 indicates any number of arguments. */ diff --git a/src/box/sql/date.c b/src/box/sql/date.c index 8a3588355..e452aad73 100644 --- a/src/box/sql/date.c +++ b/src/box/sql/date.c @@ -1306,14 +1306,15 @@ sqlite3RegisterDateTimeFunctions(void) { static FuncDef aDateTimeFuncs[] = { #ifndef SQLITE_OMIT_DATETIME_FUNCS - DFUNCTION(julianday, -1, 0, 0, juliandayFunc, AFFINITY_REAL), - DFUNCTION(date, -1, 0, 0, dateFunc, AFFINITY_REAL), - DFUNCTION(time, -1, 0, 0, timeFunc, AFFINITY_REAL), - DFUNCTION(datetime, -1, 0, 0, datetimeFunc, AFFINITY_REAL), - DFUNCTION(strftime, -1, 0, 0, strftimeFunc, AFFINITY_REAL), - DFUNCTION(current_time, 0, 0, 0, ctimeFunc, AFFINITY_REAL), - DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc, AFFINITY_REAL), - DFUNCTION(current_date, 0, 0, 0, cdateFunc, AFFINITY_REAL), + DFUNCTION(julianday, -1, 0, 0, juliandayFunc, FIELD_TYPE_NUMBER), + DFUNCTION(date, -1, 0, 0, dateFunc, FIELD_TYPE_NUMBER), + DFUNCTION(time, -1, 0, 0, timeFunc, FIELD_TYPE_NUMBER), + DFUNCTION(datetime, -1, 0, 0, datetimeFunc, FIELD_TYPE_NUMBER), + DFUNCTION(strftime, -1, 0, 0, strftimeFunc, FIELD_TYPE_NUMBER), + DFUNCTION(current_time, 0, 0, 0, ctimeFunc, FIELD_TYPE_NUMBER), + DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc, + FIELD_TYPE_NUMBER), + DFUNCTION(current_date, 0, 0, 0, cdateFunc, FIELD_TYPE_NUMBER), #else STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc), STR_FUNCTION(current_date, 0, "%Y-%m-%d", 0, currentTimeFunc), diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index 7a0b929a7..917e6e30b 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -3959,7 +3959,9 @@ sqlite3ExprCodeTarget(Parse * pParse, Expr * pExpr, int target) "misuse of aggregate: %s()", pExpr->u.zToken); } else { - pExpr->affinity = pInfo->aFunc->pFunc->ret_type; + enum field_type t = + pInfo->aFunc->pFunc->ret_type; + pExpr->affinity = sql_field_type_to_affinity(t); return pInfo->aFunc[pExpr->iAgg].iMem; } break; @@ -3997,7 +3999,8 @@ sqlite3ExprCodeTarget(Parse * pParse, Expr * pExpr, int target) } if (pDef->ret_type != AFFINITY_UNDEFINED) { - pExpr->affinity = pDef->ret_type; + pExpr->affinity = + sql_field_type_to_affinity(pDef->ret_type); } else { /* * Otherwise, use first arg as diff --git a/src/box/sql/func.c b/src/box/sql/func.c index 9667aead5..7a2d3a77d 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -1590,7 +1590,7 @@ groupConcatFinalize(sqlite3_context * context) */ static inline int sqlite3_overload_function(sqlite3 * db, const char *zName, - enum affinity_type type, int nArg) + enum field_type type, int nArg) { int rc = SQLITE_OK; @@ -1615,7 +1615,7 @@ sqlite3_overload_function(sqlite3 * db, const char *zName, void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 * db) { - int rc = sqlite3_overload_function(db, "MATCH", AFFINITY_UNDEFINED, 2); + int rc = sqlite3_overload_function(db, "MATCH", FIELD_TYPE_ANY, 2); assert(rc == SQLITE_NOMEM || rc == SQLITE_OK); if (rc == SQLITE_NOMEM) { sqlite3OomFault(db); @@ -1647,9 +1647,9 @@ sqlite3RegisterLikeFunctions(sqlite3 *db, int is_case_insensitive) * supplied pattern and FALSE otherwise. */ int *is_like_ci = SQLITE_INT_TO_PTR(is_case_insensitive); - sqlite3CreateFunc(db, "LIKE", AFFINITY_INTEGER, 2, 0, + sqlite3CreateFunc(db, "LIKE", FIELD_TYPE_INTEGER, 2, 0, is_like_ci, likeFunc, 0, 0, 0); - sqlite3CreateFunc(db, "LIKE", AFFINITY_INTEGER, 3, 0, + sqlite3CreateFunc(db, "LIKE", FIELD_TYPE_INTEGER, 3, 0, is_like_ci, likeFunc, 0, 0, 0); setLikeOptFlag(db, "LIKE", !(is_case_insensitive) ? (SQLITE_FUNC_LIKE | @@ -1704,17 +1704,17 @@ sqlite3RegisterBuiltinFunctions(void) FUNCTION(soundex, 1, 0, 0, soundexFunc), #endif FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY, - AFFINITY_INTEGER), + FIELD_TYPE_INTEGER), FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY, - AFFINITY_INTEGER), + FIELD_TYPE_INTEGER), FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY, - AFFINITY_INTEGER), - FUNCTION(ltrim, 1, 1, 0, trimFunc, AFFINITY_TEXT), - FUNCTION(ltrim, 2, 1, 0, trimFunc, AFFINITY_TEXT), - FUNCTION(rtrim, 1, 2, 0, trimFunc, AFFINITY_TEXT), - FUNCTION(rtrim, 2, 2, 0, trimFunc, AFFINITY_TEXT), - FUNCTION(trim, 1, 3, 0, trimFunc, AFFINITY_TEXT), - FUNCTION(trim, 2, 3, 0, trimFunc, AFFINITY_TEXT), + FIELD_TYPE_INTEGER), + FUNCTION(ltrim, 1, 1, 0, trimFunc, FIELD_TYPE_STRING), + FUNCTION(ltrim, 2, 1, 0, trimFunc, FIELD_TYPE_STRING), + FUNCTION(rtrim, 1, 2, 0, trimFunc, FIELD_TYPE_STRING), + FUNCTION(rtrim, 2, 2, 0, trimFunc, FIELD_TYPE_STRING), + FUNCTION(trim, 1, 3, 0, trimFunc, FIELD_TYPE_STRING), + FUNCTION(trim, 2, 3, 0, trimFunc, FIELD_TYPE_STRING), FUNCTION(min, -1, 0, 1, minmaxFunc, 0), FUNCTION(min, 0, 0, 1, 0, 0), AGGREGATE2(min, 1, 0, 1, minmaxStep, minMaxFinalize, @@ -1724,56 +1724,49 @@ sqlite3RegisterBuiltinFunctions(void) AGGREGATE2(max, 1, 1, 1, minmaxStep, minMaxFinalize, SQLITE_FUNC_MINMAX, 0), FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF, - AFFINITY_TEXT), + FIELD_TYPE_STRING), FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH, - AFFINITY_INTEGER), - FUNCTION(instr, 2, 0, 0, instrFunc, AFFINITY_INTEGER), - FUNCTION(printf, -1, 0, 0, printfFunc, AFFINITY_TEXT), - FUNCTION(unicode, 1, 0, 0, unicodeFunc, AFFINITY_TEXT), - FUNCTION(char, -1, 0, 0, charFunc, AFFINITY_TEXT), - FUNCTION(abs, 1, 0, 0, absFunc, AFFINITY_REAL), + FIELD_TYPE_INTEGER), + FUNCTION(instr, 2, 0, 0, instrFunc, FIELD_TYPE_INTEGER), + FUNCTION(printf, -1, 0, 0, printfFunc, FIELD_TYPE_STRING), + FUNCTION(unicode, 1, 0, 0, unicodeFunc, FIELD_TYPE_STRING), + FUNCTION(char, -1, 0, 0, charFunc, FIELD_TYPE_STRING), + FUNCTION(abs, 1, 0, 0, absFunc, FIELD_TYPE_NUMBER), #ifndef SQLITE_OMIT_FLOATING_POINT - FUNCTION(round, 1, 0, 0, roundFunc, AFFINITY_INTEGER), - FUNCTION(round, 2, 0, 0, roundFunc, AFFINITY_INTEGER), + FUNCTION(round, 1, 0, 0, roundFunc, FIELD_TYPE_INTEGER), + FUNCTION(round, 2, 0, 0, roundFunc, FIELD_TYPE_INTEGER), #endif - FUNCTION(upper, 1, 0, 1, UpperICUFunc, AFFINITY_TEXT), - FUNCTION(lower, 1, 0, 1, LowerICUFunc, AFFINITY_TEXT), - FUNCTION(hex, 1, 0, 0, hexFunc, AFFINITY_TEXT), + FUNCTION(upper, 1, 0, 1, UpperICUFunc, FIELD_TYPE_STRING), + FUNCTION(lower, 1, 0, 1, LowerICUFunc, FIELD_TYPE_STRING), + FUNCTION(hex, 1, 0, 0, hexFunc, FIELD_TYPE_STRING), FUNCTION2(ifnull, 2, 0, 0, noopFunc, SQLITE_FUNC_COALESCE, - AFFINITY_INTEGER), - VFUNCTION(random, 0, 0, 0, randomFunc, AFFINITY_REAL), - VFUNCTION(randomblob, 1, 0, 0, randomBlob, AFFINITY_BLOB), + FIELD_TYPE_INTEGER), + VFUNCTION(random, 0, 0, 0, randomFunc, FIELD_TYPE_NUMBER), + VFUNCTION(randomblob, 1, 0, 0, randomBlob, FIELD_TYPE_SCALAR), FUNCTION(nullif, 2, 0, 1, nullifFunc, 0), - FUNCTION(version, 0, 0, 0, sql_func_version, AFFINITY_TEXT), - FUNCTION(quote, 1, 0, 0, quoteFunc, AFFINITY_TEXT), - VFUNCTION(row_count, 0, 0, 0, sql_row_count, AFFINITY_INTEGER), - FUNCTION(replace, 3, 0, 0, replaceFunc, AFFINITY_TEXT), - FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc, AFFINITY_BLOB), - FUNCTION(substr, 2, 0, 0, substrFunc, AFFINITY_TEXT), - FUNCTION(substr, 3, 0, 0, substrFunc, AFFINITY_TEXT), + FUNCTION(version, 0, 0, 0, sql_func_version, FIELD_TYPE_STRING), + FUNCTION(quote, 1, 0, 0, quoteFunc, FIELD_TYPE_STRING), + VFUNCTION(row_count, 0, 0, 0, sql_row_count, FIELD_TYPE_INTEGER), + FUNCTION(replace, 3, 0, 0, replaceFunc, FIELD_TYPE_STRING), + FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc, FIELD_TYPE_SCALAR), + FUNCTION(substr, 2, 0, 0, substrFunc, FIELD_TYPE_STRING), + FUNCTION(substr, 3, 0, 0, substrFunc, FIELD_TYPE_STRING), AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize, 0), AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize, 0), AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize, 0), AGGREGATE2(count, 0, 0, 0, countStep, countFinalize, - SQLITE_FUNC_COUNT, AFFINITY_INTEGER), + SQLITE_FUNC_COUNT, FIELD_TYPE_INTEGER), AGGREGATE(count, 1, 0, 0, countStep, countFinalize, - AFFINITY_INTEGER), + FIELD_TYPE_INTEGER), AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, - groupConcatFinalize, AFFINITY_TEXT), + groupConcatFinalize, FIELD_TYPE_STRING), AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, - groupConcatFinalize, AFFINITY_TEXT), - -#ifdef SQLITE_CASE_SENSITIVE_LIKE - LIKEFUNC(like, 2, 0,SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE, - AFFINITY_INTEGER), - LIKEFUNC(like, 3, 0,SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE, - AFFINITY_INTEGER), -#else + groupConcatFinalize, FIELD_TYPE_STRING), + LIKEFUNC(like, 2, 1, SQLITE_FUNC_LIKE, - AFFINITY_INTEGER), + FIELD_TYPE_INTEGER), LIKEFUNC(like, 3, 1, SQLITE_FUNC_LIKE, - AFFINITY_INTEGER), -#endif + FIELD_TYPE_INTEGER), #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION FUNCTION(unknown, -1, 0, 0, unknownFunc, 0), #endif diff --git a/src/box/sql/main.c b/src/box/sql/main.c index 8574d6464..c009b9c63 100644 --- a/src/box/sql/main.c +++ b/src/box/sql/main.c @@ -750,7 +750,7 @@ sqlite3_interrupt(sqlite3 * db) int sqlite3CreateFunc(sqlite3 * db, const char *zFunctionName, - enum affinity_type type, + enum field_type type, int nArg, int flags, void *pUserData, @@ -820,7 +820,7 @@ sqlite3CreateFunc(sqlite3 * db, int sqlite3_create_function_v2(sqlite3 * db, const char *zFunc, - enum affinity_type type, + enum field_type type, int nArg, int flags, void *p, diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h index e2d630929..2a7223fff 100644 --- a/src/box/sql/sqliteInt.h +++ b/src/box/sql/sqliteInt.h @@ -732,7 +732,7 @@ sqlite3_memory_used(void); int sqlite3_create_function_v2(sqlite3 * db, const char *zFunctionName, - enum affinity_type type, + enum field_type type, int nArg, int flags, void *pApp, @@ -1660,7 +1660,7 @@ struct FuncDef { FuncDestructor *pDestructor; /* Reference counted destructor function */ } u; /* Return type. */ - enum affinity_type ret_type; + enum field_type ret_type; }; /* @@ -4569,7 +4569,7 @@ void sqlite3RegisterLikeFunctions(sqlite3 *, int); int sql_is_like_func(struct sqlite3 *db, struct Expr *expr, int *is_like_ci); -int sqlite3CreateFunc(sqlite3 *, const char *, enum affinity_type, +int sqlite3CreateFunc(sqlite3 *, const char *, enum field_type, int, int, void *, void (*)(sqlite3_context *, int, sqlite3_value **), void (*)(sqlite3_context *, int, sqlite3_value **), -- 2.15.1