Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: Nikita Pettik <korablev@tarantool.org>,
	tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH 4/6] sql: extend result set with nullability
Date: Thu, 28 Nov 2019 23:41:57 +0100	[thread overview]
Message-ID: <29dc1d4c-215c-902a-0532-259814a15740@tarantool.org> (raw)
In-Reply-To: <3ab4973b2ba51caca2e6c211a66a5f6fdf6faff7.1574846892.git.korablev@tarantool.org>

Thanks for the patch!

You added a leading whitespace to the commit title.

Here is a strange example:

    box.cfg{}
    s = box.schema.create_space('TEST', {
        format = {{'ID', 'unsigned'}, {'COL', 'unsigned', is_nullable = true}}
    })
    pk = s:create_index('pk', {parts = {{'ID'}, {'COL', is_nullable = false}}})

In that example I defined a 'false-nullable' column. It
is nullable in the space format, but is not in the
index format. The strictest rule wins, so it is not nullable
after all. That can be seen in struct tuple_format. SQL says,
that it is nullable. But this is not a real problem. Perhaps
this might be even right. However the next example certainly
misses something:

    box.execute('SELECT * FROM test')
    ---
    - metadata:
      - name: ID
        type: unsigned
      - name: COL
        type: unsigned
      rows: []
    ...

    box.execute('SELECT col FROM test')
    ---
    - metadata:
      - type: unsigned
        name: COL
        is_nullable: true
      rows: []
    ...

As you can see, nullable depends on whether I select a
column explicitly or not. Perhaps the same happens to
autoincrement meta, I didn't check.

See 5 comments below.

On 27/11/2019 13:15, Nikita Pettik wrote:
> If member of result set is (solely) column identifier, then metadata
> will contain its corresponding field nullability as boolean property.
> Note that indicating nullability for other expressions (like x + 1)
> may make sense but it requires derived nullability calculation which in
> turn seems to be overkill (at least in scope of current patch).
> 
> Part of #4407
> ---
>  src/box/execute.c                                |  18 +-
>  src/box/iproto_constants.h                       |   1 +
>  src/box/lua/execute.c                            |   5 +
>  src/box/lua/net_box.c                            |   7 +-
>  src/box/sql/select.c                             |   6 +-
>  src/box/sql/sqlInt.h                             |   3 +
>  src/box/sql/vdbe.h                               |   3 +
>  src/box/sql/vdbeInt.h                            |   5 +
>  src/box/sql/vdbeapi.c                            |   7 +
>  src/box/sql/vdbeaux.c                            |   7 +
>  test/box/sql-update-with-nested-select.result    |   5 +-
>  test/sql/boolean.result                          | 425 ++++++++++++++---------
>  test/sql/check-clear-ephemeral.result            |   5 +-
>  test/sql/collation.result                        |  74 ++--
>  test/sql/gh-3199-no-mem-leaks.result             | 120 ++++---
>  test/sql/gh2141-delete-trigger-drop-table.result |  20 +-
>  test/sql/gh2251-multiple-update.result           |  10 +-
>  test/sql/iproto.result                           | 105 +++---
>  test/sql/misc.result                             |  25 +-
>  test/sql/on-conflict.result                      |  20 +-
>  test/sql/persistency.result                      | 190 ++++++----
>  test/sql/row-count.result                        |  25 +-
>  test/sql/sql-debug.result                        |  15 +-
>  test/sql/transition.result                       | 190 ++++++----
>  test/sql/types.result                            | 105 +++---
>  test/sql/update-with-nested-select.result        |   5 +-
>  26 files changed, 862 insertions(+), 539 deletions(-)
> 
> diff --git a/src/box/execute.c b/src/box/execute.c
> index 20bfd0957..98812ae1e 100644
> --- a/src/box/execute.c
> +++ b/src/box/execute.c
> @@ -267,8 +267,10 @@ error:
>  	region_truncate(region, svp);
>  	return -1;
>  }
> +
>  static size_t
> -metadata_map_sizeof(const char *name, const char *type, const char *coll)
> +metadata_map_sizeof(const char *name, const char *type, const char *coll,
> +		    int nullable)

1. Please, rename to 'is_nullable'. Here and in other places.

>  {
>  	uint32_t members_count = 2;
>  	size_t map_size = 0;
> @@ -277,6 +279,11 @@ metadata_map_sizeof(const char *name, const char *type, const char *coll)
>  		map_size += mp_sizeof_uint(IPROTO_FIELD_COLL);
>  		map_size += mp_sizeof_str(strlen(coll));
>  	}
> +	if (nullable != -1) {
> +		members_count++;
> +		map_size += mp_sizeof_uint(IPROTO_FIELD_NULLABLE);

2. This too. IPROTO_FIELD_IS_NULLABLE.

> +		map_size += mp_sizeof_bool(nullable);
> +	}
>  	map_size += mp_sizeof_uint(IPROTO_FIELD_NAME);
>  	map_size += mp_sizeof_uint(IPROTO_FIELD_TYPE);
>  	map_size += mp_sizeof_str(strlen(name));
> @@ -334,6 +342,10 @@ sql_get_metadata(struct sql_stmt *stmt, struct obuf *out, int column_count)
>  			pos = mp_encode_uint(pos, IPROTO_FIELD_COLL);
>  			pos = mp_encode_str(pos, coll, strlen(coll));
>  		}
> +		if (nullable != -1) {
> +			pos = mp_encode_uint(pos, IPROTO_FIELD_NULLABLE);
> +			pos = mp_encode_bool(pos, nullable);
> +		}

