Changeset: aa2c47f1d56e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/aa2c47f1d56e
Modified Files:
        sql/backends/monet5/sql_statistics.c
Branch: Jul2021
Log Message:

Filter deleted rows while analyzing


diffs (98 lines):

diff --git a/sql/backends/monet5/sql_statistics.c 
b/sql/backends/monet5/sql_statistics.c
--- a/sql/backends/monet5/sql_statistics.c
+++ b/sql/backends/monet5/sql_statistics.c
@@ -189,11 +189,19 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
 
                        if (tbl && strcmp(b->name, tbl))
                                continue;
-                       if (isTable(t) && ol_first_node(t->columns))
+                       if (isTable(t) && ol_first_node(t->columns)) {
+                               BAT *cands;
+
+                               if ((cands = store->storage_api.bind_cands(tr, 
t, 1, 0)) == NULL) {
+                                       GDKfree(maxval);
+                                       GDKfree(minval);
+                                       throw(SQL, "analyze", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+                               }
+
                                for (ncol = ol_first_node((t)->columns); ncol; 
ncol = ncol->next) {
                                        sql_base *bc = ncol->data;
                                        sql_column *c = (sql_column *) 
ncol->data;
-                                       BAT *bn, *br;
+                                       BAT *bn, *nbn, *br;
                                        BAT *bsample;
                                        lng sz;
                                        ssize_t (*tostr)(str*,size_t*,const 
void*,bool);
@@ -212,6 +220,13 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                /* XXX throw error instead? */
                                                continue;
                                        }
+                                       nbn = BATproject(cands, bn);
+                                       BBPunfix(bn->batCacheid);
+                                       if (!nbn) {
+                                               /* XXX throw error instead? */
+                                               continue;
+                                       }
+                                       bn = nbn;
                                        sz = BATcount(bn);
                                        tostr = BATatoms[bn->ttype].atomToStr;
 
@@ -265,6 +280,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                if (maxval == NULL) {
                                                        GDKfree(minval);
                                                        
BBPunfix(bn->batCacheid);
+                                                       
BBPunfix(cands->batCacheid);
                                                        throw(SQL, "analyze", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                                }
                                                maxlen = 4;
@@ -275,6 +291,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                if (minval == NULL){
                                                        GDKfree(maxval);
                                                        
BBPunfix(bn->batCacheid);
+                                                       
BBPunfix(cands->batCacheid);
                                                        throw(SQL, "analyze", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                                }
                                                minlen = 4;
@@ -288,6 +305,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                                GDKfree(minval);
                                                                GDKfree(maxval);
                                                                
BBPunfix(bn->batCacheid);
+                                                               
BBPunfix(cands->batCacheid);
                                                                throw(SQL, 
"analyze", GDK_EXCEPTION);
                                                        }
                                                        GDKfree(val);
@@ -300,6 +318,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                                GDKfree(minval);
                                                                GDKfree(maxval);
                                                                
BBPunfix(bn->batCacheid);
+                                                               
BBPunfix(cands->batCacheid);
                                                                throw(SQL, 
"analyze", GDK_EXCEPTION);
                                                        }
                                                        GDKfree(val);
@@ -313,21 +332,26 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                        if (!is_oid_nil(rid) && (log_res = 
store->table_api.table_delete(tr, sysstats, rid)) != LOG_OK) {
                                                GDKfree(maxval);
                                                GDKfree(minval);
+                                               BBPunfix(cands->batCacheid);
                                                throw(SQL, "analyze", 
SQLSTATE(42000) "ANALYZE: failed%s", log_res == LOG_CONFLICT ? " due to 
conflict with another transaction" : "");
                                        }
                                        if ((log_res = 
store->table_api.table_insert(tr, sysstats, &c->base.id, 
&c->type.type->base.name, &width, &ts, samplesize ? &samplesize : &sz, &sz, 
&uniq, &nils, &minval, &maxval, &sorted, &revsorted)) != LOG_OK) {
                                                GDKfree(maxval);
                                                GDKfree(minval);
+                                               BBPunfix(cands->batCacheid);
                                                throw(SQL, "analyze", 
SQLSTATE(42000) "ANALYZE: failed%s", log_res == LOG_CONFLICT ? " due to 
conflict with another transaction" : "");
                                        }
                                        if (!isNew(c) && (log_res = 
sql_trans_add_dependency(tr, c->base.id, ddl)) != LOG_OK) {
                                                GDKfree(maxval);
                                                GDKfree(minval);
+                                               BBPunfix(cands->batCacheid);
                                                throw(SQL, "analyze", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                        }
                                }
+                               BBPunfix(cands->batCacheid);
                        }
                }
+       }
        GDKfree(maxval);
        GDKfree(minval);
        return MAL_SUCCEED;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to