Changeset: b0ac5937105f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b0ac5937105f
Added Files:
        sql/test/BugTracker-2019/Tests/view-too-few-rows.Bug-6736.sql
        sql/test/BugTracker-2019/Tests/view-too-few-rows.Bug-6736.stable.err
        sql/test/BugTracker-2019/Tests/view-too-few-rows.Bug-6736.stable.out
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_system.c
        gdk/gdk_system.h
        monetdb5/mal/mal_instruction.c
        monetdb5/modules/mal/mal_mapi.c
        sql/backends/monet5/UDF/pyapi/pyapi.c
        sql/backends/monet5/vaults/bam/bam_loader.c
        sql/backends/monet5/wlr.c
        sql/test/BugTracker-2019/Tests/All
Branch: default
Log Message:

Merge with Apr2019 branch.


diffs (truncated from 782 to 300 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3279,6 +3279,7 @@ BBPbackup(BAT *b, bool subcommit)
        char *srcdir;
        long_str nme;
        const char *s = BBP_physical(b->batCacheid);
+       size_t slen;
 
        if (BBPprepare(subcommit) != GDK_SUCCEED) {
                return GDK_FAIL;
@@ -3292,8 +3293,11 @@ BBPbackup(BAT *b, bool subcommit)
        s = strrchr(srcdir, DIR_SEP);
        if (!s)
                goto fail;
-       strncpy(nme, ++s, sizeof(nme));
-       nme[sizeof(nme) - 1] = 0;
+
+       slen = strlen(++s);
+       if (slen >= sizeof(nme))
+               goto fail;
+       memcpy(nme, s, slen + 1);
        srcdir[s - srcdir] = 0;
 
        if (b->ttype != TYPE_void &&
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -704,8 +704,18 @@ MT_create_thread(MT_Id *t, void (*f) (vo
        pthread_attr_t attr;
        int ret;
        struct posthread *p;
+       size_t tlen;
 
        join_threads();
+       if (threadname == NULL) {
+               fprintf(stderr, "#MT_create_thread: thread must have a name\n");
+               return -1;
+       }
+       tlen = strlen(threadname);
+       if (tlen >= sizeof(p->threadname)) {
+               fprintf(stderr, "#MT_create_thread: thread's name is too 
large\n");
+               return -1;
+       }
        if ((ret = pthread_attr_init(&attr)) != 0) {
                fprintf(stderr,
                        "#MT_create_thread: cannot init pthread attr: %s\n",
@@ -734,8 +744,8 @@ MT_create_thread(MT_Id *t, void (*f) (vo
                .detached = (d == MT_THR_DETACHED),
        };
        ATOMIC_INIT(&p->exited, 0);
-       strncpy(p->threadname, threadname, sizeof(p->threadname));
-       p->threadname[sizeof(p->threadname) - 1] = 0;
+
+       memcpy(p->threadname, threadname, tlen + 1);
        pthread_mutex_lock(&posthread_lock);
        p->next = posthreads;
        posthreads = p;
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -456,12 +456,16 @@ typedef struct MT_Lock {
                _DBG_LOCK_COUNT_2(l);                                   \
        } while (0)
 
-#define MT_lock_init(l, n)                                     \
-       do {                                                    \
-               ATOMIC_CLEAR(&(l)->lock);                       \
-               strncpy((l)->name, (n), sizeof((l)->name));     \
-               (l)->name[sizeof((l)->name) - 1] = 0;           \
-               _DBG_LOCK_INIT(l);                              \
+#define MT_lock_init(l, n)                             \
+       do {                                            \
+               size_t nlen;                            \
+               ATOMIC_CLEAR(&(l)->lock);               \
+               nlen = strlen(n);                       \
+               if (nlen >= sizeof((l)->name))          \
+                       nlen = sizeof((l)->name) - 1;   \
+               memcpy((l)->name, (n), nlen + 1);       \
+               (l)->name[sizeof((l)->name) - 1] = 0;   \
+               _DBG_LOCK_INIT(l);                      \
        } while (0)
 
 #define MT_lock_unset(l)                                       \
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -387,14 +387,20 @@ getMalBlkOptimized(MalBlkPtr mb, str nam
        InstrPtr p;
        int i= 0;
        char buf[IDLENGTH]= {0}, *n;
+       size_t nlen;
 
        if( name == 0)
                return mb;
-       strncpy(buf,name, IDLENGTH);
-       buf[IDLENGTH - 1] = 0;
+
+       nlen = strlen(name);
+       if (nlen >= sizeof(buf)) {
+               mb->errors = createMalException(mb,0, TYPE, "Optimizer name is 
too large");
+               return NULL;
+       }
+       memcpy(buf, name, nlen + 1);
        n = strchr(buf,']');
        if( n) *n = 0;
-       
+
        while (h ){
                for( i = 1; i< h->stop; i++){
                        p = getInstrPtr(h,i);
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -818,9 +818,15 @@ SERVERlisten(int port, const char *usock
 #endif
 
                userver.sun_family = AF_UNIX;
-               strncpy(userver.sun_path, usockfile, sizeof(userver.sun_path));
-               userver.sun_path[sizeof(userver.sun_path) - 1] = 0;
-
+               size_t ulen = strlen(usockfile);
+               if (ulen >= sizeof(userver.sun_path)) {
+                       if (sock != INVALID_SOCKET)
+                               closesocket(sock);
+                       closesocket(usock);
+                       GDKfree(psock);
+                       throw(IO, "mal_mapi.listen", "usockfile name is too 
large");
+               }
+               memcpy(userver.sun_path, usockfile, ulen + 1);
                length = (SOCKLEN) sizeof(userver);
                if(remove(usockfile) == -1 && errno != ENOENT) {
                        char *e = createException(IO, "mal_mapi.listen", 
OPERATION_FAILED ": remove UNIX socket file");
diff --git a/sql/backends/monet5/UDF/pyapi/pyapi.c 
b/sql/backends/monet5/UDF/pyapi/pyapi.c
--- a/sql/backends/monet5/UDF/pyapi/pyapi.c
+++ b/sql/backends/monet5/UDF/pyapi/pyapi.c
@@ -865,7 +865,7 @@ static str PyAPIeval(Client cntxt, MalBl
                                                                                
   (void (*)(void *)) &
                                                                                
           ComputeParallelAggregation,
                                                                                
   params, MT_THR_JOINABLE,
-                                                                               
   "ComputeParallelAggregation");
+                                                                               
   "pyapi_par_aggr");
                                        if (res != 0) {
                                                msg = createException(MAL, 
"pyapi.eval",
                                                                                
          SQLSTATE(PY000) "Failed to start thread.");
diff --git a/sql/backends/monet5/vaults/bam/bam_loader.c 
b/sql/backends/monet5/vaults/bam/bam_loader.c
--- a/sql/backends/monet5/vaults/bam/bam_loader.c
+++ b/sql/backends/monet5/vaults/bam/bam_loader.c
@@ -315,7 +315,7 @@ bam_loader(Client cntxt, MalBlkPtr mb, s
                                                          
run_process_bam_alignments,
                                                          &r_thread_data[i],
                                                          MT_THR_JOINABLE,
-                                                         
"run_process_bam_alignments")) != 0) {
+                                                         "bam_alignments")) != 
0) {
                        msg = createException(MAL, "bam_loader",
                                                  SQLSTATE(BA000) "Could not 
create thread to process alignments (errnr %d)",
                                                  errnr);
diff --git a/sql/backends/monet5/wlr.c b/sql/backends/monet5/wlr.c
--- a/sql/backends/monet5/wlr.c
+++ b/sql/backends/monet5/wlr.c
@@ -443,7 +443,7 @@ WLRinit(void)
                return MAL_SUCCEED;
        // time to continue the consolidation process in the background
        if (MT_create_thread(&wlr_thread, WLRprocessScheduler, (void*) cntxt,
-                            MT_THR_DETACHED, "WLRprocessScheduler") < 0) {
+                            MT_THR_DETACHED, "WLRprocSched") < 0) {
                        throw(SQL,"wlr.init",SQLSTATE(42000) "Starting wlr 
manager failed");
        }
        return MAL_SUCCEED;
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
@@ -23,3 +23,4 @@ prepare-types.Bug-6724
 prepare-non-existing-function.Bug-6725
 select-distinct.Bug-6728
 table-duplicate-column.Bug-6729
+view-too-few-rows.Bug-6736
diff --git a/sql/test/BugTracker-2019/Tests/view-too-few-rows.Bug-6736.sql 
b/sql/test/BugTracker-2019/Tests/view-too-few-rows.Bug-6736.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2019/Tests/view-too-few-rows.Bug-6736.sql
@@ -0,0 +1,242 @@
+start transaction;
+
+CREATE SCHEMA "dw_hospital";
+CREATE SEQUENCE "dw_hospital"."seq_36397" AS INTEGER;
+CREATE SEQUENCE "dw_hospital"."seq_36422" AS INTEGER;
+CREATE SEQUENCE "dw_hospital"."seq_45337" AS INTEGER;
+CREATE SEQUENCE "dw_hospital"."seq_45407" AS INTEGER;
+SET SCHEMA "dw_hospital";
+CREATE TABLE "dw_hospital"."bri_classi_gruppi_movimenti" (
+       "classe_movimento_id"        INTEGER       NOT NULL,
+       "gruppo_classe_movimento_id" INTEGER       NOT NULL,
+       "last_batch_id"              INTEGER       NOT NULL DEFAULT '0',
+       "last_updated"               TIMESTAMP     NOT NULL DEFAULT 
current_timestamp(),
+       CONSTRAINT "PK_bri_classi_gruppi_movimenti" PRIMARY KEY 
("classe_movimento_id", "gruppo_classe_movimento_id")
+);
+CREATE TABLE "dw_hospital"."dim_classi_movimenti" (
+       "id"                  INTEGER       NOT NULL,
+       "codice"              VARCHAR(16)   NOT NULL,
+       "descrizione"         VARCHAR(256)  NOT NULL,
+       "tipo_centro"         VARCHAR(16)   NOT NULL,
+       "tipo_movimentazione" VARCHAR(16)   NOT NULL,
+       "tipo_caricamento"    VARCHAR(16)   NOT NULL,
+       "uso_ribaltamento"    VARCHAR(16)   NOT NULL,
+       "version"             INTEGER       NOT NULL,
+       "valid_from"          DATE,
+       "valid_to"            DATE,
+       "last_batch_id"       INTEGER       NOT NULL DEFAULT '0',
+       "last_updated"        TIMESTAMP     NOT NULL DEFAULT 
current_timestamp(),
+       CONSTRAINT "PK_dim_classi_movimenti" PRIMARY KEY ("id")
+);
+CREATE TABLE "dw_hospital"."dim_periodi" (
+       "id"                      INTEGER       NOT NULL,
+       "language_code"           VARCHAR(2)    NOT NULL,
+       "country_code"            VARCHAR(2)    NOT NULL,
+       "month_abbreviation"      VARCHAR(3)    NOT NULL,
+       "month_name"              VARCHAR(12)   NOT NULL,
+       "quarter_name"            VARCHAR(8)    NOT NULL,
+       "year_quarter"            VARCHAR(13)   NOT NULL,
+       "year_month_abbreviation" VARCHAR(8)    NOT NULL,
+       "year2"                   VARCHAR(2)    NOT NULL,
+       "year4"                   INTEGER       NOT NULL,
+       "month_number"            INTEGER       NOT NULL,
+       "quarter_number"          INTEGER       NOT NULL,
+       "year_month_number"       VARCHAR(8)    NOT NULL,
+       "last_batch_id"           INTEGER       NOT NULL DEFAULT '0',
+       "last_updated"            TIMESTAMP     NOT NULL DEFAULT 
current_timestamp(),
+       CONSTRAINT "PK_dim_periodi" PRIMARY KEY ("id"),
+       CONSTRAINT "IDX_dim_periodi" UNIQUE ("year4", "month_number")
+);
+create view "dw_hospital"."v_dim_classi_movimenti" as
+ select 
+ "dim_classi_movimenti"."id" as "id",
+ "dim_classi_movimenti"."codice" as "codice",
+ "dim_classi_movimenti"."descrizione" as "descrizione",
+ "dim_classi_movimenti"."codice" || ' - ' || 
"dim_classi_movimenti"."descrizione" as "codice_descrizione",
+ "dim_classi_movimenti"."tipo_centro" as "tipo_centro",
+ "dim_classi_movimenti"."tipo_movimentazione" as "tipo_movimentazione",
+ "dim_classi_movimenti"."tipo_caricamento" as "tipo_caricamento",
+ "dim_classi_movimenti"."uso_ribaltamento" as "uso_ribaltamento",
+ "dim_classi_movimenti"."version" as "version",
+ "dim_classi_movimenti"."valid_from" as "valid_from",
+ "dim_classi_movimenti"."valid_to" as "valid_to",
+ "dim_classi_movimenti"."last_batch_id" as "last_batch_id",
+ "dim_classi_movimenti"."last_updated" as "last_updated"
+ from
+ "dw_hospital"."dim_classi_movimenti"
+;
+CREATE TABLE "dw_hospital"."facts_costi_2017" (
+       "id"                     INTEGER       NOT NULL DEFAULT next value for 
"dw_hospital"."seq_36397",
+       "id_movimento_aggregato" INTEGER       NOT NULL,
+       "periodo_id"             INTEGER       NOT NULL,
+       "centro_id"              INTEGER       NOT NULL,
+       "tipo_centro_id"         INTEGER       NOT NULL,
+       "area_id"                INTEGER       NOT NULL,
+       "fattore_id"             INTEGER       NOT NULL,
+       "gestione_fattore_id"    INTEGER       NOT NULL,
+       "tipo_fattore_id"        INTEGER       NOT NULL,
+       "classe_movimento_id"    INTEGER       NOT NULL,
+       "applicativo_id"         INTEGER       NOT NULL,
+       "progetto_id"            INTEGER       NOT NULL,
+       "valore"                 DECIMAL(19,4) NOT NULL,
+       "quantita"               DECIMAL(19,4) NOT NULL,
+       "last_batch_id"          INTEGER       NOT NULL,
+       "archive"                INTEGER       NOT NULL,
+       "last_updated"           TIMESTAMP     NOT NULL DEFAULT 
current_timestamp(),
+       CONSTRAINT "PK_facts_costi_2017" PRIMARY KEY ("id")
+);
+CREATE TABLE "dw_hospital"."facts_costi_2018" (
+       "id"                     INTEGER       NOT NULL DEFAULT next value for 
"dw_hospital"."seq_36422",
+       "id_movimento_aggregato" INTEGER       NOT NULL,
+       "periodo_id"             INTEGER       NOT NULL,
+       "centro_id"              INTEGER       NOT NULL,
+       "tipo_centro_id"         INTEGER       NOT NULL,
+       "area_id"                INTEGER       NOT NULL,
+       "fattore_id"             INTEGER       NOT NULL,
+       "gestione_fattore_id"    INTEGER       NOT NULL,
+       "tipo_fattore_id"        INTEGER       NOT NULL,
+       "classe_movimento_id"    INTEGER       NOT NULL,
+       "applicativo_id"         INTEGER       NOT NULL,
+       "progetto_id"            INTEGER       NOT NULL,
+       "valore"                 DECIMAL(19,4) NOT NULL,
+       "quantita"               DECIMAL(19,4) NOT NULL,
+       "last_batch_id"          INTEGER       NOT NULL,
+       "archive"                INTEGER       NOT NULL,
+       "last_updated"           TIMESTAMP     NOT NULL DEFAULT 
current_timestamp(),
+       CONSTRAINT "PK_facts_costi_2018" PRIMARY KEY ("id")
+);
+CREATE TABLE "dw_hospital"."facts_costi_2019" (
+       "id"                     INTEGER       NOT NULL DEFAULT next value for 
"dw_hospital"."seq_45407",
+       "id_movimento_aggregato" INTEGER       NOT NULL,
+       "periodo_id"             INTEGER       NOT NULL,
+       "centro_id"              INTEGER       NOT NULL,
+       "tipo_centro_id"         INTEGER       NOT NULL,
+       "area_id"                INTEGER       NOT NULL,
+       "fattore_id"             INTEGER       NOT NULL,
+       "gestione_fattore_id"    INTEGER       NOT NULL,
+       "tipo_fattore_id"        INTEGER       NOT NULL,
+       "classe_movimento_id"    INTEGER       NOT NULL,
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to