3. We send autoincrement only in case it is true.
Then how about sending nullability only in case it
is true? To save a bit of the network.

>  	}
>  	return 0;
>  }
> diff --git a/src/box/iproto_constants.h b/src/box/iproto_constants.h
> index fa9c029a2..030c25531 100644
> --- a/src/box/iproto_constants.h
> +++ b/src/box/iproto_constants.h
> @@ -132,6 +132,7 @@ enum iproto_metadata_key {
>  	IPROTO_FIELD_NAME = 0,
>  	IPROTO_FIELD_TYPE = 1,
>  	IPROTO_FIELD_COLL = 2,
> +	IPROTO_FIELD_NULLABLE = 3

4. Please, add a comma after 3 so as not to
change this line in the next commit.

>  };
>  
>  enum iproto_ballot_key {
> diff --git a/src/box/sql/select.c b/src/box/sql/select.c
> index 66e8c1274..b772bcead 100644
> --- a/src/box/sql/select.c
> +++ b/src/box/sql/select.c
> @@ -1836,7 +1837,10 @@ generate_column_metadata(struct Parse *pParse, struct SrcList *pTabList,
>  			} else {
>  				vdbe_set_metadata_col_name(v, i, zCol);
>  			}
> -
> +			bool is_nullable = space_def->fields[iCol].is_nullable;
> +			if (p->op == TK_COLUMN)
> +				vdbe_set_metadata_col_nullability(v, i,
> +								  is_nullable);

5. Please, wrap into {}.

  reply	other threads:[~2019-11-28 22:42 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-27 12:15 [Tarantool-patches] [PATCH 0/6] sql: extend response metadata Nikita Pettik
2019-11-27 12:15 ` [Tarantool-patches] [PATCH 1/6] sql: refactor resulting set metadata Nikita Pettik
2019-11-28 22:41   ` Vladislav Shpilevoy
2019-12-05 11:39     ` Nikita Pettik
2019-12-05 23:58       ` Vladislav Shpilevoy
2019-12-06 12:48         ` Nikita Pettik
2019-12-17 13:23   ` Sergey Ostanevich
2019-11-27 12:15 ` [Tarantool-patches] [PATCH 2/6] sql: fix possible null dereference in sql_expr_coll() Nikita Pettik
2019-11-28 22:42   ` Vladislav Shpilevoy
2019-12-05 11:40     ` Nikita Pettik
2019-12-05 23:59       ` Vladislav Shpilevoy
2019-12-06 12:48         ` Nikita Pettik
2019-12-17 13:30           ` Sergey Ostanevich
2019-12-17 14:44             ` Nikita Pettik
2019-12-17 19:53               ` Nikita Pettik
2019-11-27 12:15 ` [Tarantool-patches] [PATCH 3/6] sql: extend result set with collation Nikita Pettik
2019-11-28 22:41   ` Vladislav Shpilevoy
2019-12-05 11:50     ` Nikita Pettik
2019-12-18 11:08   ` Sergey Ostanevich
2019-12-24  0:44     ` Nikita Pettik
2019-11-27 12:15 ` [Tarantool-patches] [PATCH 4/6] sql: extend result set with nullability Nikita Pettik
2019-11-28 22:41   ` Vladislav Shpilevoy [this message]
2019-12-05 11:50     ` Nikita Pettik
2019-12-06  0:00       ` Vladislav Shpilevoy
2019-12-06 12:49         ` Nikita Pettik
2019-12-18 13:31   ` Sergey Ostanevich
2019-11-27 12:15 ` [Tarantool-patches] [PATCH 5/6] sql: extend result set with autoincrement Nikita Pettik
2019-11-28 22:41   ` Vladislav Shpilevoy
2019-12-05 11:51     ` Nikita Pettik
2019-12-18 15:17   ` Sergey Ostanevich
2019-12-24  0:47     ` Nikita Pettik
2019-11-27 12:15 ` [Tarantool-patches] [PATCH 6/6] sql: extend result set with alias Nikita Pettik
2019-11-28 22:41   ` Vladislav Shpilevoy
2019-12-05 11:51     ` Nikita Pettik
2019-12-06  0:02       ` Vladislav Shpilevoy
2019-12-06 12:50         ` Nikita Pettik
2019-12-06 21:52           ` Vladislav Shpilevoy
2019-12-19 15:17   ` Sergey Ostanevich
2019-12-24  0:27     ` Nikita Pettik
2019-11-28 22:55 ` [Tarantool-patches] [PATCH 0/6] sql: extend response metadata Vladislav Shpilevoy

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=29dc1d4c-215c-902a-0532-259814a15740@tarantool.org \
    --to=v.shpilevoy@tarantool.org \
    --cc=korablev@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH 4/6] sql: extend result set with nullability' \
    /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