[tarantool-patches] [PATCH 4/5] sql: make built-ins raise errors for varbin args
Nikita Pettik
korablev at tarantool.org
Wed Jul 24 14:42:46 MSK 2019
Since values of type 'varbinary' can't be cast to any other type, let's
patch built-in functions which are not assumed to accept arguments of
this type to raise an error in case argument turn out to be of type
varbinary.
Part of #4206
---
src/box/sql/func.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/box/sql/func.c b/src/box/sql/func.c
index 4ec591eee..5fd1496fd 100644
--- a/src/box/sql/func.c
+++ b/src/box/sql/func.c
@@ -196,9 +196,10 @@ absFunc(sql_context * context, int argc, sql_value ** argv)
sql_result_null(context);
break;
}
- case MP_BOOL: {
+ case MP_BOOL:
+ case MP_BIN: {
diag_set(ClientError, ER_INCONSISTENT_TYPES, "number",
- "boolean");
+ mem_type_to_str(argv[0]));
context->is_aborted = true;
return;
}
@@ -506,6 +507,12 @@ roundFunc(sql_context * context, int argc, sql_value ** argv)
}
if (sql_value_is_null(argv[0]))
return;
+ if (sql_value_type(argv[0]) == MP_BIN) {
+ diag_set(ClientError, ER_SQL_TYPE_MISMATCH,
+ sql_value_text(argv[0]), "numeric");
+ context->is_aborted = true;
+ return;
+ }
r = sql_value_double(argv[0]);
/* If Y==0 and X will fit in a 64-bit int,
* handle the rounding directly,
@@ -560,6 +567,13 @@ case_type##ICUFunc(sql_context *context, int argc, sql_value **argv) \
const char *z2; \
int n; \
UNUSED_PARAMETER(argc); \
+ int arg_type = sql_value_type(argv[0]); \
+ if (arg_type == MP_BIN) { \
+ diag_set(ClientError, ER_INCONSISTENT_TYPES, "TEXT", \
+ "VARBINARY"); \
+ context->is_aborted = true; \
+ return; \
+ } \
z2 = (char *)sql_value_text(argv[0]); \
n = sql_value_bytes(argv[0]); \
/* \
@@ -646,6 +660,12 @@ randomBlob(sql_context * context, int argc, sql_value ** argv)
unsigned char *p;
assert(argc == 1);
UNUSED_PARAMETER(argc);
+ if (sql_value_type(argv[0]) == MP_BIN) {
+ diag_set(ClientError, ER_SQL_TYPE_MISMATCH,
+ sql_value_text(argv[0]), "numeric");
+ context->is_aborted = true;
+ return;
+ }
n = sql_value_int(argv[0]);
if (n < 1)
return;
--
2.15.1
More information about the Tarantool-patches
mailing list