Changeset: 829864d25bb2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=829864d25bb2
Added Files:
        sql/test/Tests/truncate-statements.sql
        sql/test/Tests/truncate-statements.stable.err
        sql/test/Tests/truncate-statements.stable.out
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_upgrades.c
        sql/include/sql_catalog.h
        sql/include/sql_relation.h
        sql/scripts/51_sys_schema_extension.sql
        sql/server/rel_distribute.c
        sql/server/rel_dump.c
        sql/server/rel_optimizer.c
        sql/server/rel_partition.c
        sql/server/rel_psm.c
        sql/server/rel_rel.c
        sql/server/rel_schema.c
        sql/server/rel_semantic.c
        sql/server/rel_updates.c
        sql/server/rel_updates.h
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/server/sql_privileges.c
        sql/server/sql_scan.c
        sql/test/Tests/All
        sql/test/pg_regress/Tests/alter_table.stable.err
        sql/test/pg_regress/Tests/float8.stable.err.int128
        sql/test/pg_regress/Tests/insert.stable.err
Branch: sqlextra
Log Message:

Added truncate statements


diffs (truncated from 1215 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1346,6 +1346,7 @@ rel2bin_args(backend *be, sql_rel *rel, 
        case op_insert:
        case op_update:
        case op_delete:
+       case op_truncate:
                args = rel2bin_args(be, rel->r, args);
                break;
        }
@@ -1356,7 +1357,7 @@ typedef struct trigger_input {
        sql_table *t;
        stmt *tids;
        stmt **updates;
-       int type; /* insert 1, update 2, delete 3 */
+       int type; /* insert 1, update 2, delete 3, truncate 4 */
        const char *on;
        const char *nn;
 } trigger_input;
@@ -4303,7 +4304,7 @@ rel2bin_update(backend *be, sql_rel *rel
 }
  
 static void
-sql_stack_add_deleted(mvc *sql, const char *name, sql_table *t, stmt *tids)
+sql_stack_add_deleted(mvc *sql, const char *name, sql_table *t, stmt *tids, 
int type)
 {
        /* Put single relation of updates and old values on to the stack */
        sql_rel *r = NULL;
@@ -4314,7 +4315,7 @@ sql_stack_add_deleted(mvc *sql, const ch
        ti->t = t;
        ti->tids = tids;
        ti->updates = NULL;
-       ti->type = 3;
+       ti->type = type;
        ti->nn = name;
        for (n = t->columns.set->h; n; n = n->next) {
                sql_column *c = n->data;
@@ -4329,7 +4330,7 @@ sql_stack_add_deleted(mvc *sql, const ch
 }
 
 static int
-sql_delete_triggers(backend *be, sql_table *t, stmt *tids, int time)
+sql_delete_triggers(backend *be, sql_table *t, stmt *tids, int time, int 
firing_type, int internal_type)
 {
        mvc *sql = be->mvc;
        node *n;
@@ -4342,7 +4343,7 @@ sql_delete_triggers(backend *be, sql_tab
                sql_trigger *trigger = n->data;
 
                stack_push_frame(sql, "OLD-NEW");
-               if (trigger->event == 1 && trigger->time == time) {
+               if (trigger->event == firing_type && trigger->time == time) {
                        stmt *s = NULL;
        
                        /* add name for the 'deleted' to the stack */
@@ -4350,7 +4351,7 @@ sql_delete_triggers(backend *be, sql_tab
                
                        if (!o) o = "old"; 
                
-                       sql_stack_add_deleted(sql, o, t, tids);
+                       sql_stack_add_deleted(sql, o, t, tids, internal_type);
                        s = sql_parse(be, sql->sa, trigger->statement, 
m_instantiate);
 
                        if (!s) 
@@ -4457,7 +4458,7 @@ sql_delete(backend *be, sql_table *t, st
        }
 
 /* before */
-       if (!sql_delete_triggers(be, t, v, 0)) 
+       if (!sql_delete_triggers(be, t, v, 0, 1, 3))
                return sql_error(sql, 02, "DELETE: triggers failed for table 
'%s'", t->base.name);
 
        if (!sql_delete_keys(be, t, v, l)) 
@@ -4475,7 +4476,7 @@ sql_delete(backend *be, sql_table *t, st
        }
 
 /* after */
-       if (!sql_delete_triggers(be, t, v, 1)) 
+       if (!sql_delete_triggers(be, t, v, 1, 1, 3))
                return sql_error(sql, 02, "DELETE: triggers failed for table 
'%s'", t->base.name);
        if (rows) 
                s = stmt_aggr(be, rows, NULL, NULL, sql_bind_aggr(sql->sa, 
sql->session->schema, "count", NULL), 1, 0);
@@ -4510,10 +4511,104 @@ rel2bin_delete(backend *be, sql_rel *rel
        return delete;
 }
 
+static stmt *
+sql_truncate(backend *be, sql_table *t, int restart_sequences, int drop_action)
+{
+       mvc *sql = be->mvc;
+       list *l = sa_list(sql->sa);
+       stmt *v = stmt_tid(be, t, 0), *s = NULL;
+       const char *next_value_for = "next value for \"sys\".\"seq_";
+       char *seq_name;
+       str seq_pos = NULL;
+       sql_column *col;
+       sql_sequence *seq;
+       sql_schema *sche = t->s;
+       sql_trans *tr = sql->session->tr;
+       node *n;
+
+       if(restart_sequences) { /* restart the sequences if it's the case */
+               for (n = t->columns.set->h; n; n = n->next) {
+                       col = n->data;
+                       if (col->def && (seq_pos = strstr(col->def, 
next_value_for))) {
+                               seq_name = _STRDUP(seq_pos + 
(strlen(next_value_for) - strlen("seq_")));
+                               seq_name[strlen(seq_name)-1] = '\0';
+                               seq = find_sql_sequence(sche, seq_name);
+                               if (seq) {
+                                       sql_trans_sequence_restart(tr, seq, 
seq->start);
+                                       seq->base.wtime = sche->base.wtime = 
tr->wtime = tr->wstime;
+                                       tr->schema_updates++;
+                               }
+                               _DELETE(seq_name);
+                       }
+               }
+       }
+
+       if (!drop_action && t->keys.set) { /* Check for foreign key references 
if it's the case */
+               for (n = t->keys.set->h; n; n = n->next) {
+                       sql_key *k = n->data;
+
+                       if (k->type == ukey || k->type == pkey) {
+                               sql_ukey *uk = (sql_ukey *) k;
+
+                               if (uk->keys && list_length(uk->keys)) {
+                                       node *l = uk->keys->h;
+
+                                       for (; l; l = l->next) {
+                                               k = l->data;
+                                               /* make sure it is not a self 
referencing key */
+                                               if (k->t != t)
+                                                       return sql_error(sql, 
02, "TRUNCATE: FOREIGN KEY %s.%s depends on %s", k->t->base.name, k->base.name, 
t->base.name);
+                                       }
+                               }
+                       }
+               }
+       }
+
+/* before */
+       if (!sql_delete_triggers(be, t, v, 0, 3, 4))
+               return sql_error(sql, 02, "TRUNCATE: triggers failed for table 
'%s'", t->base.name);
+
+       if (!sql_delete_keys(be, t, v, l))
+               return sql_error(sql, 02, "TRUNCATE: failed to delete indexes 
for table '%s'", t->base.name);
+
+       s = stmt_table_clear(be, t);
+       list_append(l, s);
+
+/* after */
+       if (!sql_delete_triggers(be, t, v, 1, 3, 4))
+               return sql_error(sql, 02, "TRUNCATE: triggers failed for table 
'%s'", t->base.name);
+       return s;
+}
+
 #define E_ATOM_INT(e) ((atom*)((sql_exp*)e)->l)->data.val.lval
 #define E_ATOM_STRING(e) ((atom*)((sql_exp*)e)->l)->data.val.sval
 
 static stmt *
+rel2bin_truncate(backend *be, sql_rel *rel)
+{
+       mvc *sql = be->mvc;
+       stmt *truncate;
+       sql_rel *tr = rel->l;
+       sql_table *t = NULL;
+       node *n;
+       int restart_sequences, drop_action;
+
+       if (tr->op == op_basetable)
+               t = tr->l;
+       else
+               assert(0/*ddl statement*/);
+
+       n = rel->exps->h;
+       restart_sequences = E_ATOM_INT(n->data);
+       drop_action = E_ATOM_INT(n->next->data);
+
+       truncate = sql_truncate(be, t, restart_sequences, drop_action);
+       if (sql->cascade_action)
+               sql->cascade_action = NULL;
+       return truncate;
+}
+
+static stmt *
 rel2bin_output(backend *be, sql_rel *rel, list *refs) 
 {
        mvc *sql = be->mvc;
@@ -4821,6 +4916,11 @@ subrel_bin(backend *be, sql_rel *rel, li
                if (sql->type == Q_TABLE)
                        sql->type = Q_UPDATE;
                break;
+       case op_truncate:
+               s = rel2bin_truncate(be, rel);
+               if (sql->type == Q_TABLE)
+                       sql->type = Q_UPDATE;
+               break;
        case op_ddl:
                s = rel2bin_ddl(be, rel, refs);
                break;
@@ -5033,7 +5133,8 @@ rel_deps(sql_allocator *sa, sql_rel *r, 
                break;
        case op_insert: 
        case op_update: 
-       case op_delete: 
+       case op_delete:
+       case op_truncate:
                if (rel_deps(sa, r->l, refs, l) != 0 ||
                    rel_deps(sa, r->r, refs, l) != 0)
                        return -1;
diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -764,10 +764,16 @@ sql_update_jul2017(Client c, mvc *sql)
                        "privilege_code_id   INT NOT NULL PRIMARY KEY,\n"
                        "privilege_code_name VARCHAR(30) NOT NULL UNIQUE);\n"
                        "INSERT INTO sys.privilege_codes (privilege_code_id, 
privilege_code_name) VALUES\n"
-                       "(1, 'SELECT'), (2, 'UPDATE'), (4, 'INSERT'), (8, 
'DELETE'), (16, 'EXECUTE'), (32, 'GRANT'),\n"
+                       "(1, 'SELECT'), (2, 'UPDATE'), (4, 'INSERT'), (8, 
'DELETE'), (16, 'EXECUTE'), (32, 'GRANT'), (64, 'TRUNCATE'),\n"
                        "(3, 'SELECT,UPDATE'), (5, 'SELECT,INSERT'), (6, 
'INSERT,UPDATE'), (7, 'SELECT,INSERT,UPDATE'),\n"
                        "(9, 'SELECT,DELETE'), (10, 'UPDATE,DELETE'), (11, 
'SELECT,UPDATE,DELETE'), (12, 'INSERT,DELETE'),\n"
-                       "(13, 'SELECT,INSERT,DELETE'), (14, 
'INSERT,UPDATE,DELETE'), (15, 'SELECT,INSERT,UPDATE,DELETE');\n"
+                       "(13, 'SELECT,INSERT,DELETE'), (14, 
'INSERT,UPDATE,DELETE'), (15, 'SELECT,INSERT,UPDATE,DELETE'),\n"
+                       "(65, 'SELECT,TRUNCATE'), (66, 'UPDATE,TRUNCATE'), (68, 
'INSERT,TRUNCATE'), (72, 'DELETE,TRUNCATE'),\n"
+                       "(67, 'SELECT,UPDATE,TRUNCATE'), (69, 
'SELECT,INSERT,TRUNCATE'), (73, 'SELECT,DELETE,TRUNCATE'),\n"
+                       "(70, 'INSERT,UPDATE,TRUNCATE'), (76, 
'INSERT,DELETE,TRUNCATE'), (74, 'UPDATE,DELETE,TRUNCATE'),\n"
+                       "(71, 'SELECT,INSERT,UPDATE,TRUNCATE'), (75, 
'SELECT,UPDATE,DELETE,TRUNCATE'),\n"
+                       "(77, 'SELECT,INSERT,DELETE,TRUNCATE'), (78, 
'INSERT,UPDATE,DELETE,TRUNCATE'),\n"
+                       "(79, 'SELECT,INSERT,UPDATE,DELETE,TRUNCATE');\n"
                        "ALTER TABLE sys.privilege_codes SET READ ONLY;\n"
 
                        "update sys._tables set system = true where name in 
('function_languages', 'function_types', 'index_types', 'key_types', 
'privilege_codes') and schema_id = (select id from sys.schemas where name = 
'sys');\n");
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -35,6 +35,7 @@
 #define PRIV_DELETE 8
 #define PRIV_EXECUTE 16
 #define PRIV_GRANT 32
+#define PRIV_TRUNCATE 64
 /* global privs */
 #define PRIV_COPYFROMFILE 1
 #define PRIV_COPYINTOFILE 2
@@ -418,7 +419,7 @@ typedef struct sql_trigger {
        sql_base base;
        sht time;               /* before or after */
        sht orientation;        /* row or statement */
-       sht event;              /* insert, delete, update */
+       sht event;              /* insert, delete, update, truncate */
        /* int action_order;     TODO, order within the set of triggers */
        struct list *columns;   /* update trigger on list of (sql_kc) columns */
 
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -163,7 +163,8 @@ typedef enum operator_type {
        op_sample,
        op_insert,      /* insert(l=table, r insert expressions) */ 
        op_update,      /* update(l=table, r update expressions) */
-       op_delete       /* delete(l=table, r delete expression) */
+       op_delete,      /* delete(l=table, r delete expression) */
+       op_truncate /* trucante(l=table) */
 } operator_type;
 
 #define is_atom(et) \
@@ -222,7 +223,7 @@ typedef enum operator_type {
 #define is_topn(op) \
        (op == op_topn)
 #define is_modify(op) \
-       (op == op_insert || op == op_update || op == op_delete)
+       (op == op_insert || op == op_update || op == op_delete || op == 
op_truncate)
 #define is_sample(op) \
        (op == op_sample)
 
diff --git a/sql/scripts/51_sys_schema_extension.sql 
b/sql/scripts/51_sys_schema_extension.sql
--- a/sql/scripts/51_sys_schema_extension.sql
+++ b/sql/scripts/51_sys_schema_extension.sql
@@ -12,7 +12,7 @@ CREATE TABLE sys.keywords (
 INSERT INTO sys.keywords (keyword) VALUES
 ('ADD'), ('ADMIN'), ('AFTER'), ('AGGREGATE'), ('ALL'), ('ALTER'), ('ALWAYS'), 
('AND'), ('ANY'), ('ASC'), ('ASYMMETRIC'), ('ATOMIC'), ('AUTO_INCREMENT'),
 ('BEFORE'), ('BEGIN'), ('BEST'), ('BETWEEN'), ('BIGINT'), ('BIGSERIAL'), 
('BINARY'), ('BLOB'), ('BY'),
-('CALL'), ('CASCADE'), ('CASE'), ('CAST'), ('CHAIN'), ('CHAR'), ('CHARACTER'), 
('CHECK'), ('CLOB'), ('COALESCE'), ('COMMIT'), ('COMMITTED'), ('CONSTRAINT'), 
('CONVERT'), ('COPY'), ('CORRESPONDING'), ('CREATE'), ('CROSS'), ('CURRENT'), 
('CURRENT_DATE'), ('CURRENT_ROLE'), ('CURRENT_TIME'), ('CURRENT_TIMESTAMP'), 
('CURRENT_USER'),
+('CALL'), ('CASCADE'), ('CASE'), ('CAST'), ('CHAIN'), ('CHAR'), ('CHARACTER'), 
('CHECK'), ('CLOB'), ('COALESCE'), ('COMMIT'), ('COMMITTED'), ('CONSTRAINT'), 
('CONTINUE'), ('CONVERT'), ('COPY'), ('CORRESPONDING'), ('CREATE'), ('CROSS'), 
('CURRENT'), ('CURRENT_DATE'), ('CURRENT_ROLE'), ('CURRENT_TIME'), 
('CURRENT_TIMESTAMP'), ('CURRENT_USER'),
 ('DAY'), ('DEC'), ('DECIMAL'), ('DECLARE'), ('DEFAULT'), ('DELETE'), 
('DELIMITERS'), ('DESC'), ('DO'), ('DOUBLE'), ('DROP'),
 ('EACH'), ('EFFORT'), ('ELSE'), ('ELSEIF'), ('ENCRYPTED'), ('END'), 
('ESCAPE'), ('EVERY'), ('EXCEPT'), ('EXCLUDE'), ('EXISTS'), ('EXTERNAL'), 
('EXTRACT'),
 ('FALSE'), ('FLOAT'), ('FOLLOWING'), ('FOR'), ('FOREIGN'), ('FROM'), ('FULL'), 
('FUNCTION'),
@@ -27,7 +27,7 @@ INSERT INTO sys.keywords (keyword) VALUE
 ('PARTIAL'), ('PARTITION'), ('POSITION'), ('PRECEDING'), ('PRESERVE'), 
('PRIMARY'), ('PRIVILEGES'), ('PROCEDURE'), ('PUBLIC'),
 ('RANGE'), ('READ'), ('REAL'), ('RECORDS'), ('REFERENCES'), ('REFERENCING'), 
('REMOTE'), ('RENAME'), ('REPEATABLE'), ('REPLICA'), ('RESTART'), ('RESTRICT'), 
('RETURN'), ('RETURNS'), ('REVOKE'), ('RIGHT'), ('ROLLBACK'), ('ROWS'),
 ('SAMPLE'), ('SAVEPOINT'), ('SECOND'), ('SELECT'), ('SEQUENCE'), ('SERIAL'), 
('SERIALIZABLE'), ('SESSION_USER'), ('SET'), ('SIMPLE'), ('SMALLINT'), 
('SOME'), ('SPLIT_PART'), ('STDIN'), ('STDOUT'), ('STORAGE'), ('STREAM'), 
('STRING'), ('SUBSTRING'), ('SYMMETRIC'),
-('THEN'), ('TIES'), ('TINYINT'), ('TO'), ('TRANSACTION'), ('TRIGGER'), 
('TRUE'),
+('THEN'), ('TIES'), ('TINYINT'), ('TO'), ('TRANSACTION'), ('TRIGGER'), 
('TRUE'), ('TRUNCATE'),
 ('UNBOUNDED'), ('UNCOMMITTED'), ('UNENCRYPTED'), ('UNION'), ('UNIQUE'), 
('UPDATE'), ('USER'), ('USING'),
 ('VALUES'), ('VARCHAR'), ('VARYING'), ('VIEW'),
 ('WHEN'), ('WHERE'), ('WHILE'), ('WITH'), ('WORK'), ('WRITE'),
@@ -112,15 +112,22 @@ ALTER TABLE sys.index_types SET READ ONL
 
 CREATE TABLE sys.privilege_codes (
     privilege_code_id   INT NOT NULL PRIMARY KEY,
-    privilege_code_name VARCHAR(30) NOT NULL UNIQUE);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to