Changeset: 960fa2655454 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/960fa2655454
Modified Files:
clients/Tests/MAL-signatures-hge.test
clients/Tests/MAL-signatures.test
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/server/sql_parser.y
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_storage.h
sql/storage/sql_storage.h
sql/storage/store.c
sql/test/sysmon/vacuum/Tests/test_vacuum.SQL.py
Branch: default
Log Message:
introduced vacuum_tab/vacuum_col for variable size data types
diffs (truncated from 803 to 300 lines):
diff --git a/clients/Tests/MAL-signatures-hge.test
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -49805,8 +49805,13 @@ SQLstddev_pop;
return the standard deviation population of groups
sql
stop_vacuum
+unsafe pattern sql.stop_vacuum(X_0:str, X_1:str):void
+SQLstr_stop_vacuum;
+stop auto vacuum
+sql
+stop_vacuum
unsafe pattern sql.stop_vacuum(X_0:str, X_1:str, X_2:str):void
-SQLstr_column_stop_vacuum;
+SQLstr_stop_vacuum;
stop auto vacuum
sql
storage
@@ -49965,8 +49970,13 @@ SYSupdate_tables;
Procedure triggered on update of the sys._tables table
sql
vacuum
+unsafe pattern sql.vacuum(X_0:str, X_1:str, X_2:int):void
+SQLstr_auto_vacuum;
+auto vacuum string column of given table with interval(sec)
+sql
+vacuum
unsafe pattern sql.vacuum(X_0:str, X_1:str, X_2:str, X_3:int):void
-SQLstr_column_auto_vacuum;
+SQLstr_auto_vacuum;
auto vacuum string column with interval(sec)
sql
vacuum
diff --git a/clients/Tests/MAL-signatures.test
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -38215,8 +38215,13 @@ SQLstddev_pop;
return the standard deviation population of groups
sql
stop_vacuum
+unsafe pattern sql.stop_vacuum(X_0:str, X_1:str):void
+SQLstr_stop_vacuum;
+stop auto vacuum
+sql
+stop_vacuum
unsafe pattern sql.stop_vacuum(X_0:str, X_1:str, X_2:str):void
-SQLstr_column_stop_vacuum;
+SQLstr_stop_vacuum;
stop auto vacuum
sql
storage
@@ -38350,8 +38355,13 @@ SYSupdate_tables;
Procedure triggered on update of the sys._tables table
sql
vacuum
+unsafe pattern sql.vacuum(X_0:str, X_1:str, X_2:int):void
+SQLstr_auto_vacuum;
+auto vacuum string column of given table with interval(sec)
+sql
+vacuum
unsafe pattern sql.vacuum(X_0:str, X_1:str, X_2:str, X_3:int):void
-SQLstr_column_auto_vacuum;
+SQLstr_auto_vacuum;
auto vacuum string column with interval(sec)
sql
vacuum
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
@@ -4928,40 +4928,40 @@ finalize:
}
static str
-do_str_column_vacuum(sql_trans *tr, sql_column *c, char *sname, char *tname,
char *cname)
+do_str_column_vacuum(sql_trans *tr, sql_column *c)
{
- int res;
- int access = 0;
- BAT* b = NULL;
- BAT* bn = NULL;
- sqlstore *store = tr->store;
-
- if ((b = store->storage_api.bind_col(tr, c, access)) == NULL)
- throw(SQL, "do_str_column_vacuum", SQLSTATE(42S22)
"storage_api.bind_col failed for %s.%s.%s", sname, tname, cname);
- // vacuum varsized bats
if (ATOMvarsized(c->type.type->localtype)) {
- // TODO check for num of updates on the BAT against some
threshold
- // and decide whether to proceed
- if ((bn = COLcopy(b, b->ttype, true, PERSISTENT)) == NULL) {
- BBPunfix(b->batCacheid);
- throw(SQL, "do_str_column_vacuum", SQLSTATE(42S22)
"COLcopy failed for %s.%s.%s", sname, tname, cname);
+ int res = 0;
+ sqlstore *store = tr->store;
+
+ if ((res = (int) store->storage_api.vacuum_col(tr, c)) !=
LOG_OK) {
+ if (res == LOG_CONFLICT)
+ throw(SQL, "do_str_column_vacuum",
SQLSTATE(25S01) "TRANSACTION CONFLICT in storage_api.vacuum_col %s.%s.%s",
c->t->s->base.name, c->t->base.name, c->base.name);
+ if (res == LOG_ERR)
+ throw(SQL, "do_str_column_vacuum",
SQLSTATE(HY000) "LOG ERROR in storage_api.vacuum_col %s.%s.%s",
c->t->s->base.name, c->t->base.name, c->base.name);
+ throw(SQL, "do_str_column_vacuum", SQLSTATE(HY000)
"ERROR in storage_api.vacuum_col %s.%s.%s", c->t->s->base.name,
c->t->base.name, c->base.name);
}
- if ((res = (int) store->storage_api.swap_bats(tr, c, bn)) !=
LOG_OK) {
- BBPreclaim(bn);
- BBPunfix(b->batCacheid);
- if (res == LOG_CONFLICT)
- throw(SQL, "do_str_column_vacuum",
SQLSTATE(25S01) "TRANSACTION CONFLICT in storage_api.swap_bats %s.%s.%s",
sname, tname, cname);
- if (res == LOG_ERR)
- throw(SQL, "do_str_column_vacuum",
SQLSTATE(HY000) "LOG ERROR in storage_api.swap_bats %s.%s.%s", sname, tname,
cname);
- throw(SQL, "do_str_column_vacuum", SQLSTATE(HY000)
"ERROR in storage_api.swap_bats %s.%s.%s", sname, tname, cname);
- }
- }
- BBPunfix(b->batCacheid);
- BBPreclaim(bn);
+ }
return MAL_SUCCEED;
}
-str
+static str
+do_str_table_vacuum(sql_trans *tr, sql_table *t)
+{
+ int res = 0;
+ sqlstore *store = tr->store;
+
+ if ((res = (int) store->storage_api.vacuum_tab(tr, t)) != LOG_OK) {
+ if (res == LOG_CONFLICT)
+ throw(SQL, "do_str_table_vacuum", SQLSTATE(25S01)
"TRANSACTION CONFLICT in storage_api.vacuum_col %s.%s", t->s->base.name,
t->base.name);
+ if (res == LOG_ERR)
+ throw(SQL, "do_str_table_vacuum", SQLSTATE(HY000) "LOG
ERROR in storage_api.vacuum_col %s.%s", t->s->base.name, t->base.name);
+ throw(SQL, "do_str_table_vacuum", SQLSTATE(HY000) "ERROR in
storage_api.vacuum_col %s.%s", t->s->base.name, t->base.name);
+ }
+ return MAL_SUCCEED;
+}
+
+static str
SQLstr_column_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
mvc *m = NULL;
@@ -5000,12 +5000,13 @@ SQLstr_column_vacuum(Client cntxt, MalBl
if (c->storage_type)
throw(SQL, "sql.str_column_vacuum", SQLSTATE(42000) "Cannot
vacuum compressed column");
- return do_str_column_vacuum(tr, c, sname, tname, cname);
+ return do_str_column_vacuum(tr, c);
}
static gdk_return
-str_column_vacuum_callback(int argc, void *argv[]) {
+str_vacuum_callback(int argc, void *argv[])
+{
sqlstore *store = (sqlstore *) argv[0];
char *sname = (char *) argv[1];
char *tname = (char *) argv[2];
@@ -5021,18 +5022,18 @@ str_column_vacuum_callback(int argc, voi
(void) argc;
if ((sa = sa_create(NULL)) == NULL) {
- TRC_ERROR((component_t) SQL, "[str_column_vacuum_callback] --
Failed to create allocator!");
+ TRC_ERROR((component_t) SQL, "[str_vacuum_callback] -- Failed
to create allocator!");
return GDK_FAIL;
}
if ((session = sql_session_create(store, sa, 0)) == NULL) {
- TRC_ERROR((component_t) SQL, "[str_column_vacuum_callback] --
Failed to create session!");
+ TRC_ERROR((component_t) SQL, "[str_vacuum_callback] -- Failed
to create session!");
sa_destroy(sa);
return GDK_FAIL;
}
if (sql_trans_begin(session) < 0) {
- TRC_ERROR((component_t) SQL, "[str_column_vacuum_callback] --
Failed to begin transaction!");
+ TRC_ERROR((component_t) SQL, "[str_vacuum_callback] -- Failed
to begin transaction!");
sql_session_destroy(session);
sa_destroy(sa);
return GDK_FAIL;
@@ -5040,26 +5041,32 @@ str_column_vacuum_callback(int argc, voi
do {
if((s = find_sql_schema(session->tr, sname)) == NULL) {
- TRC_ERROR((component_t) SQL,
"[str_column_vacuum_callback] -- Invalid or missing schema %s!",sname);
+ TRC_ERROR((component_t) SQL, "[str_vacuum_callback] --
Invalid or missing schema %s!",sname);
res = GDK_FAIL;
break;
}
if((t = find_sql_table(session->tr, s, tname)) == NULL) {
- TRC_ERROR((component_t) SQL,
"[str_column_vacuum_callback] -- Invalid or missing table %s!", tname);
+ TRC_ERROR((component_t) SQL, "[str_vacuum_callback] --
Invalid or missing table %s!", tname);
res = GDK_FAIL;
break;
}
-
- if ((c = find_sql_column(t, cname)) == NULL) {
- TRC_ERROR((component_t) SQL,
"[str_column_vacuum_callback] -- Invalid or missing column %s!", cname);
- res = GDK_FAIL;
- break;
- }
-
- if((msg=do_str_column_vacuum(session->tr, c, sname, tname,
cname)) != MAL_SUCCEED) {
- TRC_ERROR((component_t) SQL,
"[str_column_vacuum_callback] -- %s", msg);
- res = GDK_FAIL;
+ if (cname) {
+ if ((c = find_sql_column(t, cname)) == NULL) {
+ TRC_ERROR((component_t) SQL,
"[str_vacuum_callback] -- Invalid or missing column %s!", cname);
+ res = GDK_FAIL;
+ break;
+ }
+
+ if((msg=do_str_column_vacuum(session->tr, c)) !=
MAL_SUCCEED) {
+ TRC_ERROR((component_t) SQL,
"[str_vacuum_callback] -- %s", msg);
+ res = GDK_FAIL;
+ }
+ } else {
+ if((msg=do_str_table_vacuum(session->tr, t)) !=
MAL_SUCCEED) {
+ TRC_ERROR((component_t) SQL,
"[str_vacuum_callback] -- %s", msg);
+ res = GDK_FAIL;
+ }
}
} while(0);
@@ -5087,25 +5094,31 @@ str_column_vacuum_callback(int argc, voi
}
static gdk_return
-str_column_vacuum_callback_args_free(int argc, void *argv[])
+str_vacuum_callback_args_free(int argc, void *argv[])
{
(void) argc;
// free up sname, tname, cname. First pointer points to sqlstore so
leave it.
GDKfree(argv[1]); // sname
GDKfree(argv[2]); // tname
- GDKfree(argv[3]); // cname
+ if (argv[3])
+ GDKfree(argv[3]); // cname
return GDK_SUCCEED;
}
-str
-SQLstr_column_auto_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci)
+static str
+SQLstr_auto_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
mvc *m = NULL;
str msg = NULL;
char *sname = *getArgReference_str(stk, pci, 1);
char *tname = *getArgReference_str(stk, pci, 2);
- char *cname = *getArgReference_str(stk, pci, 3);
- int interval = *getArgReference_int(stk, pci, 4); // in sec
+ char *cname = NULL;
+ int iarg = 3;
+ if (pci->argc == 5) {
+ cname = *getArgReference_str(stk, pci, 3);
+ iarg++;
+ }
+ int interval = *getArgReference_int(stk, pci, iarg); // in sec
char *sname_copy = NULL, *tname_copy = NULL, *cname_copy = NULL;
if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
@@ -5118,49 +5131,51 @@ SQLstr_column_auto_vacuum(Client cntxt,
sql_column *c = NULL;
if (strNil(sname))
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000)
"Schema name cannot be NULL");
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(42000) "Schema name
cannot be NULL");
if (strNil(tname))
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) "Table
name cannot be NULL");
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(42000) "Table name
cannot be NULL");
if (strNil(cname))
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000)
"Column name cannot be NULL");
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(42000) "Column name
cannot be NULL");
if ((s = mvc_bind_schema(m, sname)) == NULL)
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(3F000)
"Invalid or missing schema %s",sname);
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(3F000) "Invalid or
missing schema %s",sname);
if ((t = mvc_bind_table(m, s, tname)) == NULL)
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S02)
"Invalid or missing table %s.%s",sname,tname);
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(42S02) "Invalid or
missing table %s.%s",sname,tname);
if (!isTable(t))
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) "%s
'%s' is not persistent",
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(42000) "%s '%s' is
not persistent",
TABLE_TYPE_DESCRIPTION(t->type, t->properties),
t->base.name);
if (isTempTable(t))
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000)
"Cannot vacuum column from temporary table");
- if ((c = mvc_bind_column(m, t, cname)) == NULL)
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S22)
"Column not found in %s.%s.%s",sname,tname,cname);
- if (c->storage_type)
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000)
"Cannot vacuum compressed column");
-
- if (!(sname_copy = GDKstrdup(sname)) || !(tname_copy =
GDKstrdup(tname)) || !(cname_copy = GDKstrdup(cname))) {
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(42000) "Cannot
vacuum column from temporary table");
+ if (cname && (c = mvc_bind_column(m, t, cname)) == NULL)
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(42S22) "Column not
found in %s.%s.%s",sname,tname,cname);
+ if (c && c->storage_type)
+ throw(SQL, "sql.str_auto_vacuum", SQLSTATE(42000) "Cannot
vacuum compressed column");
+
+ if (!(sname_copy = GDKstrdup(sname)) || !(tname_copy =
GDKstrdup(tname)) || (cname && !(cname_copy = GDKstrdup(cname)))) {
GDKfree(sname_copy);
GDKfree(tname_copy);
GDKfree(cname_copy);
- throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]