From: Kirill Shcherbatov <kshcherbatov@tarantool.org>
To: tarantool-patches@freelists.org,
Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
Subject: [tarantool-patches] Re: [PATCH v1 1/1] sql: introduce TRUNCATE TABLE operation
Date: Wed, 18 Jul 2018 16:01:41 +0300 [thread overview]
Message-ID: <606f657b-26df-35b9-ddf1-d5bae5654d82@tarantool.org> (raw)
In-Reply-To: <797d52e5-1387-dd3d-1fb2-0fafbbbdcf56@tarantool.org>
> Hello. I do not see, where do you call box_truncate, and where is a
> test that it is called.
I've discussed this problem with Nikita and we have decided to make separate OP_Truncate code.
=====================================
diff --git a/extra/mkkeywordhash.c b/extra/mkkeywordhash.c
index 1ec1538..705caf1 100644
--- a/extra/mkkeywordhash.c
+++ b/extra/mkkeywordhash.c
@@ -281,6 +281,7 @@ static Keyword aKeywordTable[] = {
{ "VARCHAR", "TK_ID", RESERVED, true },
{ "WHENEVER", "TK_STANDARD", RESERVED, true },
{ "WHILE", "TK_STANDARD", RESERVED, true },
+ { "TRUNCATE", "TK_TRUNCATE", ALWAYS, true },
};
/* Number of keywords */
diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index a64d723..be4c860 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -1953,7 +1953,7 @@ vdbe_emit_stat_space_clear(struct Parse *parse, const char *stat_table_name,
* On memory allocation error sql_table delete_from
* releases memory for its own.
*/
- sql_table_delete_from(parse, src_list, where);
+ sql_table_delete_from(parse, src_list, where, false);
}
/**
diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c
index f9d3498..ab6771d 100644
--- a/src/box/sql/delete.c
+++ b/src/box/sql/delete.c
@@ -73,7 +73,7 @@ sql_materialize_view(struct Parse *parse, const char *name, struct Expr *where,
void
sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list,
- struct Expr *where)
+ struct Expr *where, bool allow_truncate)
{
struct sqlite3 *db = parse->db;
if (parse->nErr || db->mallocFailed)
@@ -185,9 +185,10 @@ sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list,
*/
if (where == NULL && !is_complex) {
assert(!is_view);
-
- sqlite3VdbeAddOp1(v, OP_Clear, space_id);
-
+ if (!allow_truncate || space_is_system(space) || in_txn() != NULL)
+ sqlite3VdbeAddOp1(v, OP_Clear, space_id);
+ else
+ sqlite3VdbeAddOp1(v, OP_Truncate, space_id);
/* Do not start Tarantool's transaction in case of
* truncate optimization. This is workaround until
* system tables cannot be changes inside a
diff --git a/src/box/sql/fkey.c b/src/box/sql/fkey.c
index 6a91890..e67866c 100644
--- a/src/box/sql/fkey.c
+++ b/src/box/sql/fkey.c
@@ -784,7 +784,7 @@ sqlite3FkDropTable(Parse *parser, SrcList *name, Table *table)
/* Staring new transaction before DELETE FROM <tbl> */
sqlite3VdbeAddOp0(v, OP_TTransaction);
sql_table_delete_from(parser, sqlite3SrcListDup(parser->db, name, 0),
- NULL);
+ NULL, false);
parser->disableTriggers = 0;
/*
* If the DELETE has generated immediate foreign key
diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index 0c510f5..18ca39b 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -722,7 +722,16 @@ cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
/* Instruct SQL to initate Tarantool's transaction. */
pParse->initiateTTrans = true;
- sql_table_delete_from(pParse,X,W);
+ sql_table_delete_from(pParse,X,W,true);
+}
+
+/////////////////////////// The TRUNCATE statement /////////////////////////////
+//
+cmd ::= TRUNCATE TABLE fullname(X). {
+ sqlSubProgramsRemaining = SQL_MAX_COMPILING_TRIGGERS;
+ /* Instruct SQL to initate Tarantool's transaction. */
+ pParse->initiateTTrans = true;
+ sql_table_delete_from(pParse, X, NULL,true);
}
%type where_opt {Expr*}
diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h
index 54661cb..5c293bc 100644
--- a/src/box/sql/sqliteInt.h
+++ b/src/box/sql/sqliteInt.h
@@ -3700,10 +3700,11 @@ void sqlite3OpenTable(Parse *, int iCur, Table *, int);
* @param tab_list List of single element which table from which
* deletetion if performed.
* @param where The WHERE clause. May be NULL.
+ * @param allow_truncate use truncate opcode if possible.
*/
void
sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list,
- struct Expr *where);
+ struct Expr *where, bool allow_truncate);
void sqlite3Update(Parse *, SrcList *, ExprList *, Expr *,
enum on_conflict_action);
diff --git a/src/box/sql/trigger.c b/src/box/sql/trigger.c
index ec0bc98..1949fdb 100644
--- a/src/box/sql/trigger.c
+++ b/src/box/sql/trigger.c
@@ -698,8 +698,8 @@ codeTriggerProgram(Parse * pParse, /* The parser context */
targetSrcList(pParse, pStep),
sqlite3ExprDup(db,
pStep->pWhere,
- 0)
- );
+ 0),
+ false);
break;
}
default:
diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
index f50e389..66a567b 100644
--- a/src/box/sql/vdbe.c
+++ b/src/box/sql/vdbe.c
@@ -39,6 +39,7 @@
* in this file for details. If in doubt, do not deviate from existing
* commenting and indentation practices when changing or adding code.
*/
+#include "box/box.h"
#include "box/txn.h"
#include "box/session.h"
#include "sqliteInt.h"
@@ -4574,12 +4575,27 @@ case OP_IdxGE: { /* jump */
* doesn't involve truncating, since it features completely
* different mechanism under hood.
*/
-case OP_Clear: {
+/* Opcode: Truncate P1 * * * *
+ * Synopsis: space id = P1
+ *
+ * Same as OP_Clear except this routine uses box_truncate that
+ * works faster, but have some restictions: the space_id is not an
+ * ID of system space, this routine mustn't be called by active
+ * transaction.
+ */
+case OP_Clear:
+case OP_Truncate: {
assert(pOp->p1 > 0);
uint32_t space_id = pOp->p1;
- struct space *space = space_by_id(space_id);
- assert(space != NULL);
- rc = tarantoolSqlite3ClearTable(space);
+ if (pOp->opcode == OP_Clear) {
+ struct space *space = space_by_id(space_id);
+ assert(space != NULL);
+ rc = tarantoolSqlite3ClearTable(space);
+ } else {
+ rc = box_truncate(space_id);
+ if (rc != 0)
+ rc = SQL_TARANTOOL_ERROR;
+ }
if (rc) goto abort_due_to_error;
break;
}
diff --git a/test/sql/delete.result b/test/sql/delete.result
index c33079c..6026406 100644
--- a/test/sql/delete.result
+++ b/test/sql/delete.result
@@ -33,6 +33,16 @@ box.sql.execute("SELECT * FROM t1;");
---
- - [2, 4]
...
+--
+-- gh-2201: TRUNCATE TABLE operation
+--
+box.sql.execute("TRUNCATE TABLE t1;")
+---
+...
+box.sql.execute("SELECT * FROM t1;")
+---
+- []
+...
-- Cleanup
box.sql.execute("DROP TABLE t1;");
---
diff --git a/test/sql/delete.test.lua b/test/sql/delete.test.lua
index 1721989..7132302 100644
--- a/test/sql/delete.test.lua
+++ b/test/sql/delete.test.lua
@@ -21,6 +21,12 @@ box.sql.execute("DELETE FROM t1 WHERE a=1;");
-- Verify
box.sql.execute("SELECT * FROM t1;");
+--
+-- gh-2201: TRUNCATE TABLE operation
+--
+box.sql.execute("TRUNCATE TABLE t1;")
+box.sql.execute("SELECT * FROM t1;")
+
-- Cleanup
box.sql.execute("DROP TABLE t1;");
next prev parent reply other threads:[~2018-07-18 13:01 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-18 8:22 [tarantool-patches] " Kirill Shcherbatov
2018-07-18 8:31 ` [tarantool-patches] " Vladislav Shpilevoy
2018-07-18 13:01 ` Kirill Shcherbatov [this message]
2018-07-18 16:40 ` n.pettik
2018-07-19 9:01 ` Kirill Shcherbatov
2018-07-19 10:00 ` Kirill Shcherbatov
2018-07-20 2:16 ` n.pettik
2018-07-20 8:29 ` Kirill Shcherbatov
2018-07-20 16:33 ` n.pettik
2018-07-23 10:33 ` Kirill Shcherbatov
2018-07-25 12:58 ` n.pettik
2018-07-25 16:59 ` Kirill Shcherbatov
2018-07-26 9:10 ` n.pettik
2018-07-26 20:40 ` Vladislav Shpilevoy
2018-07-27 7:09 ` Kirill Shcherbatov
2018-07-27 7:16 ` 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=606f657b-26df-35b9-ddf1-d5bae5654d82@tarantool.org \
--to=kshcherbatov@tarantool.org \
--cc=tarantool-patches@freelists.org \
--cc=v.shpilevoy@tarantool.org \
--subject='[tarantool-patches] Re: [PATCH v1 1/1] sql: introduce TRUNCATE TABLE operation' \
/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