From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 660582BBEA for ; Sun, 14 Apr 2019 11:04:15 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mO9B5tMXAxZo for ; Sun, 14 Apr 2019 11:04:15 -0400 (EDT) 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 turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id EE1972BB33 for ; Sun, 14 Apr 2019 11:04:14 -0400 (EDT) From: Nikita Pettik Subject: [tarantool-patches] [PATCH 5/9] sql: improve type determination for column meta Date: Sun, 14 Apr 2019 18:04:03 +0300 Message-Id: In-Reply-To: References: In-Reply-To: References: Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org Cc: v.shpilevoy@tarantool.org, kostja@tarantool.org, Nikita Pettik In most cases we don't assign and store type of node of expression AST (except for constant literals). To determine type of node we use sql_expr_type() function, which implements logic of quite simple recursive tree traversal. Before this patch we set type of node after code generation in sqlExprCodeTarget() without any traversal. This approach is way worse even then sql_expr_type(). So, to improve accuracy of type determination, let's always call that method and remove type assignment in sqlExprCodeTarget(). --- src/box/sql/expr.c | 19 ++++--------------- src/box/sql/select.c | 2 +- test/sql/check-clear-ephemeral.result | 2 +- test/sql/gh-2347-max-int-literals.result | 2 +- test/sql/gh-3199-no-mem-leaks.result | 18 +++++++++--------- test/sql/gh-3888-values-blob-assert.result | 2 +- test/sql/persistency.result | 8 ++++---- test/sql/transition.result | 4 ++-- test/sql/types.result | 10 +++++----- 9 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index 6b38e8e66..09ebdba66 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -105,6 +105,10 @@ sql_expr_type(struct Expr *pExpr) case TK_NOT: case TK_AND: case TK_OR: + case TK_ISNULL: + case TK_NOTNULL: + case TK_BETWEEN: + case TK_IN: /* * FIXME: should be changed to BOOL type * when it is implemented. Now simply @@ -3769,7 +3773,6 @@ 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; } @@ -3780,14 +3783,12 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int 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; @@ -3805,7 +3806,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] == '\''); @@ -3887,7 +3887,6 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) testcase(regFree1 == 0); testcase(regFree2 == 0); } - pExpr->type = FIELD_TYPE_INTEGER; break; } case TK_AND: @@ -3931,10 +3930,6 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) sqlVdbeAddOp3(v, op, r2, r1, target); testcase(regFree1 == 0); testcase(regFree2 == 0); - if (op != TK_CONCAT) - pExpr->type = FIELD_TYPE_NUMBER; - else - pExpr->type = FIELD_TYPE_STRING; break; } case TK_UMINUS:{ @@ -3966,7 +3961,6 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) } case TK_BITNOT: case TK_NOT:{ - pExpr->type = FIELD_TYPE_INTEGER; assert(TK_BITNOT == OP_BitNot); testcase(op == TK_BITNOT); assert(TK_NOT == OP_Not); @@ -3980,7 +3974,6 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) case TK_ISNULL: case TK_NOTNULL:{ int addr; - pExpr->type = FIELD_TYPE_INTEGER; assert(TK_ISNULL == OP_IsNull); testcase(op == TK_ISNULL); assert(TK_NOTNULL == OP_NotNull); @@ -4225,7 +4218,6 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) case TK_IN:{ int destIfFalse = sqlVdbeMakeLabel(v); int destIfNull = sqlVdbeMakeLabel(v); - pExpr->type = FIELD_TYPE_INTEGER; sqlVdbeAddOp2(v, OP_Null, 0, target); sqlExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); @@ -4249,18 +4241,15 @@ sqlExprCodeTarget(Parse * pParse, Expr * pExpr, int target) * Z is stored in pExpr->pList->a[1].pExpr. */ case TK_BETWEEN:{ - pExpr->type = FIELD_TYPE_INTEGER; exprCodeBetween(pParse, pExpr, target, 0, 0); return target; } case TK_SPAN: case TK_COLLATE:{ - pExpr->type = FIELD_TYPE_STRING; return sqlExprCodeTarget(pParse, pExpr->pLeft, target); } case TK_UPLUS:{ - pExpr->type = FIELD_TYPE_NUMBER; return sqlExprCodeTarget(pParse, pExpr->pLeft, target); } diff --git a/src/box/sql/select.c b/src/box/sql/select.c index b1ec8c758..59f22140c 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -1760,7 +1760,7 @@ generateColumnNames(Parse * pParse, /* Parser context */ if (p->op == TK_VARIABLE) var_pos[var_count++] = i; sqlVdbeSetColName(v, i, COLNAME_DECLTYPE, - field_type_strs[p->type], SQL_TRANSIENT); + field_type_strs[sql_expr_type(p)], SQL_TRANSIENT); if (pEList->a[i].zName) { char *zName = pEList->a[i].zName; sqlVdbeSetColName(v, i, COLNAME_NAME, zName, diff --git a/test/sql/check-clear-ephemeral.result b/test/sql/check-clear-ephemeral.result index 8fbea982c..84dc7af3d 100644 --- a/test/sql/check-clear-ephemeral.result +++ b/test/sql/check-clear-ephemeral.result @@ -26,7 +26,7 @@ box.execute("SELECT a FROM t1 ORDER BY b, a LIMIT 10 OFFSET 20;"); --- - metadata: - name: A - type: scalar + type: integer rows: - [840] - [880] diff --git a/test/sql/gh-2347-max-int-literals.result b/test/sql/gh-2347-max-int-literals.result index 35bedd0c9..2c2773e8c 100644 --- a/test/sql/gh-2347-max-int-literals.result +++ b/test/sql/gh-2347-max-int-literals.result @@ -23,7 +23,7 @@ box.execute("select (-9223372036854775808)") --- - metadata: - name: (-9223372036854775808) - type: number + type: integer rows: - [-9223372036854775808] ... diff --git a/test/sql/gh-3199-no-mem-leaks.result b/test/sql/gh-3199-no-mem-leaks.result index a873c5019..49ed9775d 100644 --- a/test/sql/gh-3199-no-mem-leaks.result +++ b/test/sql/gh-3199-no-mem-leaks.result @@ -29,7 +29,7 @@ box.execute('SELECT x, y, x + y FROM test ORDER BY y') - name: X type: integer - name: Y - type: scalar + type: integer - name: x + y type: number rows: @@ -46,7 +46,7 @@ box.execute('SELECT x, y, x + y FROM test ORDER BY y') - name: X type: integer - name: Y - type: scalar + type: integer - name: x + y type: number rows: @@ -59,7 +59,7 @@ box.execute('SELECT x, y, x + y FROM test ORDER BY y') - name: X type: integer - name: Y - type: scalar + type: integer - name: x + y type: number rows: @@ -72,7 +72,7 @@ box.execute('SELECT x, y, x + y FROM test ORDER BY y') - name: X type: integer - name: Y - type: scalar + type: integer - name: x + y type: number rows: @@ -85,7 +85,7 @@ box.execute('SELECT x, y, x + y FROM test ORDER BY y') - name: X type: integer - name: Y - type: scalar + type: integer - name: x + y type: number rows: @@ -112,7 +112,7 @@ box.execute('SELECT a, id + 2, b FROM test2 WHERE b < id * 2 ORDER BY a ') --- - metadata: - name: A - type: scalar + type: string - name: id + 2 type: number - name: B @@ -135,7 +135,7 @@ box.execute('SELECT a, id + 2 * b, a FROM test2 WHERE b < id * 2 ORDER BY a ') - name: id + 2 * b type: number - name: A - type: scalar + type: string rows: - ['abc', 3, 'abc'] - ['hello', 6, 'hello'] @@ -150,7 +150,7 @@ box.execute('SELECT a, id + 2 * b, a FROM test2 WHERE b < id * 2 ORDER BY a ') - name: id + 2 * b type: number - name: A - type: scalar + type: string rows: - ['abc', 3, 'abc'] - ['hello', 6, 'hello'] @@ -165,7 +165,7 @@ box.execute('SELECT a, id + 2 * b, a FROM test2 WHERE b < id * 2 ORDER BY a ') - name: id + 2 * b type: number - name: A - type: scalar + type: string rows: - ['abc', 3, 'abc'] - ['hello', 6, 'hello'] 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/persistency.result b/test/sql/persistency.result index b4217f808..cd5dcae1f 100644 --- a/test/sql/persistency.result +++ b/test/sql/persistency.result @@ -228,7 +228,7 @@ box.execute("SELECT bar, foo, 42, 'awesome' FROM foobar ORDER BY bar") --- - metadata: - name: BAR - type: scalar + type: string - name: FOO type: integer - name: '42' @@ -244,7 +244,7 @@ box.execute("SELECT bar, foo, 42, 'awesome' FROM foobar ORDER BY bar DESC") --- - metadata: - name: BAR - type: scalar + type: string - name: FOO type: integer - name: '42' @@ -341,7 +341,7 @@ box.execute("SELECT a FROM t1 ORDER BY b, a LIMIT 10 OFFSET 20;"); --- - metadata: - name: A - type: scalar + type: integer rows: - [840] - [880] @@ -446,7 +446,7 @@ box.execute("SELECT a FROM t1 ORDER BY b, a LIMIT 10 OFFSET 20;"); --- - metadata: - name: A - type: scalar + type: integer rows: - [840] - [880] diff --git a/test/sql/transition.result b/test/sql/transition.result index adf5d0816..49edf96c6 100644 --- a/test/sql/transition.result +++ b/test/sql/transition.result @@ -225,7 +225,7 @@ box.execute("SELECT bar, foo, 42, 'awesome' FROM foobar ORDER BY bar") --- - metadata: - name: BAR - type: scalar + type: string - name: FOO type: integer - name: '42' @@ -241,7 +241,7 @@ box.execute("SELECT bar, foo, 42, 'awesome' FROM foobar ORDER BY bar DESC") --- - metadata: - name: BAR - type: scalar + type: string - name: FOO type: integer - name: '42' diff --git a/test/sql/types.result b/test/sql/types.result index 3aa0169e2..6bccd39ef 100644 --- a/test/sql/types.result +++ b/test/sql/types.result @@ -399,7 +399,7 @@ box.execute("SELECT true and false;") --- - metadata: - name: true and false - type: number + type: integer rows: - [0] ... @@ -407,7 +407,7 @@ box.execute("SELECT true or unknown;") --- - metadata: - name: true or unknown - type: number + type: integer rows: - [1] ... @@ -481,7 +481,7 @@ box.execute("SELECT b FROM t ORDER BY b;") --- - metadata: - name: B - type: scalar + type: boolean rows: - [null] - [false] @@ -501,7 +501,7 @@ box.execute("SELECT b FROM t ORDER BY b LIMIT 1;") --- - metadata: - name: B - type: scalar + type: boolean rows: - [null] ... @@ -509,7 +509,7 @@ box.execute("SELECT b FROM t GROUP BY b LIMIT 1;") --- - metadata: - name: B - type: scalar + type: boolean rows: - [null] ... -- 2.15.1