[Tarantool-patches] [PATCH 1/1] sql: fix typeof() for double values

imeevma at tarantool.org imeevma at tarantool.org
Tue Dec 31 11:47:04 MSK 2019


This patch corrects the result of typeof() for double values.
Previously, it gave the type "number" in the case of a
floating-point number. Now it gives "double".

Follow-up #3812
---
https://github.com/tarantool/tarantool/issues/3812
https://github.com/tarantool/tarantool/tree/imeevma/gh-3812-fix-typeof-function

 src/box/sql/func.c            |  2 +-
 test/sql-tap/cast.test.lua    | 12 +++++-----
 test/sql-tap/check.test.lua   |  4 ++--
 test/sql-tap/func.test.lua    |  4 ++--
 test/sql-tap/select3.test.lua |  8 +++----
 test/sql/types.result         | 51 +++++++++++++++++++++++++++++++++++++++++++
 test/sql/types.test.lua       |  9 ++++++++
 7 files changed, 75 insertions(+), 15 deletions(-)

diff --git a/src/box/sql/func.c b/src/box/sql/func.c
index deaae61..6e724c8 100644
--- a/src/box/sql/func.c
+++ b/src/box/sql/func.c
@@ -428,7 +428,7 @@ typeofFunc(sql_context * context, int NotUsed, sql_value ** argv)
 		z = "string";
 		break;
 	case MP_DOUBLE:
-		z = "number";
+		z = "double";
 		break;
 	case MP_BIN:
 		z = "varbinary";
diff --git a/test/sql-tap/cast.test.lua b/test/sql-tap/cast.test.lua
index 23229db..9c937a0 100755
--- a/test/sql-tap/cast.test.lua
+++ b/test/sql-tap/cast.test.lua
@@ -257,10 +257,10 @@ test:do_execsql_test(
 test:do_execsql_test(
     "cast-1.26",
     [[
-        SELECT typeof(CAST(123 AS NUMBER))
+        SELECT typeof(CAST(123 AS DOUBLE))
     ]], {
         -- <cast-1.26>
-        "number"
+        "double"
         -- </cast-1.26>
     })
 
@@ -320,7 +320,7 @@ test:do_execsql_test(
         SELECT typeof(123.456)
     ]], {
         -- <cast-1.32>
-        "number"
+        "double"
         -- </cast-1.32>
     })
 
@@ -357,10 +357,10 @@ test:do_execsql_test(
 test:do_execsql_test(
     "cast-1.36",
     [[
-        SELECT typeof(CAST(123.456 AS NUMBER))
+        SELECT typeof(CAST(123.456 AS DOUBLE))
     ]], {
         -- <cast-1.36>
-        "number"
+        "double"
         -- </cast-1.36>
     })
 
@@ -380,7 +380,7 @@ test:do_execsql_test(
         SELECT typeof(CAST(123.456 AS SCALAR))
     ]], {
         -- <cast-1.38>
-        "number"
+        "double"
         -- </cast-1.38>
     })
 
diff --git a/test/sql-tap/check.test.lua b/test/sql-tap/check.test.lua
index 21ededa..3dc28cf 100755
--- a/test/sql-tap/check.test.lua
+++ b/test/sql-tap/check.test.lua
@@ -29,7 +29,7 @@ test:do_execsql_test(
     [[
         CREATE TABLE t1(
           x INTEGER CHECK( x<5 ),
-          y NUMBER CHECK( y>x ),
+          y DOUBLE CHECK( y>x ),
           z  INT primary key
         );
     ]], {
@@ -207,7 +207,7 @@ test:do_execsql_test(
         CREATE TABLE t2(
           id  INT primary key,
           x SCALAR CONSTRAINT one CHECK( typeof(coalesce(x,0))=='integer'),
-          y NUMBER CONSTRAINT two CHECK( typeof(coalesce(y,0.1))=='number' ),
+          y DOUBLE CONSTRAINT two CHECK( typeof(coalesce(y,0.1))=='double' ),
           z SCALAR CONSTRAINT three CHECK( typeof(coalesce(z,''))=='string' )
         );
     ]], {
diff --git a/test/sql-tap/func.test.lua b/test/sql-tap/func.test.lua
index bd1941b..3c08892 100755
--- a/test/sql-tap/func.test.lua
+++ b/test/sql-tap/func.test.lua
@@ -518,7 +518,7 @@ test:do_execsql_test(
         SELECT typeof(round(5.1,1));
     ]], {
         -- <func-4.14>
-        "number"
+        "double"
         -- </func-4.14>
     })
 
