Changeset: d5278d67ad5f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d5278d67ad5f
Added Files:
sql/test/BugTracker-2019/Tests/prepare-non-existing-function.Bug-6725.sql
sql/test/BugTracker-2019/Tests/prepare-non-existing-function.Bug-6725.stable.err
sql/test/BugTracker-2019/Tests/prepare-non-existing-function.Bug-6725.stable.out
Modified Files:
gdk/gdk_logger.c
sql/server/rel_select.c
sql/storage/bat/bat_storage.c
sql/storage/store.c
sql/test/BugTracker-2019/Tests/All
sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.sql
sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.stable.out
Branch: context
Log Message:
merged with default
diffs (truncated from 509 to 300 lines):
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1503,7 +1503,7 @@ bm_subcommit(logger *lg, BAT *list_bid,
}
n[i++] = dcatalog->batCacheid;
- if (BATcount(dcatalog) > (BATcount(catalog_nme)/2) &&
+ if (BATcount(dcatalog) > 1024 &&
catalog_bid == list_bid &&
catalog_nme == list_nme &&
lg->catalog_bid == catalog_bid) {
@@ -3238,7 +3238,7 @@ logger_add_bat(logger *lg, BAT *b, const
if (lg->debug & 1)
fprintf(stderr, "#create %s\n", NAME(name, tpe, id));
assert(log_find(lg->catalog_bid, lg->dcatalog, bid) == BUN_NONE);
- lg->changes += BATcount(b) + 1;
+ lg->changes += BATcount(b) + 1000;
if (BUNappend(lg->catalog_bid, &bid, false) != GDK_SUCCEED ||
BUNappend(lg->catalog_nme, name, false) != GDK_SUCCEED ||
BUNappend(lg->catalog_tpe, &tpe, false) != GDK_SUCCEED ||
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -393,7 +393,8 @@ bind_func(mvc *sql, sql_schema *s, char
{
sql_subfunc *sf = NULL;
- assert(t1);
+ if (t1 == NULL)
+ return NULL;
if (sql->forward) {
if (execute_priv(sql, sql->forward) &&
strcmp(fname, sql->forward->base.name) == 0 &&
@@ -3317,9 +3318,13 @@ rel_unop_(sql_query *query, sql_rel *rel
}
return exp_unop(sql->sa, e, f);
} else if (e) {
- char *type = exp_subtype(e)->type->sqlname;
-
- return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no such
unary operator '%s(%s)'", fname, type);
+ if (t) {
+ char *type = t->type->sqlname;
+
+ return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no
such unary operator '%s(%s)'", fname, type);
+ } else {
+ return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no
such unary operator '%s(?)'", fname);
+ }
}
return NULL;
}
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
@@ -1908,12 +1908,13 @@ clear_delta(sql_trans *tr, sql_delta *ba
sz += BATcount(b);
bat_clear(b);
BATcommit(b);
+ }
+ if (b)
bat_destroy(b);
- }
}
if (bat->bid) {
b = temp_descriptor(bat->bid);
- if(b) {
+ if (b) {
assert(!isEbat(b));
sz += BATcount(b);
/* for transactions we simple switch to ibid only */
@@ -1933,16 +1934,18 @@ clear_delta(sql_trans *tr, sql_delta *ba
if (b && !isEbat(b)) {
bat_clear(b);
BATcommit(b);
+ }
+ if (b)
bat_destroy(b);
- }
}
if (bat->uvbid) {
b = temp_descriptor(bat->uvbid);
if(b && !isEbat(b)) {
bat_clear(b);
BATcommit(b);
+ }
+ if (b)
bat_destroy(b);
- }
}
bat->cnt = 0;
bat->ucnt = 0;
@@ -2007,9 +2010,11 @@ empty_col(sql_column *c)
if (bat->ibid == BID_NIL)
return LOG_ERR;
- if (bat->bid == bat->ibid &&
- (bat->bid = copyBat(bat->ibid, type, 0)) == 0)
- return LOG_ERR;
+ if (bat->bid == bat->ibid) { /* if we use the empty, we need to make a
real copy */
+ temp_destroy(bat->bid);
+ if ((bat->bid = copyBat(bat->ibid, type, 0)) == 0)
+ return LOG_ERR;
+ }
/* make new bat persistent */
{
@@ -2030,8 +2035,7 @@ empty_col(sql_column *c)
return LOG_ERR;
}
bat_set_access(b, BAT_READ);
- if (BATmode(b, false) != GDK_SUCCEED ||
- logger_add_bat(bat_logger, b, bat->name,
c->t->bootstrap?0:LOG_COL, c->base.id) != GDK_SUCCEED) {
+ if (logger_add_bat(bat_logger, b, bat->name,
c->t->bootstrap?0:LOG_COL, c->base.id) != GDK_SUCCEED) {
bat_destroy(b);
return LOG_ERR;
}
@@ -2057,9 +2061,11 @@ empty_idx(sql_idx *i)
if (bat->ibid == BID_NIL)
return LOG_ERR;
- if (bat->bid == bat->ibid &&
- (bat->bid = copyBat(bat->ibid, type, 0)) == 0)
- return LOG_ERR;
+ if (bat->bid == bat->ibid) { /* if we use the empty, we need to make a
real copy */
+ temp_destroy(bat->bid);
+ if ((bat->bid = copyBat(bat->ibid, type, 0)) == 0)
+ return LOG_ERR;
+ }
/* make new bat persistent */
{
@@ -2079,8 +2085,7 @@ empty_idx(sql_idx *i)
return LOG_ERR;
}
bat_set_access(b, BAT_READ);
- if (BATmode(b, false) != GDK_SUCCEED ||
- logger_add_bat(bat_logger, b, bat->name,
i->t->bootstrap?0:LOG_IDX, i->base.id) != GDK_SUCCEED) {
+ if (logger_add_bat(bat_logger, b, bat->name,
i->t->bootstrap?0:LOG_IDX, i->base.id) != GDK_SUCCEED) {
bat_destroy(b);
return LOG_ERR;
}
@@ -2094,9 +2099,11 @@ empty_del(sql_table *t)
{
sql_dbat *bat = t->data;
- if (bat->dbid == e_bat(TYPE_oid) &&
- (bat->dbid = copyBat(bat->dbid, TYPE_oid, 0)) == 0)
- return LOG_ERR;
+ if (bat->dbid == ebats[TYPE_oid]->batCacheid) { /* if we use the empty,
we need to make a real copy */
+ temp_destroy(bat->dbid);
+ if ((bat->dbid = copyBat(bat->dbid, TYPE_oid, 0)) == 0)
+ return LOG_ERR;
+ }
/* make new bat persistent */
{
@@ -2116,8 +2123,7 @@ empty_del(sql_table *t)
return LOG_ERR;
}
bat_set_access(b, BAT_READ);
- if (BATmode(b, false) != GDK_SUCCEED ||
- logger_add_bat(bat_logger, b, bat->dname,
t->bootstrap?0:LOG_TAB, t->base.id) != GDK_SUCCEED) {
+ if (logger_add_bat(bat_logger, b, bat->dname,
t->bootstrap?0:LOG_TAB, t->base.id) != GDK_SUCCEED) {
bat_destroy(b);
return LOG_ERR;
}
@@ -2733,7 +2739,7 @@ update_table(sql_trans *tr, sql_table *f
}
while (b && b->wtime >= oldest->stime)
b = b->next;
- if (/* DISABLES CODE */ (0) && b && b->wtime <
oldest->stime) {
+ if (b && b->wtime < oldest->stime) {
/* anything older can go */
destroy_dbat(tr, b->next);
b->next = NULL;
@@ -2773,7 +2779,7 @@ update_table(sql_trans *tr, sql_table *f
}
while (b && b->wtime >= oldest->stime)
b = b->next;
- if (/* DISABLES CODE */ (0) && b && b->wtime <
oldest->stime) {
+ if (b && b->wtime < oldest->stime) {
/* anything older can go */
destroy_bat(tr, b->next);
b->next = NULL;
@@ -2838,7 +2844,7 @@ update_table(sql_trans *tr, sql_table *f
}
while (b && b->wtime >= oldest->stime)
b = b->next;
- if (/* DISABLES CODE */ (0) && b &&
b->wtime < oldest->stime) {
+ if (b && b->wtime < oldest->stime) {
/* anything older can go */
destroy_bat(tr, b->next);
b->next = NULL;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2078,12 +2078,12 @@ store_apply_deltas(void)
logging = false;
}
-static bool need_flush = false;
+static ATOMIC_TYPE need_flush = ATOMIC_VAR_INIT(0);
void
store_flush_log(void)
{
- need_flush = true;
+ ATOMIC_SET(&need_flush, 1);
}
static int
@@ -2143,7 +2143,7 @@ store_manager(void)
int res = LOG_OK;
int t;
- for (t = timeout; t > 0 && !need_flush; t -= sleeptime) {
+ for (t = timeout; t > 0 && !ATOMIC_GET(&need_flush); t -=
sleeptime) {
MT_sleep_ms(sleeptime);
if (GDKexiting())
return;
@@ -2154,11 +2154,11 @@ store_manager(void)
MT_lock_unset(&bs_lock);
return;
}
- if (!need_flush && logger_funcs.changes() < changes) {
+ if (!ATOMIC_GET(&need_flush) && logger_funcs.changes() <
changes) {
MT_lock_unset(&bs_lock);
continue;
}
- need_flush = false;
+ ATOMIC_SET(&need_flush, 1);
while (ATOMIC_GET(&store_nr_active)) { /* find a moment to
flush */
MT_lock_unset(&bs_lock);
if (GDKexiting())
@@ -2166,6 +2166,7 @@ store_manager(void)
MT_sleep_ms(sleeptime);
MT_lock_set(&bs_lock);
}
+ ATOMIC_SET(&need_flush, 0);
MT_thread_setworking("flushing");
logging = true;
@@ -6537,8 +6538,20 @@ sql_session_reset(sql_session *s, int ac
int
sql_trans_begin(sql_session *s)
{
- sql_trans *tr = s->tr;
- int snr = tr->schema_number;
+ sql_trans *tr;
+ int snr;
+
+ /*
+ while (ATOMIC_GET(&need_flush)) {
+ store_unlock();
+ if (GDKexiting())
+ return -1;
+ MT_sleep_ms(100);
+ store_lock();
+ }
+ */
+ tr = s->tr;
+ snr = tr->schema_number;
#ifdef STORE_DEBUG
fprintf(stderr,"#sql trans begin %d\n", snr);
diff --git a/sql/test/BugTracker-2019/Tests/All
b/sql/test/BugTracker-2019/Tests/All
--- a/sql/test/BugTracker-2019/Tests/All
+++ b/sql/test/BugTracker-2019/Tests/All
@@ -19,3 +19,4 @@ insert-into-select.Bug-6718
copy-into-unicode-quote.Bug-6716
select_window_function_and_asterisk.Bug-6722
disallow_duplicate_column_aliases.Bug-6723
+prepare-non-existing-function.Bug-6725
diff --git
a/sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.sql
b/sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.sql
--- a/sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.sql
+++ b/sql/test/BugTracker-2019/Tests/merge-statement-aliases.Bug-6715.sql
@@ -1,5 +1,24 @@
-start transaction;
CREATE TABLE ProductTarget (ProductID SERIAL, Name VARCHAR(100) NOT NULL,
ProductNumber BIGINT, Color VARCHAR(30) NOT NULL);
CREATE TABLE ProductSource (ProductID SERIAL, Name VARCHAR(100) NOT NULL,
ProductNumber BIGINT, Color VARCHAR(30) NOT NULL);
+
MERGE INTO ProductTarget T USING ProductSource S ON S.ProductID = T.ProductID
WHEN MATCHED THEN UPDATE SET Name = S.Name;
-rollback;
+
+MERGE INTO ProductTarget T USING ProductSource S ON S.ProductID = T.ProductID
WHEN MATCHED THEN UPDATE SET T.Name = S.Name, ProductTarget.ProductNumber =
S.ProductNumber, ProductTarget.Color = S.Color;
+
+MERGE INTO ProductTarget T USING ProductSource S ON S.ProductID = T.ProductID
WHEN NOT MATCHED THEN INSERT (T.ProductID, ProductTarget.ProductNumber,
ProductTarget.Color, T.Name) VALUES (S.ProductID, S.ProductNumber, S.Color,
S.Name);
+
+MERGE INTO ProductTarget T USING ProductSource S ON S.ProductID = T.ProductID
+ WHEN MATCHED THEN UPDATE SET Name = S.Name, ProductNumber = S.ProductNumber,
Color = S.Color
+ WHEN NOT MATCHED THEN INSERT (ProductID, ProductNumber, Color, Name) VALUES
(S.ProductID, S.ProductNumber, Color, Name);
+
+MERGE INTO ProductTarget T USING ProductSource S ON S.ProductID = T.ProductID
+ WHEN MATCHED THEN UPDATE SET ProductTarget.Name = S.Name,
ProductTarget.ProductNumber = S.ProductNumber, T.Color = S.Color
+ WHEN NOT MATCHED THEN INSERT (T.ProductID, ProductTarget.ProductNumber,
ProductTarget.Color, T.Name) VALUES (ProductID, S.ProductNumber, S.Color, Name);
+
+MERGE INTO ProductTarget T USING ProductSource S ON T.ProductID = S.ProductID
+ WHEN MATCHED THEN UPDATE SET T.Name = S.Name, T.ProductNumber =
ProductNumber, T.Color = Color
+ WHEN NOT MATCHED THEN INSERT (T.ProductID, T.ProductNumber, T.Color, T.Name)
VALUES (ProductID, S.ProductNumber, S.Color, Name);
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list