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

Reply via email to