Changeset: 36412f77a7fa for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/36412f77a7fa
Modified Files:
sql/backends/monet5/dict.c
sql/include/sql_catalog.h
sql/server/sql_mvc.c
sql/storage/sql_catalog.c
sql/storage/store.c
Branch: default
Log Message:
for local tmps' we need to look inside the tables for keys, idxs, and triggers
diffs (268 lines):
diff --git a/sql/backends/monet5/dict.c b/sql/backends/monet5/dict.c
--- a/sql/backends/monet5/dict.c
+++ b/sql/backends/monet5/dict.c
@@ -19,6 +19,9 @@ static void
BATnegateprops(BAT *b)
{
/* disable all properties here */
+ b->tnonil = false;
+ b->tnil = false;
+ b->tsorted = false;
b->tsorted = false;
b->trevsorted = false;
b->tnosorted = 0;
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
@@ -766,9 +766,11 @@ extern node *list_find_base_id(list *l,
extern sql_key *find_sql_key(sql_table *t, const char *kname);
extern sql_key *sql_trans_find_key(sql_trans *tr, sqlid id);
+extern sql_key *schema_find_key(sql_trans *tr, sql_schema *s, const char
*name);
extern sql_idx *find_sql_idx(sql_table *t, const char *kname);
extern sql_idx *sql_trans_find_idx(sql_trans *tr, sqlid id);
+extern sql_idx *schema_find_idx(sql_trans *tr, sql_schema *s, const char
*name);
extern sql_column *find_sql_column(sql_table *t, const char *cname);
@@ -786,6 +788,7 @@ extern sql_type *sql_trans_bind_type(sql
extern sql_type *sql_trans_find_type(sql_trans *tr, sql_schema *s /*optional
*/, sqlid id);
extern sql_func *sql_trans_find_func(sql_trans *tr, sqlid id);
extern sql_trigger *sql_trans_find_trigger(sql_trans *tr, sqlid id);
+extern sql_trigger *schema_find_trigger(sql_trans *tr, sql_schema *s, const
char *name);
extern void find_partition_type(sql_subtype *tpe, sql_table *mt);
extern void *sql_values_list_element_validate_and_insert(void *v1, void *v2,
void *tpe, int* res);
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -290,7 +290,7 @@ mvc_init(int debug, store_type store_tpe
for (int i = 0; i < 9; i++) {
sql_column *col = NULL;
-
+
mvc_create_column_(&col, m, t, tview[i].name,
tview[i].type, tview[i].digits);
if (col == NULL) {
mvc_destroy(m);
@@ -999,10 +999,9 @@ mvc_first_column(mvc *m, sql_table *t)
sql_key *
mvc_bind_key(mvc *m, sql_schema *s, const char *kname)
{
- sql_base *b = os_find_name(s->keys, m->session->tr, kname);
- sql_key *k = (sql_key*)b;
+ sql_key *k = schema_find_key(m->session->tr, s, kname);
- if (!b)
+ if (!k)
return NULL;
TRC_DEBUG(SQL_TRANS, "Bind key: %s.%s\n", s->base.name, kname);
return k;
@@ -1011,11 +1010,10 @@ mvc_bind_key(mvc *m, sql_schema *s, cons
sql_idx *
mvc_bind_idx(mvc *m, sql_schema *s, const char *iname)
{
- sql_base *b = os_find_name(s->idxs, m->session->tr, iname);
+ sql_idx *i = schema_find_idx(m->session->tr, s, iname);
- if (!b)
+ if (!i)
return NULL;
- sql_idx *i = (sql_idx*)b;
TRC_DEBUG(SQL_TRANS, "Bind index: %s.%s\n", s->base.name, iname);
return i;
}
@@ -1060,13 +1058,12 @@ mvc_bind_ukey(sql_table *t, list *colnam
sql_trigger *
mvc_bind_trigger(mvc *m, sql_schema *s, const char *tname)
{
- sql_base *b = os_find_name(s->triggers, m->session->tr, tname);
+ sql_trigger *t = schema_find_trigger(m->session->tr, s, tname);
- if (!b)
+ if (!t)
return NULL;
- sql_trigger *trigger = (sql_trigger*)b;
TRC_DEBUG(SQL_TRANS, "Bind trigger: %s.%s\n", s->base.name, tname);
- return trigger;
+ return t;
}
int
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -166,6 +166,22 @@ sql_trans_find_key(sql_trans *tr, sqlid
return NULL;
}
+sql_key *
+schema_find_key(sql_trans *tr, sql_schema *s, const char *name)
+{
+ sql_base *b = os_find_name(s->keys, tr, name);
+
+ if (!b && tr->tmp == s && tr->localtmps.set) { /* for localtmps search
tables */
+ for(node *n = tr->localtmps.set->h; n; n = n->next) {
+ sql_table *t = n->data;
+ sql_key *o = find_sql_key(t, name);
+ if (o)
+ return o;
+ }
+ }
+ return (sql_key*)b;
+}
+
sql_idx *
find_sql_idx(sql_table *t, const char *iname)
{
@@ -189,6 +205,22 @@ sql_trans_find_idx(sql_trans *tr, sqlid
return NULL;
}
+sql_idx *
+schema_find_idx(sql_trans *tr, sql_schema *s, const char *name)
+{
+ sql_base *b = os_find_name(s->idxs, tr, name);
+
+ if (!b && tr->tmp == s && tr->localtmps.set) { /* for localtmps search
tables */
+ for(node *n = tr->localtmps.set->h; n; n = n->next) {
+ sql_table *t = n->data;
+ sql_idx *o = find_sql_idx(t, name);
+ if (o)
+ return o;
+ }
+ }
+ return (sql_idx*)b;
+}
+
sql_column *
find_sql_column(sql_table *t, const char *cname)
{
@@ -311,6 +343,15 @@ sql_trans_find_func(sql_trans *tr, sqlid
return NULL;
}
+static sql_trigger *
+find_sql_trigger(sql_table *t, const char *tname)
+{
+ node *n = ol_find_name(t->triggers, tname);
+ if (n)
+ return n->data;
+ return NULL;
+}
+
sql_trigger *
sql_trans_find_trigger(sql_trans *tr, sqlid id)
{
@@ -325,6 +366,22 @@ sql_trans_find_trigger(sql_trans *tr, sq
return NULL;
}
+sql_trigger *
+schema_find_trigger(sql_trans *tr, sql_schema *s, const char *name)
+{
+ sql_base *b = os_find_name(s->triggers, tr, name);
+
+ if (!b && tr->tmp == s && tr->localtmps.set) { /* for localtmps search
tables */
+ for(node *n = tr->localtmps.set->h; n; n = n->next) {
+ sql_table *t = n->data;
+ sql_trigger *o = find_sql_trigger(t, name);
+ if (o)
+ return o;
+ }
+ }
+ return (sql_trigger*)b;
+}
+
void*
sql_values_list_element_validate_and_insert(void *v1, void *v2, void *tpe,
int* res)
{
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2139,37 +2139,6 @@ store_init(int debug, store_type store_t
return store;
}
-// All this must only be accessed while holding the store->flush.
-// The exception is flush_now, which can be set by anyone at any
-// time and therefore needs some special treatment.
-static struct {
- // These two are inputs, set from outside the store_manager
- bool enabled;
- ATOMIC_TYPE flush_now;
- // These are state set from within the store_manager
- bool working;
- int countdown_ms;
- unsigned int cycle;
- char *reason_to;
- char *reason_not_to;
-} flusher = {
- .flush_now = ATOMIC_VAR_INIT(0),
- .enabled = true,
-};
-
-static void
-flusher_new_cycle(void)
-{
- int cycle_time = GDKdebug & FORCEMITOMASK ? 500 : 50000;
-
- // do not touch .enabled and .flush_now, those are inputs
- flusher.working = false;
- flusher.countdown_ms = cycle_time;
- flusher.cycle += 1;
- flusher.reason_to = NULL;
- flusher.reason_not_to = NULL;
-}
-
void
store_exit(sqlstore *store)
{
@@ -2233,14 +2202,11 @@ store_apply_deltas(sqlstore *store)
{
int res = LOG_OK;
- flusher.working = true;
-
store_lock(store);
ulng oldest = store_oldest_pending(store);
store_unlock(store);
if (oldest)
res = store->logger_api.flush(store, oldest-1);
- flusher.working = false;
return res;
}
@@ -2248,7 +2214,6 @@ void
store_suspend_log(sqlstore *store)
{
MT_lock_set(&store->lock);
- flusher.enabled = false;
MT_lock_unset(&store->lock);
}
@@ -2256,7 +2221,6 @@ void
store_resume_log(sqlstore *store)
{
MT_lock_set(&store->flush);
- flusher.enabled = true;
MT_lock_unset(&store->flush);
}
@@ -2352,7 +2316,6 @@ store_manager(sqlstore *store)
const int sleeptime = 100;
MT_lock_unset(&store->flush);
MT_sleep_ms(sleeptime);
- flusher.countdown_ms -= sleeptime;
MT_lock_set(&store->commit);
MT_lock_set(&store->flush);
if (store->logger_api.changes(store) <= 0) {
@@ -2373,7 +2336,6 @@ store_manager(sqlstore *store)
if (GDKexiting())
break;
- flusher_new_cycle();
MT_thread_setworking("sleeping");
TRC_DEBUG(SQL_STORE, "Store flusher done\n");
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]