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 5972F26647 for ; Mon, 2 Jul 2018 08:34:10 -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 sYYZ-9tLf4Bl for ; Mon, 2 Jul 2018 08:34:10 -0400 (EDT) Received: from smtpng3.m.smailru.net (smtpng3.m.smailru.net [94.100.177.149]) (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 9C25523C96 for ; Mon, 2 Jul 2018 08:34:09 -0400 (EDT) From: Kirill Shcherbatov Subject: [tarantool-patches] [PATCH v1 1/1] sql: show formated MsgPack BLOB on select Date: Mon, 2 Jul 2018 15:33:53 +0300 Message-Id: <3778fd7451fde6e28b3b4c9fcf88fb310a8b50b6.1530534766.git.kshcherbatov@tarantool.org> 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 Cc: korablev@tarantool.org, Kirill Shcherbatov Previously MsgPacks BLOB objects were shown as base64 strings. Now we print them in human-readable form. Resolves #2369. --- https://github.com/tarantool/tarantool/tree/kshch/gh-2369-display-tuple-msgpucks https://github.com/tarantool/tarantool/issues/2369 src/box/lua/sql.c | 8 +++++++- src/box/sql/sqliteInt.h | 12 ++++++++++++ src/box/sql/vdbeInt.h | 3 +-- src/box/sql/vdbeapi.c | 8 ++++++++ test/sql/gh2141-delete-trigger-drop-table.result | 12 ++++++------ test/sql/persistency.result | 9 ++++++--- 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/box/lua/sql.c b/src/box/lua/sql.c index e693aea..7a49aac 100644 --- a/src/box/lua/sql.c +++ b/src/box/lua/sql.c @@ -1,5 +1,6 @@ #include "sql.h" #include "box/sql.h" +#include "lua/msgpack.h" #include "box/sql/sqliteInt.h" #include "box/info.h" @@ -44,8 +45,13 @@ lua_push_row(struct lua_State *L, struct sqlite3_stmt *stmt) } case SQLITE_BLOB: { const void *blob = sqlite3_column_blob(stmt, i); - lua_pushlstring(L, blob, + if (sqlite3_column_subtype(stmt,i) == MSGPACK_SUBTYPE) { + luamp_decode(L, luaL_msgpack_default, + (const char **)&blob); + } else { + lua_pushlstring(L, blob, sqlite3_column_bytes(stmt, i)); + } break; } case SQLITE_NULL: diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h index e939663..3854482 100644 --- a/src/box/sql/sqliteInt.h +++ b/src/box/sql/sqliteInt.h @@ -482,6 +482,15 @@ sqlite3_value_double(sqlite3_value *); int sqlite3_value_int(sqlite3_value *); +/** + * Get row column subtype. + * @param stmt row data to process. + * @param i column index. + * @retval sqlute3 subtype if any, 0 else. + */ +unsigned int +sqlite3_column_subtype(sqlite3_stmt *stmt, int i); + sqlite3_int64 sqlite3_value_int64(sqlite3_value *); @@ -672,6 +681,9 @@ enum sql_type { SQLITE_NULL = 5, }; +/** The "subtype" set for MsgPack values.*/ +#define MSGPACK_SUBTYPE 77 + /** * Structure for internal usage during INSERT/UPDATE * statements compilation. diff --git a/src/box/sql/vdbeInt.h b/src/box/sql/vdbeInt.h index 0115a0d..1b767a5 100644 --- a/src/box/sql/vdbeInt.h +++ b/src/box/sql/vdbeInt.h @@ -253,8 +253,7 @@ struct Mem { #define MEM_Zero 0x0000 #endif -/* The "subtype" set for MsgPack values */ -#define MSGPACK_SUBTYPE 77 /* Ascii for "M" */ + /* Return TRUE if Mem X contains dynamically allocated content - anything * that needs to be deallocated to avoid a leak. diff --git a/src/box/sql/vdbeapi.c b/src/box/sql/vdbeapi.c index d35338a..d1ae976 100644 --- a/src/box/sql/vdbeapi.c +++ b/src/box/sql/vdbeapi.c @@ -1047,6 +1047,14 @@ sqlite3_column_type(sqlite3_stmt * pStmt, int i) return iType; } +unsigned int +sqlite3_column_subtype(sqlite3_stmt * pStmt, int i) +{ + unsigned int type = sqlite3_value_subtype(columnMem(pStmt, i)); + columnMallocFailure(pStmt); + return type; +} + /* * Convert the N-th element of pStmt->pColName[] into a string using * xFunc() then return that string. If N is out of range, return 0. diff --git a/test/sql/gh2141-delete-trigger-drop-table.result b/test/sql/gh2141-delete-trigger-drop-table.result index ec5a380..3ccb416 100644 --- a/test/sql/gh2141-delete-trigger-drop-table.result +++ b/test/sql/gh2141-delete-trigger-drop-table.result @@ -26,12 +26,12 @@ box.sql.execute("CREATE TRIGGER tt_ad AFTER DELETE ON t BEGIN SELECT 1; END") -- check that these triggers exist box.sql.execute("SELECT \"name\", \"opts\" FROM \"_trigger\"") --- -- - ['TT_AD', !!binary gaNzcWzZOkNSRUFURSBUUklHR0VSIHR0X2FkIEFGVEVSIERFTEVURSBPTiB0IEJFR0lOIFNFTEVDVCAxOyBFTkQ=] - - ['TT_AI', !!binary gaNzcWzZOkNSRUFURSBUUklHR0VSIHR0X2FpIEFGVEVSIElOU0VSVCBPTiB0IEJFR0lOIFNFTEVDVCAxOyBFTkQ=] - - ['TT_AU', !!binary gaNzcWzZOkNSRUFURSBUUklHR0VSIHR0X2F1IEFGVEVSIFVQREFURSBPTiB0IEJFR0lOIFNFTEVDVCAxOyBFTkQ=] - - ['TT_BD', !!binary gaNzcWzZO0NSRUFURSBUUklHR0VSIHR0X2JkIEJFRk9SRSBERUxFVEUgT04gdCBCRUdJTiBTRUxFQ1QgMTsgRU5E] - - ['TT_BI', !!binary gaNzcWzZO0NSRUFURSBUUklHR0VSIHR0X2JpIEJFRk9SRSBJTlNFUlQgT04gdCBCRUdJTiBTRUxFQ1QgMTsgRU5E] - - ['TT_BU', !!binary gaNzcWzZO0NSRUFURSBUUklHR0VSIHR0X2J1IEJFRk9SRSBVUERBVEUgT04gdCBCRUdJTiBTRUxFQ1QgMTsgRU5E] +- - ['TT_AD', {'sql': 'CREATE TRIGGER tt_ad AFTER DELETE ON t BEGIN SELECT 1; END'}] + - ['TT_AI', {'sql': 'CREATE TRIGGER tt_ai AFTER INSERT ON t BEGIN SELECT 1; END'}] + - ['TT_AU', {'sql': 'CREATE TRIGGER tt_au AFTER UPDATE ON t BEGIN SELECT 1; END'}] + - ['TT_BD', {'sql': 'CREATE TRIGGER tt_bd BEFORE DELETE ON t BEGIN SELECT 1; END'}] + - ['TT_BI', {'sql': 'CREATE TRIGGER tt_bi BEFORE INSERT ON t BEGIN SELECT 1; END'}] + - ['TT_BU', {'sql': 'CREATE TRIGGER tt_bu BEFORE UPDATE ON t BEGIN SELECT 1; END'}] ... -- drop table box.sql.execute("DROP TABLE t") diff --git a/test/sql/persistency.result b/test/sql/persistency.result index 8f89039..10b3dd7 100644 --- a/test/sql/persistency.result +++ b/test/sql/persistency.result @@ -142,7 +142,8 @@ box.sql.execute("CREATE TRIGGER tfoobar AFTER INSERT ON foobar BEGIN INSERT INTO ... box.sql.execute("SELECT \"name\", \"opts\" FROM \"_trigger\""); --- -- - ['TFOOBAR', !!binary gaNzcWzZaUNSRUFURSBUUklHR0VSIHRmb29iYXIgQUZURVIgSU5TRVJUIE9OIGZvb2JhciBCRUdJTiBJTlNFUlQgSU5UTyBiYXJmb28gVkFMVUVTICgndHJpZ2dlciB0ZXN0JywgOTk5OSk7IEVORA==] +- - ['TFOOBAR', {'sql': 'CREATE TRIGGER tfoobar AFTER INSERT ON foobar BEGIN INSERT + INTO barfoo VALUES (''trigger test'', 9999); END'}] ... -- Many entries box.sql.execute("CREATE TABLE t1(a,b,c,PRIMARY KEY(b,c));") @@ -168,7 +169,8 @@ test_run:cmd('restart server default'); -- prove that trigger survived box.sql.execute("SELECT \"name\", \"opts\" FROM \"_trigger\""); --- -- - ['TFOOBAR', !!binary gaNzcWzZaUNSRUFURSBUUklHR0VSIHRmb29iYXIgQUZURVIgSU5TRVJUIE9OIGZvb2JhciBCRUdJTiBJTlNFUlQgSU5UTyBiYXJmb28gVkFMVUVTICgndHJpZ2dlciB0ZXN0JywgOTk5OSk7IEVORA==] +- - ['TFOOBAR', {'sql': 'CREATE TRIGGER tfoobar AFTER INSERT ON foobar BEGIN INSERT + INTO barfoo VALUES (''trigger test'', 9999); END'}] ... -- ... functional box.sql.execute("INSERT INTO foobar VALUES ('foobar trigger test', 8888)") @@ -181,7 +183,8 @@ box.sql.execute("SELECT * FROM barfoo WHERE foo = 9999"); -- and still persistent box.sql.execute("SELECT \"name\", \"opts\" FROM \"_trigger\"") --- -- - ['TFOOBAR', !!binary gaNzcWzZaUNSRUFURSBUUklHR0VSIHRmb29iYXIgQUZURVIgSU5TRVJUIE9OIGZvb2JhciBCRUdJTiBJTlNFUlQgSU5UTyBiYXJmb28gVkFMVUVTICgndHJpZ2dlciB0ZXN0JywgOTk5OSk7IEVORA==] +- - ['TFOOBAR', {'sql': 'CREATE TRIGGER tfoobar AFTER INSERT ON foobar BEGIN INSERT + INTO barfoo VALUES (''trigger test'', 9999); END'}] ... -- and can be dropped just once box.sql.execute("DROP TRIGGER tfoobar") -- 2.7.4