From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: tarantool-patches@freelists.org, Kirill Yukhin <kyukhin@tarantool.org>
Subject: [tarantool-patches] Re: [PATCH 1/2] sql: allow key_def to be NULL for ephemeral create
Date: Fri, 18 May 2018 13:50:49 +0300 [thread overview]
Message-ID: <0dd409e1-3162-653a-6a1f-f7cf1c6d3072@tarantool.org> (raw)
In-Reply-To: <20180518104847.xni3sj7halyqozqi@tarantool.org>
Now LGTM.
On 18/05/2018 13:48, Kirill Yukhin wrote:
> On 18 мая 13:33, Vladislav Shpilevoy wrote:
>> Hello. Thanks for fixes!
>>
>>> diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c
>>> index 3455f52..2c1ce44 100644
>>> --- a/src/box/sql/delete.c
>>> +++ b/src/box/sql/delete.c
>>> @@ -386,14 +386,9 @@ sqlite3DeleteFrom(Parse * pParse, /* The parser context */
>>> iPk = pParse->nMem + 1;
>>> pParse->nMem += nPk;
>>> iEphCur = pParse->nTab++;
>>> - struct key_def *def = key_def_new(nPk);
>>> - if (def == NULL) {
>>> - sqlite3OomFault(db);
>>> - goto delete_from_cleanup;
>>> - }
>>> addrEphOpen =
>>> sqlite3VdbeAddOp4(v, OP_OpenTEphemeral, iEphCur,
>>> - nPk, 0, (char*)def, P4_KEYDEF);
>>> + nPk);
>>
>> Compilation error.
> Whoops, fixed.
>
> --
> Regards, Kirill Yukhin
>
> commit 8640d51f1fb60022b4b61b84fd5c6111c5dbe916
> Author: Kirill Yukhin <kyukhin@tarantool.org>
> Date: Wed May 16 09:47:02 2018 +0300
>
> sql: allow key_def to be NULL for ephemeral create
>
> There're many cases in SQL FE, where exact key def passed to
> ephemeral table doesn't matter. It is used to store data only.
> Only field count makes sense in such a case. However it is
> passed separately (in P2). So, allow P4 field to be NULL for
> OP_OpenTEphemeral. Update delete from routine from sql/delete.c
> accordingly.
>
> Part of #3235
>
> diff --git a/src/box/sql.c b/src/box/sql.c
> index 195fdfb..6d2e0b9 100644
> --- a/src/box/sql.c
> +++ b/src/box/sql.c
> @@ -370,8 +370,9 @@ int tarantoolSqlite3Count(BtCursor *pCur, i64 *pnEntry)
> *
> * @retval SQLITE_OK on success, SQLITE_TARANTOOL_ERROR otherwise.
> */
> -int tarantoolSqlite3EphemeralCreate(BtCursor *pCur, uint32_t field_count,
> - struct key_def *def)
> +int
> +tarantoolSqlite3EphemeralCreate(BtCursor *pCur, uint32_t field_count,
> + struct key_def *def)
> {
> assert(pCur);
> assert(pCur->curFlags & BTCF_TEphemCursor);
> @@ -381,7 +382,7 @@ int tarantoolSqlite3EphemeralCreate(BtCursor *pCur, uint32_t field_count,
> return SQL_TARANTOOL_ERROR;
> for (uint32_t part = 0; part < field_count; ++part) {
> struct coll *coll;
> - if (part < def->part_count)
> + if (def != NULL && part < def->part_count)
> coll = def->parts[part].coll;
> else
> coll = NULL;
> diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c
> index 3455f52..1a2f3d0 100644
> --- a/src/box/sql/delete.c
> +++ b/src/box/sql/delete.c
> @@ -386,14 +386,9 @@ sqlite3DeleteFrom(Parse * pParse, /* The parser context */
> iPk = pParse->nMem + 1;
> pParse->nMem += nPk;
> iEphCur = pParse->nTab++;
> - struct key_def *def = key_def_new(nPk);
> - if (def == NULL) {
> - sqlite3OomFault(db);
> - goto delete_from_cleanup;
> - }
> addrEphOpen =
> - sqlite3VdbeAddOp4(v, OP_OpenTEphemeral, iEphCur,
> - nPk, 0, (char*)def, P4_KEYDEF);
> + sqlite3VdbeAddOp2(v, OP_OpenTEphemeral, iEphCur,
> + nPk);
> } else {
> pPk = sqlite3PrimaryKeyIndex(pTab);
> assert(pPk != 0);
> diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c
> index 5ada87e..54a7e4a 100644
> --- a/src/box/sql/insert.c
> +++ b/src/box/sql/insert.c
> @@ -566,13 +566,7 @@ sqlite3Insert(Parse * pParse, /* Parser context */
> regRec = sqlite3GetTempReg(pParse);
> regCopy = sqlite3GetTempRange(pParse, nColumn);
> regTempId = sqlite3GetTempReg(pParse);
> - struct key_def *def = key_def_new(nColumn + 1);
> - if (def == NULL) {
> - sqlite3OomFault(db);
> - goto insert_cleanup;
> - }
> - sqlite3VdbeAddOp4(v, OP_OpenTEphemeral, srcTab, nColumn+1,
> - 0, (char*)def, P4_KEYDEF);
> + sqlite3VdbeAddOp2(v, OP_OpenTEphemeral, srcTab, nColumn+1);
> /* Create counter for rowid */
> sqlite3VdbeAddOp4Dup8(v, OP_Int64,
> 0 /* unused */,
> diff --git a/src/box/sql/select.c b/src/box/sql/select.c
> index bd895bc..de111d3 100644
> --- a/src/box/sql/select.c
> +++ b/src/box/sql/select.c
> @@ -2215,13 +2215,7 @@ generateWithRecursiveQuery(Parse * pParse, /* Parsing context */
> VdbeComment((v, "Orderby table"));
> destQueue.pOrderBy = pOrderBy;
> } else {
> - struct key_def *def = key_def_new(nCol + 1);
> - if (def == NULL) {
> - sqlite3OomFault(pParse->db);
> - goto end_of_recursive_query;
> - }
> - sqlite3VdbeAddOp4(v, OP_OpenTEphemeral, iQueue, nCol + 1, 0,
> - (char*)def, P4_KEYDEF);
> + sqlite3VdbeAddOp2(v, OP_OpenTEphemeral, iQueue, nCol + 1);
> VdbeComment((v, "Queue table"));
> }
> if (iDistinct) {
> @@ -2422,13 +2416,7 @@ multiSelect(Parse * pParse, /* Parsing context */
> if (dest.eDest == SRT_EphemTab) {
> assert(p->pEList);
> int nCols = p->pEList->nExpr;
> - struct key_def *def = key_def_new(nCols + 1);
> - if (def == NULL) {
> - sqlite3OomFault(db);
> - goto multi_select_end;
> - }
> - sqlite3VdbeAddOp4(v, OP_OpenTEphemeral, dest.iSDParm, nCols + 1,
> - 0, (char*)def, P4_KEYDEF);
> + sqlite3VdbeAddOp2(v, OP_OpenTEphemeral, dest.iSDParm, nCols + 1);
> VdbeComment((v, "Destination temp"));
> dest.eDest = SRT_Table;
> }
> @@ -5608,11 +5596,8 @@ sqlite3Select(Parse * pParse, /* The parser context */
> /* If the output is destined for a temporary table, open that table.
> */
> if (pDest->eDest == SRT_EphemTab) {
> - struct key_def *def = key_def_new(pEList->nExpr + 1);
> - if (def == NULL)
> - sqlite3OomFault(db);
> - sqlite3VdbeAddOp4(v, OP_OpenTEphemeral, pDest->iSDParm,
> - pEList->nExpr + 1, 0, (char*)def, P4_KEYDEF);
> + sqlite3VdbeAddOp2(v, OP_OpenTEphemeral, pDest->iSDParm,
> + pEList->nExpr + 1);
>
> VdbeComment((v, "Output table"));
> }
> diff --git a/src/box/sql/update.c b/src/box/sql/update.c
> index f3db92c..204adc2 100644
> --- a/src/box/sql/update.c
> +++ b/src/box/sql/update.c
> @@ -358,13 +358,8 @@ sqlite3Update(Parse * pParse, /* The parser context */
> sqlite3VdbeAddOp2(v, OP_Null, 0, iPk);
>
> if (isView) {
> - struct key_def *def = key_def_new(nKey);
> - if (def == NULL) {
> - sqlite3OomFault(db);
> - goto update_cleanup;
> - }
> - addrOpen = sqlite3VdbeAddOp4(v, OP_OpenTEphemeral, iEph,
> - nKey, 0, (char*)def, P4_KEYDEF);
> + addrOpen = sqlite3VdbeAddOp2(v, OP_OpenTEphemeral, iEph,
> + nKey);
> } else {
> addrOpen = sqlite3VdbeAddOp2(v, OP_OpenTEphemeral, iEph, nPk);
> sql_vdbe_set_p4_key_def(pParse, pPk);
> diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
> index e27fe2f..455198d 100644
> --- a/src/box/sql/vdbe.c
> +++ b/src/box/sql/vdbe.c
> @@ -3225,9 +3225,9 @@ open_cursor_set_hints:
> /**
> * Opcode: OpenTEphemeral P1 P2 * P4 *
> * Synopsis:
> - * @param P1 index of new cursor to be created
> - * @param P2 number of columns in a new table
> - * @param P4 key def for new table
> + * @param P1 index of new cursor to be created.
> + * @param P2 number of columns in a new table.
> + * @param P4 key def for new table, NULL is allowed.
> *
> * This opcode creates Tarantool's ephemeral table and sets cursor P1 to it.
> */
> @@ -3236,21 +3236,20 @@ case OP_OpenTEphemeral: {
> BtCursor *pBtCur;
> assert(pOp->p1 >= 0);
> assert(pOp->p2 > 0);
> - assert(pOp->p4.key_def != NULL);
> - assert(pOp->p4type == P4_KEYDEF);
> + assert(pOp->p4type != P4_KEYDEF || pOp->p4.key_def != NULL);
>
> pCx = allocateCursor(p, pOp->p1, pOp->p2, CURTYPE_TARANTOOL);
> if (pCx == 0) goto no_mem;
> pCx->nullRow = 1;
>
> - pCx->key_def = pOp->p4.key_def;
> pBtCur = pCx->uc.pCursor;
> /* Ephemeral spaces don't have space_id */
> pBtCur->eState = CURSOR_INVALID;
> pBtCur->curFlags = BTCF_TEphemCursor;
>
> rc = tarantoolSqlite3EphemeralCreate(pCx->uc.pCursor, pOp->p2,
> - pCx->key_def);
> + pOp->p4.key_def);
> + pCx->key_def = pCx->uc.pCursor->index->def->key_def;
> if (rc) goto abort_due_to_error;
> break;
> }
>
next prev parent reply other threads:[~2018-05-18 10:50 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-16 15:24 [tarantool-patches] [PATCH 0/2] sql: refactor DELETE STMT translation Kirill Yukhin
2018-05-16 15:24 ` [tarantool-patches] [PATCH 1/2] sql: allow key_def to be NULL for ephemeral create Kirill Yukhin
2018-05-17 15:49 ` [tarantool-patches] " Kirill Yukhin
2018-05-17 16:47 ` Vladislav Shpilevoy
2018-05-18 6:57 ` Kirill Yukhin
2018-05-18 10:33 ` Vladislav Shpilevoy
2018-05-18 10:48 ` Kirill Yukhin
2018-05-18 10:50 ` Vladislav Shpilevoy [this message]
2018-05-16 15:24 ` [tarantool-patches] [PATCH 2/2] sql: refactor delete routines Kirill Yukhin
2018-05-16 16:29 ` [tarantool-patches] " Kirill Yukhin
2018-05-17 14:23 ` Vladislav Shpilevoy
2018-05-17 15:48 ` Kirill Yukhin
2018-05-17 16:47 ` Vladislav Shpilevoy
2018-05-18 6:56 ` Kirill Yukhin
2018-05-18 10:33 ` Vladislav Shpilevoy
2018-05-17 15:18 ` Vladislav Shpilevoy
2018-05-18 11:01 ` [tarantool-patches] Re: [PATCH 0/2] sql: refactor DELETE STMT translation Kirill Yukhin
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=0dd409e1-3162-653a-6a1f-f7cf1c6d3072@tarantool.org \
--to=v.shpilevoy@tarantool.org \
--cc=kyukhin@tarantool.org \
--cc=tarantool-patches@freelists.org \
--subject='[tarantool-patches] Re: [PATCH 1/2] sql: allow key_def to be NULL for ephemeral create' \
/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