diff --git a/src/box/sql/func.c b/src/box/sql/func.c index 94302cc56b0c3a437bd97300f031ae606aeb988e..90e8e152fb549eb71ae0ed31c8b8c6c768307ee7 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -553,7 +553,7 @@ roundFunc(sql_context * context, int argc, sql_value ** argv) } if (mem_is_null(argv[0])) return; - if (mem_is_bin(argv[0])) { + if (!mem_is_num(argv[0]) && !mem_is_str(argv[0])) { diag_set(ClientError, ER_SQL_TYPE_MISMATCH, mem_str(argv[0]), "numeric"); context->is_aborted = true; @@ -613,7 +613,8 @@ case_type##ICUFunc(sql_context *context, int argc, sql_value **argv) \ const char *z2; \ int n; \ UNUSED_PARAMETER(argc); \ - if (mem_is_bin(argv[0])) { \ + if (mem_is_bin(argv[0]) || mem_is_map(argv[0]) || \ + mem_is_array(argv[0])) { \ diag_set(ClientError, ER_INCONSISTENT_TYPES, "text", \ "varbinary"); \ context->is_aborted = true; \ @@ -694,7 +695,8 @@ randomBlob(sql_context * context, int argc, sql_value ** argv) unsigned char *p; assert(argc == 1); UNUSED_PARAMETER(argc); - if (mem_is_bin(argv[0])) { + if (mem_is_bin(argv[0]) || mem_is_map(argv[0]) || + mem_is_array(argv[0])) { diag_set(ClientError, ER_SQL_TYPE_MISMATCH, mem_str(argv[0]), "numeric"); context->is_aborted = true; @@ -1584,7 +1586,8 @@ soundexFunc(sql_context * context, int argc, sql_value ** argv) 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, }; assert(argc == 1); - if (mem_is_bin(argv[0])) { + if (mem_is_bin(argv[0]) || mem_is_map(argv[0]) || + mem_is_array(argv[0])) { diag_set(ClientError, ER_SQL_TYPE_MISMATCH, mem_str(argv[0]), "text"); context->is_aborted = true; diff --git a/src/box/sql/mem.h b/src/box/sql/mem.h index 1db7f4debe41d0a1138a2c80644ae01f5f92ab0e..526b6bf3e7237cc19d33f698a1f01ddd8b16b4b4 100644 --- a/src/box/sql/mem.h +++ b/src/box/sql/mem.h @@ -184,7 +184,7 @@ mem_is_bool(const struct Mem *mem) static inline bool mem_is_bin(const struct Mem *mem) { - return (mem->flags & MEM_Blob) != 0; + return (mem->flags & MEM_Blob) != 0 && (mem->flags & MEM_Subtype) == 0; } static inline bool diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index 2308587e75efc1473ce43057bd4aa4dfa8b4e007..12ec703a220e237a1bb105da9864ee6644f0f773 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -1643,6 +1643,11 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ "varbinary"); goto abort_due_to_error; } + } else if (mem_is_map(pIn3) || mem_is_map(pIn1) || mem_is_array(pIn3) || + mem_is_array(pIn1)) { + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, + mem_type_to_str(pIn3), mem_type_to_str(pIn1)); + goto abort_due_to_error; } else if (type == FIELD_TYPE_STRING) { if (mem_cmp_str(pIn3, pIn1, &res, pOp->p4.pColl) != 0) { const char *str =