[Tarantool-patches] [PATCH v1 6/7] sql: VARBINARY and STRING in built-in functions
imeevma at tarantool.org
imeevma at tarantool.org
Wed Aug 12 18:15:53 MSK 2020
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
]], {
-- <cse-1.13>
"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
]], {
-- <cse-1.14>
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
]], {
-- <func-1.4>
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
]], {
-- <func-2.9>
"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
]], {
-- <func-2.10>
"", "", "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
]], {
-- <func-5.3>
"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
]], {
-- <func-6.2>
"1","nil","345","nil","67890"
@@ -2932,13 +2932,13 @@ test:do_catchsql_test(
-- </func-76.2>
})
-test:do_catchsql_test(
+test:do_execsql_test(
"func-76.3",
[[
SELECT SOUNDEX(X'FF')
]], {
-- <func-76.3>
- 1, "Type mismatch: can not convert varbinary to text"
+ "?000"
-- </func-76.3>
})
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, {
-- <position-1.23>
- 1, "Inconsistent types: expected text or varbinary got unsigned"
+ 1, "Type mismatch: can not convert 12345 to string or varbinary"
-- </position-1.23>
})
@@ -238,7 +238,7 @@ test:do_test(
return test:catchsql "SELECT position(34, 123456.78);"
end, {
-- <position-1.24>
- 1, "Inconsistent types: expected text or varbinary got real"
+ 1, "Type mismatch: can not convert 123456.78 to string or varbinary"
-- </position-1.24>
})
@@ -248,7 +248,7 @@ test:do_test(
return test:catchsql "SELECT position(x'3334', 123456.78);"
end, {
-- <position-1.25>
- 1, "Inconsistent types: expected text or varbinary got real"
+ 1, "Type mismatch: can not convert 123456.78 to string or varbinary"
-- </position-1.25>
})
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
More information about the Tarantool-patches
mailing list