[tarantool-patches] [PATCH 6/6] sql: discard numeric conversion by unary plus

Nikita Pettik korablev at tarantool.org
Mon Sep 17 23:32:30 MSK 2018


In SQLite unary plus behaves as implicit conversion to numeric type.
Consider following example:

CREATE TABLE t1 (id INT PRIMARY KEY, a TEXT, b BLOB);
INSERT INTO t1 VALUES (1, '99', '99');

SELECT * FROM t1 WHERE a = b; (*)
SELECT * FROM t1 WHERE +a = +b; (**)

Since BLOB and TEXT are incompatible, result of (*) would be empty set.
However, comparison in second query (**) would be of <NUMERIC> types,
and result set would consist of one tuple [1, '99', '99'].

Lets discard this conversion produced by unary plus, since it implicitly
affects result set of query and no one other DB support such behaviour.
Instead, simply use type of operand it is related to.
---
 src/box/sql/expr.c           |  9 ++++++
 test/sql-tap/whereB.test.lua | 72 ++++++++++++++++++++++----------------------
 2 files changed, 45 insertions(+), 36 deletions(-)

diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c
index 534d856eb..aff1f35fd 100644
--- a/src/box/sql/expr.c
+++ b/src/box/sql/expr.c
@@ -115,6 +115,15 @@ sqlite3ExprAffinity(Expr * pExpr)
 				      &field_no);
 		return pExpr->space_def->fields[field_no].affinity;
 	}
+	/*
+	 * In case of unary plus we shouldn't discard
+	 * affinity of operand (since plus always features
+	 * NUMERIC affinity).
+	 */
+	if (op == TK_UPLUS) {
+		assert(pExpr->pRight == NULL);
+		return pExpr->pLeft->affinity;
+	}
 	return pExpr->affinity;
 }
 
diff --git a/test/sql-tap/whereB.test.lua b/test/sql-tap/whereB.test.lua
index 7e2aff078..42d90fa18 100755
--- a/test/sql-tap/whereB.test.lua
+++ b/test/sql-tap/whereB.test.lua
@@ -357,14 +357,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-4.4",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-4.4>
-    
+    1, 2, 1
     -- </whereB-4.4>
     })
 
@@ -393,14 +393,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-4.102",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-4.102>
-    
+    1, 2, 1
     -- </whereB-4.102>
     })
 
@@ -457,14 +457,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-5.4",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-5.4>
-    
+    1, 2, 1
     -- </whereB-5.4>
     })
 
@@ -493,14 +493,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-5.102",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-5.102>
-    
+    1, 2, 1
     -- </whereB-5.102>
     })
 
@@ -557,14 +557,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-6.4",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-6.4>
-    
+    1, 2, 1
     -- </whereB-6.4>
     })
 
@@ -593,14 +593,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-6.102",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-6.102>
-    
+    1, 2, 1
     -- </whereB-6.102>
     })
 
@@ -657,14 +657,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-7.4",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-7.4>
-    
+    1, 2, 1
     -- </whereB-7.4>
     })
 
@@ -693,14 +693,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-7.102",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-7.102>
-    
+    1, 2, 1
     -- </whereB-7.102>
     })
 
@@ -757,14 +757,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-8.4",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-8.4>
-    
+    1, 2, 1
     -- </whereB-8.4>
     })
 
@@ -793,14 +793,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-8.102",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-8.102>
-    
+    1, 2, 1
     -- </whereB-8.102>
     })
 
@@ -857,14 +857,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-9.4",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-9.4>
-    
+    1, 2, 1
     -- </whereB-9.4>
     })
 
@@ -893,14 +893,14 @@ test:do_execsql_test(
 
 test:do_execsql_test(
     "whereB-9.102",
-    -- In this case the unary "+" operator removes the column affinity so
-    -- the columns compare false
+    -- In this case the unary "+" operator shouldn't
+    -- affect result set of query.
     [[
         SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     ]],
     {
     -- <whereB-9.102>
-    
+    1, 2, 1
     -- </whereB-9.102>
     })
 
-- 
2.15.1





More information about the Tarantool-patches mailing list