exp_t * exp_list(exp_t *list, exp_t *exp) { ll_t *ll; if (list->ex_type != EX_LIST) { ll = ll_create(); if (ll == NULL) { log_die(EX_SOFTWARE, "exp_list: ll_create failed"); } if (LL_INSERT(ll, list) == -1) { log_die(EX_SOFTWARE, "exp_list: LL_INSERT failed"); } list = exp_create(EX_LIST, ll); } else { ll = list->ex_data; } if (LL_INSERT(ll, exp) == -1) { log_die(EX_SOFTWARE, "exp_list: LL_INSERT failed"); } return list; }
exp_t * exp_symbol(char *symbol) { exp_t *exp; /* * Check definitions */ exp = sht_lookup(exp_defs, symbol); if (exp) { free(symbol); return exp; } /* * Check symbols */ if (acl_symbol_lookup(symbol) == NULL) { acl_parser_error("unknown symbol \"%s\"", symbol); } return exp_create(EX_SYMBOL, symbol); }
sql_exp * exp_values(sql_allocator *sa, list *exps) { sql_exp *e = exp_create(sa, e_atom); e->card = CARD_MULTI; e->f = exps; return e; }
sql_exp * exp_atom(sql_allocator *sa, atom *a) { sql_exp *e = exp_create(sa, e_atom); e->card = CARD_ATOM; e->l = a; return e; }
sql_exp * exp_rel(sql_allocator *sa, sql_rel *rel) { sql_exp *e = exp_create(sa, e_psm); e->l = rel; e->flag = PSM_REL; return e; }
sql_exp * exp_return(sql_allocator *sa, sql_exp *val, int level) { sql_exp *e = exp_create(sa, e_psm); e->l = val; e->flag = PSM_RETURN + SET_PSM_LEVEL(level); return e; }
sql_exp * exp_var(sql_allocator *sa, char *name, sql_subtype *type, int level) { sql_exp *e = exp_create(sa, e_psm); e->name = name; e->tpe = *type; e->flag = PSM_VAR + SET_PSM_LEVEL(level); return e; }
sql_exp * exp_set(sql_allocator *sa, char *name, sql_exp *val, int level) { sql_exp *e = exp_create(sa, e_psm); e->name = name; e->l = val; e->flag = PSM_SET + SET_PSM_LEVEL(level); return e; }
sql_exp * exp_compare(sql_allocator *sa, sql_exp *l, sql_exp *r, int cmptype) { sql_exp *e = exp_create(sa, e_cmp); e->card = l->card; e->l = l; e->r = r; e->flag = cmptype; return e; }
sql_exp * exp_atom_ref(sql_allocator *sa, int i, sql_subtype *tpe) { sql_exp *e = exp_create(sa, e_atom); e->card = CARD_ATOM; e->flag = i; if (tpe) e->tpe = *tpe; return e; }
sql_exp * exp_while(sql_allocator *sa, sql_exp *cond, list *stmts) { sql_exp *e = exp_create(sa, e_psm); e->l = cond; e->r = stmts; e->flag = PSM_WHILE; return e; }
sql_exp * exp_param(sql_allocator *sa, char *name, sql_subtype *tpe, int frame) { sql_exp *e = exp_create(sa, e_atom); e->r = sa_strdup(sa, name); e->card = CARD_ATOM; e->flag = frame; if (tpe) e->tpe = *tpe; return e; }
sql_exp * exp_op( sql_allocator *sa, list *l, sql_subfunc *f ) { sql_exp *e = exp_create(sa, e_func); e->card = exps_card(l); if (!l || list_length(l) == 0) e->card = CARD_ATOM; /* unop returns a single atom */ e->l = l; e->f = f; return e; }
sql_exp * exp_if(sql_allocator *sa, sql_exp *cond, list *if_stmts, list *else_stmts) { sql_exp *e = exp_create(sa, e_psm); e->l = cond; e->r = if_stmts; e->f = else_stmts; e->flag = PSM_IF; return e; }
sql_exp * exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype) { sql_exp *e = exp_create(sa, e_cmp); e->card = l->card; e->l = l; e->r = r; assert( cmptype == cmp_in || cmptype == cmp_notin); e->flag = cmptype; return e; }
exp_t * exp_constant(var_type_t type, void *data, int flags) { var_t *v = NULL; v = var_create(type, NULL, data, flags); if (v == NULL) { log_die(EX_SOFTWARE, "exp_constant: var_create failed"); } return exp_create(EX_CONSTANT, v); }
exp_t * exp_parentheses(exp_t *exp) { exp_t *p; p = exp_create(EX_PARENTHESES, exp); if (p == NULL) { log_die(EX_SOFTWARE, "exp_parentheses: exp_create failed"); } return p; }
sql_exp * exp_filter(sql_allocator *sa, sql_exp *l, list *r, sql_subfunc *f, int anti) { sql_exp *e = exp_create(sa, e_cmp); e->card = l->card; e->l = l; e->r = r; e->f = f; e->flag = cmp_filter; if (anti) set_anti(e); return e; }
sql_exp * exp_aggr( sql_allocator *sa, list *l, sql_subaggr *a, int distinct, int no_nils, int card, int has_nils ) { sql_exp *e = exp_create(sa, e_aggr); e->card = card; e->l = l; e->f = a; if (distinct) set_distinct(e); if (no_nils) set_no_nil(e); if (!has_nils) set_has_no_nil(e); return e; }
sql_exp * exp_or(sql_allocator *sa, list *l, list *r) { sql_exp *f = NULL; sql_exp *e = exp_create(sa, e_cmp); f = l->h?l->h->data:r->h?r->h->data:NULL; e->card = l->h?exps_card(l):exps_card(r); e->l = l; e->r = r; assert(f); e->f = f; e->flag = cmp_or; return e; }
sql_exp * exp_convert(sql_allocator *sa, sql_exp *exp, sql_subtype *fromtype, sql_subtype *totype ) { sql_exp *e = exp_create(sa, e_convert); e->card = exp->card; e->l = exp; totype = dup_subtype(sa, totype); e->r = append(append(sa_list(sa), dup_subtype(sa, fromtype)),totype); e->tpe = *totype; if (exp->name) e->name = sa_strdup(sa, exp->name); if (exp->rname) e->rname = sa_strdup(sa, exp->rname); return e; }
exp_t * exp_ternary_cond(exp_t *condition, exp_t *cond_true, exp_t *cond_false) { exp_ternary_condition_t *etc; etc = (exp_ternary_condition_t *) malloc(sizeof (exp_ternary_condition_t)); if (etc == NULL) { log_sys_die(EX_OSERR, "exp_ternary_cond: malloc"); } etc->etc_condition = condition; etc->etc_true = cond_true; etc->etc_false = cond_false; return exp_create(EX_TERNARY_COND, etc); }
sql_exp * exp_column(sql_allocator *sa, char *rname, char *cname, sql_subtype *t, int card, int has_nils, int intern) { sql_exp *e = exp_create(sa, e_column); assert(cname); e->card = card; e->name = sa_strdup(sa, cname); e->l = (rname)?sa_strdup(sa, rname):NULL; e->r = sa_strdup(sa, cname); if (t) e->tpe = *t; if (!has_nils) set_has_no_nil(e); if (intern) set_intern(e); return e; }
sql_exp * exp_alias(sql_allocator *sa, char *arname, char *acname, char *org_rname, char *org_cname, sql_subtype *t, int card, int has_nils, int intern) { sql_exp *e = exp_create(sa, e_column); assert(acname && org_cname); e->card = card; e->rname = (arname)?sa_strdup(sa, arname):(org_rname)?sa_strdup(sa, org_rname):NULL; e->name = sa_strdup(sa, acname); e->l = (org_rname)?sa_strdup(sa, org_rname):NULL; e->r = sa_strdup(sa, org_cname); if (t) e->tpe = *t; if (!has_nils) set_has_no_nil(e); if (intern) set_intern(e); return e; }
exp_t * exp_function(char *id, exp_t *args) { exp_function_t *ef; if (acl_function_lookup(id) == NULL) { acl_parser_error("unknown function \"%s\"", id); } ef = (exp_function_t *) malloc(sizeof (exp_function_t)); if (ef == NULL) { log_sys_die(EX_OSERR, "exp_function: malloc"); } ef->ef_name = id; ef->ef_args = args; return exp_create(EX_FUNCTION, ef); }
exp_t * exp_operation(int operator, exp_t *op1, exp_t *op2) { exp_operation_t *eo; eo = (exp_operation_t *) malloc(sizeof (exp_operation_t)); if (eo == NULL) { log_sys_die(EX_OSERR, "exp_operation: malloc"); } eo->eo_operator = operator; eo->eo_operand[0] = op1; eo->eo_operand[1] = op2; if (operator == '=' && op1->ex_type != EX_VARIABLE) { acl_parser_error("bad use of '=' operator"); } return exp_create(EX_OPERATION, eo); }