[tarantool-patches] [PATCH 4/8] sql: replace affinity with field type for func
Nikita Pettik
korablev at tarantool.org
Fri Dec 28 12:34:48 MSK 2018
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
More information about the Tarantool-patches
mailing list