[tarantool-patches] Re: [PATCH v1 2/4] sql: disallow use of TYPEOF in Check
Konstantin Osipov
kostja at tarantool.org
Fri Jan 18 21:04:17 MSK 2019
* Kirill Shcherbatov <kshcherbatov at tarantool.org> [19/01/10 23:12]:
> Due to the fact that we are going to perform CHECKs validations
> on the server side, checks are performed on the fields with
> affinity already applied that may differ with type of original
> data.
> After the introduction of static types, the need for type checks
> based on the CHECKs disappeared.
>
> Need for #3691
> ---
> src/box/sql/build.c | 23 ++++++++++
> test/sql-tap/check.test.lua | 89 ++-----------------------------------
> 2 files changed, 26 insertions(+), 86 deletions(-)
>
> diff --git a/src/box/sql/build.c b/src/box/sql/build.c
> index 7e5bcc518..9c6b1b49a 100644
> --- a/src/box/sql/build.c
> +++ b/src/box/sql/build.c
> @@ -756,12 +756,35 @@ primary_key_exit:
> return;
> }
>
> +static int
> +sql_check_expr_test_callback(struct Walker *walker, struct Expr *expr)
> +{
> + if (expr->op == TK_FUNCTION && strcmp(expr->u.zToken, "TYPEOF") == 0) {
> + diag_set(ClientError, ER_SQL, "TYPEOF function is forbidden "
> + "for usage in Check constraint");
> + walker->eCode = 1;
> + return WRC_Abort;
> + }
> + return WRC_Continue;
> +}
This callback needs a comment. All functions need a comment, even
static ones. A commonly accepted abbreviation for callbacks is _cb
ending.
A better option for function name would be ck_constraint_walk_expr_cb.
Please reply to my questions in previous emails.
> void
> sql_add_check_constraint(struct Parse *parser, struct ExprSpan *span)
> {
> struct Expr *expr = span->pExpr;
> struct Table *table = parser->pNewTable;
> if (table != NULL) {
> + /* Test if Check expression valid. */
is valid. valid is a general term. What problems specifically are
you looking for? What is forbidden in a check expression? please
add a better comment.
> + struct Walker w;
> + memset(&w, 0, sizeof(w));
> + w.xExprCallback = sql_check_expr_test_callback;
> + sqlite3WalkExpr(&w, expr);
> + if (w.eCode != 0) {
> + parser->rc = SQL_TARANTOOL_ERROR;
> + parser->nErr++;
> + goto release_expr;
> + }
> +
I don't understand the premise for this code. Why do yo uneed a
separate walker, aren't these expressions checked already
someplace else in the code?
--
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov
More information about the Tarantool-patches
mailing list