@@ -528,7 +528,7 @@ test:do_execsql_test(
         SELECT typeof(round(5.1));
     ]], {
         -- <func-4.15>
-        "number"
+        "double"
         -- </func-4.15>
     })
 
diff --git a/test/sql-tap/select3.test.lua b/test/sql-tap/select3.test.lua
index 92e7f8e..0b0b9cc 100755
--- a/test/sql-tap/select3.test.lua
+++ b/test/sql-tap/select3.test.lua
@@ -376,9 +376,9 @@ test:do_execsql_test("select3-7.2", [[
 test:do_execsql_test("select3-8.1", [[
   DROP TABLE IF EXISTS A;
   CREATE TABLE A (
-    A1 NUMBER,
+    A1 DOUBLE,
     A2 TEXT,
-    A3 NUMBER,
+    A3 DOUBLE,
     id int primary key
   );
   INSERT INTO A VALUES(39136,'ABC',1201900000, 1);
@@ -386,7 +386,7 @@ test:do_execsql_test("select3-8.1", [[
   SELECT typeof(sum(a3)) FROM a;
 ]], {
   -- <select3-8.1>
-  "number"
+  "double"
   -- </select3-8.1>
 })
 
@@ -394,7 +394,7 @@ test:do_execsql_test("select3-8.2", [[
   SELECT typeof(sum(a3)) FROM a GROUP BY a1;
 ]], {
   -- <select3-8.2>
-  "number"
+  "double"
   -- </select3-8.2>
 })
 
diff --git a/test/sql/types.result b/test/sql/types.result
index 6d0aefd..ac4c91e 100644
--- a/test/sql/types.result
+++ b/test/sql/types.result
@@ -2082,3 +2082,54 @@ box.execute("DROP TABLE t4;")
 ---
 - row_count: 1
 ...
+-- Make sure the typeof() function works correctly with DOUBLE.
+box.execute("SELECT 1.0, typeof(1.0);")
+---
+- metadata:
+  - name: '1.0'
+    type: double
+  - name: typeof(1.0)
+    type: string
+  rows:
+  - [1, 'double']
+...
+box.execute("SELECT CAST(2 AS DOUBLE), typeof(CAST(2 AS DOUBLE));")
+---
+- metadata:
+  - name: CAST(2 AS DOUBLE)
+    type: double
+  - name: typeof(CAST(2 AS DOUBLE))
+    type: string
+  rows:
+  - [2, 'double']
+...
+box.execute("SELECT 3e3, typeof(3e3);")
+---
+- metadata:
+  - name: '3e3'
+    type: double
+  - name: typeof(3e3)
+    type: string
+  rows:
+  - [3000, 'double']
+...
+box.execute("CREATE TABLE t5 (d DOUBLE PRIMARY KEY);")
+---
+- row_count: 1
+...
+box.execute("INSERT INTO t5 VALUES (4), (5.5), (6e6);")
+---
+- row_count: 3
+...
+box.execute("SELECT d, TYPEOF(d) FROM t5;")
+---
+- metadata:
+  - name: D
+    type: double
+  - name: TYPEOF(d)
+    type: string
+  rows:
+  - [4, 'double']
+  - [5.5, 'double']
+  - [6000000, 'double']
+...
diff --git a/test/sql/types.test.lua b/test/sql/types.test.lua
index 24bfa42..c677b27 100644
--- a/test/sql/types.test.lua
+++ b/test/sql/types.test.lua
@@ -465,3 +465,12 @@ box.execute("CREATE TABLE t4 (i INT PRIMARY KEY, d DOUBLE DEFAULT 1.2345);")
 box.execute("INSERT INTO t4(i) VALUES (1);")
 box.execute("SELECT * FROM t4;")
 box.execute("DROP TABLE t4;")
+
+-- Make sure the typeof() function works correctly with DOUBLE.
+box.execute("SELECT 1.0, typeof(1.0);")
+box.execute("SELECT CAST(2 AS DOUBLE), typeof(CAST(2 AS DOUBLE));")
+box.execute("SELECT 3e3, typeof(3e3);")
+
+box.execute("CREATE TABLE t5 (d DOUBLE PRIMARY KEY);")
+box.execute("INSERT INTO t5 VALUES (4), (5.5), (6e6);")
+box.execute("SELECT d, TYPEOF(d) FROM t5;")
-- 
2.7.4



More information about the Tarantool-patches mailing list