Changeset: e00d391be073 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e00d391be073
Modified Files:
        gdk/gdk.h
        gdk/gdk_batop.c
        gdk/gdk_hash.c
        gdk/gdk_heap.c
        gdk/gdk_private.h
        gdk/gdk_utils.c
        sql/test/BugTracker-2024/Tests/All
        sql/test/information-schema/Tests/columns.test
        testing/sqllogictest.py
Branch: default
Log Message:

Merge with Dec2023 branch.


diffs (truncated from 481 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -887,9 +887,6 @@ mskGetVal(BAT *b, BUN p)
  * @item int
  * @tab
  *  HEAPcopy (Heap *dst,*src);
- * @item int
- * @tab
- *  HEAPwarm (Heap *h);
  * @end multitable
  *
  *
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -665,7 +665,7 @@ append_msk_bat(BAT *b, BATiter *ni, stru
 /* Append the contents of BAT n (subject to the optional candidate
  * list s) to BAT b.  If b is empty, b will get the seqbase of s if it
  * was passed in, and else the seqbase of n. */
-gdk_return
+static gdk_return
 BATappend2(BAT *b, BAT *n, BAT *s, bool force, bool mayshare)
 {
        struct canditer ci;
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -1381,32 +1381,3 @@ HASHfree(BAT *b)
                MT_rwlock_wrunlock(&b->thashlock);
        }
 }
-
-bool
-HASHgonebad(BAT *b, const void *v)
-{
-       Hash *h = b->thash;
-       BUN cnt, hit;
-
-       if (h == NULL)
-               return true;    /* no hash is bad hash? */
-
-       BATiter bi = bat_iterator(b);
-       if (h->nbucket * 2 < BATcount(b)) {
-               int (*cmp) (const void *, const void *) = ATOMcompare(bi.type);
-               BUN i = HASHget(h, (BUN) HASHprobe(h, v));
-               for (cnt = hit = 1; i != BUN_NONE; i = HASHgetlink(h, i), cnt++)
-                       hit += ((*cmp) (v, BUNtail(bi, (BUN) i)) == 0);
-
-               if (cnt / hit > 4) {
-                       bat_iterator_end(&bi);
-                       return true;    /* linked list too long */
-               }
-
-               /* in this case, linked lists are long but contain the
-                * desired values such hash tables may be useful for
-                * locating all duplicates */
-       }
-       bat_iterator_end(&bi);
-       return false;           /* a-ok */
-}
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -439,57 +439,6 @@ HEAPextend(Heap *h, size_t size, bool ma
        return GDK_FAIL;
 }
 
-gdk_return
-HEAPshrink(Heap *h, size_t size)
-{
-       char *p = NULL;
-
-       assert(size >= h->free);
-       assert(size <= h->size);
-       if (h->storage == STORE_MEM) {
-               p = GDKrealloc(h->base, size);
-               TRC_DEBUG(HEAP, "Shrinking malloced heap %s %zu %zu %p %p\n",
-                         h->filename, h->size, size, h->base, p);
-       } else {
-               char *path;
-
-               assert(h->hasfile);
-               /* shrink memory mapped file */
-               /* round up to multiple of GDK_mmap_pagesize with
-                * minimum of one */
-               size = (size + GDK_mmap_pagesize - 1) & ~(GDK_mmap_pagesize - 
1);
-               if (size == 0)
-                       size = GDK_mmap_pagesize;
-               if (size >= h->size) {
-                       /* don't grow */
-                       return GDK_SUCCEED;
-               }
-               if ((path = GDKfilepath(h->farmid, BATDIR, h->filename, NULL)) 
== NULL)
-                       return GDK_FAIL;
-               p = GDKmremap(path,
-                             h->storage == STORE_PRIV ?
-                               MMAP_COPY | MMAP_READ | MMAP_WRITE :
-                               MMAP_READ | MMAP_WRITE,
-                             h->base, h->size, &size);
-               GDKfree(path);
-               TRC_DEBUG(HEAP, "Shrinking %s mmapped "
-                         "heap (%s) %zu %zu %p %p\n",
-                         h->storage == STORE_MMAP ? "shared" : "privately",
-                         h->filename, h->size, size, h->base, p);
-       }
-       if (p) {
-               if (h->farmid == 1) {
-                       QryCtx *qc = MT_thread_get_qry_ctx();
-                       if (qc)
-                               ATOMIC_SUB(&qc->datasize, h->size - size);
-               }
-               h->size = size;
-               h->base = p;
-               return GDK_SUCCEED;
-       }
-       return GDK_FAIL;
-}
-
 /* grow the string offset heap so that the value v fits (i.e. wide
  * enough to fit the value), and it has space for at least cap elements;
  * copy ncopy BUNs, or up to the heap size, whichever is smaller */
@@ -962,22 +911,6 @@ HEAPsave(Heap *h, const char *nme, const
        return rc;
 }
 
-int
-HEAPwarm(Heap *h)
-{
-       int bogus_result = 0;
-
-       if (h->storage != STORE_MEM) {
-               /* touch the heap sequentially */
-               int *cur = (int *) h->base;
-               int *lim = (int *) (h->base + h->free) - 4096;
-
-               for (; cur < lim; cur += 4096)  /* try to schedule 4 parallel 
memory accesses */
-                       bogus_result |= cur[0] | cur[1024] | cur[2048] | 
cur[3072];
-       }
-       return bogus_result;
-}
-
 
 /* Return the (virtual) size of the heap. */
 size_t
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -58,8 +58,6 @@ const char *ATOMunknown_name(int a)
        __attribute__((__visibility__("hidden")));
 void ATOMunknown_clean(void)
        __attribute__((__visibility__("hidden")));
-gdk_return BATappend2(BAT *b, BAT *n, BAT *s, bool force, bool mayshare)
-       __attribute__((__visibility__("hidden")));
 bool BATcheckhash(BAT *b)
        __attribute__((__visibility__("hidden")));
 bool BATcheckimprints(BAT *b)
@@ -154,9 +152,6 @@ FILE *GDKfileopen(int farmid, const char
        __attribute__((__visibility__("hidden")));
 char *GDKload(int farmid, const char *nme, const char *ext, size_t size, 
size_t *maxsize, storage_t mode)
        __attribute__((__visibility__("hidden")));
-void GDKlog(_In_z_ _Printf_format_string_ FILE * fl, const char *format, ...)
-       __attribute__((__format__(__printf__, 2, 3)))
-       __attribute__((__visibility__("hidden")));
 gdk_return GDKmove(int farmid, const char *dir1, const char *nme1, const char 
*ext1, const char *dir2, const char *nme2, const char *ext2, bool report)
        __attribute__((__warn_unused_result__))
        __attribute__((__visibility__("hidden")));
@@ -189,8 +184,6 @@ void HASHappend_locked(BAT *b, BUN i, co
        __attribute__((__visibility__("hidden")));
 void HASHfree(BAT *b)
        __attribute__((__visibility__("hidden")));
-bool HASHgonebad(BAT *b, const void *v)
-       __attribute__((__visibility__("hidden")));
 BUN HASHdelete(BATiter *bi, BUN p, const void *v)
        __attribute__((__visibility__("hidden")));
 void HASHdelete_locked(BATiter *bi, BUN p, const void *v)
@@ -227,11 +220,6 @@ void HEAP_recover(Heap *, const var_t *,
 gdk_return HEAPsave(Heap *h, const char *nme, const char *ext, bool dosync, 
BUN free, MT_Lock *lock)
        __attribute__((__warn_unused_result__))
        __attribute__((__visibility__("hidden")));
-gdk_return HEAPshrink(Heap *h, size_t size)
-       __attribute__((__warn_unused_result__))
-       __attribute__((__visibility__("hidden")));
-int HEAPwarm(Heap *h)
-       __attribute__((__visibility__("hidden")));
 void IMPSdecref(Imprints *imprints, bool remove)
        __attribute__((__visibility__("hidden")));
 void IMPSfree(BAT *b)
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -339,7 +339,7 @@ GDKcopyenv(BAT **key, BAT **val, bool wr
  * Single-lined comments can now be logged safely, together with
  * process, thread and user ID, and the current time.
  */
-void
+static void __attribute__((__format__(__printf__, 2, 3)))
 GDKlog(FILE *lockFile, const char *format, ...)
 {
        va_list ap;
diff --git a/sql/test/BugTracker-2024/Tests/All 
b/sql/test/BugTracker-2024/Tests/All
--- a/sql/test/BugTracker-2024/Tests/All
+++ b/sql/test/BugTracker-2024/Tests/All
@@ -51,3 +51,4 @@ rel_groupby_cse-Bug-7485
 CMDgen_group-Bug-7486
 sql_init_subtype-Bug-7487
 orderby-max-over-rows-Bug-7488
+rel2bin_select-Bug-7496
diff --git a/sql/test/BugTracker-2024/Tests/rel2bin_select-Bug-7496.test 
b/sql/test/BugTracker-2024/Tests/rel2bin_select-Bug-7496.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2024/Tests/rel2bin_select-Bug-7496.test
@@ -0,0 +1,38 @@
+statement ok
+create view columns_7496 as select
+  s."name" as table_schema,
+  t."name" as table_name,
+  c."name" as column_name,
+  cast(1 + c."number" as int) as ordinal_position,
+  c."default" as column_default,
+  cast(sys.ifthenelse(c."null", 'YES', 'NO') as varchar(3)) as is_nullable,
+  cast(sys."describe_type"(c."type", c."type_digits", c."type_scale") as 
varchar(1024)) as data_type,
+  cast(sys.ifthenelse(seq."name" is null, 'NO', 'YES') as varchar(3)) as 
is_identity,
+  seq."name" as identity_generation,
+  seq."start" as identity_start,
+  seq."increment" as identity_increment,
+  seq."maxvalue" as identity_maximum,
+  seq."minvalue" as identity_minimum,
+  cast(sys.ifthenelse(seq."cycle", 'YES', 'NO') as varchar(3)) as 
identity_cycle,
+  cast(sys.ifthenelse(seq."name" is null, 'NO', 'YES') as varchar(3)) as 
is_generated,
+  cast(sys.ifthenelse(seq."name" is null, null, c."default") as varchar(1024)) 
as generation_expression,
+  cm."remark" as comments
+  from sys."columns" c
+  inner join sys."tables" t on c."table_id" = t."id"
+  inner join sys."schemas" s on t."schema_id" = s."id"
+  left outer join sys."comments" cm on c."id" = cm."id"
+  left outer join sys."sequences" seq on ((seq."name"||'"') = 
substring(c."default", 3 + sys."locate"('"."seq_',c."default",14)))
+  order by s."name", t."name", c."number"
+
+query TI nosort
+SELECT "is_generated", length("is_generated") as data_length FROM columns_7496 
WHERE "identity_generation" IS NOT NULL AND length("is_generated") > 2
+----
+
+-- next query causes: sql/backends/monet5/rel_bin.c:4355: rel2bin_select: 
Assertion `sql->session->status == -10' failed
+skipif knownfail
+query TI nosort
+SELECT "is_generated", length("is_generated") as data_length FROM columns_7496 
WHERE "is_generated" IS NOT NULL AND length("is_generated") > 2
+----
+
+statement ok
+drop view columns_7496
diff --git a/sql/test/information-schema/Tests/columns.test 
b/sql/test/information-schema/Tests/columns.test
--- a/sql/test/information-schema/Tests/columns.test
+++ b/sql/test/information-schema/Tests/columns.test
@@ -230,3 +230,175 @@ URL
 2147483643
 8589934572
 
+-- entity integrity checks
+query ITTTT rowsort
+SELECT COUNT(*) AS duplicates, TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, 
COLUMN_NAME
+ FROM INFORMATION_SCHEMA.COLUMNS
+ GROUP BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
+ HAVING COUNT(*) > 1
+----
+
+-- as TABLE_CATALOG is always NULL the TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME 
combo should be unique also
+query ITTT rowsort
+SELECT COUNT(*) AS duplicates, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
+ FROM INFORMATION_SCHEMA.COLUMNS
+ GROUP BY TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
+ HAVING COUNT(*) > 1
+----
+
+-- it should also be unique when using schema_id instead of TABLE_SCHEMA
+query IITT rowsort
+SELECT COUNT(*) AS duplicates, schema_id, TABLE_NAME, COLUMN_NAME
+ FROM INFORMATION_SCHEMA.COLUMNS
+ GROUP BY schema_id, TABLE_NAME, COLUMN_NAME
+ HAVING COUNT(*) > 1
+----
+
+-- it should also be unique when using table_id instead of TABLE_SCHEMA, 
TABLE_NAME
+query IIT rowsort
+SELECT COUNT(*) AS duplicates, table_id, COLUMN_NAME
+ FROM INFORMATION_SCHEMA.COLUMNS
+ GROUP BY table_id, COLUMN_NAME
+ HAVING COUNT(*) > 1
+----
+
+-- column_id alone should be unique also
+query II rowsort
+SELECT COUNT(*) AS duplicates, column_id
+ FROM INFORMATION_SCHEMA.COLUMNS
+ GROUP BY column_id
+ HAVING COUNT(*) > 1
+----
+
+-- referential integrity checks
+query TTTT rowsort
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to