From: Roman Khabibov <roman.habibov@tarantool.org> To: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Cc: tarantool-patches@dev.tarantool.org Subject: Re: [Tarantool-patches] [PATCH v4 4/6] sql: use parser's region of "index" array Date: Wed, 7 Oct 2020 16:53:01 +0300 [thread overview] Message-ID: <E34681E0-6643-4723-BC45-EC5245E1EB0B@tarantool.org> (raw) In-Reply-To: <de09d670-6b37-24eb-ea51-f36d18d9fbd1@tarantool.org> Hi! Thanks for the review. > On Oct 6, 2020, at 00:22, Vladislav Shpilevoy <v.shpilevoy@tarantool.org> wrote: > > Thanks for the patch! > >> diff --git a/src/box/sql/build.c b/src/box/sql/build.c >> index 6cc76bb77..d1d240315 100644 >> --- a/src/box/sql/build.c >> +++ b/src/box/sql/build.c >> @@ -2717,7 +2737,7 @@ sql_create_index(struct Parse *parse) { >> >> if (tbl_name != NULL) >> goto exit_create_index; >> - table_add_index(space, index); >> + sql_space_add_index(&parse->region, space, index); > > In case of a fail the error is never checked anywhere. Parse->is_aborted > stays false. Yes. See the new diff. commit 9ee07e6a5429b4fa1e26412147f161cc921093d9 Author: Roman Khabibov <roman.habibov@tarantool.org> Date: Thu Sep 3 14:26:47 2020 +0300 sql: use parser's region of "index" array Allocate memory for the "index" array of ephemeral space on the parser's region instead of a heap as it was before. Fixed a memory leak that realloc() generated. Needed for #2349 diff --git a/src/box/sql/build.c b/src/box/sql/build.c index 3b3c8099a..fd8e7ed1e 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -2228,29 +2228,52 @@ vdbe_emit_new_sec_index_id(struct Parse *parse, uint32_t space_id, } /** - * Add new index to table's indexes list. + * Add new index to ephemeral @a space's "index" array. Reallocate + * memory on @a parse's region if needed. + * * We follow convention that PK comes first in list. * + * @param parse Parsing structure. * @param space Space to which belongs given index. * @param index Index to be added to list. */ -static void -table_add_index(struct space *space, struct index *index) +static int +sql_space_add_index(struct Parse *parse, struct space *space, + struct index *index) { uint32_t idx_count = space->index_count; - size_t indexes_sz = sizeof(struct index *) * (idx_count + 1); - struct index **idx = (struct index **) realloc(space->index, - indexes_sz); - if (idx == NULL) { - diag_set(OutOfMemory, indexes_sz, "realloc", "idx"); - return; - } - space->index = idx; + size_t size = 0; + struct index **idx = NULL; + struct region *region = &parse->region; + if (idx_count == 0) { + idx = region_alloc_array(region, typeof(struct index *), 1, + &size); + if (idx == NULL) + goto alloc_error; + /* + * Reallocate each time the idx_count becomes equal to the + * power of two. + */ + } else if ((idx_count & (idx_count - 1)) == 0) { + idx = region_alloc_array(region, typeof(struct index *), + idx_count * 2, &size); + if (idx == NULL) + goto alloc_error; + memcpy(idx, space->index, idx_count * sizeof(struct index *)); + } + if (idx != NULL) + space->index = idx; /* Make sure that PK always comes as first member. */ if (index->def->iid == 0 && idx_count != 0) SWAP(space->index[0], index); space->index[space->index_count++] = index; space->index_id_max = MAX(space->index_id_max, index->def->iid);; + return 0; + +alloc_error: + diag_set(OutOfMemory, size, "region_alloc_array", "idx"); + parse->is_aborted = true; + return -1; } int @@ -2717,9 +2740,8 @@ sql_create_index(struct Parse *parse) { sqlVdbeAddOp0(vdbe, OP_Expire); } - if (tbl_name != NULL) + if (tbl_name != NULL || sql_space_add_index(parse, space, index) != 0) goto exit_create_index; - table_add_index(space, index); index = NULL; /* Clean up before exiting. */
next prev parent reply other threads:[~2020-10-07 13:53 UTC|newest] Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-09-11 21:51 [Tarantool-patches] [PATCH v4 0/6] Support column addition Roman Khabibov 2020-09-11 21:51 ` [Tarantool-patches] [PATCH v4 1/6] sql: rename TK_COLUMN to TK_COLUMN_NAME Roman Khabibov 2020-09-16 13:17 ` Nikita Pettik 2020-09-28 23:29 ` Roman Khabibov 2020-09-11 21:51 ` [Tarantool-patches] [PATCH v4 2/6] sql: refactor create_table_def and parse Roman Khabibov 2020-09-16 13:27 ` Nikita Pettik 2020-09-17 14:43 ` Vladislav Shpilevoy 2020-09-18 12:31 ` Nikita Pettik 2020-09-18 13:21 ` Roman Khabibov 2020-09-28 23:29 ` Roman Khabibov 2020-09-17 14:43 ` Vladislav Shpilevoy 2020-10-02 22:08 ` Vladislav Shpilevoy 2020-10-03 21:37 ` Roman Khabibov 2020-10-04 13:45 ` Vladislav Shpilevoy 2020-10-04 21:44 ` Roman Khabibov 2020-10-05 21:22 ` Vladislav Shpilevoy 2020-10-07 13:53 ` Roman Khabibov 2020-10-07 22:35 ` Vladislav Shpilevoy 2020-10-08 10:32 ` Roman Khabibov 2020-09-17 15:16 ` Vladislav Shpilevoy 2020-10-02 22:08 ` Vladislav Shpilevoy 2020-09-11 21:51 ` [Tarantool-patches] [PATCH v4 3/6] schema: add box_space_field_MAX Roman Khabibov 2020-09-11 21:51 ` [Tarantool-patches] [PATCH v4 4/6] sql: use parser's region of "index" array Roman Khabibov 2020-09-16 13:30 ` Nikita Pettik 2020-09-28 23:29 ` Roman Khabibov 2020-09-17 14:53 ` Vladislav Shpilevoy 2020-09-23 14:25 ` Roman Khabibov 2020-09-24 21:30 ` Vladislav Shpilevoy 2020-10-05 21:22 ` Vladislav Shpilevoy 2020-10-07 13:53 ` Roman Khabibov [this message] 2020-09-11 21:51 ` [Tarantool-patches] [PATCH v4 5/6] box: disallow to modify format of a view Roman Khabibov 2020-09-16 13:37 ` Nikita Pettik 2020-09-22 15:59 ` Roman Khabibov 2020-09-17 15:01 ` Vladislav Shpilevoy 2020-09-22 15:59 ` Roman Khabibov 2020-09-11 21:51 ` [Tarantool-patches] [PATCH v4 6/6] sql: support column addition Roman Khabibov 2020-09-16 20:18 ` Nikita Pettik 2020-09-17 15:19 ` Vladislav Shpilevoy 2020-09-18 12:59 ` Nikita Pettik 2020-09-28 23:28 ` Roman Khabibov 2020-10-02 22:08 ` Vladislav Shpilevoy 2020-10-03 21:37 ` Roman Khabibov 2020-09-17 15:45 ` Vladislav Shpilevoy 2020-10-04 13:45 ` Vladislav Shpilevoy 2020-10-04 21:44 ` Roman Khabibov 2020-09-11 22:00 ` [Tarantool-patches] [PATCH v4 0/6] Support " Roman Khabibov 2020-10-08 22:07 ` Vladislav Shpilevoy
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=E34681E0-6643-4723-BC45-EC5245E1EB0B@tarantool.org \ --to=roman.habibov@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v4 4/6] sql: use parser'\''s region of "index" array' \ /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