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