From: Nikita Pettik <korablev@tarantool.org> To: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Cc: tarantool-patches@dev.tarantool.org Subject: Re: [Tarantool-patches] [PATCH v2 07/16] port: add dump format and request type to port_sql Date: Fri, 13 Dec 2019 16:55:42 +0300 [thread overview] Message-ID: <20191213135542.GA52107@tarantool.org> (raw) In-Reply-To: <527d98cf-be26-edcc-f615-c5b9a2f7dd7c@tarantool.org> On 03 Dec 23:51, Vladislav Shpilevoy wrote: > Thanks for the patch! > > See 4 comments below. > > On 20/11/2019 22:28, Nikita Pettik wrote: > > Dump formats of DQL and DML queries are different: the last one contains > > number of affected rows and optionally list of autoincremented ids; the > > first one comprises all meta-information including column names of > > resulting set and their types. What is more, dump format is going to be > > different for execute and prepare requests. So let's introduce separate > > member to struct port_sql responsible for dump format to be used. > > > > What is more, prepared statement finalization is required only for > > PREPARE-AND-EXECUTE requests. So let's keep request type in port as well. > > 1. I don't think it is a good idea to rely on certain > meta being returned by only certain requests. There is > a ticket, which will remove the border between different > request types: > https://github.com/tarantool/tarantool/issues/3649. It's in the wishlist, so I doubt that it will be implemented in observed feature. As an alternative to your proposal below I can suggest to add ref count to prepared statements. It is assumed to be increased once it is added to prepared statement cache and before execution; after execution it is decremented. > Yes, now this is either sql_info or metadata, but that > will change. > > > > > Note that C standard specifies that enums are integers, but it does not > > specify the size. Hence, let's use simple uint8 - mentioned enums are > > small enough to fit into it. > > 2. Try this: > > enum ... <member> : 8; Hm, doesn't it allocate one whole enum member anyway? If so, still undefined size is implied. > > --- a/src/box/execute.c > > +++ b/src/box/execute.c > > @@ -100,7 +100,9 @@ static void > > port_sql_destroy(struct port *base) > > { > > port_tuple_vtab.destroy(base); > > - sql_finalize(((struct port_sql *)base)->stmt); > > + struct port_sql *port_sql = (struct port_sql *) base; > > + if (port_sql->request == PREPARE_AND_EXECUTE) > > 3. You could turn the types into a bitmask to drop the > dependency on a certain request type: > > bool do_finalize : 1; Well, seems to be quite suitable, let's use it: diff --git a/src/box/execute.c b/src/box/execute.c index 0e731672c..dfe586334 100644 --- a/src/box/execute.c +++ b/src/box/execute.c @@ -101,7 +101,7 @@ port_sql_destroy(struct port *base) { port_tuple_vtab.destroy(base); struct port_sql *port_sql = (struct port_sql *) base; - if (port_sql->request == PREPARE_AND_EXECUTE) + if (port_sql->do_finalize) sql_stmt_finalize(((struct port_sql *)base)->stmt); } @@ -117,15 +117,14 @@ const struct port_vtab port_sql_vtab = { static void port_sql_create(struct port *port, struct sql_stmt *stmt, - enum sql_serialization_format format, - enum sql_request_type request) + enum sql_serialization_format format, bool do_finalize) { port_tuple_create(port); port->vtab = &port_sql_vtab; struct port_sql *port_sql = (struct port_sql *) port; port_sql->stmt = stmt; port_sql->serialization_format = format; - port_sql->request = request; + port_sql->do_finalize = do_finalize; } /** @@ -460,7 +459,7 @@ sql_prepare_and_execute(const char *sql, int len, const struct sql_bind *bind, assert(stmt != NULL); enum sql_serialization_format format = sql_column_count(stmt) > 0 ? DQL_EXECUTE : DML_EXECUTE; - port_sql_create(port, stmt, format, PREPARE_AND_EXECUTE); + port_sql_create(port, stmt, format, true); if (sql_bind(stmt, bind, bind_count) == 0 && sql_execute(stmt, port, region) == 0) return 0; diff --git a/src/box/execute.h b/src/box/execute.h index e9b74f7c8..c87e765cf 100644 --- a/src/box/execute.h +++ b/src/box/execute.h @@ -57,12 +57,6 @@ enum sql_serialization_format { DML_PREPARE = 3, }; -enum sql_request_type { - PREPARE_AND_EXECUTE = 0, - PREPARE = 1, - EXECUTE_PREPARED = 2 -}; - extern const char *sql_info_key_strs[]; struct region; @@ -107,8 +101,11 @@ struct port_sql { * DQL; and on type of SQL request: execute or prepare. */ uint8_t serialization_format; - /** enum sql_request_type */ - uint8_t request; + /** + * There's no need in clean-up in case of PREPARE request: + * statement remains in cache and will be deleted later. + */ + bool do_finalize; }; > bool do_omit_data : 1; do_omit_data is not enough: serialize formats are different for all four cases. > > + sql_finalize(((struct port_sql *)base)->stmt); > > } > > > > const struct port_vtab port_sql_vtab = { > > @@ -395,6 +404,9 @@ port_sql_dump_msgpack(struct port *port, struct obuf *out) > > mp_encode_int(buf, id_entry->id); > > } > > } > > + break; > > + } > > + default: unreachable(); > > 4. Please, wrap on a new line, and include into {}. I know, > this is shorter, but this just does not match the code > style. In the other place too. Okay: diff --git a/src/box/execute.c b/src/box/execute.c index 0e731672c..3bc4988b7 100644 --- a/src/box/execute.c +++ b/src/box/execute.c @@ -407,7 +406,9 @@ port_sql_dump_msgpack(struct port *port, struct obuf *out) } break; } - default: unreachable(); + default: { + unreachable(); + } } return 0; } diff --git a/src/box/lua/execute.c b/src/box/lua/execute.c index 2cbc5dfab..b164ffcaf 100644 --- a/src/box/lua/execute.c +++ b/src/box/lua/execute.c @@ -82,7 +82,9 @@ port_sql_dump_lua(struct port *port, struct lua_State *L, bool is_flat) } break; } - default: unreachable(); + default: { + unreachable(); + } } } > > } > > return 0; > > }
next prev parent reply other threads:[~2019-12-13 13:55 UTC|newest] Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-11-20 21:27 [Tarantool-patches] [PATCH v2 00/16] sql: prepared statements Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 01/16] sql: remove sql_prepare_v2() Nikita Pettik 2019-12-04 11:36 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 02/16] sql: refactor sql_prepare() and sqlPrepare() Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 11:36 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 03/16] sql: move sql_prepare() declaration to box/execute.h Nikita Pettik 2019-12-04 11:37 ` Konstantin Osipov 2019-12-05 13:32 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 04/16] sql: rename sqlPrepare() to sql_compile() Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-13 13:49 ` Nikita Pettik 2019-12-04 11:39 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 05/16] sql: move sql_finalize() to execute.h Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 11:39 ` Konstantin Osipov 2019-12-13 13:49 ` Nikita Pettik 2019-12-04 11:40 ` Konstantin Osipov 2019-12-05 13:37 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 06/16] port: increase padding of struct port Nikita Pettik 2019-12-04 11:42 ` Konstantin Osipov 2019-12-13 13:54 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 07/16] port: add dump format and request type to port_sql Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-13 13:55 ` Nikita Pettik [this message] 2019-12-04 11:52 ` Konstantin Osipov 2019-12-13 13:53 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 08/16] sql: resurrect sql_bind_parameter_count() function Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 11:54 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 09/16] sql: resurrect sql_bind_parameter_name() Nikita Pettik 2019-12-04 11:55 ` Konstantin Osipov 2019-12-04 11:55 ` Konstantin Osipov 2019-12-13 13:55 ` Nikita Pettik 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 10/16] sql: add sql_stmt_schema_version() Nikita Pettik 2019-12-04 11:57 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 11/16] sql: introduce sql_stmt_sizeof() function Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-13 13:56 ` Nikita Pettik 2019-12-04 11:59 ` Konstantin Osipov 2019-12-13 13:56 ` Nikita Pettik 2019-12-13 14:15 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 12/16] box: increment schema_version on ddl operations Nikita Pettik 2019-12-04 12:03 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 13/16] sql: introduce sql_stmt_query_str() method Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 12:04 ` Konstantin Osipov 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 14/16] sql: introduce cache for prepared statemets Nikita Pettik 2019-12-03 22:51 ` Vladislav Shpilevoy 2019-12-04 12:11 ` Konstantin Osipov 2019-12-17 14:43 ` Kirill Yukhin 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 15/16] box: introduce prepared statements Nikita Pettik 2019-12-04 12:13 ` Konstantin Osipov 2019-12-06 23:18 ` Vladislav Shpilevoy 2019-11-20 21:28 ` [Tarantool-patches] [PATCH v2 16/16] netbox: " Nikita Pettik 2019-12-06 23:18 ` Vladislav Shpilevoy 2019-12-03 22:51 ` [Tarantool-patches] [PATCH v2 00/16] sql: " Vladislav Shpilevoy 2019-12-17 15:58 ` Georgy Kirichenko
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=20191213135542.GA52107@tarantool.org \ --to=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v2 07/16] port: add dump format and request type to port_sql' \ /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