Changeset: 43084b097365 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/43084b097365
Modified Files:
        sql/server/rel_exp.c
Branch: Dec2025
Log Message:

reset exp before mark free


diffs (154 lines):

diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -4026,6 +4026,50 @@ free_exps(allocator *sa, list *exps)
 
 
 static void
+sql_exp_reset(sql_exp *e)
+{
+       if (!e)
+               return;
+
+       e->l = e->r = e->f = e->p = NULL;
+       e->comment = NULL;
+
+       // Reset basic fields
+       e->type = -1;
+       e->alias.label = 0;
+       e->alias.name = NULL;
+       e->alias.rname = NULL;
+       e->flag = 0;
+       e->tmp = 0;
+       e->nid = 0;
+
+       // Reset bitfields
+       e->card = 0;
+       e->freevar = 0;
+       e->intern = 0;
+       e->selfref = 0;
+       e->anti = 0;
+       e->partitioning = 0;
+       e->ascending = 0;
+       e->nulls_last = 0;
+       e->zero_if_empty = 0;
+       e->distinct = 0;
+       e->semantics = 0;
+       e->any = 0;
+       e->need_no_nil = 0;
+       e->has_no_nil = 0;
+       e->unique = 0;
+       e->base = 0;
+       e->ref = 0;
+       e->used = 0;
+       e->symmetric = 0;
+
+       // Reset subtype
+       memset(&e->tpe, 0, sizeof(e->tpe));
+}
+
+
+static void
 _free_exp_internal(allocator *sa, sql_exp *e)
 {
        if (!e)
@@ -4034,7 +4078,7 @@ static void
                // free_props(sa, e->p);
                e->p = NULL;
        }
-       e->type = -1;
+       sql_exp_reset(e);
        ma_free(sa, e);
 }
 
@@ -4054,48 +4098,76 @@ free_exp(allocator *sa, sql_exp *e)
                case e_cmp:
                        if (e->flag < cmp_filter) {
                                // l and r are exp
-                               if (e->l)
+                               if (e->l) {
                                        free_exp(sa, e->l);
-                               if (e->r)
+                                       e->l = NULL;
+                               }
+                               if (e->r) {
                                        free_exp(sa, e->r);
-                               if (e->f)
+                                       e->r = NULL;
+                               }
+                               if (e->f) {
                                        free_exp(sa, e->f);
+                                       e->f = NULL;
+                               }
                        }
                        if (e->flag == cmp_filter) {
                                // l and r are list
-                               if (e->l)
+                               if (e->l) {
                                        free_exps(sa, e->l);
-                               if (e->r)
+                                       e->l = NULL;
+                               }
+                               if (e->r) {
                                        free_exps(sa, e->r);
+                                       e->r = NULL;
+                               }
                        }
                        break;
                case e_func:
                case e_aggr:
-                       if (e->l)
+                       if (e->l) {
                                free_exps(sa, e->l);
+                               e->l = NULL;
+                       }
                        break;
                case e_convert:
-                       if (e->l)
+                       if (e->l) {
                                free_exp(sa, e->l);
+                               e->l = NULL;
+                       }
                        break;
                case e_psm:
-                       if ((e->flag & PSM_SET) && e->l)
+                       if ((e->flag & PSM_SET) && e->l) {
                                free_exp(sa, e->l);
-                       if ((e->flag & PSM_RETURN) && e->l)
+                               e->l = NULL;
+                       }
+                       if ((e->flag & PSM_RETURN) && e->l) {
                                free_exp(sa, e->l);
+                               e->l = NULL;
+                       }
                        if (e->flag & PSM_WHILE) {
-                               if (e->l)
+                               if (e->l) {
                                        free_exp(sa, e->l);
-                               if (e->r)
+                                       e->l = NULL;
+                               }
+                               if (e->r) {
                                        free_exps(sa, e->r);
+                                       e->r = NULL;
+                               }
                        }
                        if (e->flag & PSM_IF) {
-                               if (e->l)
+                               if (e->l) {
                                        free_exp(sa, e->l);
-                               if (e->r)
+                                       e->l = NULL;
+                               }
+                               if (e->r) {
                                        free_exps(sa, e->r);
-                               if (e->f)
+                                       e->r = NULL;
+                               }
+                               if (e->f) {
                                        free_exps(sa, e->f);
+                                       e->f = NULL;
+                               }
                        }
                        break;
                case e_column:
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to