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

Reply via email to