From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: Mergen Imeev <imeevma@tarantool.org> Cc: tarantool-patches@dev.tarantool.org Subject: Re: [Tarantool-patches] [PATCH v3 3/5] sql: introduce SET statement Date: Sun, 17 Nov 2019 18:26:48 +0100 [thread overview] Message-ID: <3d76e64a-cd03-1bf1-5830-0d0b142a5e27@tarantool.org> (raw) In-Reply-To: <20191115140609.GA15961@tarantool.org> Hi! Thanks for the fixes! See 4 comments below. >>>>> @@ -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. >>> No, PRAGMA also set during parsing. I once suggested to >>> change it, so parser would only parse, but my suggestion >>> was declined. >> >> 3. This is bad and should be fixed. >> https://github.com/tarantool/tarantool/issues/4621 > Fixed. Since control pragmas will be deleted, SET is now > using VDBE I closed the issue in this commit. Still, it > may be better to close it in the last commit of the > patch-set. Should I move it to the last commit? 1. You can try to fix it now, it is ok. Talking of control pragmas, PRAGMA still exists after your patch. And still works during parsing. I don't know what to do with it, because I don't know what are we going to do with PRAGMA. And seems like nobody knows. > 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 > Closes #4621 2. This commit message is getting worse and worse. I think it needs to be totally rewritten. Still existing problems with the current message: - I don't understand, which pragmas are totally deleted, which moved to SET, which of the moved have a new name; - From the message it still is not clear when a user needs to use PRAGMA and when SET. Yes, you said PRAGMA is purely informative, but I don't see it in the message. And the technical writer, who will see this message out of all the discussion, will be very confused with what has happened, and will ask for more details, I can guarantee that; - Parts of the message before '@Tarantoolbot document' and after are in some ideas different, in some they are totally the same. I propose you to remove the part before doc request, and write the doc request more accurate. And check again that all deleted PRAGMAs really don't work (in the last patch), all new SETs really work, with exactly the same names as in the commit message; - I think you need to explain what is a result of SET - metadata like DQL? Sql_info like DML/DDL? > > @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' > > All of these setting with exception of 'sql_compound_select_limit' > are session-local settings. Their value can be viewed in > _vsession_settings sysview. > > Example of usage: > SET sql_full_column_names = true; > SET sql_compound_select_limit = 10; > SET sql_default_engine = 'memtx'; > > diff --git a/src/box/sql/build.c b/src/box/sql/build.c > index ce87b88..8e3ba6a 100644 > --- a/src/box/sql/build.c > +++ b/src/box/sql/build.c > @@ -3382,3 +3397,86 @@ sql_session_opt_tuple(struct tuple_format *format, int option_id, > *result = tuple; > return 0; > } > + > +int > +sql_set_session_option(int id, void *opt_value) > +{ > + struct Expr *value = (struct Expr *)opt_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]); > + return -1; > + } > + 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) { > + diag_set(ClientError, ER_NO_SUCH_ENGINE, > + value->u.zToken); > + return -1; > + } > + current_session()->sql_default_engine = engine; > + } > + return 0; > +} > + > +int > +sql_set_global_option(int id, void *opt_value) > +{ > + struct Expr *value = (struct Expr *)opt_value; > + (void)id; > + assert(id == SQL_GLOBAL_OPTION_COMPOUND_SELECT_LIMIT); > + int limit = value->u.iValue; > + int rc = sql_limit(sql_get(), SQL_LIMIT_COMPOUND_SELECT, limit); > + assert(rc >= 0); > + return rc < 0 ? -1 : 0; > +} > + > +void > +sql_set_settings(struct Parse *parse_context, struct Token *name, > + struct Expr *value) > +{ > + int opt_id; > + const char *val = (const char*) value; > + struct Vdbe *vdbe = sqlGetVdbe(parse_context); > + char *name_str = sql_name_from_token(sql_get(), name); > + if (name_str == NULL) { > + parse_context->is_aborted = true; > + return; > + } > + /* Try to find the option among the session options. */ > + for (opt_id = 0; opt_id < SQL_SESSION_OPTION_max; ++opt_id) { > + if (strcasecmp(sql_session_opts[opt_id].name, name_str) == 0) { > + sqlVdbeAddOp4(vdbe, OP_Set, 0, opt_id, 0, val, P4_PTR); > + return; 3. Expr is a parser time structure. You can't use it at runtime. 4. There is a leak. 'val' is not freed. > + } > + } > + /* Try to find the option among the global options. */ > + for (opt_id = 0; opt_id < SQL_GLOBAL_OPTION_max; ++opt_id) { > + if (strcasecmp(sql_global_opts[opt_id].name, name_str) == 0) { > + sqlVdbeAddOp4(vdbe, OP_Set, 1, opt_id, 0, val, P4_PTR); > + return; > + } > + } > + diag_set(ClientError, ER_SQL_PARSER_GENERIC, "Setting is not found"); > + parse_context->is_aborted = true; > + return; > +}
next prev parent reply other threads:[~2019-11-17 17:20 UTC|newest] Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-11-07 10:36 [Tarantool-patches] [PATCH v3 0/5] Replace control pragmas by SET imeevma 2019-11-07 10:36 ` [Tarantool-patches] [PATCH v3 1/5] sysview: make get() and create_iterator() methods virtual imeevma 2019-11-07 10:36 ` [Tarantool-patches] [PATCH v3 2/5] box: introdice _vsession_settings sysview imeevma 2019-11-07 10:36 ` [Tarantool-patches] [PATCH v3 3/5] sql: introduce SET statement imeevma 2019-11-07 12:40 ` Vladislav Shpilevoy 2019-11-07 14:12 ` Mergen Imeev 2019-11-11 21:56 ` Vladislav Shpilevoy 2019-11-15 14:06 ` Mergen Imeev 2019-11-17 17:26 ` Vladislav Shpilevoy [this message] 2019-11-17 20:32 ` Vladislav Shpilevoy 2019-11-27 10:33 ` Mergen Imeev 2019-11-27 23:03 ` Vladislav Shpilevoy 2019-11-27 23:07 ` Vladislav Shpilevoy 2019-11-27 23:09 ` Vladislav Shpilevoy 2019-11-28 8:59 ` Mergen Imeev 2019-11-28 8:56 ` Mergen Imeev 2019-11-07 10:36 ` [Tarantool-patches] [PATCH v3 4/5] temporary: disable boolean.test.sql imeevma 2019-11-07 10:37 ` [Tarantool-patches] [PATCH v3 5/5] sql: replace control pragmas imeevma 2019-12-06 11:37 ` [Tarantool-patches] [PATCH v3 0/5] Replace control pragmas by SET Kirill Yukhin 2019-12-06 13:50 ` Mergen Imeev 2019-12-06 14:06 ` Sergey Ostanevich 2019-12-17 22:11 ` Alexander Turenko 2019-12-18 2:39 ` Peter Gulutzan 2019-12-18 17:39 ` Peter Gulutzan 2019-12-19 9:59 ` Mergen Imeev 2019-12-19 17:35 ` Peter Gulutzan 2019-12-19 17:51 ` Mergen Imeev 2019-12-19 21:09 ` Vladislav Shpilevoy 2019-12-18 10:20 ` Kirill Yukhin 2019-12-18 10:53 ` Alexander Turenko
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=3d76e64a-cd03-1bf1-5830-0d0b142a5e27@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=imeevma@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v3 3/5] sql: introduce SET statement' \ /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