[Tarantool-patches] [PATCH v3 3/5] sql: introduce SET statement

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Thu Nov 7 15:40:39 MSK 2019


Hi! Thanks for the fixes!

See 5 comments below.

On 07/11/2019 13:36, imeevma at tarantool.org wrote:
> Due to the removal of sql_compound_select_limit from the session
> options, this patch has been modified.
> 
> New patch:
> 
> From 12ed4be2e7e433fdca58a43fc3b937eb9a54f52f Mon Sep 17 00:00:00 2001
> From: Mergen Imeev <imeevma at gmail.com>
> Date: Wed, 16 Oct 2019 16:43:10 +0300
> Subject: [PATCH] sql: introduce SET statement
> 
> This patch creates an SQL SET statement. This statement replaces
> pragmas that can modify SQL settings. List of pragmas that will
> have the corresponding option in SET:
> 'defer_foreign_keys'
> 'full_column_names'
> 'recursive_triggers'
> 'reverse_unordered_selects'
> 'sql_compound_select_limit'
> 'sql_default_engine'
> 
> 'parser_trace'
> 'select_trace'
> 'sql_trace'
> 'vdbe_addoptrace'
> 'vdbe_debug'
> 'vdbe_eqp'
> 'vdbe_listing'
> 'vdbe_trace'
> 'where_trace'
> 
> All these pragmas along with the pragmas 'short_column_names' and
> 'count_changes' will be removed in the next patch.
> 
> Part of #4511
> 
> @TarantoolBot document
> Title: SQL SET statement
> SQL SET statement is used to change SQL settings. To change the
> value of an SQL parameter, use the following syntax:
> 
> SET <name of the setting> = <value of the setting>;
> 
> Currently available SQL settings:
> 'sql_defer_foreign_keys'
> 'sql_full_column_names'
> 'sql_recursive_triggers'
> 'sql_reverse_unordered_selects'
> 'sql_compound_select_limit'
> 'sql_default_engine'
> 
> In addition, SQL debugging settings can also be changed using this
> statement in the debug build:
> 'sql_parser_trace'
> 'sql_select_trace'
> 'sql_trace'
> 'sql_vdbe_addoptrace'
> 'sql_vdbe_debug'
> 'sql_vdbe_eqp'
> 'sql_vdbe_listing'
> 'sql_vdbe_trace'
> 'sql_where_trace'
> 
> Example of usage:
> SET full_column_names = true;

1. I tried this:

tarantool> box.execute('SET full_column_names = true;')
---
- null
- Setting is not found
...

???

> SET sql_compound_select_limit = 10;
> SET sql_default_engine = 'memtx';

2. It would be cool to sum up here what is a purpose of
PRAGMA and SET. How are they different. From the code I
see, that looks like PRAGMA never changes anything. It
only returns something. While SET only sets and never
returns, right?

In the next patch I see diff like this:

> -        return test:execsql "PRAGMA full_column_names"
> -    end, {
> +        return box.space._vsession_settings:get("sql_full_column_names").value
> +    end,

Is there any plan how to make it simpler? Seems like it is
impossible for a user to get session settings other than via
direct select from a system space. It was simpler with PRAGMA.

> 
> diff --git a/src/box/sql/build.c b/src/box/sql/build.c
> index ce87b88..77f8dd4 100644
> --- a/src/box/sql/build.c
> +++ b/src/box/sql/build.c
> @@ -3275,6 +3275,21 @@ enum {
>  	SQL_SESSION_OPTION_max,
>  };
>  
> +

3. Nit: unnecessary empty line.

> +/**
> + * Identifiers of all SQL global options that can be viewed. The
> + * identifier of the option is equal to its place in the sorted
> + * list of global options, which starts at 0.
> + *
> + * It is IMPORTANT that these options are sorted by name. If this
> + * is not the case, the result returned by the _vsession_settings
> + * space iterator will not be sorted properly.

4. First question - why should they be sorted? Second question -
aren't they removed from _vsession_settings space?

> + */
> +enum {
> +	SQL_GLOBAL_OPTION_COMPOUND_SELECT_LIMIT = 0,
> +	SQL_GLOBAL_OPTION_max,
> +};
> @@ -3382,3 +3408,82 @@ sql_session_opt_tuple(struct tuple_format *format, int option_id,
>  	*result = tuple;
>  	return 0;
>  }
> +
> +static void
> +sql_set_session_option(struct Parse *parse_context, int id, struct Expr *value)
> +{
> +	struct session *session = current_session();
> +	struct sql_option_metadata *option = &sql_session_opts[id];
> +	if (value->type != option->field_type) {
> +		diag_set(ClientError, ER_INCONSISTENT_TYPES,
> +			 field_type_strs[option->field_type],
> +			 field_type_strs[value->type]);
> +		parse_context->is_aborted = true;
> +		return;
> +	}
> +	if (value->type == FIELD_TYPE_BOOLEAN) {
> +		bool is_set = value->op == TK_TRUE;
> +		if (is_set)
> +			session->sql_flags |= option->mask;
> +		else
> +			session->sql_flags &= ~option->mask;
> +#ifndef NDEBUG
> +		if (id == SQL_SESSION_OPTION_PARSER_TRACE) {
> +			if (is_set)
> +				sqlParserTrace(stdout, "parser: ");
> +			else
> +				sqlParserTrace(NULL, NULL);
> +		}
> +#endif
> +	} else {
> +		assert(id == SQL_SESSION_OPTION_DEFAULT_ENGINE);
> +		enum sql_storage_engine engine =
> +			STR2ENUM(sql_storage_engine, value->u.zToken);
> +		if (engine == sql_storage_engine_MAX) {
> +			parse_context->is_aborted = true;
> +			diag_set(ClientError, ER_NO_SUCH_ENGINE,
> +				 value->u.zToken);
> +			return;
> +		}
> +		current_session()->sql_default_engine = engine;
> +	}
> +}

5. Wait. So the settings are set during parsing? Isn't it wrong?
'Parser only parses' and everything? PRAGMA works in runtime.


More information about the Tarantool-patches mailing list