[Tarantool-patches] [PATCH] sql: raise an error on attempt to use HASH index in SQL

Nikita Pettik korablev at tarantool.org
Wed Jun 17 02:08:12 MSK 2020


On 16 Jun 18:06, Kirill Yukhin wrote:
> Since currently query planner is unable to use HASH indexes
> and attempt to use it will likely lead to SEGFAULT, this
> patch raises an error on attempt to open VDBE cursor
> against HASH index.
> 
> Closes #4659
> ---
> 
> ChangeLog entry:
> ## Bugs fixed
> ### SQL
> * Block using HASH indexes in SQL since scheduler

scheduler -> planner.

> is unable  to use it properly (gh-4659).

Not only hash indexes, but any other except for tree indexes.
 
> Issue: https://github.com/tarantool/tarantool/issues/4659
> Branch: https://github.com/tarantool/tarantool/tree/kyukhin/gh-4659-block-hash-index

Tests fail on your branch. See https://travis-ci.org/github/tarantool/tarantool/jobs/698493716

>  src/box/sql/build.c                            |  6 +++++
>  test/sql-tap/gh-4659-block-hash-index.test.lua | 35 ++++++++++++++++++++++++++
>  2 files changed, 41 insertions(+)
>  create mode 100755 test/sql-tap/gh-4659-block-hash-index.test.lua
> 
> diff --git a/src/box/sql/build.c b/src/box/sql/build.c
> index 0b60d2e..b429a4e 100644
> --- a/src/box/sql/build.c
> +++ b/src/box/sql/build.c
> @@ -722,6 +722,12 @@ vdbe_emit_open_cursor(struct Parse *parse_context, int cursor, int index_id,
>  		      struct space *space)
>  {
>  	assert(space != NULL);
> +	if (space->index[index_id]->def->type != TREE) {
> +		diag_set(ClientError, ER_UNSUPPORTED, "SQL",
> +			 "using of non-TREE index type");

Nit: I guess 'of' is reundant in this sentence. Also I'd include
hint in error message like: "... type. Please, use INDEXED BY clause
to force using proper index."

> diff --git a/test/sql-tap/gh-4659-block-hash-index.test.lua b/test/sql-tap/gh-4659-block-hash-index.test.lua
> new file mode 100755
> index 0000000..8c84e2d
> --- /dev/null
> +++ b/test/sql-tap/gh-4659-block-hash-index.test.lua
> @@ -0,0 +1,35 @@
> +#!/usr/bin/env tarantool
> +test = require("sqltester")
> +test:plan(2)
> +
> +-- gh-4782 - Raise an error in case space features HASH index.
> +-- Make sure that in case of attempt to use HASH index
> +-- from within SQL statement - an error is raised.
> +-- This is actually a stub until we are unable to employ
> +-- HASH index while planning a query.
> +
> +f = {
> +    {'1', 'unsigned'},
> +    {'2', 'string'},
> +}
> +
> +s = box.schema.create_space("T1", {format = f})
> +s:create_index('PK', {type = 'hash', parts = {'1'}})
> +
> +test:do_catchsql_test(
> +    "blocked-hash-index-1",
> +    "SELECT * FROM T1", {
> +        1, "SQL does not support using of non-TREE index type"
> +    })
> +
> +s = box.schema.create_space("T2", {format = f})
> +s:create_index('PK', {parts = {'2'}})
> +s:create_index('SK', {type = 'hash', parts = {'1'}})

Add a couple of tests covering other index types.

> +test:do_catchsql_test(
> +    "blocked-hash-index-1",
> +    "SELECT * FROM T2 INDEXED BY SK", {
> +        1, "SQL does not support using of non-TREE index type"
> +    })
> +
> +test:finish_test()
> -- 
> 1.8.3.1
> 


More information about the Tarantool-patches mailing list