[tarantool-patches] Re: [PATCH 8/8] sql: introduce dry-run execution

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Thu Aug 29 23:46:21 MSK 2019


Thanks for the patch!

See 2 comments below.

On 27/08/2019 15:34, Nikita Pettik wrote:
> To get result of dry-run execution locally, one can use
> box.dry_run("sql_string") method, which returns query's
> meta-information. Note this method does not support binding values
> substitution.
> 
> To get result of dry-run execution using net.box facilities, one can
> pass map containing dry_run options to :execute() method (leaving array
> of bindings empty):
> 
> cn:execute("SELECT 1;", {}, {{dry_run = true}})
> 
> Or simply set options considering their order:
> 
> cn:execute("SELECT 1;", {}, {true})
> 
> Note that there's no binding substitution even if array of values to be
> bound is not empty. Also, dry-run execution for DML and DDL request
> doesn't make any sense - zero row_count is always returned.
> 
> Under the hood we add 'meta_only' flag to struct port_sql, which
> regulates whether response contains only metadata or metadata and
> tuples forming the result set of query.
> 
> Closes #3292

1. JFR, we will need a docbot request. About box, netbox, and the binary
protocol.

> diff --git a/src/box/iproto.cc b/src/box/iproto.cc
> index a92e66ace..22019efaa 100644
> --- a/src/box/iproto.cc
> +++ b/src/box/iproto.cc
> @@ -1671,14 +1671,16 @@ tx_process_sql(struct cmsg *m)
>  	if (sql_prepare(sql, len, &stmt, NULL) != 0)
>  		goto error;
>  	assert(stmt != NULL);
> -	port_sql_create(&port, stmt);
> -	if (sql_bind(stmt, bind, bind_count) != 0) {
> -		port_destroy(&port);
> -		goto error;
> -	}
> -	if (sql_execute(stmt, &port, &fiber()->gc) != 0) {
> -		port_destroy(&port);
> -		goto error;
> +	port_sql_create(&port, stmt, opts.dry_run);
> +	if (!opts.dry_run) {
> +		if (sql_bind(stmt, bind, bind_count) != 0) {
> +			port_destroy(&port);
> +			goto error;
> +		}
> +		if (sql_execute(stmt, &port, &fiber()->gc) != 0) {
> +			port_destroy(&port);
> +			goto error;
> +		}
>  	}

2. This should be done inside sql_prepare_and_execute(), which
will take sql_opts parameter. It will allow you to 1) keep
sql_port encapsulated, 2) don't duplicate this code for Lua and
iproto versions.




More information about the Tarantool-patches mailing list