From: Nikita Pettik <korablev@tarantool.org> To: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH] sql: fix off-by-one error in QP Date: Mon, 21 Oct 2019 19:45:28 +0300 [thread overview] Message-ID: <20191021164528.60675-1-korablev@tarantool.org> (raw) In scope of 8fac697 it was fixed misbehavior while passing floating point values to integer iterator. Unfortunately, that patch introduced off-by-one error. Number of constraints (equalities and inequalities) can not be greater than number of key parts (obviously, each constraint can be tested against at most one index part). Inequality constraint can involve only field representing last key part. To get it number of constraints was used as index. However, since array is 0-based, the last key part should be calculated as parts[eq_numb - 1]. Before this patch it was parts[eq_numb]. Closes #4558 --- Branch: https://github.com/tarantool/tarantool/commits/np/gh-4558-off-by-one-qp-fix Issue: https://github.com/tarantool/tarantool/issues/4558 src/box/sql/wherecode.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/box/sql/wherecode.c b/src/box/sql/wherecode.c index de51c0ba5..5bc27f134 100644 --- a/src/box/sql/wherecode.c +++ b/src/box/sql/wherecode.c @@ -1118,10 +1118,20 @@ sqlWhereCodeOneLoopStart(WhereInfo * pWInfo, /* Complete information about the W } } /* Inequality constraint comes always at the end of list. */ - enum field_type ineq_type = idx_def->key_def->parts[nEq].type; - if (pRangeStart != NULL && (ineq_type == FIELD_TYPE_INTEGER || - ineq_type == FIELD_TYPE_UNSIGNED)) - force_integer_reg = regBase + nEq; + part_count = idx_def->key_def->part_count; + if (pRangeStart != NULL) { + /* + * nEq == 0 means that filter condition + * contains only inequality. + */ + uint32_t ineq_idx = nEq == 0 ? 0 : nEq - 1; + assert(ineq_idx < part_count); + enum field_type ineq_type = + idx_def->key_def->parts[ineq_idx].type; + if (ineq_type == FIELD_TYPE_INTEGER || + ineq_type == FIELD_TYPE_UNSIGNED) + force_integer_reg = regBase + nEq; + } emit_apply_type(pParse, regBase, nConstraint - bSeekPastNull, start_types); if (pLoop->nSkip > 0 && nConstraint == pLoop->nSkip) { -- 2.15.1
next reply other threads:[~2019-10-21 16:45 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-10-21 16:45 Nikita Pettik [this message] 2019-10-23 21:12 ` Vladislav Shpilevoy 2019-10-24 8:13 ` Nikita Pettik 2019-12-29 22:20 ` Alexander Turenko 2019-12-30 0:14 ` Nikita Pettik
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=20191021164528.60675-1-korablev@tarantool.org \ --to=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH] sql: fix off-by-one error in QP' \ /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