Changeset: 2e1bfee1461d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2e1bfee1461d
Modified Files:
        gdk/ChangeLog.Jul2017
        gdk/gdk_batop.c
        gdk/gdk_logger.c
        sql/backends/monet5/sql_cat.c
        sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out
        sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out
        sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows
        sql/server/rel_select.c
        sql/server/sql_parser.y
        sql/test/BugTracker-2011/Tests/UDF_in_schema.Bug-2817.sql
        
sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.sql
        sql/test/BugTracker-2015/Tests/schema_view.Bug-3708.sql
        sql/test/BugTracker-2017/Tests/function_and_mergetable.Bug-6288.sql
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out.int128
        sql/test/Skyserver/drop_user.sql
        sql/test/leaks/Tests/check1.stable.out.int128
Branch: default
Log Message:

Merge with Jul2017 branch.


diffs (truncated from 453 to 300 lines):

diff --git a/gdk/ChangeLog.Jul2017 b/gdk/ChangeLog.Jul2017
--- a/gdk/ChangeLog.Jul2017
+++ b/gdk/ChangeLog.Jul2017
@@ -1,3 +1,7 @@
 # ChangeLog file for MonetDB
 # This file is updated with Maddlog
 
+* Mon Oct 23 2017 Sjoerd Mullender <sjo...@acm.org>
+- A serious bug, possibly resulting in database corruption, having to
+  do with appending data to a string BAT was fixed.
+
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -174,8 +174,12 @@ insert_string_bat(BAT *b, BAT *n, BAT *s
                                }
                                memcpy(b->tvheap->base + toff, n->tvheap->base, 
n->tvheap->free);
                                b->tvheap->free = toff + n->tvheap->free;
-                               /* flush double-elimination hash table */
-                               memset(b->tvheap->base, 0, GDK_STRHASHSIZE);
+                               if (toff > 0) {
+                                       /* flush double-elimination
+                                        * hash table */
+                                       memset(b->tvheap->base, 0,
+                                              GDK_STRHASHSIZE);
+                               }
                        }
                }
                if (toff != ~(size_t) 0) {
@@ -195,38 +199,10 @@ insert_string_bat(BAT *b, BAT *n, BAT *s
                                        goto bunins_failed;
                                }
                        }
-                       switch (b->twidth) {
-                       case 1:
-                               b->ttype = TYPE_bte;
-                               tp = &tbv;
-                               break;
-                       case 2:
-                               b->ttype = TYPE_sht;
-                               tp = &tsv;
-                               break;
-#if SIZEOF_VAR_T == 8
-                       case 4:
-                               b->ttype = TYPE_int;
-                               tp = &tiv;
-                               break;
-                       case 8:
-                               b->ttype = TYPE_lng;
-                               tp = &v;
-                               break;
-#else
-                       case 4:
-                               b->ttype = TYPE_int;
-                               tp = &v;
-                               break;
-#endif
-                       default:
-                               assert(0);
-                       }
-                       b->tvarsized = 0;
                }
        } else if (unshare_string_heap(b) != GDK_SUCCEED)
                return GDK_FAIL;
