From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng3.m.smailru.net (smtpng3.m.smailru.net [94.100.177.149]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 0AF50430410 for ; Wed, 12 Aug 2020 18:15:55 +0300 (MSK) From: imeevma@tarantool.org Date: Wed, 12 Aug 2020 18:15:53 +0300 Message-Id: <4441a1221dfa0c5b3c04b14fb0bbf1f019eaa9c3.1597244875.git.imeevma@gmail.com> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v1 6/7] sql: VARBINARY and STRING in built-in functions List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: v.shpilevoy@tarantool.org Cc: tarantool-patches@dev.tarantool.org This patch forces SQL built-in functions to accept VARBINARY arguments and treat them as STRING arguments if they were given in place of STRING arguments. Closes #4159 --- src/box/sql/func.c | 89 +- test/sql-tap/cse.test.lua | 4 +- test/sql-tap/func.test.lua | 14 +- test/sql-tap/orderby1.test.lua | 2 +- test/sql-tap/position.test.lua | 6 +- test/sql/boolean.result | 30 +- test/sql/types.result | 1471 +++++++++++++++++++++++++++++++- test/sql/types.test.lua | 244 ++++++ 8 files changed, 1758 insertions(+), 102 deletions(-) diff --git a/src/box/sql/func.c b/src/box/sql/func.c index 91755380d..694bd0e83 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -463,34 +463,23 @@ typeofFunc(sql_context * context, int NotUsed, sql_value ** argv) static void lengthFunc(sql_context * context, int argc, sql_value ** argv) { - int len; - assert(argc == 1); UNUSED_PARAMETER(argc); - switch (sql_value_type(argv[0])) { - case MP_BIN: - case MP_ARRAY: - case MP_MAP: - case MP_INT: - case MP_UINT: - case MP_BOOL: - case MP_DOUBLE:{ - sql_result_uint(context, sql_value_bytes(argv[0])); - break; - } - case MP_STR:{ - const unsigned char *z = sql_value_text(argv[0]); - if (z == 0) - return; - len = sql_utf8_char_count(z, sql_value_bytes(argv[0])); - sql_result_uint(context, len); - break; - } - default:{ - sql_result_null(context); - break; - } + if (sql_value_type(argv[0]) == MP_NIL) + return sql_result_null(context); + if (sql_value_type(argv[0]) == MP_BIN) + return sql_result_uint(context, sql_value_bytes(argv[0])); + if (sql_value_type(argv[0]) != MP_STR) { + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, + sql_value_to_diag_str(argv[0]), "string or varbinary"); + context->is_aborted = true; + return; } + const unsigned char *str = sql_value_text(argv[0]); + if (str == NULL) + return sql_result_null(context); + int len = sql_utf8_char_count(str, sql_value_bytes(argv[0])); + return sql_result_uint(context, len); } /* @@ -576,9 +565,9 @@ position_func(struct sql_context *context, int argc, struct Mem **argv) if (haystack_type != MP_STR && haystack_type != MP_BIN) inconsistent_type_arg = haystack; if (inconsistent_type_arg != NULL) { - diag_set(ClientError, ER_INCONSISTENT_TYPES, - "text or varbinary", - mem_type_to_str(inconsistent_type_arg)); + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, + sql_value_to_diag_str(inconsistent_type_arg), + "string or varbinary"); context->is_aborted = true; return; } @@ -748,13 +737,20 @@ substrFunc(sql_context * context, int argc, sql_value ** argv) if (z == 0) return; assert(len == sql_value_bytes(argv[0])); - } else { + } else if (p0type == MP_NIL) { + return sql_result_null(context); + } else if (p0type == MP_STR) { z = sql_value_text(argv[0]); if (z == 0) return; len = 0; if (p1 < 0) len = sql_utf8_char_count(z, sql_value_bytes(argv[0])); + } else { + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, + sql_value_to_diag_str(argv[0]), "string or varbinary"); + context->is_aborted = true; + return; } if (argc == 3) { p2 = sql_value_int(argv[2]); @@ -906,10 +902,15 @@ 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 (mp_type_is_bloblike(arg_type)) { \ - diag_set(ClientError, ER_INCONSISTENT_TYPES, "text", \ - "varbinary"); \ + enum mp_type type = sql_value_type(argv[0]); \ + if (type == MP_NIL) \ + return sql_result_null(context); \ + if (type == MP_BIN) \ + return sql_result_value(context, argv[0]); \ + if (type != MP_STR) { \ + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, \ + sql_value_to_diag_str(argv[0]), \ + "string or varbinary"); \ context->is_aborted = true; \ return; \ } \ @@ -1452,6 +1453,13 @@ quoteFunc(sql_context * context, int argc, sql_value ** argv) static void unicodeFunc(sql_context * context, int argc, sql_value ** argv) { + enum mp_type type = sql_value_type(argv[0]); + if (type != MP_NIL && type != MP_STR && type != MP_BIN) { + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, + sql_value_to_diag_str(argv[0]), "string or varbinary"); + context->is_aborted = true; + return; + } const unsigned char *z = sql_value_text(argv[0]); (void)argc; if (z && z[0]) @@ -1568,6 +1576,17 @@ replaceFunc(sql_context * context, int argc, sql_value ** argv) int loopLimit; /* Last zStr[] that might match zPattern[] */ int i, j; /* Loop counters */ + for (int i = 0; i < 3; ++i) { + enum mp_type type = sql_value_type(argv[i]); + if (type != MP_NIL && type != MP_STR && type != MP_BIN) { + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, + sql_value_to_diag_str(argv[i]), + "string or varbinary"); + context->is_aborted = true; + return; + } + } + assert(argc == 3); UNUSED_PARAMETER(argc); zStr = sql_value_text(argv[0]); @@ -1880,9 +1899,9 @@ soundexFunc(sql_context * context, int argc, sql_value ** argv) }; assert(argc == 1); enum mp_type mp_type = sql_value_type(argv[0]); - if (mp_type_is_bloblike(mp_type)) { + if (mp_type != MP_NIL && mp_type != MP_STR && mp_type != MP_BIN) { diag_set(ClientError, ER_SQL_TYPE_MISMATCH, - sql_value_to_diag_str(argv[0]), "text"); + sql_value_to_diag_str(argv[0]), "string or varbinary"); context->is_aborted = true; return; } diff --git a/test/sql-tap/cse.test.lua b/test/sql-tap/cse.test.lua index 341b6de01..cfb642cfe 100755 --- a/test/sql-tap/cse.test.lua +++ b/test/sql-tap/cse.test.lua @@ -198,7 +198,7 @@ test:do_execsql_test( test:do_execsql_test( "cse-1.13", [[ - SELECT upper(b), typeof(b), b FROM t1 + SELECT upper(CAST(b AS STRING)), typeof(b), b FROM t1 ]], { -- "11", "integer", 11, "21", "integer", 21 @@ -208,7 +208,7 @@ test:do_execsql_test( test:do_execsql_test( "cse-1.14", [[ - SELECT b, typeof(b), upper(b), typeof(b), b FROM t1 + SELECT b, typeof(b), upper(CAST(b AS STRING)), typeof(b), b FROM t1 ]], { -- 11, "integer", "11", "integer", 11, 21, "integer", "21", "integer", 21 diff --git a/test/sql-tap/func.test.lua b/test/sql-tap/func.test.lua index 82cf350ea..29d6e422c 100755 --- a/test/sql-tap/func.test.lua +++ b/test/sql-tap/func.test.lua @@ -95,7 +95,7 @@ test:do_execsql_test( test:do_execsql_test( "func-1.4", [[ - SELECT coalesce(length(a),-1) FROM t2 + SELECT coalesce(length(CAST(a AS STRING)),-1) FROM t2 ]], { -- 1, -1, 3, -1, 5 @@ -197,7 +197,7 @@ test:do_execsql_test( test:do_execsql_test( "func-2.9", [[ - SELECT substr(a,1,1) FROM t2 + SELECT substr(CAST(a AS STRING),1,1) FROM t2 ]], { -- "1", "", "3", "", "6" @@ -207,7 +207,7 @@ test:do_execsql_test( test:do_execsql_test( "func-2.10", [[ - SELECT substr(a,2,2) FROM t2 + SELECT substr(CAST(a AS STRING),2,2) FROM t2 ]], { -- "", "", "45", "", "78" @@ -763,7 +763,7 @@ test:do_execsql_test( test:do_execsql_test( "func-5.3", [[ - SELECT upper(a), lower(a) FROM t2 + SELECT upper(CAST(a AS STRING)), lower(CAST(a AS STRING)) FROM t2 ]], { -- "1","1","","","345","345","","","67890","67890" @@ -797,7 +797,7 @@ test:do_execsql_test( test:do_execsql_test( "func-6.2", [[ - SELECT coalesce(upper(a),'nil') FROM t2 + SELECT coalesce(upper(CAST(a AS STRING)),'nil') FROM t2 ]], { -- "1","nil","345","nil","67890" @@ -2932,13 +2932,13 @@ test:do_catchsql_test( -- }) -test:do_catchsql_test( +test:do_execsql_test( "func-76.3", [[ SELECT SOUNDEX(X'FF') ]], { -- - 1, "Type mismatch: can not convert varbinary to text" + "?000" -- }) diff --git a/test/sql-tap/orderby1.test.lua b/test/sql-tap/orderby1.test.lua index 51e8d301f..95a8de487 100755 --- a/test/sql-tap/orderby1.test.lua +++ b/test/sql-tap/orderby1.test.lua @@ -735,7 +735,7 @@ test:do_execsql_test( SELECT ( SELECT 'hardware' FROM ( SELECT 'software' ORDER BY 'firmware' ASC, 'sportswear' DESC - ) GROUP BY 1 HAVING length(b) <> 0 + ) GROUP BY 1 HAVING length(CAST(b AS STRING)) <> 0 ) FROM abc; ]], { diff --git a/test/sql-tap/position.test.lua b/test/sql-tap/position.test.lua index e0455abc9..a84e11cd0 100755 --- a/test/sql-tap/position.test.lua +++ b/test/sql-tap/position.test.lua @@ -228,7 +228,7 @@ test:do_test( return test:catchsql "SELECT position(34, 12345);" end, { -- - 1, "Inconsistent types: expected text or varbinary got unsigned" + 1, "Type mismatch: can not convert 12345 to string or varbinary" -- }) @@ -238,7 +238,7 @@ test:do_test( return test:catchsql "SELECT position(34, 123456.78);" end, { -- - 1, "Inconsistent types: expected text or varbinary got real" + 1, "Type mismatch: can not convert 123456.78 to string or varbinary" -- }) @@ -248,7 +248,7 @@ test:do_test( return test:catchsql "SELECT position(x'3334', 123456.78);" end, { -- - 1, "Inconsistent types: expected text or varbinary got real" + 1, "Type mismatch: can not convert 123456.78 to string or varbinary" -- }) diff --git a/test/sql/boolean.result b/test/sql/boolean.result index d366aca7d..743183f7d 100644 --- a/test/sql/boolean.result +++ b/test/sql/boolean.result @@ -280,25 +280,13 @@ SELECT abs(a) FROM t0; | ... SELECT lower(a) FROM t0; | --- - | - metadata: - | - name: COLUMN_1 - | type: string - | rows: - | - ['false'] - | - ['true'] - | - [null] - | - [null] + | - null + | - 'Type mismatch: can not convert FALSE to string or varbinary' | ... SELECT upper(a) FROM t0; | --- - | - metadata: - | - name: COLUMN_1 - | type: string - | rows: - | - ['FALSE'] - | - ['TRUE'] - | - [null] - | - [null] + | - null + | - 'Type mismatch: can not convert FALSE to string or varbinary' | ... SELECT quote(a) FROM t0; | --- @@ -314,14 +302,8 @@ SELECT quote(a) FROM t0; -- gh-4462: LENGTH didn't take BOOLEAN arguments. SELECT length(a) FROM t0; | --- - | - metadata: - | - name: COLUMN_1 - | type: integer - | rows: - | - [5] - | - [4] - | - [null] - | - [null] + | - null + | - 'Type mismatch: can not convert FALSE to string or varbinary' | ... SELECT typeof(a) FROM t0; | --- diff --git a/test/sql/types.result b/test/sql/types.result index 82a82117b..c3eb4e27d 100644 --- a/test/sql/types.result +++ b/test/sql/types.result @@ -830,19 +830,13 @@ box.execute("DELETE FROM t WHERE i < 18446744073709551613;") ... box.execute("SELECT lower(i) FROM t;") --- -- metadata: - - name: COLUMN_1 - type: string - rows: - - ['18446744073709551613'] +- null +- 'Type mismatch: can not convert 18446744073709551613 to string or varbinary' ... box.execute("SELECT upper(i) FROM t;") --- -- metadata: - - name: COLUMN_1 - type: string - rows: - - ['18446744073709551613'] +- null +- 'Type mismatch: can not convert 18446744073709551613 to string or varbinary' ... box.execute("SELECT abs(i) FROM t;") --- @@ -1311,13 +1305,19 @@ box.execute("SELECT group_concat(v) FROM t;") ... box.execute("SELECT lower(v) FROM t;") --- -- null -- 'Inconsistent types: expected text got varbinary' +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['abc'] ... box.execute("SELECT upper(v) FROM t;") --- -- null -- 'Inconsistent types: expected text got varbinary' +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['abc'] ... box.execute("SELECT abs(v) FROM t;") --- @@ -1879,25 +1879,13 @@ box.execute("SELECT group_concat(d) FROM t;") ... box.execute("SELECT lower(d) FROM t;") --- -- metadata: - - name: COLUMN_1 - type: string - rows: - - ['10.0'] - - ['-2.0'] - - ['3.3'] - - ['1.8e+19'] +- null +- 'Type mismatch: can not convert 10.0 to string or varbinary' ... box.execute("SELECT upper(d) FROM t;") --- -- metadata: - - name: COLUMN_1 - type: string - rows: - - ['10.0'] - - ['-2.0'] - - ['3.3'] - - ['1.8E+19'] +- null +- 'Type mismatch: can not convert 10.0 to string or varbinary' ... box.execute("SELECT abs(d) FROM t;") --- @@ -2807,3 +2795,1426 @@ box.execute([[SELECT typeof(length('abc'));]]) rows: - ['integer'] ... +-- Make sure the function argument types are checked. +box.execute([[SELECT abs(-1);]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1] +... +box.execute([[SELECT abs(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1] +... +box.execute([[SELECT abs(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1.5] +... +box.execute([[SELECT abs(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to number' +... +box.execute([[SELECT abs('a');]]) +--- +- null +- 'Type mismatch: can not convert a to number' +... +box.execute([[SELECT abs(X'33');]]) +--- +- null +- 'Type mismatch: can not convert varbinary to number' +... +box.execute([[SELECT char(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to unsigned' +... +box.execute([[SELECT char(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ["\x01"] +... +box.execute([[SELECT char(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ["\x01"] +... +box.execute([[SELECT char(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to unsigned' +... +box.execute([[SELECT char('a');]]) +--- +- null +- 'Type mismatch: can not convert a to unsigned' +... +box.execute([[SELECT char(X'33');]]) +--- +- null +- 'Type mismatch: can not convert varbinary to unsigned' +... +box.execute([[SELECT character_length(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT character_length(1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT character_length(1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT character_length(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT character_length('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT character_length(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT char_length(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT char_length(1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT char_length(1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT char_length(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT char_length('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT char_length(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT coalesce(-1, -1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [-1] +... +box.execute([[SELECT coalesce(1, 1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1] +... +box.execute([[SELECT coalesce(1.5, 1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1.5] +... +box.execute([[SELECT coalesce(true, true);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [true] +... +box.execute([[SELECT coalesce('a', 'a');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['a'] +... +box.execute([[SELECT coalesce(X'33', X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['3'] +... +box.execute([[SELECT greatest(-1, -1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [-1] +... +box.execute([[SELECT greatest(1, 1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1] +... +box.execute([[SELECT greatest(1.5, 1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1.5] +... +box.execute([[SELECT greatest(true, true);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [true] +... +box.execute([[SELECT greatest('a', 'a');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['a'] +... +box.execute([[SELECT greatest(X'33', X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['3'] +... +box.execute([[SELECT hex(-1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['2D31'] +... +box.execute([[SELECT hex(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['31'] +... +box.execute([[SELECT hex(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['312E35'] +... +box.execute([[SELECT hex(true);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['54525545'] +... +box.execute([[SELECT hex('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['61'] +... +box.execute([[SELECT hex(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['33'] +... +box.execute([[SELECT ifnull(-1, -1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [-1] +... +box.execute([[SELECT ifnull(1, 1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1] +... +box.execute([[SELECT ifnull(1.5, 1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1.5] +... +box.execute([[SELECT ifnull(true, true);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [true] +... +box.execute([[SELECT ifnull('a', 'a');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['a'] +... +box.execute([[SELECT ifnull(X'33', X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['3'] +... +box.execute([[SELECT least(-1, -1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [-1] +... +box.execute([[SELECT least(1, 1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1] +... +box.execute([[SELECT least(1.5, 1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1.5] +... +box.execute([[SELECT least(true, true);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [true] +... +box.execute([[SELECT least('a', 'a');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['a'] +... +box.execute([[SELECT least(X'33', X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['3'] +... +box.execute([[SELECT length(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT length(1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT length(1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT length(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT length('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT length(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT likelihood(-1, -1);]]) +--- +- null +- Illegal parameters, second argument to likelihood() must be a constant between 0.0 + and 1.0 +... +box.execute([[SELECT likelihood(1, 1);]]) +--- +- null +- Illegal parameters, second argument to likelihood() must be a constant between 0.0 + and 1.0 +... +box.execute([[SELECT likelihood(1.5, 1.5);]]) +--- +- null +- Illegal parameters, second argument to likelihood() must be a constant between 0.0 + and 1.0 +... +box.execute([[SELECT likelihood(true, true);]]) +--- +- null +- Illegal parameters, second argument to likelihood() must be a constant between 0.0 + and 1.0 +... +box.execute([[SELECT likelihood('a', 'a');]]) +--- +- null +- Illegal parameters, second argument to likelihood() must be a constant between 0.0 + and 1.0 +... +box.execute([[SELECT likelihood(X'33', X'33');]]) +--- +- null +- Illegal parameters, second argument to likelihood() must be a constant between 0.0 + and 1.0 +... +box.execute([[SELECT likely(-1);]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [-1] +... +box.execute([[SELECT likely(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT likely(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: double + rows: + - [1.5] +... +box.execute([[SELECT likely(true);]]) +--- +- metadata: + - name: COLUMN_1 + type: boolean + rows: + - [true] +... +box.execute([[SELECT likely('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['a'] +... +box.execute([[SELECT likely(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: varbinary + rows: + - ['3'] +... +box.execute([[SELECT lower(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT lower(1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT lower(1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT lower(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT lower('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['a'] +... +box.execute([[SELECT lower(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['3'] +... +box.execute([[SELECT nullif(-1, -1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [null] +... +box.execute([[SELECT nullif(1, 1);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [null] +... +box.execute([[SELECT nullif(1.5, 1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [null] +... +box.execute([[SELECT nullif(true, true);]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [null] +... +box.execute([[SELECT nullif('a', 'a');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [null] +... +box.execute([[SELECT nullif(X'33', X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [null] +... +box.execute([[SELECT position(-1, -1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT position(1, 1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT position(1.5, 1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT position(true, true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT position('a', 'a');]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT position(X'33', X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT printf(-1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['-1'] +... +box.execute([[SELECT printf(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['1'] +... +box.execute([[SELECT printf(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['1.5'] +... +box.execute([[SELECT printf(true);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['TRUE'] +... +box.execute([[SELECT printf('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['a'] +... +box.execute([[SELECT printf(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['3'] +... +box.execute([[SELECT quote(-1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - [-1] +... +box.execute([[SELECT quote(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - [1] +... +box.execute([[SELECT quote(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['1.5'] +... +box.execute([[SELECT quote(true);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['TRUE'] +... +box.execute([[SELECT quote('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['''a'''] +... +box.execute([[SELECT quote(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['X''33'''] +... +box.execute([[SELECT randomblob(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to unsigned' +... +box.execute([[SELECT randomblob(0);]]) +--- +- metadata: + - name: COLUMN_1 + type: varbinary + rows: + - [null] +... +box.execute([[SELECT randomblob(0.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: varbinary + rows: + - [null] +... +box.execute([[SELECT randomblob(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to unsigned' +... +box.execute([[SELECT randomblob('a');]]) +--- +- null +- 'Type mismatch: can not convert a to unsigned' +... +box.execute([[SELECT randomblob(X'33');]]) +--- +- null +- 'Type mismatch: can not convert varbinary to unsigned' +... +box.execute([[SELECT replace(-1, -1, -1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT replace(1, 1, 1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT replace(1.5, 1.5, 1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT replace(true, true, true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT replace('a', 'a', 'a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['a'] +... +box.execute([[SELECT replace(X'33', X'33', X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['3'] +... +box.execute([[SELECT round(-1, -1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to unsigned' +... +box.execute([[SELECT round(1, 1);]]) +--- +- metadata: + - name: COLUMN_1 + type: double + rows: + - [1] +... +box.execute([[SELECT round(1.5, 1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: double + rows: + - [1.5] +... +box.execute([[SELECT round(true, true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to double' +... +box.execute([[SELECT round('a', 'a');]]) +--- +- null +- 'Type mismatch: can not convert a to double' +... +box.execute([[SELECT round(X'33', X'33');]]) +--- +- null +- 'Type mismatch: can not convert varbinary to double' +... +box.execute([[SELECT soundex(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT soundex(1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT soundex(1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT soundex(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT soundex('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['A000'] +... +box.execute([[SELECT soundex(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['?000'] +... +box.execute([[SELECT substr(-1, -1, -1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT substr(1, 1, 1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT substr(1.5, 1.5, 1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT substr(true, true, true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to integer' +... +box.execute([[SELECT substr('a', 'a', 'a');]]) +--- +- null +- 'Type mismatch: can not convert a to integer' +... +box.execute([[SELECT substr(X'33', X'33', X'33');]]) +--- +- null +- 'Type mismatch: can not convert varbinary to integer' +... +box.execute([[SELECT typeof(-1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['integer'] +... +box.execute([[SELECT typeof(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['integer'] +... +box.execute([[SELECT typeof(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['double'] +... +box.execute([[SELECT typeof(true);]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['boolean'] +... +box.execute([[SELECT typeof('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['string'] +... +box.execute([[SELECT typeof(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['varbinary'] +... +box.execute([[SELECT unicode(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT unicode(1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT unicode(1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT unicode(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT unicode('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - [97] +... +box.execute([[SELECT unicode(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - [51] +... +box.execute([[SELECT unlikely(-1);]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [-1] +... +box.execute([[SELECT unlikely(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT unlikely(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: double + rows: + - [1.5] +... +box.execute([[SELECT unlikely(true);]]) +--- +- metadata: + - name: COLUMN_1 + type: boolean + rows: + - [true] +... +box.execute([[SELECT unlikely('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['a'] +... +box.execute([[SELECT unlikely(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: varbinary + rows: + - ['3'] +... +box.execute([[SELECT upper(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to string or varbinary' +... +box.execute([[SELECT upper(1);]]) +--- +- null +- 'Type mismatch: can not convert 1 to string or varbinary' +... +box.execute([[SELECT upper(1.5);]]) +--- +- null +- 'Type mismatch: can not convert 1.5 to string or varbinary' +... +box.execute([[SELECT upper(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to string or varbinary' +... +box.execute([[SELECT upper('a');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['A'] +... +box.execute([[SELECT upper(X'33');]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['3'] +... +box.execute([[SELECT zeroblob(-1);]]) +--- +- null +- 'Type mismatch: can not convert -1 to unsigned' +... +box.execute([[SELECT zeroblob(1);]]) +--- +- metadata: + - name: COLUMN_1 + type: varbinary + rows: + - ["\0"] +... +box.execute([[SELECT zeroblob(1.5);]]) +--- +- metadata: + - name: COLUMN_1 + type: varbinary + rows: + - ["\0"] +... +box.execute([[SELECT zeroblob(true);]]) +--- +- null +- 'Type mismatch: can not convert TRUE to unsigned' +... +box.execute([[SELECT zeroblob('a');]]) +--- +- null +- 'Type mismatch: can not convert a to unsigned' +... +box.execute([[SELECT zeroblob(X'33');]]) +--- +- null +- 'Type mismatch: can not convert varbinary to unsigned' +... +box.execute([[CREATE TABLE t (i INTEGER PRIMARY KEY, u UNSIGNED, d DOUBLE, b BOOLEAN, s STRING, v VARBINARY);]]) +--- +- row_count: 1 +... +box.execute([[INSERT INTO t VALUES (-1, 1, 1.5, true, 'a', X'33');]]) +--- +- row_count: 1 +... +box.execute([[SELECT avg(i) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [-1] +... +box.execute([[SELECT avg(u) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1] +... +box.execute([[SELECT avg(d) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1.5] +... +box.execute([[SELECT avg(b) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert TRUE to number' +... +box.execute([[SELECT avg(s) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert a to number' +... +box.execute([[SELECT avg(v) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert varbinary to number' +... +box.execute([[SELECT count(i) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT count(u) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT count(d) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT count(b) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT count(s) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT count(v) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: integer + rows: + - [1] +... +box.execute([[SELECT group_concat(i) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['-1'] +... +box.execute([[SELECT group_concat(u) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['1'] +... +box.execute([[SELECT group_concat(d) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['1.5'] +... +box.execute([[SELECT group_concat(b) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['TRUE'] +... +box.execute([[SELECT group_concat(s) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['a'] +... +box.execute([[SELECT group_concat(v) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: string + rows: + - ['3'] +... +box.execute([[SELECT max(i) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [-1] +... +box.execute([[SELECT max(u) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1] +... +box.execute([[SELECT max(d) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1.5] +... +box.execute([[SELECT max(b) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [true] +... +box.execute([[SELECT max(s) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['a'] +... +box.execute([[SELECT max(v) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['3'] +... +box.execute([[SELECT min(i) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [-1] +... +box.execute([[SELECT min(u) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1] +... +box.execute([[SELECT min(d) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [1.5] +... +box.execute([[SELECT min(b) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - [true] +... +box.execute([[SELECT min(s) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['a'] +... +box.execute([[SELECT min(v) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: scalar + rows: + - ['3'] +... +box.execute([[SELECT sum(i) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [-1] +... +box.execute([[SELECT sum(u) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1] +... +box.execute([[SELECT sum(d) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1.5] +... +box.execute([[SELECT sum(b) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert TRUE to number' +... +box.execute([[SELECT sum(s) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert a to number' +... +box.execute([[SELECT sum(v) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert varbinary to number' +... +box.execute([[SELECT total(i) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [-1] +... +box.execute([[SELECT total(u) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1] +... +box.execute([[SELECT total(d) FROM t;]]) +--- +- metadata: + - name: COLUMN_1 + type: number + rows: + - [1.5] +... +box.execute([[SELECT total(b) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert TRUE to number' +... +box.execute([[SELECT total(s) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert a to number' +... +box.execute([[SELECT total(v) FROM t;]]) +--- +- null +- 'Type mismatch: can not convert varbinary to number' +... +box.execute([[DROP TABLE t;]]) +--- +- row_count: 1 +... diff --git a/test/sql/types.test.lua b/test/sql/types.test.lua index fff0057bd..ac9128548 100644 --- a/test/sql/types.test.lua +++ b/test/sql/types.test.lua @@ -629,3 +629,247 @@ box.execute([[DROP TABLE ts;]]) -- instead of values of type UNSIGNED. -- box.execute([[SELECT typeof(length('abc'));]]) + +-- Make sure the function argument types are checked. +box.execute([[SELECT abs(-1);]]) +box.execute([[SELECT abs(1);]]) +box.execute([[SELECT abs(1.5);]]) +box.execute([[SELECT abs(true);]]) +box.execute([[SELECT abs('a');]]) +box.execute([[SELECT abs(X'33');]]) + +box.execute([[SELECT char(-1);]]) +box.execute([[SELECT char(1);]]) +box.execute([[SELECT char(1.5);]]) +box.execute([[SELECT char(true);]]) +box.execute([[SELECT char('a');]]) +box.execute([[SELECT char(X'33');]]) + +box.execute([[SELECT character_length(-1);]]) +box.execute([[SELECT character_length(1);]]) +box.execute([[SELECT character_length(1.5);]]) +box.execute([[SELECT character_length(true);]]) +box.execute([[SELECT character_length('a');]]) +box.execute([[SELECT character_length(X'33');]]) + +box.execute([[SELECT char_length(-1);]]) +box.execute([[SELECT char_length(1);]]) +box.execute([[SELECT char_length(1.5);]]) +box.execute([[SELECT char_length(true);]]) +box.execute([[SELECT char_length('a');]]) +box.execute([[SELECT char_length(X'33');]]) + +box.execute([[SELECT coalesce(-1, -1);]]) +box.execute([[SELECT coalesce(1, 1);]]) +box.execute([[SELECT coalesce(1.5, 1.5);]]) +box.execute([[SELECT coalesce(true, true);]]) +box.execute([[SELECT coalesce('a', 'a');]]) +box.execute([[SELECT coalesce(X'33', X'33');]]) + +box.execute([[SELECT greatest(-1, -1);]]) +box.execute([[SELECT greatest(1, 1);]]) +box.execute([[SELECT greatest(1.5, 1.5);]]) +box.execute([[SELECT greatest(true, true);]]) +box.execute([[SELECT greatest('a', 'a');]]) +box.execute([[SELECT greatest(X'33', X'33');]]) + +box.execute([[SELECT hex(-1);]]) +box.execute([[SELECT hex(1);]]) +box.execute([[SELECT hex(1.5);]]) +box.execute([[SELECT hex(true);]]) +box.execute([[SELECT hex('a');]]) +box.execute([[SELECT hex(X'33');]]) + +box.execute([[SELECT ifnull(-1, -1);]]) +box.execute([[SELECT ifnull(1, 1);]]) +box.execute([[SELECT ifnull(1.5, 1);]]) +box.execute([[SELECT ifnull(true, true);]]) +box.execute([[SELECT ifnull('a', 'a');]]) +box.execute([[SELECT ifnull(X'33', X'33');]]) + +box.execute([[SELECT least(-1, -1);]]) +box.execute([[SELECT least(1, 1);]]) +box.execute([[SELECT least(1.5, 1.5);]]) +box.execute([[SELECT least(true, true);]]) +box.execute([[SELECT least('a', 'a');]]) +box.execute([[SELECT least(X'33', X'33');]]) + +box.execute([[SELECT length(-1);]]) +box.execute([[SELECT length(1);]]) +box.execute([[SELECT length(1.5);]]) +box.execute([[SELECT length(true);]]) +box.execute([[SELECT length('a');]]) +box.execute([[SELECT length(X'33');]]) + +box.execute([[SELECT likelihood(-1, -1);]]) +box.execute([[SELECT likelihood(1, 1);]]) +box.execute([[SELECT likelihood(1.5, 1.5);]]) +box.execute([[SELECT likelihood(true, true);]]) +box.execute([[SELECT likelihood('a', 'a');]]) +box.execute([[SELECT likelihood(X'33', X'33');]]) + +box.execute([[SELECT likely(-1);]]) +box.execute([[SELECT likely(1);]]) +box.execute([[SELECT likely(1.5);]]) +box.execute([[SELECT likely(true);]]) +box.execute([[SELECT likely('a');]]) +box.execute([[SELECT likely(X'33');]]) + +box.execute([[SELECT lower(-1);]]) +box.execute([[SELECT lower(1);]]) +box.execute([[SELECT lower(1.5);]]) +box.execute([[SELECT lower(true);]]) +box.execute([[SELECT lower('a');]]) +box.execute([[SELECT lower(X'33');]]) + +box.execute([[SELECT nullif(-1, -1);]]) +box.execute([[SELECT nullif(1, 1);]]) +box.execute([[SELECT nullif(1.5, 1.5);]]) +box.execute([[SELECT nullif(true, true);]]) +box.execute([[SELECT nullif('a', 'a');]]) +box.execute([[SELECT nullif(X'33', X'33');]]) + +box.execute([[SELECT position(-1, -1);]]) +box.execute([[SELECT position(1, 1);]]) +box.execute([[SELECT position(1.5, 1.5);]]) +box.execute([[SELECT position(true, true);]]) +box.execute([[SELECT position('a', 'a');]]) +box.execute([[SELECT position(X'33', X'33');]]) + +box.execute([[SELECT printf(-1);]]) +box.execute([[SELECT printf(1);]]) +box.execute([[SELECT printf(1.5);]]) +box.execute([[SELECT printf(true);]]) +box.execute([[SELECT printf('a');]]) +box.execute([[SELECT printf(X'33');]]) + +box.execute([[SELECT quote(-1);]]) +box.execute([[SELECT quote(1);]]) +box.execute([[SELECT quote(1.5);]]) +box.execute([[SELECT quote(true);]]) +box.execute([[SELECT quote('a');]]) +box.execute([[SELECT quote(X'33');]]) + +box.execute([[SELECT randomblob(-1);]]) +box.execute([[SELECT randomblob(0);]]) +box.execute([[SELECT randomblob(0.5);]]) +box.execute([[SELECT randomblob(true);]]) +box.execute([[SELECT randomblob('a');]]) +box.execute([[SELECT randomblob(X'33');]]) + +box.execute([[SELECT replace(-1, -1, -1);]]) +box.execute([[SELECT replace(1, 1, 1);]]) +box.execute([[SELECT replace(1.5, 1.5, 1.5);]]) +box.execute([[SELECT replace(true, true, true);]]) +box.execute([[SELECT replace('a', 'a', 'a');]]) +box.execute([[SELECT replace(X'33', X'33', X'33');]]) + +box.execute([[SELECT round(-1, -1);]]) +box.execute([[SELECT round(1, 1);]]) +box.execute([[SELECT round(1.5, 1.5);]]) +box.execute([[SELECT round(true, true);]]) +box.execute([[SELECT round('a', 'a');]]) +box.execute([[SELECT round(X'33', X'33');]]) + +box.execute([[SELECT soundex(-1);]]) +box.execute([[SELECT soundex(1);]]) +box.execute([[SELECT soundex(1.5);]]) +box.execute([[SELECT soundex(true);]]) +box.execute([[SELECT soundex('a');]]) +box.execute([[SELECT soundex(X'33');]]) + +box.execute([[SELECT substr(-1, -1, -1);]]) +box.execute([[SELECT substr(1, 1, 1);]]) +box.execute([[SELECT substr(1.5, 1.5, 1.5);]]) +box.execute([[SELECT substr(true, true, true);]]) +box.execute([[SELECT substr('a', 'a', 'a');]]) +box.execute([[SELECT substr(X'33', X'33', X'33');]]) + +box.execute([[SELECT typeof(-1);]]) +box.execute([[SELECT typeof(1);]]) +box.execute([[SELECT typeof(1.5);]]) +box.execute([[SELECT typeof(true);]]) +box.execute([[SELECT typeof('a');]]) +box.execute([[SELECT typeof(X'33');]]) + +box.execute([[SELECT unicode(-1);]]) +box.execute([[SELECT unicode(1);]]) +box.execute([[SELECT unicode(1.5);]]) +box.execute([[SELECT unicode(true);]]) +box.execute([[SELECT unicode('a');]]) +box.execute([[SELECT unicode(X'33');]]) + +box.execute([[SELECT unlikely(-1);]]) +box.execute([[SELECT unlikely(1);]]) +box.execute([[SELECT unlikely(1.5);]]) +box.execute([[SELECT unlikely(true);]]) +box.execute([[SELECT unlikely('a');]]) +box.execute([[SELECT unlikely(X'33');]]) + +box.execute([[SELECT upper(-1);]]) +box.execute([[SELECT upper(1);]]) +box.execute([[SELECT upper(1.5);]]) +box.execute([[SELECT upper(true);]]) +box.execute([[SELECT upper('a');]]) +box.execute([[SELECT upper(X'33');]]) + +box.execute([[SELECT zeroblob(-1);]]) +box.execute([[SELECT zeroblob(1);]]) +box.execute([[SELECT zeroblob(1.5);]]) +box.execute([[SELECT zeroblob(true);]]) +box.execute([[SELECT zeroblob('a');]]) +box.execute([[SELECT zeroblob(X'33');]]) + +box.execute([[CREATE TABLE t (i INTEGER PRIMARY KEY, u UNSIGNED, d DOUBLE, b BOOLEAN, s STRING, v VARBINARY);]]) +box.execute([[INSERT INTO t VALUES (-1, 1, 1.5, true, 'a', X'33');]]) + +box.execute([[SELECT avg(i) FROM t;]]) +box.execute([[SELECT avg(u) FROM t;]]) +box.execute([[SELECT avg(d) FROM t;]]) +box.execute([[SELECT avg(b) FROM t;]]) +box.execute([[SELECT avg(s) FROM t;]]) +box.execute([[SELECT avg(v) FROM t;]]) + +box.execute([[SELECT count(i) FROM t;]]) +box.execute([[SELECT count(u) FROM t;]]) +box.execute([[SELECT count(d) FROM t;]]) +box.execute([[SELECT count(b) FROM t;]]) +box.execute([[SELECT count(s) FROM t;]]) +box.execute([[SELECT count(v) FROM t;]]) + +box.execute([[SELECT group_concat(i) FROM t;]]) +box.execute([[SELECT group_concat(u) FROM t;]]) +box.execute([[SELECT group_concat(d) FROM t;]]) +box.execute([[SELECT group_concat(b) FROM t;]]) +box.execute([[SELECT group_concat(s) FROM t;]]) +box.execute([[SELECT group_concat(v) FROM t;]]) + +box.execute([[SELECT max(i) FROM t;]]) +box.execute([[SELECT max(u) FROM t;]]) +box.execute([[SELECT max(d) FROM t;]]) +box.execute([[SELECT max(b) FROM t;]]) +box.execute([[SELECT max(s) FROM t;]]) +box.execute([[SELECT max(v) FROM t;]]) + +box.execute([[SELECT min(i) FROM t;]]) +box.execute([[SELECT min(u) FROM t;]]) +box.execute([[SELECT min(d) FROM t;]]) +box.execute([[SELECT min(b) FROM t;]]) +box.execute([[SELECT min(s) FROM t;]]) +box.execute([[SELECT min(v) FROM t;]]) + +box.execute([[SELECT sum(i) FROM t;]]) +box.execute([[SELECT sum(u) FROM t;]]) +box.execute([[SELECT sum(d) FROM t;]]) +box.execute([[SELECT sum(b) FROM t;]]) +box.execute([[SELECT sum(s) FROM t;]]) +box.execute([[SELECT sum(v) FROM t;]]) + +box.execute([[SELECT total(i) FROM t;]]) +box.execute([[SELECT total(u) FROM t;]]) +box.execute([[SELECT total(d) FROM t;]]) +box.execute([[SELECT total(b) FROM t;]]) +box.execute([[SELECT total(s) FROM t;]]) +box.execute([[SELECT total(v) FROM t;]]) + +box.execute([[DROP TABLE t;]]) -- 2.25.1