[tarantool-patches] Re: [PATCH v2 3/3] sql: change collation compatibility rules

n.pettik korablev at tarantool.org
Wed Nov 14 01:37:40 MSK 2018


>> diff --git a/src/box/sql/select.c b/src/box/sql/select.c
>> index cea453f08..ab0376a1d 100644
>> --- a/src/box/sql/select.c
>> +++ b/src/box/sql/select.c
>> @@ -2150,47 +2151,51 @@ computeLimitRegisters(Parse * pParse, Select * p, int iBreak)
>>  }
>>    #ifndef SQLITE_OMIT_COMPOUND_SELECT
>> -static struct coll *
>> -multi_select_coll_seq_r(Parse *parser, Select *p, int n, bool *is_found,
>> -			uint32_t *coll_id)
>> +/**
>> + * This function determines resulting collation sequence for
>> + * @n-th column of the result set for the compound SELECT
>> + * statement. Since compound SELECT performs implicit comparisons
>> + * between values, all parts of compound queries must use
>> + * the same collation. Otherwise, an error is raised.
>> + *
>> + * @param parser Parse context.
>> + * @param p Select meta-information.
>> + * @param n Column number of the result set.
>> + * @param is_forced_coll Used if we fall into recursion.
>> + *        For most-outer call it is unused. Used to indicate that
>> + *        explicit COLLATE clause is used.
>> + * @retval Id of collation to be used during string comparison.
>> + */
>> +static uint32_t
>> +multi_select_coll_seq(struct Parse *parser, struct Select *p, int n,
>> +		      bool *is_forced_coll)
> 
> 1. I renamed this function into multi_select_coll_seq_r and
> created a wrapper without is_forced_coll to remove some of
> 'bool unused' things. Apply or drop the fix, up to you.

Ok, I don’t mind your fixes. Applied.

>> diff --git a/src/box/sql/whereexpr.c b/src/box/sql/whereexpr.c
>> index 9fa6ce15d..e05967554 100644
>> --- a/src/box/sql/whereexpr.c
>> +++ b/src/box/sql/whereexpr.c
>> @@ -168,7 +168,7 @@ exprCommute(Parse * pParse, Expr * pExpr)
>>  			bool is_found;
>>  			uint32_t id;
>>  			sql_expr_coll(pParse, pExpr->pLeft, &is_found, &id);
>> -			if (is_found) {
>> +			if (id != 0) {
> 
> 2. If you fix a comment about COLL_NONE constant return,
> do not forget to pick this hunk up as well, please. Maybe
> this patch contains more, I am not sure.

Ok, I’ve returned COLL_NONE usages:

diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c
index 09c248154..b67b22c23 100644
--- a/src/box/sql/expr.c
+++ b/src/box/sql/expr.c
@@ -360,11 +360,11 @@ collations_check_compatibility(uint32_t lhs_id, bool is_lhs_forced,
                return 0;
        }
        if (lhs_id != rhs_id) {
-               if (lhs_id == 0) {
+               if (lhs_id == COLL_NONE) {
                        *res_id = rhs_id;
                        return 0;
                }
-               if (rhs_id == 0) {
+               if (rhs_id == COLL_NONE) {
                        *res_id = lhs_id;
                        return 0;
                }
diff --git a/src/box/sql/select.c b/src/box/sql/select.c
index 2db8e1c7f..efdac9dba 100644
--- a/src/box/sql/select.c
+++ b/src/box/sql/select.c
@@ -1963,7 +1963,8 @@ sqlite3SelectAddColumnTypeAndCollation(Parse * pParse,            /* Parsing contexts */
                uint32_t coll_id;
 
                if (pTab->def->fields[i].coll_id == COLL_NONE &&
-                   sql_expr_coll(pParse, p, &is_found, &coll_id) && coll_id != 0)
+                   sql_expr_coll(pParse, p, &is_found, &coll_id) &&
+                   coll_id != COLL_NONE)
                        pTab->def->fields[i].coll_id = coll_id;
        }
 }
@@ -2172,7 +2173,7 @@ multi_select_coll_seq_r(struct Parse *parser, struct Select *p, int n,
 {
        bool is_prior_forced = false;
        bool is_current_forced;
-       uint32_t prior_coll_id = 0;
+       uint32_t prior_coll_id = COLL_NONE;
        uint32_t current_coll_id;
        if (p->pPrior != NULL) {
                prior_coll_id = multi_select_coll_seq_r(parser, p->pPrior, n,
diff --git a/src/box/sql/whereexpr.c b/src/box/sql/whereexpr.c
index e05967554..971f428b7 100644
--- a/src/box/sql/whereexpr.c
+++ b/src/box/sql/whereexpr.c
@@ -168,7 +168,7 @@ exprCommute(Parse * pParse, Expr * pExpr)
                        bool is_found;
                        uint32_t id;
                        sql_expr_coll(pParse, pExpr->pLeft, &is_found, &id);
-                       if (id != 0) {
+                       if (id != COLL_NONE) {
                                /*
                                 * Neither X nor Y have COLLATE
                                 * operators, but X has ag





More information about the Tarantool-patches mailing list