Tarantool development patches archive
 help / color / mirror / Atom feed
From: Nikita Pettik <korablev@tarantool.org>
To: tarantool-patches@freelists.org
Cc: v.shpilevoy@tarantool.org, Nikita Pettik <korablev@tarantool.org>
Subject: [tarantool-patches] [PATCH] sql: fix extra type calculation before bytecode generation
Date: Fri,  5 Apr 2019 03:06:27 +0300	[thread overview]
Message-ID: <20190405000627.58693-1-korablev@tarantool.org> (raw)

In SQL type of constant literal (e.g. 1, 2.5, 'abc') is assigned right
after parsing and saving into struct Expr. Occasionally, type is
re-assigned before emitting opcodes to store literal into VDBE memory.
What is more, for floating point number type is changed to "integer".
This patch fixes this obvious misbehaviour.
---
Branch: https://github.com/tarantool/tarantool/tree/np/fix-float-type-meta

 src/box/sql/expr.c                         |  4 ---
 test/sql/gh-3888-values-blob-assert.result |  2 +-
 test/sql/misc.result                       | 43 ++++++++++++++++++++++++++++++
 test/sql/misc.test.lua                     |  9 +++++++
 4 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c
index 4b98bd175..0b5fe788c 100644
--- a/src/box/sql/expr.c
+++ b/src/box/sql/expr.c
@@ -3760,20 +3760,17 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target)
 							pExpr->op2);
 		}
 	case TK_INTEGER:{
-			pExpr->type = FIELD_TYPE_INTEGER;
 			expr_code_int(pParse, pExpr, false, target);
 			return target;
 		}
 #ifndef SQL_OMIT_FLOATING_POINT
 	case TK_FLOAT:{
-			pExpr->type = FIELD_TYPE_INTEGER;
 			assert(!ExprHasProperty(pExpr, EP_IntValue));
 			codeReal(v, pExpr->u.zToken, 0, target);
 			return target;
 		}
 #endif
 	case TK_STRING:{
-			pExpr->type = FIELD_TYPE_STRING;
 			assert(!ExprHasProperty(pExpr, EP_IntValue));
 			sqlVdbeLoadString(v, target, pExpr->u.zToken);
 			return target;
@@ -3791,7 +3788,6 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target)
 			assert(pExpr->u.zToken[0] == 'x'
 			       || pExpr->u.zToken[0] == 'X');
 			assert(pExpr->u.zToken[1] == '\'');
-			pExpr->type = FIELD_TYPE_SCALAR;
 			z = &pExpr->u.zToken[2];
 			n = sqlStrlen30(z) - 1;
 			assert(z[n] == '\'');
diff --git a/test/sql/gh-3888-values-blob-assert.result b/test/sql/gh-3888-values-blob-assert.result
index 5275b0fc7..0d4a27c1f 100644
--- a/test/sql/gh-3888-values-blob-assert.result
+++ b/test/sql/gh-3888-values-blob-assert.result
@@ -64,7 +64,7 @@ box.execute('SELECT 3.14')
 ---
 - metadata:
   - name: '3.14'
-    type: integer
+    type: number
   rows:
   - [3.14]
 ...
diff --git a/test/sql/misc.result b/test/sql/misc.result
index 6454015f5..b5bb1fb4c 100644
--- a/test/sql/misc.result
+++ b/test/sql/misc.result
@@ -63,3 +63,46 @@ box.execute('CREATE TABLE test (id INTEGER PRIMARY KEY, b TEXT CONSTRAINT c1 COL
 - error: Keyword 'COLLATE' is reserved. Please use double quotes if 'COLLATE' is an
     identifier.
 ...
+-- Make sure that type of literals in meta complies with its real
+-- type. For instance, typeof(0.5) is number, not integer.
+--
+box.execute('SELECT 1;')
+---
+- metadata:
+  - name: '1'
+    type: integer
+  rows:
+  - [1]
+...
+box.execute('SELECT 1.5;')
+---
+- metadata:
+  - name: '1.5'
+    type: number
+  rows:
+  - [1.5]
+...
+box.execute('SELECT 1.0;')
+---
+- metadata:
+  - name: '1.0'
+    type: number
+  rows:
+  - [1]
+...
+box.execute('SELECT \'abc\';')
+---
+- metadata:
+  - name: '''abc'''
+    type: string
+  rows:
+  - ['abc']
+...
+box.execute('SELECT X\'4D6564766564\'')
+---
+- metadata:
+  - name: X'4D6564766564'
+    type: scalar
+  rows:
+  - ['Medved']
+...
diff --git a/test/sql/misc.test.lua b/test/sql/misc.test.lua
index 79ca8da21..0b1c34d1b 100644
--- a/test/sql/misc.test.lua
+++ b/test/sql/misc.test.lua
@@ -17,3 +17,12 @@ box.execute('\n\n\n\t\t\t   ')
 box.execute('CREATE TABLE test (id INTEGER PRIMARY KEY, b INTEGER CONSTRAINT c1 NULL)')
 box.execute('CREATE TABLE test (id INTEGER PRIMARY KEY, b INTEGER CONSTRAINT c1 DEFAULT 300)')
 box.execute('CREATE TABLE test (id INTEGER PRIMARY KEY, b TEXT CONSTRAINT c1 COLLATE "binary")')
+
+-- Make sure that type of literals in meta complies with its real
+-- type. For instance, typeof(0.5) is number, not integer.
+--
+box.execute('SELECT 1;')
+box.execute('SELECT 1.5;')
+box.execute('SELECT 1.0;')
+box.execute('SELECT \'abc\';')
+box.execute('SELECT X\'4D6564766564\'')
-- 
2.15.1

             reply	other threads:[~2019-04-05  0:06 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-05  0:06 Nikita Pettik [this message]
2019-04-05  5:49 ` [tarantool-patches] " Konstantin Osipov
2019-04-05  9:51 ` Vladislav Shpilevoy
2019-04-05 15:35 ` Kirill Yukhin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190405000627.58693-1-korablev@tarantool.org \
    --to=korablev@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='Re: [tarantool-patches] [PATCH] sql: fix extra type calculation before bytecode generation' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox