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