Changeset: 4508ea149dad for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4508ea149dad
Modified Files:
        clients/mapiclient/dump.c
        gdk/gdk_logger.c
        sql/server/rel_schema.c
        sql/server/sql_mvc.c
        sql/server/sql_parser.y
        sql/storage/bat/bat_storage.c
Branch: ustr
Log Message:

Implemented STORAGE option for colums during creation; implemented WAL for USTR.


diffs (truncated from 523 to 300 lines):

diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -919,7 +919,8 @@ dump_column_definition(Mapi mid, stream 
                                "c.type_digits, "       /* 2 */
                                "c.type_scale, "        /* 3 */
                                "c.\"null\", "          /* 4 */
-                               "c.number "                     /* 5 */
+                               "c.number, "            /* 5 */
+                               "c.storage "            /* 6 */
                         "FROM sys._columns c "
                         "WHERE c.table_id = %s "
                         "ORDER BY c.number", tid);
@@ -930,7 +931,8 @@ dump_column_definition(Mapi mid, stream 
                                "c.type_digits, "       /* 2 */
                                "c.type_scale, "        /* 3 */
                                "c.\"null\", "          /* 4 */
-                               "c.number "                     /* 5 */
+                               "c.number, "            /* 5 */
+                               "c.storage "            /* 6 */
                         "FROM sys._columns c, "
                              "sys._tables t, "
                              "sys.schemas s "
@@ -950,6 +952,7 @@ dump_column_definition(Mapi mid, stream 
                char *c_type_digits = strdup(mapi_fetch_field(hdl, 2));
                char *c_type_scale = strdup(mapi_fetch_field(hdl, 3));
                const char *c_null = mapi_fetch_field(hdl, 4);
+               const char *c_storage = mapi_fetch_field(hdl, 6);
                int space;
 
                if (mapi_error(mid) || !c_type || !c_type_digits || 
!c_type_scale) {
@@ -999,6 +1002,11 @@ dump_column_definition(Mapi mid, stream 
                                                 CAP(13 - space), "");
                        space = 13;
                }
+               if (c_storage && strcmp(c_storage, "USTR") == 0) {
+                       mnstr_printf(sqlf, "%*s STORAGE '%s'",
+                                                CAP(13 - space), "", 
c_storage);
+                       space = 13;
+               }
 
                cnt++;
                free(c_type);
@@ -1935,7 +1943,7 @@ bailout:
 }
 
 static int
-dump_table_storage(Mapi mid, const char *schema, const char *tname, stream 
*sqlf, bool after)
+dump_table_storage(Mapi mid, const char *schema, const char *tname, stream 
*sqlf)
 {
        char *query = NULL;
        size_t maxquerylen;
@@ -1953,10 +1961,10 @@ dump_table_storage(Mapi mid, const char 
 
        snprintf(query, maxquerylen,
                         "SELECT name, storage FROM sys._columns "
-                        "WHERE storage %s LIKE 'USTR' "
+                        "WHERE storage NOT LIKE 'USTR' "
                         "AND table_id = (SELECT id FROM sys._tables WHERE name 
= '%s' "
                         "AND schema_id = (SELECT id FROM sys.schemas WHERE 
name = '%s'))",
-                        after ? "NOT" : "", t, s);
+                        t, s);
        if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid))
                goto bailout;
        while ((mapi_fetch_row(hdl)) != 0) {
@@ -2209,14 +2217,12 @@ dump_table(Mapi mid, const char *schema,
        }
 
        rc = describe_table(mid, schema, tname, sqlf, foreign, databaseDump);
-       if (rc == 0)
-               rc = dump_table_storage(mid, schema, tname, sqlf, false);
        if (rc == 0 && !describe)
                rc = dump_table_data(mid, schema, tname, sqlf, ddir, ext, 
useInserts, noescape);
        if (rc == 0)
                rc = dump_table_access(mid, schema, tname, sqlf);
        if (rc == 0)
-               rc = dump_table_storage(mid, schema, tname, sqlf, true);
+               rc = dump_table_storage(mid, schema, tname, sqlf);
        if (rc == 0 && !databaseDump)
                rc = dump_table_defaults(mid, schema, tname, sqlf);
   doreturn:
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -38,6 +38,7 @@ static gdk_return log_del_bat(logger *lg
 #define LOG_CLEAR      8       /* DEPRECATED */
 #define LOG_BAT_GROUP  9
 #define LOG_UPDATE_CB  10
+#define LOG_CREATE_USTR        11
 
 #ifdef NATIVE_WIN32
 #define getfilepos _ftelli64
@@ -65,6 +66,7 @@ static const char *log_commands[] = {
        "",                     /* LOG_CLEAR IS DEPRECATED */
        "LOG_BAT_GROUP",
        "LOG_UPDATE_CB",
+       "LOG_CREATE_USTR",
 };
 
 typedef struct logaction {
@@ -960,13 +962,13 @@ la_bat_destroy(logger *lg, logaction *la
 }
 
 static log_return
-log_read_create(logger *lg, trans *tr, log_id id)
+log_read_create(logger *lg, trans *tr, logformat *l)
 {
        bte tt;
        int tpe;
 
        assert(!lg->inmemory);
-       TRC_DEBUG(WAL, "create %d", id);
+       TRC_DEBUG(WAL, "create%s %d", l->flag == LOG_CREATE_USTR ? " ustr" : 
"", l->id);
 
        if (mnstr_read(lg->input_log, &tt, 1, 1) != 1) {
                TRC_CRITICAL(GDK, "read failed\n");
@@ -976,9 +978,9 @@ log_read_create(logger *lg, trans *tr, l
        tpe = find_type_nr(lg, tt);
        /* read create */
        if (tr_grow(tr) == GDK_SUCCEED) {
-               tr->changes[tr->nr].type = LOG_CREATE;
+               tr->changes[tr->nr].type = l->flag;
                tr->changes[tr->nr].tt = tpe;
-               tr->changes[tr->nr].cid = id;
+               tr->changes[tr->nr].cid = l->id;
                tr->nr++;
                return LOG_OK;
        }
@@ -998,6 +1000,12 @@ la_bat_create(logger *lg, logaction *la,
        if (la->tt < 0)
                BATtseqbase(b, 0);
 
+       if (la->type == LOG_CREATE_USTR &&
+           BATconvert2ustr(b) != GDK_SUCCEED) {
+               logbat_destroy(b);
+               return GDK_FAIL;
+       }
+
        if ((b = BATsetaccess(b, BAT_READ)) == NULL ||
            log_add_bat(lg, b, la->cid, tid) != GDK_SUCCEED) {
                logbat_destroy(b);
@@ -1071,6 +1079,7 @@ la_apply(logger *lg, logaction *c, int t
                ret = la_bat_updates(lg, c, tid);
                break;
        case LOG_CREATE:
+       case LOG_CREATE_USTR:
                if (!lg->flushing)
                        ret = la_bat_create(lg, c, tid);
                break;
@@ -1452,6 +1461,7 @@ log_read_transaction(logger *lg, BAT *id
                                break;
                        /* fall through */
                case LOG_CREATE:
+               case LOG_CREATE_USTR:
                case LOG_DESTROY:
                        if (tr != NULL && updated && BAThash(lg->catalog_id) == 
GDK_SUCCEED) {
                                BATiter cni = bat_iterator(lg->catalog_id);
@@ -1472,7 +1482,7 @@ log_read_transaction(logger *lg, BAT *id
                                 * location of the bat that this
                                 * transaction is working on, and posold
                                 * is the location of the previous
-                                * version of the bat.  If LOG_CREATE,
+                                * version of the bat.  If LOG_CREATE(_USTR),
                                 * both are relevant, since the latter
                                 * is the new bat, and the former is the
                                 * to-be-destroyed bat.  For
@@ -1486,7 +1496,10 @@ log_read_transaction(logger *lg, BAT *id
                                        assert(posnew < maxupdated);
                                        updated[posnew / 32] |= 1U << (posnew % 
32);
                                }
-                               if ((l.flag == LOG_CREATE || posnew == 
BUN_NONE) && posold != BUN_NONE) {
+                               if ((l.flag == LOG_CREATE ||
+                                    l.flag == LOG_CREATE_USTR ||
+                                    posnew == BUN_NONE) &&
+                                   posold != BUN_NONE) {
                                        assert(posold < maxupdated);
                                        updated[posold / 32] |= 1U << (posold % 
32);
                                }
@@ -1538,10 +1551,11 @@ log_read_transaction(logger *lg, BAT *id
                        }
                        break;
                case LOG_CREATE:
+               case LOG_CREATE_USTR:
                        if (tr == NULL)
                                err = LOG_EOF;
                        else
-                               err = log_read_create(lg, tr, l.id);
+                               err = log_read_create(lg, tr, &l);
                        break;
                case LOG_DESTROY:
                        if (tr == NULL)
@@ -3330,7 +3344,7 @@ log_bat_persists(logger *lg, BAT *b, log
                return GDK_FAIL;
        }
 
-       l.flag = LOG_CREATE;
+       l.flag = b->ustr ? LOG_CREATE_USTR : LOG_CREATE;
        l.id = id;
        if (!LOG_DISABLED(lg)) {
                assert(mnstr_errnr(lg->current->output_log) == MNSTR_NO__ERROR);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -381,6 +381,7 @@ column_constraint_name(allocator *ta, sy
 
 #define COL_NULL       0
 #define COL_DEFAULT 1
+#define COL_STORAGE 2
 
 static bool
 foreign_key_check_types(sql_subtype *lt, sql_subtype *rt)
@@ -695,67 +696,44 @@ column_options(sql_query *query, dlist *
                        symbol *s = n->data.sym;
 
                        switch (s->token) {
-                               case SQL_CONSTRAINT: {
-                                       dlist *l = s->data.lval;
-                                       char *opt_name = l->h->data.sval, 
*default_name = NULL;
-                                       symbol *sym = l->h->next->data.sym;
-                                       allocator *ta = 
MT_thread_getallocator();
-                                       allocator_state ta_state = ma_open(ta);
+                       case SQL_CONSTRAINT: {
+                               dlist *l = s->data.lval;
+                               char *opt_name = l->h->data.sval, *default_name 
= NULL;
+                               symbol *sym = l->h->next->data.sym;
+                               allocator *ta = MT_thread_getallocator();
+                               allocator_state ta_state = ma_open(ta);
 
-                                       if (!opt_name && !(default_name = 
column_constraint_name(ta, sym, cs, t))) {
-                                               ma_close(&ta_state);
-                                               return SQL_ERR;
-                                       }
-
-                                       res = column_constraint_type(query, 
opt_name ? opt_name : default_name, sym, ss, t, cs, isDeclared, &used);
+                               if (!opt_name && !(default_name = 
column_constraint_name(ta, sym, cs, t))) {
                                        ma_close(&ta_state);
-                                       if (res<0)
-                                               res = SQL_ERR;
-                               }       break;
-                               case SQL_DEFAULT: {
-                                       symbol *sym = s->data.sym;
-                                       char *err = NULL, *r;
-
-                                       if ((used&(1<<COL_DEFAULT))) {
-                                               (void) sql_error(sql, 02, 
SQLSTATE(42000) "A default value for a column may be specified at most once");
-                                               return SQL_ERR;
-                                       }
-                                       used |= (1<<COL_DEFAULT);
-
-                                       if (sym->token == SQL_COLUMN || 
sym->token == SQL_IDENT || sym->token == SQL_NEXT) {
-                                               exp_kind ek = {type_value, 
card_value, FALSE};
-                                               sql_exp *e = 
rel_logical_value_exp(query, NULL, sym, sql_sel, ek);
+                                       return SQL_ERR;
+                               }
 
-                                               if (!e)
-                                                       return SQL_ERR;
-                                               if (e && is_atom(e->type)) {
-                                                       atom *a = 
exp_value(sql, e);
+                               res = column_constraint_type(query, opt_name ? 
opt_name : default_name, sym, ss, t, cs, isDeclared, &used);
+                               ma_close(&ta_state);
+                               if (res<0)
+                                       res = SQL_ERR;
+                       }       break;
+                       case SQL_DEFAULT: {
+                               symbol *sym = s->data.sym;
+                               char *err = NULL, *r;
 
-                                                       if (a && atom_null(a)) {
-                                                               switch 
(mvc_default(sql, cs, NULL)) {
-                                                                       case -1:
-                                                                               
(void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                                                                               
return SQL_ERR;
-                                                                       case -2:
-                                                                       case -3:
-                                                                               
(void) sql_error(sql, 02, SQLSTATE(42000) "DEFAULT: transaction conflict 
detected while setting default value");
-                                                                               
return SQL_ERR;
-                                                                       default:
-                                                                               
break;
-                                                               }
-                                                               break;
-                                                       }
-                                               }
-                                               /* reset error */
-                                               sql->session->status = 0;
-                                               sql->errstr[0] = '\0';
-                                       }
-                                       r = symbol2string(sql, s->data.sym, 0, 
&err);
-                                       if (!r) {
-                                               (void) sql_error(sql, 02, 
SQLSTATE(42000) "Incorrect default value '%s'", err?err:"");
+                               if (used & (1 << COL_DEFAULT)) {
+                                       (void) sql_error(sql, 02, 
SQLSTATE(42000) "A default value for a column may be specified at most once");
+                                       return SQL_ERR;
+                               }
+                               used |= (1 << COL_DEFAULT);
+
+                               if (sym->token == SQL_COLUMN || sym->token == 
SQL_IDENT || sym->token == SQL_NEXT) {
+                                       exp_kind ek = {type_value, card_value, 
FALSE};
+                                       sql_exp *e = 
rel_logical_value_exp(query, NULL, sym, sql_sel, ek);
+
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to