From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id E7E662A06F for ; Fri, 17 Aug 2018 10:04:15 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fwSfpA9ZJUo5 for ; Fri, 17 Aug 2018 10:04:15 -0400 (EDT) Received: from smtpng2.m.smailru.net (smtpng2.m.smailru.net [94.100.179.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 177DD2A064 for ; Fri, 17 Aug 2018 10:04:14 -0400 (EDT) Subject: [tarantool-patches] Re: [PATCH v1 1/1] sql: remove struct Enc References: <792834dabd4287aeb213202581de02b23a4c4557.1534508548.git.kshcherbatov@tarantool.org> <22d959eb-5c4e-fb12-f7de-cf10a237f0dd@tarantool.org> From: Kirill Shcherbatov Message-ID: Date: Fri, 17 Aug 2018 17:04:12 +0300 MIME-Version: 1.0 In-Reply-To: <22d959eb-5c4e-fb12-f7de-cf10a237f0dd@tarantool.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: tarantool-patches@freelists.org, Nikita Pettik Cc: Vladislav Shpilevoy On 17.08.2018 15:40, Vladislav Shpilevoy wrote: > Hi! Please, do not use any Lua things in SQL. > You should not even include this: #include "lua/msgpack.h". ====================================== diff --git a/src/box/sql.c b/src/box/sql.c index f1e860d..321d3c4 100644 --- a/src/box/sql.c +++ b/src/box/sql.c @@ -56,7 +56,7 @@ #include "xrow.h" #include "iproto_constants.h" #include "fkey.h" -#include "lua/msgpack.h" +#include "mpstream.h" #include "small/region.h" static sqlite3 *db = NULL; @@ -1250,7 +1250,7 @@ sql_encode_table(struct region *region, struct Table *table, uint32_t *size) pk_forced_int = pk; } uint32_t field_count = def->field_count; - luamp_encode_array(luaL_msgpack_default, &stream, field_count); + mpstream_encode_array(&stream, field_count); for (uint32_t i = 0; i < field_count && !is_error; i++) { const char *t; uint32_t cid = def->fields[i].coll_id; @@ -1261,13 +1261,10 @@ sql_encode_table(struct region *region, struct Table *table, uint32_t *size) base_len += 1; if (default_str != NULL) base_len += 1; - luamp_encode_map(luaL_msgpack_default, &stream, base_len); - luamp_encode_str(luaL_msgpack_default, &stream, "name", - strlen("name")); - luamp_encode_str(luaL_msgpack_default, &stream, field->name, - strlen(field->name)); - luamp_encode_str(luaL_msgpack_default, &stream, "type", - strlen("type")); + mpstream_encode_map(&stream, base_len); + mpstream_encode_str(&stream, "name", strlen("name")); + mpstream_encode_str(&stream, field->name, strlen(field->name)); + mpstream_encode_str(&stream, "type", strlen("type")); if (i == pk_forced_int) { t = "integer"; } else { @@ -1280,32 +1277,30 @@ sql_encode_table(struct region *region, struct Table *table, uint32_t *size) assert(def->fields[i].is_nullable == action_is_nullable(def->fields[i]. nullable_action)); - luamp_encode_str(luaL_msgpack_default, &stream, t, strlen(t)); - luamp_encode_str(luaL_msgpack_default, &stream, "affinity", - strlen("affinity")); - luamp_encode_uint(luaL_msgpack_default, &stream, + mpstream_encode_str(&stream, t, strlen(t)); + mpstream_encode_str(&stream, "affinity", strlen("affinity")); + mpstream_encode_uint(&stream, def->fields[i].affinity); - luamp_encode_str(luaL_msgpack_default, &stream, "is_nullable", - strlen("is_nullable")); - luamp_encode_bool(luaL_msgpack_default, &stream, + mpstream_encode_str(&stream, "is_nullable", + strlen("is_nullable")); + mpstream_encode_bool(&stream, def->fields[i].is_nullable); - luamp_encode_str(luaL_msgpack_default, &stream, - "nullable_action", strlen("nullable_action")); + mpstream_encode_str(&stream, "nullable_action", + strlen("nullable_action")); assert(def->fields[i].nullable_action < on_conflict_action_MAX); const char *action = on_conflict_action_strs[def->fields[i].nullable_action]; - luamp_encode_str(luaL_msgpack_default, &stream, action, - strlen(action)); + mpstream_encode_str(&stream, action, strlen(action)); if (cid != COLL_NONE) { - luamp_encode_str(luaL_msgpack_default, &stream, - "collation", strlen("collation")); - luamp_encode_uint(luaL_msgpack_default, &stream, cid); + mpstream_encode_str(&stream, "collation", + strlen("collation")); + mpstream_encode_uint(&stream, cid); } if (default_str != NULL) { - luamp_encode_str(luaL_msgpack_default, &stream, - "default", strlen("default")); - luamp_encode_str(luaL_msgpack_default, &stream, - default_str, strlen(default_str)); + mpstream_encode_str(&stream, "default", + strlen("default")); + mpstream_encode_str(&stream, default_str, + strlen(default_str)); } } mpstream_flush(&stream); @@ -1337,27 +1332,24 @@ sql_encode_table_opts(struct region *region, struct Table *table, has_checks = table->def->opts.checks != NULL; } uint32_t checks_cnt = has_checks ? table->def->opts.checks->nExpr : 0; - luamp_encode_map(luaL_msgpack_default, &stream, - 1 + is_view + (checks_cnt > 0)); + mpstream_encode_map(&stream, 1 + is_view + (checks_cnt > 0)); - luamp_encode_str(luaL_msgpack_default, &stream, "sql", strlen("sql")); - luamp_encode_str(luaL_msgpack_default, &stream, sql, strlen(sql)); + mpstream_encode_str(&stream, "sql", strlen("sql")); + mpstream_encode_str(&stream, sql, strlen(sql)); if (is_view) { - luamp_encode_str(luaL_msgpack_default, &stream, "view", - strlen("view")); - luamp_encode_bool(luaL_msgpack_default, &stream, true); + mpstream_encode_str(&stream, "view", strlen("view")); + mpstream_encode_bool(&stream, true); } if (checks_cnt == 0) goto finish; /* Encode checks. */ struct ExprList_item *a = table->def->opts.checks->a; - luamp_encode_str(luaL_msgpack_default, &stream, "checks", - strlen("checks")); - luamp_encode_array(luaL_msgpack_default, &stream, checks_cnt); + mpstream_encode_str(&stream, "checks", strlen("checks")); + mpstream_encode_array(&stream, checks_cnt); for (uint32_t i = 0; i < checks_cnt && !is_error; ++i) { int items = (a[i].pExpr != NULL) + (a[i].zName != NULL); - luamp_encode_map(luaL_msgpack_default, &stream, items); + mpstream_encode_map(&stream, items); /* * a[i].pExpr could be NULL for VIEW column names * represented as checks. @@ -1365,17 +1357,14 @@ sql_encode_table_opts(struct region *region, struct Table *table, if (a[i].pExpr != NULL) { struct Expr *pExpr = a[i].pExpr; assert(pExpr->u.zToken != NULL); - luamp_encode_str(luaL_msgpack_default, &stream, "expr", - strlen("expr")); - luamp_encode_str(luaL_msgpack_default, &stream, - pExpr->u.zToken, - strlen(pExpr->u.zToken)); + mpstream_encode_str(&stream, "expr", strlen("expr")); + mpstream_encode_str(&stream, pExpr->u.zToken, + strlen(pExpr->u.zToken)); } if (a[i].zName != NULL) { - luamp_encode_str(luaL_msgpack_default, &stream, "name", - strlen("name")); - luamp_encode_str(luaL_msgpack_default, &stream, - a[i].zName, strlen(a[i].zName)); + mpstream_encode_str(&stream, "name", strlen("name")); + mpstream_encode_str(&stream, a[i].zName, + strlen(a[i].zName)); } } @@ -1402,11 +1391,9 @@ fkey_encode_links(struct region *region, const struct fkey_def *def, int type, mpstream_init(&stream, region, region_reserve_cb, region_alloc_cb, set_encode_error, &is_error); uint32_t field_count = def->field_count; - luamp_encode_array(luaL_msgpack_default, &stream, field_count); - for (uint32_t i = 0; i < field_count && !is_error; ++i) { - luamp_encode_uint(luaL_msgpack_default, &stream, - def->links[i].fields[type]); - } + mpstream_encode_array(&stream, field_count); + for (uint32_t i = 0; i < field_count && !is_error; ++i) + mpstream_encode_uint(&stream, def->links[i].fields[type]); mpstream_flush(&stream); if (is_error) return NULL; @@ -1451,7 +1438,7 @@ sql_encode_index_parts(struct region *region, struct SqliteIndex *index, struct key_def *key_def = index->def->key_def; uint32_t part_count = key_def->part_count; struct key_part *part = key_def->parts; - luamp_encode_array(luaL_msgpack_default, &stream, part_count); + mpstream_encode_array(&stream, part_count); for (uint32_t i = 0; i < part_count; ++i, ++part) { uint32_t col = part->fieldno; assert(fields[col].is_nullable == @@ -1465,37 +1452,33 @@ sql_encode_index_parts(struct region *region, struct SqliteIndex *index, } /* Do not decode default collation. */ uint32_t cid = part->coll_id; - luamp_encode_map(luaL_msgpack_default, &stream, - 5 + (cid != COLL_NONE)); - luamp_encode_str(luaL_msgpack_default, &stream, "type", - strlen("type")); - luamp_encode_str(luaL_msgpack_default, &stream, t, strlen(t)); - luamp_encode_str(luaL_msgpack_default, &stream, "field", - strlen("field")); - luamp_encode_uint(luaL_msgpack_default, &stream, col); + mpstream_encode_map(&stream, 5 + (cid != COLL_NONE)); + mpstream_encode_str(&stream, "type", strlen("type")); + mpstream_encode_str(&stream, t, strlen(t)); + mpstream_encode_str(&stream, "field", strlen("field")); + mpstream_encode_uint(&stream, col); if (cid != COLL_NONE) { - luamp_encode_str(luaL_msgpack_default, &stream, - "collation", strlen("collation")); - luamp_encode_uint(luaL_msgpack_default, &stream, cid); + mpstream_encode_str(&stream, "collation", + strlen("collation")); + mpstream_encode_uint(&stream, cid); } - luamp_encode_str(luaL_msgpack_default, &stream, "is_nullable", - strlen("is_nullable")); - luamp_encode_bool(luaL_msgpack_default, &stream, + mpstream_encode_str(&stream, "is_nullable", + strlen("is_nullable")); + mpstream_encode_bool(&stream, fields[col].is_nullable); - luamp_encode_str(luaL_msgpack_default, &stream, - "nullable_action", strlen("nullable_action")); + mpstream_encode_str(&stream, "nullable_action", + strlen("nullable_action")); const char *action_str = on_conflict_action_strs[fields[col].nullable_action]; - luamp_encode_str(luaL_msgpack_default, &stream, action_str, - strlen(action_str)); + mpstream_encode_str(&stream, action_str, strlen(action_str)); - luamp_encode_str(luaL_msgpack_default, &stream, "sort_order", - strlen("sort_order")); + mpstream_encode_str(&stream, "sort_order", + strlen("sort_order")); enum sort_order sort_order = part->sort_order; assert(sort_order < sort_order_MAX); const char *sort_order_str = sort_order_strs[sort_order]; - luamp_encode_str(luaL_msgpack_default, &stream, sort_order_str, - strlen(sort_order_str)); + mpstream_encode_str(&stream, sort_order_str, + strlen(sort_order_str)); } mpstream_flush(&stream); if (is_error) @@ -1518,10 +1501,9 @@ sql_encode_index_opts(struct region *region, struct SqliteIndex *index, bool is_error = false; mpstream_init(&stream, region, region_reserve_cb, region_alloc_cb, set_encode_error, &is_error); - luamp_encode_map(luaL_msgpack_default, &stream, 2); + mpstream_encode_map(&stream, 1 + (sql != NULL)); /* Mark as unique pk and unique indexes */ - luamp_encode_str(luaL_msgpack_default, &stream, "unique", - strlen("unique")); + mpstream_encode_str(&stream, "unique", strlen("unique")); /* If user didn't defined ON CONFLICT OPTIONS, all uniqueness checks * will be made by Tarantool. However, Tarantool doesn't have ON * CONFLIT option, so in that case (except ON CONFLICT ABORT, which is @@ -1529,10 +1511,11 @@ sql_encode_index_opts(struct region *region, struct SqliteIndex *index, * INSERT OR REPLACE/IGNORE uniqueness checks will be also done by * Tarantool. */ - luamp_encode_bool(luaL_msgpack_default, &stream, IsUniqueIndex(index)); - luamp_encode_str(luaL_msgpack_default, &stream, "sql", strlen("sql")); - luamp_encode_str(luaL_msgpack_default, &stream, sql, - sql != NULL ? strlen(sql) : 0); + mpstream_encode_bool(&stream, IsUniqueIndex(index)); + if (sql != NULL) { + mpstream_encode_str(&stream, "sql", strlen("sql")); + mpstream_encode_str(&stream, sql, strlen(sql)); + } mpstream_flush(&stream); if (is_error) return NULL;