[tarantool-patches] Re: [PATCH 1/6] sql: move constraint name to struct contraint_parse

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Wed Jan 16 23:54:09 MSK 2019


Hi! Thanks for the fixes! See 2 comments below.

> diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h
> index 51a5d01b5..981e3c660 100644
> --- a/src/box/sql/sqliteInt.h
> +++ b/src/box/sql/sqliteInt.h
> @@ -2697,7 +2697,7 @@ struct fkey_parse {
>    */
>   struct constraint_parse {
>          /** Name of table which constraint belongs to. */
> -       struct SrcList *table_name;
> +       struct SrcList *table;
>          /** Name of the constraint currently being parsed. */
>          struct Token name;
>   };
> 
>>
>>> +	/** Name of the constraint currently being parsed. */
>>> +	struct Token name;
>>> +};
>>
>> 2.1. Also, I see that struct constraint_parse is not able to
>> describe a foreign key - it has no parent table, referenced
>> columns - you pass them separately from struct constraint_parse
>> which looks contr-intuitive. Can you please, elaborate so it,
>> for example, has struct fkey_parse as a member? Or at least,
>> have both parent and child table name and cols as Token and
>> ExprList pointers?
> 
> According to ANSI only three constraints can be added:
> UNIQUE/PK, FK and CHECK.

1. But you've named foreign key system space _fk_constraint ...
And here you have struct constraint_parse, which is not able to
fit a whole fk *constraint*.

> Only name of table and name
> of constraint are shared among features of these constraints:
> CHECK also has ExprSpan and UNIQUE - columns (child).
> I guess it is fair to move child cols to this structure,
> but other members seems to be redundant.
> Hence, I will add parent name and parent colls
> only if you insist.

If I were you I would add here both child and parent attributes,
is_deferred, action, but who am I to insist on anything? Please,
consult server team chat whether we should consider foreign keys
as constraints. Or do nothing. I am not a manager, so it is just
an advice. I do not insist on elaborating this structure further.
(Although it looks unfinished to me.)

> 
> diff --git a/src/box/sql/build.c b/src/box/sql/build.c
> index 963b16626..af961592a 100644
> --- a/src/box/sql/build.c
> +++ b/src/box/sql/build.c
> 
> @@ -727,8 +726,10 @@ sqlite3AddPrimaryKey(Parse * pParse,       /* Parsing context */
>                                                               &token, 0));
>                  if (list == NULL)
>                          goto primary_key_exit;
> -               sql_create_index(pParse, 0, 0, list, 0, SORT_ORDER_ASC,
> +               pParse->constraint.cols = list;
> +               sql_create_index(pParse, 0, 0, 0, SORT_ORDER_ASC,
>                                   false, SQL_INDEX_TYPE_CONSTRAINT_PK);
> +               pParse->constraint.cols = NULL;

2. I think, that it is safer to nullify pParse->constraint.cols in the
same place where it is deleted, inside sql_create_index. What do you think?
Also, it removes code duplication here and in the hunk below.

>                  if (db->mallocFailed)
>                          goto primary_key_exit;
>          } else if (autoInc) {
> @@ -736,8 +737,10 @@ sqlite3AddPrimaryKey(Parse * pParse,       /* Parsing context */
>                                  "INTEGER PRIMARY KEY or INT PRIMARY KEY");
>                  goto primary_key_exit;
>          } else {
> -               sql_create_index(pParse, 0, 0, pList, 0, sortOrder, false,
> +               pParse->constraint.cols = pList;
> +               sql_create_index(pParse, 0, 0, 0, sortOrder, false,
>                                   SQL_INDEX_TYPE_CONSTRAINT_PK);
> +               pParse->constraint.cols = NULL;
>                  pList = 0;
>                  if (pParse->nErr > 0)
>                          goto primary_key_exit;
>




More information about the Tarantool-patches mailing list