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]