Changeset: c38a273b3759 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c38a273b3759
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_updates.c
        sql/server/sql_parser.y
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
Branch: default
Log Message:

add option to disable key checks


diffs (242 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
@@ -2976,11 +2976,13 @@ rel2bin_insert( mvc *sql, sql_rel *rel, 
 {
        list *newl, *l;
        stmt *inserts = NULL, *insert = NULL, *s, *ddl = NULL, *pin = NULL;
-       int idx_ins = 0;
+       int idx_ins = 0, constraint = 1;
        node *n, *m;
        sql_rel *tr = rel->l, *prel = rel->r;
        sql_table *t = NULL;
 
+       if ((rel->flag&UPD_NO_CONSTRAINT)) 
+               constraint = 0;
        if ((rel->flag&UPD_COMP)) {  /* special case ! */
                idx_ins = 1;
                prel = rel->l;
@@ -3027,7 +3029,7 @@ rel2bin_insert( mvc *sql, sql_rel *rel, 
                if ((hash_index(i->type) && list_length(i->columns) <= 1) ||
                    i->type == no_idx)
                        is = NULL;
-               if (i->key) {
+               if (i->key && constraint) {
                        stmt *ckeys = sql_insert_key(sql, newl, i->key, is, 
pin);
 
                        list_prepend(l, ckeys);
@@ -3045,7 +3047,8 @@ rel2bin_insert( mvc *sql, sql_rel *rel, 
                return NULL;
 
        l = list_append(l, stmt_list(sql->sa, newl));
-       sql_insert_check_null(sql, t, newl, l);
+       if (constraint)
+               sql_insert_check_null(sql, t, newl, l);
        if (!sql_insert_triggers(sql, t, l)) 
                return sql_error(sql, 02, "INSERT INTO: triggers failed for 
table '%s'", t->base.name);
        if (insert->op1->nrcols == 0) {
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1043,7 +1043,7 @@ rel_import(mvc *sql, sql_table *t, char 
 }
 
 static sql_rel *
-copyfrom(mvc *sql, dlist *qname, dlist *files, dlist *seps, dlist *nr_offset, 
str null_string, int locked)
+copyfrom(mvc *sql, dlist *qname, dlist *files, dlist *seps, dlist *nr_offset, 
str null_string, int locked, int constraint)
 {
        sql_rel *rel = NULL;
        char *sname = qname_schema(qname);
@@ -1144,11 +1144,13 @@ copyfrom(mvc *sql, dlist *qname, dlist *
        rel = rel_insert_table(sql, t, t->base.name, rel);
        if (rel && locked)
                rel->flag |= UPD_LOCKED;
+       if (rel && !constraint)
+               rel->flag |= UPD_NO_CONSTRAINT;
        return rel;
 }
 
 static sql_rel *
-bincopyfrom(mvc *sql, dlist *qname, dlist *files)
+bincopyfrom(mvc *sql, dlist *qname, dlist *files, int constraint)
 {
        char *sname = qname_schema(qname);
        char *tname = qname_table(qname);
@@ -1215,7 +1217,10 @@ bincopyfrom(mvc *sql, dlist *qname, dlis
                append(exps, exp_column(sql->sa, t->base.name, c->base.name, 
&c->type, CARD_MULTI, c->null, 0));
        }
        res = rel_table_func(sql->sa, NULL, import, exps);
-       return rel_insert_table(sql, t, t->base.name, res);
+       res = rel_insert_table(sql, t, t->base.name, res);
+       if (res && !constraint)
+               res->flag |= UPD_NO_CONSTRAINT;
+       return res;
 }
 
 static sql_rel *
@@ -1357,7 +1362,7 @@ rel_updates(mvc *sql, symbol *s)
        {
                dlist *l = s->data.lval;
 
-               ret = copyfrom(sql, l->h->data.lval, l->h->next->data.lval, 
l->h->next->next->data.lval, l->h->next->next->next->data.lval, 
l->h->next->next->next->next->data.sval, 
l->h->next->next->next->next->next->data.i_val);
+               ret = copyfrom(sql, l->h->data.lval, l->h->next->data.lval, 
l->h->next->next->data.lval, l->h->next->next->next->data.lval, 
l->h->next->next->next->next->data.sval, 
l->h->next->next->next->next->next->data.i_val, 
l->h->next->next->next->next->next->next->data.i_val);
                sql->type = Q_UPDATE;
        }
                break;
@@ -1365,7 +1370,7 @@ rel_updates(mvc *sql, symbol *s)
        {
                dlist *l = s->data.lval;
 
-               ret = bincopyfrom(sql, l->h->data.lval, l->h->next->data.lval);
+               ret = bincopyfrom(sql, l->h->data.lval, l->h->next->data.lval, 
l->h->next->next->data.i_val);
                sql->type = Q_UPDATE;
        }
                break;
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -445,6 +445,7 @@ int yydebug=1;
        opt_chain
        opt_distinct
        opt_locked
+       opt_constraint
        set_distinct
        opt_with_check_option
 
@@ -2434,7 +2435,7 @@ opt_to_savepoint:
  ;
 
 copyfrom_stmt:
-    COPY opt_nr INTO qname FROM string_commalist opt_seps opt_null_string 
opt_locked
+    COPY opt_nr INTO qname FROM string_commalist opt_seps opt_null_string 
opt_locked opt_constraint
        { dlist *l = L();
          append_list(l, $4);
          append_list(l, $6);
@@ -2442,8 +2443,9 @@ copyfrom_stmt:
          append_list(l, $2);
          append_string(l, $8);
          append_int(l, $9);
+         append_int(l, $10);
          $$ = _symbol_create_list( SQL_COPYFROM, l ); }
-  | COPY opt_nr INTO qname FROM STDIN opt_seps opt_null_string opt_locked
+  | COPY opt_nr INTO qname FROM STDIN opt_seps opt_null_string opt_locked 
opt_constraint
        { dlist *l = L();
          append_list(l, $4);
          append_list(l, NULL);
@@ -2451,8 +2453,9 @@ copyfrom_stmt:
          append_list(l, $2);
          append_string(l, $8);
          append_int(l, $9);
+         append_int(l, $10);
          $$ = _symbol_create_list( SQL_COPYFROM, l ); }
-   | COPY opt_nr BINARY INTO qname FROM string_commalist /* binary copy from */
+   | COPY opt_nr BINARY INTO qname FROM string_commalist /* binary copy from 
*/ opt_constraint
        { dlist *l = L();
          if ($2 != NULL) {
                yyerror(m, "COPY INTO: cannot pass number of records when using 
binary COPY INTO");
@@ -2460,8 +2463,9 @@ copyfrom_stmt:
          }
          append_list(l, $5);
          append_list(l, $7);
+         append_int(l, $8);
          $$ = _symbol_create_list( SQL_BINCOPYFROM, l ); }
-  | COPY select_no_parens_orderby INTO string opt_seps opt_null_string
+  | COPY select_no_parens_orderby INTO string opt_seps opt_null_string 
        { dlist *l = L();
          append_symbol(l, $2);
          append_string(l, $4);
@@ -2522,6 +2526,11 @@ opt_locked:
  |     LOCKED          { $$ = TRUE; }
  ;
 
+opt_constraint:
+       /* empty */     { $$ = TRUE; }
+ |     NO CONSTRAINT   { $$ = FALSE; }
+ ;
+
 string_commalist:
        string_commalist_contents          { $$ = $1; }
  |     '(' string_commalist_contents ')'  { $$ = $2; }
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -25,7 +25,7 @@
 
 #define SNAPSHOT_MINSIZE ((BUN) 1024)
 
-static sql_delta *
+sql_delta *
 timestamp_delta( sql_delta *d, int ts)
 {
        while (d->next && d->wtime > ts) 
@@ -356,7 +356,7 @@ dup_delta(sql_trans *tr, sql_delta *obat
        return LOG_OK;
 }
 
-static int 
+int 
 dup_bat(sql_trans *tr, sql_table *t, sql_delta *obat, sql_delta *bat, int 
type, int oc_isnew, int c_isnew)
 {
        return dup_delta( tr, obat, bat, type, oc_isnew, c_isnew, 
isTempTable(t), t->sz);
@@ -415,6 +415,7 @@ update_idx(sql_trans *tr, sql_idx * i, v
 static void
 delta_append_bat( sql_delta *bat, BAT *i ) 
 {
+       int id = i->batCacheid;
 #ifndef NDEBUG
        BAT *c = BBPquickdesc(bat->bid, 0); 
 #endif
@@ -429,22 +430,29 @@ delta_append_bat( sql_delta *bat, BAT *i
                bat->cached = NULL;
        }
        assert(!c || BATcount(c) == bat->ibase);
-       if (!isEbat(b)){
-               /* try to use mmap() */
-               if (BATcount(b)+BATcount(i) > (BUN) REMAP_PAGE_MAXSIZE) { 
-                               BATmmap(b, STORE_MMAP, STORE_MMAP, STORE_MMAP, 
STORE_MMAP, 1);
-               }
-               assert(b->T->heap.storage != STORE_PRIV);
+       if (!bat->ibase && !BATcount(b) && BBP_refs(id) == 1 && BBP_lrefs(id) 
== 1 && !isVIEW(i) /* we need info if this is comming from copy into, like role 
== PERSISTENT */){
+               temp_destroy(bat->ibid);
+               bat->ibid = id;
+               temp_dup(id);
+               bat_destroy(b);
        } else {
-               temp_destroy(bat->ibid);
-               bat->ibid = ebat2real(b->batCacheid, bat->ibase);
+               if (!isEbat(b)){
+                       /* try to use mmap() */
+                       if (BATcount(b)+BATcount(i) > (BUN) REMAP_PAGE_MAXSIZE) 
{ 
+                                       BATmmap(b, STORE_MMAP, STORE_MMAP, 
STORE_MMAP, STORE_MMAP, 1);
+                       }
+                       assert(b->T->heap.storage != STORE_PRIV);
+               } else {
+                       temp_destroy(bat->ibid);
+                       bat->ibid = ebat2real(b->batCacheid, bat->ibase);
+                       bat_destroy(b);
+                       b = temp_descriptor(bat->ibid);
+               }
+               BATappend(b, i, TRUE);
+               assert(BUNlast(b) > b->batInserted);
                bat_destroy(b);
-               b = temp_descriptor(bat->ibid);
        }
-       BATappend(b, i, TRUE);
        bat->cnt += BATcount(i);
-       assert(BUNlast(b) > b->batInserted);
-       bat_destroy(b);
 }
 
 static void
diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h
--- a/sql/storage/bat/bat_storage.h
+++ b/sql/storage/bat/bat_storage.h
@@ -52,5 +52,8 @@ extern int tr_update_dbat(sql_trans *tr,
 extern int tr_log_delta( sql_trans *tr, sql_delta *cbat, int cleared);
 extern int tr_log_dbat(sql_trans *tr, sql_dbat *fdb, int cleared);
 
+extern int dup_bat(sql_trans *tr, sql_table *t, sql_delta *obat, sql_delta 
*bat, int type, int oc_isnew, int c_isnew);
+extern sql_delta * timestamp_delta( sql_delta *d, int ts);
+
 #endif /*BATSTORAGE_H */
 
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to