Changeset: 1636b83d9230 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1636b83d9230
Added Files:
sql/test/BugTracker-2014/Tests/setreadonly_forgets_changes.Bug-3446.sql
sql/test/BugTracker-2014/Tests/setreadonly_forgets_changes.Bug-3446.stable.err
sql/test/BugTracker-2014/Tests/setreadonly_forgets_changes.Bug-3446.stable.out
Modified Files:
gdk/gdk_utils.c
monetdb5/modules/mal/Tests/remote12.mal
monetdb5/modules/mal/mal_mapi.c
monetdb5/modules/mal/remote.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/rel.txt
sql/server/rel_optimizer.c
sql/test/BugTracker-2014/Tests/All
Branch: default
Log Message:
Merge with Jan2014 branch.
diffs (truncated from 436 to 300 lines):
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1150,25 +1150,37 @@ void
GDKexit(int status)
{
if (ATOMIC_TAS(GDKstopped, GDKstoppedLock, "GDKexit") == 0) {
+ MT_Id pid = MT_getpid();
+ Thread t, s;
+ int i;
+
MT_lock_set(&GDKthreadLock, "GDKexit");
GDKnrofthreads = 0;
MT_lock_unset(&GDKthreadLock, "GDKexit");
if (GDKvmtrim_id)
MT_join_thread(GDKvmtrim_id);
- MT_sleep_ms(CATNAP);
-
- /* Kill all threads except myself */
+ /* first give the other threads a chance to exit */
+ for (i = 0; i < 10; i++) {
+ MT_lock_set(&GDKthreadLock, "GDKexit");
+ for (t = GDKthreads, s = t + THREADS; t < s; t++)
+ if (t->pid && t->pid != pid)
+ break;
+ MT_lock_unset(&GDKthreadLock, "GDKexit");
+ if (t == s) /* no other threads? */
+ break;
+ MT_sleep_ms(CATNAP);
+ }
if (status == 0) {
- MT_Id pid = MT_getpid();
- Thread t, s;
-
+ /* they had there chance, now kill them */
MT_lock_set(&GDKthreadLock, "GDKexit");
for (t = GDKthreads, s = t + THREADS; t < s; t++) {
if (t->pid) {
MT_Id victim = t->pid;
- if (t->pid != pid)
+ if (t->pid != pid) {
+ fprintf(stderr, "#GDKexit:
killing thread\n");
MT_kill_thread(victim);
+ }
}
}
MT_lock_unset(&GDKthreadLock, "GDKexit");
diff --git a/monetdb5/modules/mal/Tests/remote12.mal
b/monetdb5/modules/mal/Tests/remote12.mal
--- a/monetdb5/modules/mal/Tests/remote12.mal
+++ b/monetdb5/modules/mal/Tests/remote12.mal
@@ -1,4 +1,4 @@
-#causing a sigfault
+#causing a segfault
uri := sabaoth.getLocalConnectionURI();
conn:str := remote.connect(uri, "monetdb", "monetdb");
e := nil:BAT;
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
@@ -178,9 +178,13 @@ doChallenge(stream *in, stream *out) {
MSscheduleClient(buf, challenge, bs, fdout);
}
-static MT_Id listener[8];
-static int lastlistener=0;
-static int serveractive=TRUE;
+static volatile ATOMIC_TYPE nlistener = 0; /* nr of listeners */
+static volatile ATOMIC_TYPE serveractive = 0;
+static volatile ATOMIC_TYPE serverexiting = 0; /* listeners should exit */
+#ifdef ATOMIC_LOCK
+/* lock for all three ATOMIC_TYPE variables above */
+static MT_Lock atomicLock MT_LOCK_INITIALIZER("atomicLock");
+#endif
static void
SERVERlistenThread(SOCKET *Sock)
@@ -199,8 +203,7 @@ SERVERlistenThread(SOCKET *Sock)
GDKfree(Sock);
}
- if (lastlistener < 8)
- listener[lastlistener++] = MT_getpid();
+ (void) ATOMIC_INC(nlistener, atomicLock, "SERVERlistenThread");
do {
FD_ZERO(&fds);
@@ -221,7 +224,8 @@ SERVERlistenThread(SOCKET *Sock)
msgsock = usock;
#endif
retval = select((int)msgsock + 1, &fds, NULL, NULL, &tv);
- if (GDKexiting())
+ if (ATOMIC_GET(serverexiting, atomicLock, "SERVERlistenThread")
||
+ GDKexiting())
break;
if (retval == 0) {
/* nothing interesting has happened */
@@ -236,7 +240,7 @@ SERVERlistenThread(SOCKET *Sock)
}
if (sock != INVALID_SOCKET && FD_ISSET(sock, &fds)) {
if ((msgsock = accept(sock, (SOCKPTR)0, (socklen_t
*)0)) == INVALID_SOCKET) {
- if (MT_geterrno() != EINTR || serveractive ==
FALSE) {
+ if (MT_geterrno() != EINTR ||
!ATOMIC_GET(serveractive, atomicLock, "SERVERlistenThread")) {
msg = "accept failed";
goto error;
}
@@ -330,7 +334,9 @@ SERVERlistenThread(SOCKET *Sock)
doChallenge(
socket_rastream(msgsock, "Server read"),
socket_wastream(msgsock, "Server write"));
- } while (!GDKexiting());
+ } while (!ATOMIC_GET(serverexiting, atomicLock, "SERVERlistenThread") &&
+ !GDKexiting());
+ (void) ATOMIC_DEC(nlistener, atomicLock, "SERVERlistenThread");
return;
error:
fprintf(stderr, "!mal_mapi.listen: %s, terminating listener\n", msg);
@@ -599,12 +605,12 @@ SERVERlisten_port(int *ret, int *pid)
str
SERVERstop(int *ret)
{
- int i;
-
-printf("SERVERstop\n");
- for( i=0; i< lastlistener; i++)
- MT_kill_thread(listener[i]);
- lastlistener = 0;
+fprintf(stderr, "SERVERstop\n");
+ ATOMIC_SET(serverexiting, 1, atomicLock, "SERVERstop");
+ /* wait until they all exited, but skip the wait if the whole
+ * system is going down */
+ while (ATOMIC_GET(nlistener, atomicLock, "SERVERstop") > 0 &&
!GDKexiting())
+ MT_sleep_ms(100);
(void) ret; /* fool compiler */
return MAL_SUCCEED;
}
@@ -614,14 +620,14 @@ str
SERVERsuspend(int *res)
{
(void) res;
- serveractive= FALSE;
+ ATOMIC_SET(serveractive, 0, atomicLock, "SERVERsuspend");
return MAL_SUCCEED;
}
str
SERVERresume(int *res)
{
- serveractive= TRUE;
+ ATOMIC_SET(serveractive, 1, atomicLock, "SERVERsuspend");
(void) res;
return MAL_SUCCEED;
}
diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -173,7 +173,7 @@ str RMTconnectScen(
throw(ILLARG, "remote.connect", ILLEGAL_ARGUMENT ": scenario is
"
"NULL or nil");
if (strcmp(*scen, "mal") != 0 && strcmp(*scen, "msql") != 0)
- throw(ILLARG, "remote.connect", ILLEGAL_ARGUMENT ": scenation
'%s' "
+ throw(ILLARG, "remote.connect", ILLEGAL_ARGUMENT ": scenario
'%s' "
"is not supported", *scen);
m = mapi_mapiuri(*ouri, *user, *passwd, *scen);
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -760,9 +760,7 @@ stmt_idx( mvc *sql, sql_idx *i, stmt *de
static stmt *
stmt_dels( mvc *sql, sql_table *t)
{
- if (!t->readonly)
- return stmt_tid(sql->sa, t);
- return NULL;
+ return stmt_tid(sql->sa, t);
}
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -479,6 +479,21 @@ create_table_or_view(mvc *sql, char *sna
return MAL_SUCCEED;
}
+static int
+table_has_updates(sql_trans *tr, sql_table *t)
+{
+ node *n;
+ int cnt = 0;
+
+ for ( n = t->columns.set->h; !cnt && n; n = n->next) {
+ sql_column *c = n->data;
+ BAT *b = store_funcs.bind_col(tr, c, RD_UPD);
+ cnt += BATcount(b);
+ BBPunfix(b->batCacheid);
+ }
+ return cnt;
+}
+
static str
alter_table(mvc *sql, char *sname, sql_table *t)
{
@@ -508,8 +523,11 @@ alter_table(mvc *sql, char *sname, sql_t
}
}
- if (t->readonly != nt->readonly)
+ if (t->readonly != nt->readonly) {
+ if (t->readonly && table_has_updates(sql->session->tr, nt))
+ return sql_message("40000!ALTER TABLE: set READONLY not
possible with outstanding updates (wait until updates are flushed)\n");
mvc_readonly(sql, nt, t->readonly);
+ }
/* check for changes */
if (t->tables.dset)
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -106,7 +106,7 @@ e_convert
e_cmp
-> l left sub expression
- -> r right sub expression (f second arg for range expressions)
+ -> r right sub expression (f second arg (->f) for range expressions)
-> flag compare type
( cmp_gt = 0,
cmp_gte = 1,
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3940,6 +3940,55 @@ rel_reduce_groupby_exps(int *changes, mv
free(tbls);
free(scores);
}
+ /* remove constants from group by list */
+ if (is_groupby(rel->op) && rel->r && !rel_is_ref(rel)) {
+ int i;
+ node *n;
+
+ for (i = 0, n = gbe->h; n; n = n->next) {
+ sql_exp *e = n->data;
+
+ if (exp_is_atom(e))
+ i++;
+ }
+ if (i) {
+ list *ngbe = new_exp_list(sql->sa);
+ list *dgbe = new_exp_list(sql->sa);
+
+ for (n = gbe->h; n; n = n->next) {
+ sql_exp *e = n->data;
+
+ if (!exp_is_atom(e))
+ append(ngbe, e);
+ else
+ append(dgbe, e);
+ }
+ rel->r = ngbe;
+ if (!list_empty(dgbe)) {
+ /* use atom's directly in the aggr expr list */
+ list *nexps = new_exp_list(sql->sa);
+
+ for (n = rel->exps->h; n; n = n->next) {
+ sql_exp *e = n->data, *ne = NULL;
+
+ if (is_column(e->type)) {
+ if (e->l)
+ ne =
exps_bind_column2(dgbe, e->l, e->r);
+ else
+ ne =
exps_bind_column(dgbe, e->r, NULL);
+ if (ne) {
+ ne = exp_copy(sql->sa,
ne);
+ exp_setname(sql->sa,
ne, e->rname, e->name);
+ e = ne;
+ }
+ }
+ append(nexps, e);
+ }
+ rel->exps = nexps;
+ }
+ (*changes)++;
+ }
+ }
return rel;
}
diff --git a/sql/test/BugTracker-2014/Tests/All
b/sql/test/BugTracker-2014/Tests/All
--- a/sql/test/BugTracker-2014/Tests/All
+++ b/sql/test/BugTracker-2014/Tests/All
@@ -10,3 +10,4 @@ temporary.Bug-3430
indices.Bug-3435
utf8bom.Bug-3436
left-outer-join-with-and.Bug-3444
+setreadonly_forgets_changes.Bug-3446
diff --git
a/sql/test/BugTracker-2014/Tests/setreadonly_forgets_changes.Bug-3446.sql
b/sql/test/BugTracker-2014/Tests/setreadonly_forgets_changes.Bug-3446.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2014/Tests/setreadonly_forgets_changes.Bug-3446.sql
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list