Changeset: f5caa5a1aa1d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f5caa5a1aa1d
Modified Files:
        sql/backends/monet5/sql.c
Branch: default
Log Message:

Improvements for sys.delta function. Validate parameters and return the number 
of deleted rows of the column's table.


diffs (142 lines):

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
@@ -1097,8 +1097,25 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
        throw(SQL, "sql.bind", SQLSTATE(42000) "unable to find %s(%s)", tname, 
cname);
 }
 
-/* The output of this function is a lng bat with the RDONLY, RD_INS and 
RD_UPD_VAL delta counts and
- * the number in the transaction chain */
+static str
+append_bat_delta_size(mvc *m, BAT* res, const char *sname, const char *tname, 
const char *cname, int delta)
+{
+       gdk_return ores;
+       lng count;
+       BAT *o = mvc_bind(m, sname, tname, cname, delta);
+       if (!o)
+               throw(SQL,"sql.delta", SQLSTATE(HY005) "Cannot access the 
column %s.%s.%s", sname, tname, cname);
+       count = BATcount(o);
+       ores = BUNappend(res, &count, false);
+       BBPunfix(o->batCacheid);
+       if (ores != GDK_SUCCEED)
+               throw(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+       return MAL_SUCCEED;
+}
+
+/* The output of this function is a lng bat with the RDONLY, RD_INS and 
RD_UPD_VAL delta counts for provided column,
+ * the number of deletes of the column's table and the number in the 
transaction chain (.i.e for each savepoint a
+ * new transaction is added in the chain) */
 
 str
 mvc_delta_values(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
@@ -1107,46 +1124,62 @@ mvc_delta_values(Client cntxt, MalBlkPtr
        const char *tname = *getArgReference_str(stk, pci, 2);
        const char *cname = *getArgReference_str(stk, pci, 3);
        mvc *m;
-       str msg;
-       BAT *b;
+       str msg = MAL_SUCCEED;
+       BAT *b = NULL;
        bat *bid = getArgReference_bat(stk, pci, 0);
-       sql_trans *t;
-       lng level = 0;
+       sql_trans *tr;
+       sql_schema *s = NULL;
+       sql_table *t = NULL;
+       lng level = 0, deletes;
 
        if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
-               return msg;
+               goto cleanup;
        if ((msg = checkSQLContext(cntxt)) != NULL)
-               return msg;
-
-       if ((b = COLnew(0, TYPE_lng, 4, TRANSIENT)) == NULL)
-               throw(SQL, "sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL);
-
-       for (int i = RDONLY ; i < RD_UPD_VAL ; i++) {
-               gdk_return ores;
-               lng count;
-               BAT *o = mvc_bind(m, sname, tname, cname, i);
-               if (!o) {
+               goto cleanup;
+
+       if (!sname || strcmp(sname, str_nil) == 0 || *sname == '\0')
+               throw(SQL, "sql.delta", SQLSTATE(3F000) "Invalid schema name");
+       if (!tname || strcmp(tname, str_nil) == 0 || *tname == '\0')
+               throw(SQL, "sql.delta", SQLSTATE(3F000) "Invalid table name");
+       if (!cname || strcmp(cname, str_nil) == 0 || *cname == '\0')
+               throw(SQL, "sql.delta", SQLSTATE(3F000) "Invalid column name");
+       if (!(s = mvc_bind_schema(m, sname)))
+               throw(SQL, "sql.delta", SQLSTATE(3F000) "No such schema '%s'", 
sname);
+       if (!(t = mvc_bind_table(m, s, tname)))
+               throw(SQL, "sql.delta", SQLSTATE(3F000) "No such table '%s' in 
schema '%s'", tname, s->base.name);
+
+       if ((b = COLnew(0, TYPE_lng, 5, TRANSIENT)) == NULL) {
+               msg = createException(SQL, "sql.delta", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+               goto cleanup;
+       }
+       if ((msg = append_bat_delta_size(m, b, sname, tname, cname, RDONLY)))
+               goto cleanup;
+       if ((msg = append_bat_delta_size(m, b, sname, tname, cname, RD_INS)))
+               goto cleanup;
+       if ((msg = append_bat_delta_size(m, b, sname, tname, cname, RD_UPD_ID)))
+               goto cleanup;
+
+       deletes = (lng) store_funcs.count_del(m->session->tr, t);
+       if (BUNappend(b, &deletes, false) != GDK_SUCCEED) {
+               msg = createException(SQL,"sql.delta", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+               goto cleanup;
+       }
+
+       tr = m->session->tr;
+       while((tr = tr->parent)) level++;
+       if (BUNappend(b, &level, false) != GDK_SUCCEED) {
+               msg = createException(SQL,"sql.delta", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+               goto cleanup;
+       }
+
+cleanup:
+       if (msg) {
+               if (b)
                        BBPreclaim(b);
-                       throw(SQL,"sql.delta", SQLSTATE(HY005) "Cannot access 
the column %s.%s.%s", sname, tname, cname);
-               }
-               count = BATcount(o);
-               ores = BUNappend(b, &count, false);
-               BBPunfix(o->batCacheid);
-               if (ores != GDK_SUCCEED) {
-                       BBPreclaim(b);
-                       throw(SQL,"sql.delta", SQLSTATE(HY001) 
MAL_MALLOC_FAIL); /* should never happen */
-               }
-       }
-
-       t = m->session->tr;
-       while((t = t->parent)) level++;
-       if (BUNappend(b, &level, false) != GDK_SUCCEED){
-               BBPreclaim(b);
-               throw(SQL,"sql.delta", SQLSTATE(HY001) MAL_MALLOC_FAIL); /* 
should never happen */
-       }
-
-       BBPkeepref(*bid = b->batCacheid);
-       return MAL_SUCCEED;
+       } else {
+               BBPkeepref(*bid = b->batCacheid);
+       }
+       return msg;
 }
 
 /* str mvc_bind_idxbat_wrap(int *bid, str *sname, str *tname, str *iname, int 
*access); */
@@ -2115,12 +2148,6 @@ mvc_result_set_wrap( Client cntxt, MalBl
        return msg;
 }
 
-
-
-
-
-
-
 /* Copy the result set into a CSV file */
 str
 mvc_export_table_wrap( Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to