[Tarantool-patches] [PATCH v5 6/6] sql: remove implicit cast from MakeRecord opcode

Nikita Pettik korablev at tarantool.org
Fri Sep 18 15:28:10 MSK 2020


On 21 Aug 12:19, imeevma at tarantool.org wrote:
> This patch removes implicit casting from MakeRecord opcode.
> 
> Closes #4230
> 
> @TarantoolBot document
> Title: remove implicit cast for comparison
> 
> After this patch-set, there will be no implicit casts for comparison.
> This means that the values ​of the field types STRING, BOOLEAN and

Again these strange characters in commit msg..

> VARBINARY can be compared with the values of the same field type.

Only.

> Any numerical value can be compared with any other numerical value.
> 
> Example:
> 
> ```
> tarantool> box.execute([[SELECT '1' > 0;]])
> ---
> - null
> - 'Type mismatch: can not convert 1 to numeric'
> ...
> 
> tarantool> box.execute([[SELECT true > X'33';]])
> ---
> - null
> - 'Type mismatch: can not convert boolean to varbinary'
> ...
> 
> tarantool> box.execute([[SELECT 1.23 > 123;]])
> ---
> - metadata:
>   - name: 1.23 > 123
>     type: boolean
>   rows:
>   - [false]
> ...
> ```
> ---
> diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c
> index bc2182446..d553b80db 100644
> --- a/src/box/sql/expr.c
> +++ b/src/box/sql/expr.c
> @@ -2886,11 +2886,18 @@ sqlCodeSubselect(Parse * pParse,	/* Parsing context */
>  						jmpIfDynamic = -1;
>  					}
>  					r3 = sqlExprCodeTarget(pParse, pE2, r1);
> -					enum field_type types[2] =
> -						{ lhs_type, field_type_MAX };
> -	 				sqlVdbeAddOp4(v, OP_MakeRecord, r3,
> -							  1, r2, (char *)types,
> -							  sizeof(types));
> +					uint32_t size =
> +						2 * sizeof(enum field_type);
> +					enum field_type *types=
> +						sqlDbMallocZero(pParse->db,

Why do you have manually alloc types? It is done in sqlVdbeAddOp4()
if pass n > 0 (like it was before your refactoring).

> +								size);
> +					types[0] = lhs_type;
> +					types[1] = field_type_MAX;
> +					sqlVdbeAddOp4(v, OP_ApplyType, r3, 1, 0,
> +						      (char *)types, P4_DYNAMIC);
> +					sqlVdbeChangeP5(v, OPFLAG_DO_NOT_CONVERT_NUMBERS);
> +					sqlVdbeAddOp3(v, OP_MakeRecord, r3, 1,
> +						      r2);
>  					sql_expr_type_cache_change(pParse,
>  								   r3, 1);
>  					sqlVdbeAddOp2(v, OP_IdxInsert, r2,

You also can remove now mem_apply_type().

> diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
> index a0ddbaf60..544619b03 100644
> --- a/src/box/sql/vdbe.c
> +++ b/src/box/sql/vdbe.c
> @@ -3145,24 +3145,17 @@ type_mismatch:
>  	break;
>  }
>  
> diff --git a/test/sql-tap/in3.test.lua b/test/sql-tap/in3.test.lua
> index a6d842962..7f3abbae0 100755
> --- a/test/sql-tap/in3.test.lua
> +++ b/test/sql-tap/in3.test.lua
> @@ -1,6 +1,6 @@
>  #!/usr/bin/env tarantool
>  test = require("sqltester")
> -test:plan(28)
> +test:plan(26)
>  
>  --!./tcltestrunner.lua
>  -- 2007 November 29
> @@ -334,18 +334,6 @@ test:do_test(
>          -- </in3-3.4>
>      })
>  
> -test:do_test(
> -    "in3-3.5",
> -    function()
> -        -- Numeric affinity should be applied to each side before the comparison
> -        -- takes place. Therefore we cannot use index t1_i1, which has no affinity.
> -        return exec_neph(" SELECT y IN (SELECT a FROM t1) FROM t2 ")
> -    end, {
> -        -- <in3-3.5>
> -        1, true
> -        -- </in3-3.5>
> -    })
> -
>  test:do_test(
>      "in3-3.6",
>      function()
> @@ -358,18 +346,6 @@ test:do_test(
>          -- </in3-3.6>
>      })
>  
> -test:do_test(
> -    "in3-3.7",
> -    function()
> -        -- Numeric affinity is applied before the comparison takes place. 
> -        -- Making it impossible to use index t1_i3.
> -        return exec_neph(" SELECT y IN (SELECT c FROM t1) FROM t2 ")
> -    end, {
> -        -- <in3-3.7>
> -        1, true
> -        -- </in3-3.7>
> -    })
> -

Why did you remove these tests?

>  -----------------------------------------------------------------------
>  --
>  -- Test using a multi-column index.


More information about the Tarantool-patches mailing list