-       if (toff == 0 && n->twidth == b->twidth) {
+       if (toff == 0 && n->twidth == b->twidth && cand == NULL) {
                /* we don't need to do any translation of offset
                 * values, so we can use fast memcpy */
                memcpy(Tloc(b, BUNlast(b)), Tloc(n, start),
@@ -250,6 +226,34 @@ insert_string_bat(BAT *b, BAT *n, BAT *s
 #endif
                const var_t *restrict tvp = (const var_t *) Tloc(n, 0);
 
+               switch (b->twidth) {
+               case 1:
+                       b->ttype = TYPE_bte;
+                       tp = &tbv;
+                       break;
+               case 2:
+                       b->ttype = TYPE_sht;
+                       tp = &tsv;
+                       break;
+#if SIZEOF_VAR_T == 8
+               case 4:
+                       b->ttype = TYPE_int;
+                       tp = &tiv;
+                       break;
+               case 8:
+                       b->ttype = TYPE_lng;
+                       tp = &v;
+                       break;
+#else
+               case 4:
+                       b->ttype = TYPE_int;
+                       tp = &v;
+                       break;
+#endif
+               default:
+                       assert(0);
+               }
+               b->tvarsized = 0;
                for (;;) {
                        if (cand) {
                                if (cand == candend)
@@ -299,6 +303,8 @@ insert_string_bat(BAT *b, BAT *n, BAT *s
                        }
                        bunfastapp(b, tp);
                }
+               b->tvarsized = 1;
+               b->ttype = TYPE_str;
        } else if (b->tvheap->free < n->tvheap->free / 2 ||
                   GDK_ELIMDOUBLES(b->tvheap)) {
                /* if b's string heap is much smaller than n's string
@@ -394,8 +400,6 @@ insert_string_bat(BAT *b, BAT *n, BAT *s
                        r++;
                }
        }
-       b->tvarsized = 1;
-       b->ttype = TYPE_str;
        return GDK_SUCCEED;
       bunins_failed:
        b->tvarsized = 1;
@@ -531,24 +535,27 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo
 
        r = BUNlast(b);
 
-       if (BATcount(b) == 0 && cand == NULL) {
+       if (BATcount(b) == 0) {
                BATiter ni = bat_iterator(n);
 
                b->tsorted = n->tsorted;
-               b->tnosorted = start <= n->tnosorted && n->tnosorted < end ? 
n->tnosorted - start : 0;
                b->trevsorted = n->trevsorted;
-               b->tnorevsorted = start <= n->tnorevsorted && n->tnorevsorted < 
end ? n->tnorevsorted - start : 0;
                b->tdense = n->tdense && cand == NULL;
-               b->tnodense = start <= n->tnodense && n->tnodense < end ? 
n->tnodense - start : 0;
                b->tnonil = n->tnonil;
                b->tnil = n->tnil && cnt == BATcount(n);
                b->tseqbase = oid_nil;
                if (cand == NULL) {
+                       b->tnosorted = start <= n->tnosorted && n->tnosorted < 
end ? n->tnosorted - start : 0;
+                       b->tnorevsorted = start <= n->tnorevsorted && 
n->tnorevsorted < end ? n->tnorevsorted - start : 0;
+                       b->tnodense = start <= n->tnodense && n->tnodense < end 
? n->tnodense - start : 0;
                        if (n->tdense && n->ttype == TYPE_oid)
                                b->tseqbase = *(oid *) BUNtail(ni, start);
                        else if (n->ttype == TYPE_void &&
                                 n->tseqbase != oid_nil)
                                b->tseqbase = n->tseqbase + start;
+               } else {
+                       b->tnosorted = 0;
+                       b->tnorevsorted = 0;
                }
                /* if tunique, uniqueness is guaranteed above */
                b->tkey = n->tkey | b->tunique;
@@ -559,7 +566,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo
                        b->tnokey[0] = b->tnokey[1] = 0;
                }
        } else {
-               BUN last = BUNlast(b) - 1;
+               BUN last = r - 1;
                BATiter ni = bat_iterator(n);
                BATiter bi = bat_iterator(b);
                int xx = ATOMcmp(b->ttype, BUNtail(ni, start), BUNtail(bi, 
last));
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1314,6 +1314,7 @@ bm_subcommit(logger *lg, BAT *list_bid, 
                }
                bids = logbat_new(TYPE_int, BATcount(tids), PERSISTENT);
                nmes = logbat_new(TYPE_str, BATcount(tids), PERSISTENT);
+
                if (bids == NULL || nmes == NULL) {
                        logbat_destroy(tids);
                        logbat_destroy(bids);
@@ -1321,6 +1322,7 @@ bm_subcommit(logger *lg, BAT *list_bid, 
                        GDKfree(n);
                        return GDK_FAIL;
                }
+
                if (BATappend(bids, catalog_bid, tids, TRUE) != GDK_SUCCEED ||
                    BATappend(nmes, catalog_nme, tids, TRUE) != GDK_SUCCEED) {
                        logbat_destroy(tids);
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -874,7 +874,11 @@ SQLdrop_schema(Client cntxt, MalBlkPtr m
        } else if (s->system) {
                throw(SQL,"sql.drop_schema",SQLSTATE(42000) "DROP SCHEMA: 
access denied for '%s'", sname);
        } else if (sql_schema_has_user(sql, s)) {
-               throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database objects which depend on it", 
sname);
+               throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database objects which depend on it)", 
sname);
+       } else if (!action /* RESTRICT */ && (
+               !list_empty(s->tables.set) || !list_empty(s->types.set) ||
+               !list_empty(s->funcs.set) || !list_empty(s->seqs.set))) {
+               throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database objects which depend on it)", 
sname);
        } else {
                mvc_drop_schema(sql, s, action);
        }
diff --git a/sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out 
b/sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out
--- a/sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out
+++ b/sql/benchmarks/tpch/fileleak/Tests/delete_all.stable.out
@@ -42,22 +42,22 @@ Ready.
 (u'l_suppkey', 262144, 60175)
 (u'l_tax', 524288, 60175)
 [(u'l_comment', 0), (u'l_commitdate', 0), (u'l_discount', 0), 
(u'l_extendedprice', 0), (u'l_linenumber', 0), (u'l_linestatus', 0), 
(u'l_orderkey', 0), (u'l_partkey', 0), (u'l_quantity', 0), (u'l_receiptdate', 
0), (u'l_returnflag', 0), (u'l_shipdate', 0), (u'l_shipinstruct', 0), 
(u'l_shipmode', 0), (u'l_suppkey', 0), (u'l_tax', 0)]
-(u'l_comment', 65536, 0)
-(u'l_commitdate', 65536, 0)
-(u'l_discount', 65536, 0)
-(u'l_extendedprice', 65536, 0)
-(u'l_linenumber', 65536, 0)
-(u'l_linestatus', 0, 0)
-(u'l_orderkey', 65536, 0)
-(u'l_partkey', 65536, 0)
-(u'l_quantity', 65536, 0)
-(u'l_receiptdate', 65536, 0)
-(u'l_returnflag', 0, 0)
-(u'l_shipdate', 65536, 0)
-(u'l_shipinstruct', 0, 0)
-(u'l_shipmode', 0, 0)
-(u'l_suppkey', 65536, 0)
-(u'l_tax', 65536, 0)
+(u'l_comment', 262144, 0)
+(u'l_commitdate', 262144, 0)
+(u'l_discount', 524288, 0)
+(u'l_extendedprice', 524288, 0)
+(u'l_linenumber', 262144, 0)
+(u'l_linestatus', 65536, 0)
+(u'l_orderkey', 262144, 0)
+(u'l_partkey', 262144, 0)
+(u'l_quantity', 524288, 0)
+(u'l_receiptdate', 262144, 0)
+(u'l_returnflag', 65536, 0)
+(u'l_shipdate', 262144, 0)
+(u'l_shipinstruct', 65536, 0)
+(u'l_shipmode', 65536, 0)
+(u'l_suppkey', 262144, 0)
+(u'l_tax', 524288, 0)
 
 # 13:16:20 >  
 # 13:16:20 >  "Done."
diff --git a/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out 
b/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out
--- a/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out
+++ b/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out
@@ -25,22 +25,22 @@ Ready.
 # 16:01:26 >  "/usr/bin/python2" "leaks.SQL.py" "leaks"
 # 16:01:26 >  
 
-(u'l_comment', 65536, 0)
-(u'l_commitdate', 65536, 0)
-(u'l_discount', 65536, 0)
-(u'l_extendedprice', 65536, 0)
-(u'l_linenumber', 65536, 0)
+(u'l_comment', 262144, 0)
+(u'l_commitdate', 262144, 0)
+(u'l_discount', 524288, 0)
+(u'l_extendedprice', 524288, 0)
+(u'l_linenumber', 262144, 0)
 (u'l_linestatus', 0, 0)
-(u'l_orderkey', 65536, 0)
-(u'l_partkey', 65536, 0)
-(u'l_quantity', 65536, 0)
-(u'l_receiptdate', 65536, 0)
+(u'l_orderkey', 262144, 0)
+(u'l_partkey', 262144, 0)
+(u'l_quantity', 524288, 0)
+(u'l_receiptdate', 262144, 0)
 (u'l_returnflag', 0, 0)
-(u'l_shipdate', 65536, 0)
+(u'l_shipdate', 262144, 0)
 (u'l_shipinstruct', 0, 0)
 (u'l_shipmode', 0, 0)
-(u'l_suppkey', 65536, 0)
-(u'l_tax', 65536, 0)
+(u'l_suppkey', 262144, 0)
+(u'l_tax', 524288, 0)
 
 # 16:01:26 >  
 # 16:01:26 >  "Done."
diff --git a/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows 
b/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows
--- a/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows
+++ b/sql/benchmarks/tpch/fileleak/Tests/leaks.stable.out.Windows
@@ -25,22 +25,22 @@ Ready.
 # 16:01:26 >  "/usr/bin/python2" "leaks.SQL.py" "leaks"
 # 16:01:26 >  
 
-(u'l_comment', 65536, 0)
-(u'l_commitdate', 65536, 0)
-(u'l_discount', 65536, 0)
-(u'l_extendedprice', 65536, 0)
-(u'l_linenumber', 65536, 0)
+(u'l_comment', 262144, 0)
+(u'l_commitdate', 262144, 0)
+(u'l_discount', 524288, 0)
+(u'l_extendedprice', 524288, 0)
+(u'l_linenumber', 262144, 0)
 (u'l_linestatus', 0, 0)
-(u'l_orderkey', 65536, 0)
-(u'l_partkey', 65536, 0)
-(u'l_quantity', 65536, 0)
-(u'l_receiptdate', 65536, 0)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to