Changeset: 09455e035ee4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/09455e035ee4
Modified Files:
sql/server/rel_select.c
Branch: Dec2025
Log Message:
Format code
diffs (286 lines):
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1541,34 +1541,37 @@ rel_column_ref(sql_query *query, sql_rel
sql_rel *inner = rel?*rel:NULL, *outer = NULL;
int used_lower_after_processed = 0;
- assert((column_r->token == SQL_COLUMN || column_r->token == SQL_IDENT)
&& column_r->type == type_list);
+ assert((column_r->token == SQL_COLUMN || column_r->token == SQL_IDENT)
+ && column_r->type == type_list);
+
l = column_r->data.lval;
if (dlist_length(l) == 1) {
const char *name = l->h->data.sval;
if (!name)
return NULL;
-
if (!exp && inner)
if (!(exp = rel_bind_column(sql, inner, name, f, 0)) &&
sql->session->status == -ERR_AMBIGUOUS)
return NULL;
if (!exp && inner && ((is_sql_aggr(f) && (is_groupby(inner->op)
|| is_select(inner->op))) ||
- (is_groupby(inner->op) &&
inner->flag))) {
+
(is_groupby(inner->op) && inner->flag))) {
/* if inner is selection, ie having clause, get the
left relation to reach group by */
sql_rel *gp = inner;
while (gp && is_select(gp->op))
gp = gp->l;
- if (gp && !is_basetable(gp->op) && gp->l && !(exp =
rel_bind_column(sql, gp->l, name, f, 0)) && sql->session->status ==
-ERR_AMBIGUOUS)
+ if (gp && !is_basetable(gp->op) && gp->l && !(exp =
rel_bind_column(sql, gp->l, name, f, 0)) &&
+ sql->session->status == -ERR_AMBIGUOUS)
return NULL;
}
if (!exp && query && query_has_outer(query)) {
int i;
-
- for (i=query_has_outer(query)-1; i>= 0 && !exp &&
(outer = query_fetch_outer(query,i)); i--) {
- if (!(exp = rel_bind_column(sql, outer, name,
f, 0)) && sql->session->status == -ERR_AMBIGUOUS)
+ for (i = query_has_outer(query)-1; i>= 0 && !exp &&
(outer = query_fetch_outer(query,i)); i--) {
+ if (!(exp = rel_bind_column(sql, outer, name,
f, 0)) &&
+ sql->session->status == -ERR_AMBIGUOUS)
return NULL;
if (!exp && is_groupby(outer->op)) {
- if (!(exp = rel_bind_column(sql,
outer->l, name, f, 0)) && sql->session->status == -ERR_AMBIGUOUS)
+ if (!(exp = rel_bind_column(sql,
outer->l, name, f, 0)) &&
+ sql->session->status ==
-ERR_AMBIGUOUS)
return NULL;
else
used_lower_after_processed =
is_processed(outer);
@@ -1578,16 +1581,24 @@ rel_column_ref(sql_query *query, sql_rel
if (exp)
break;
}
- if (exp && exp->card != CARD_AGGR &&
is_groupby(outer->op) && !is_sql_aggr(f) && rel_find_exp(outer->l, exp))
- return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results
without an aggregate function", name);
+ if (exp && exp->card != CARD_AGGR &&
is_groupby(outer->op) &&
+ !is_sql_aggr(f) && rel_find_exp(outer->l, exp))
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000)
+ "SELECT:
cannot use non GROUP BY column '%s' in query"
+ " results
without an aggregate function", name);
if (exp && outer && outer->card <= CARD_AGGR &&
exp->card > CARD_AGGR && !is_sql_aggr(f))
- return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results
without an aggregate function", name);
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000)
+ "SELECT:
cannot use non GROUP BY column '%s' in query"
+ " results
without an aggregate function", name);
if (exp && outer && !is_sql_aggr(f) &&
!is_sql_aggr(query_fetch_outer_state(query, i))) {
if (used_lower_after_processed ||
query_outer_used_exp( query, i, exp, f)) {
sql_exp *lu =
used_lower_after_processed?exp:query_outer_last_used(query, i);
if (exp_name(lu) && exp_relname(lu) &&
!has_label(lu))
- return sql_error(sql,
ERR_GROUPBY, SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\"
from outer query", exp_relname(lu), exp_name(lu));
- return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: subquery uses ungrouped column from outer query");
+ return sql_error(sql,
ERR_GROUPBY, SQLSTATE(42000)
+
"SELECT: subquery uses ungrouped column \"%s.%s\""
+
" from outer query", exp_relname(lu), exp_name(lu));
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000)
+
"SELECT: subquery uses ungrouped column from outer query");
}
}
if (exp) {
@@ -1607,12 +1618,11 @@ rel_column_ref(sql_query *query, sql_rel
if (exp && outer && (is_select(outer->op) ||
is_join(outer->op)))
set_dependent_(outer);
}
-
/* some views are just in the stack, like before and after
updates views */
if (rel && sql->use_views) {
sql_rel *v = NULL;
- int dup = stack_find_rel_view_projection_columns(sql,
name, &v); /* trigger views are basetables relations, so those may conflict */
-
+ /* trigger views are basetables relations, so those may
conflict */
+ int dup = stack_find_rel_view_projection_columns(sql,
name, &v);
if (dup < 0 || (v && exp && *rel && is_base(v->op) && v
!= *rel)) /* comparing pointers, ugh */
return sql_error(sql, ERR_AMBIGUOUS,
SQLSTATE(42000) "SELECT: identifier '%s' ambiguous", name);
if (v && !exp) {
@@ -1625,18 +1635,24 @@ rel_column_ref(sql_query *query, sql_rel
}
if (!exp) /* If no column was found, try a variable or
parameter */
exp = rel_exp_variable_on_scope(sql, NULL, name);
-
if (!exp) {
- if (inner && !is_sql_aggr(f) && is_groupby(inner->op)
&& inner->l && (exp = rel_bind_column(sql, inner->l, name, f, 0)))
- return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results
without an aggregate function", name);
- }
-
+ if (inner && !is_sql_aggr(f) && is_groupby(inner->op)
&& inner->l &&
+ (exp = rel_bind_column(sql, inner->l, name, f,
0)))
+ return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(42000)
+ "SELECT:
cannot use non GROUP BY column '%s' in query"
+ " results
without an aggregate function", name);
+ }
if (!exp)
- return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000)
"SELECT: identifier '%s' unknown", name);
- if (exp && inner && inner->card <= CARD_AGGR && exp->card >
CARD_AGGR && (is_sql_sel(f) || is_sql_having(f)) && (!is_sql_aggr(f) &&
!(inner->flag)))
- return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000)
"SELECT: cannot use non GROUP BY column '%s' in query results without an
aggregate function", name);
+ return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000)
+ "SELECT: identifier
'%s' unknown", name);
+ if (exp && inner && inner->card <= CARD_AGGR && exp->card >
CARD_AGGR &&
+ (is_sql_sel(f) || is_sql_having(f)) && (!is_sql_aggr(f)
&& !(inner->flag)))
+ return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000)
+ "SELECT: cannot use
non GROUP BY column '%s' in query"
+ " results without an
aggregate function", name);
if (exp && inner && is_groupby(inner->op) && !is_sql_aggr(f) &&
!is_freevar(exp) && !inner->flag)
exp = rel_groupby_add_aggr(sql, inner, exp);
+
} else if (dlist_length(l) == 2 || dlist_length(l) == 3) {
const char *sname = NULL;
const char *tname = l->h->data.sval;
@@ -1650,24 +1666,29 @@ rel_column_ref(sql_query *query, sql_rel
return NULL;
if (!exp && rel && inner)
- if (!(exp = rel_bind_column3(sql, inner, sname, tname,
cname, f)) && sql->session->status == -ERR_AMBIGUOUS)
+ if (!(exp = rel_bind_column3(sql, inner, sname, tname,
cname, f)) &&
+ sql->session->status == -ERR_AMBIGUOUS)
return NULL;
if (!exp && inner && is_sql_aggr(f) && (is_groupby(inner->op)
|| is_select(inner->op))) {
/* if inner is selection, ie having clause, get the
left relation to reach group by */
sql_rel *gp = inner;
while (gp && is_select(gp->op))
gp = gp->l;
- if (gp && !is_basetable(gp->op) && gp->l && !(exp =
rel_bind_column3(sql, gp->l, sname, tname, cname, f)) && sql->session->status
== -ERR_AMBIGUOUS)
+ if (gp && !is_basetable(gp->op) && gp->l &&
+ !(exp = rel_bind_column3(sql, gp->l, sname,
tname, cname, f)) &&
+ sql->session->status == -ERR_AMBIGUOUS)
return NULL;
}
if (!exp && query && query_has_outer(query)) {
int i;
for (i=query_has_outer(query)-1; i>= 0 && !exp &&
(outer = query_fetch_outer(query,i)); i--) {
- if (!(exp = rel_bind_column3(sql, outer, sname,
tname, cname, f | sql_outer)) && sql->session->status == -ERR_AMBIGUOUS)
+ if (!(exp = rel_bind_column3(sql, outer, sname,
tname, cname, f | sql_outer)) &&
+ sql->session->status == -ERR_AMBIGUOUS)
return NULL;
if (!exp && is_groupby(outer->op)) {
- if (!(exp = rel_bind_column3(sql,
outer->l, sname, tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS)
+ if (!(exp = rel_bind_column3(sql,
outer->l, sname, tname, cname, f)) &&
+ sql->session->status ==
-ERR_AMBIGUOUS)
return NULL;
else
used_lower_after_processed =
is_processed(outer);
@@ -1677,16 +1698,24 @@ rel_column_ref(sql_query *query, sql_rel
if (exp)
break;
}
- if (exp && exp->card != CARD_AGGR &&
is_groupby(outer->op) && !is_sql_aggr(f) && rel_find_exp(outer->l, exp))
- return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query
results without an aggregate function", tname, cname);
+ if (exp && exp->card != CARD_AGGR &&
is_groupby(outer->op) &&
+ !is_sql_aggr(f) && rel_find_exp(outer->l, exp))
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000)
+ "SELECT:
cannot use non GROUP BY column '%s.%s' in"
+ " query
results without an aggregate function", tname, cname);
if (exp && outer && outer->card <= CARD_AGGR &&
exp->card > CARD_AGGR && !is_sql_aggr(f))
- return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query
results without an aggregate function", tname, cname);
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000)
+ "SELECT:
cannot use non GROUP BY column '%s.%s'"
+ " in query
results without an aggregate function", tname, cname);
if (exp && outer && !is_sql_aggr(f)) {
if (used_lower_after_processed ||
query_outer_used_exp( query, i, exp, f)) {
sql_exp *lu =
used_lower_after_processed?exp:query_outer_last_used(query, i);
if (exp_name(lu) && exp_relname(lu) &&
!has_label(lu))
- return sql_error(sql,
ERR_GROUPBY, SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\"
from outer query", exp_relname(lu), exp_name(lu));
- return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: subquery uses ungrouped column from outer query");
+ return sql_error(sql,
ERR_GROUPBY, SQLSTATE(42000)
+
"SELECT: subquery uses ungrouped column"
+
" \"%s.%s\" from outer query", exp_relname(lu), exp_name(lu));
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000)
+
"SELECT: subquery uses ungrouped column from outer query");
}
}
if (exp) {
@@ -1710,31 +1739,37 @@ rel_column_ref(sql_query *query, sql_rel
/* some views are just in the stack, like before and after
updates views */
if (rel && sql->use_views) {
sql_rel *v = stack_find_rel_view(sql, tname);
-
- if (v && exp && *rel && is_base(v->op) && v != *rel) /*
trigger views are basetables relations, so those may conflict */
- return sql_error(sql, ERR_AMBIGUOUS,
SQLSTATE(42000) "SELECT: identifier '%s.%s' ambiguous", tname, cname);
+ /* trigger views are basetables relations, so those may
conflict */
+ if (v && exp && *rel && is_base(v->op) && v != *rel)
+ return sql_error(sql, ERR_AMBIGUOUS,
SQLSTATE(42000)
+ "SELECT:
identifier '%s.%s' ambiguous", tname, cname);
if (v && !exp) {
if (*rel)
*rel = rel_crossproduct(sql->sa, *rel,
rel_dup(v), op_join);
else
*rel = rel_dup(v);
- if (!(exp = rel_bind_column3(sql, *rel, sname,
tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS)
+ if (!(exp = rel_bind_column3(sql, *rel, sname,
tname, cname, f)) &&
+ sql->session->status == -ERR_AMBIGUOUS)
return NULL;
}
}
+
if (!exp) { /* If no column was found, try a global variable */
sql_var *var = NULL;
sql_subtype *tpe = NULL;
int level = 0;
sql_arg *a = NULL;
-
- if (find_variable_on_scope(sql, tname, cname, &var, &a,
&tpe, &level, "SELECT")) { /* search schema with table name, ugh */
+ /* search schema with table name, ugh */
+ if (find_variable_on_scope(sql, tname, cname, &var, &a,
&tpe, &level, "SELECT")) {
assert(level == 0);
- exp = exp_param_or_declared(sql->sa,
ma_strdup(sql->sa, var->sname), ma_strdup(sql->sa, var->name), &(var->var.tpe),
0);
+ exp = exp_param_or_declared(sql->sa,
ma_strdup(sql->sa, var->sname),
+
ma_strdup(sql->sa, var->name), &(var->var.tpe), 0);
}
}
+
if (!exp) {
- if (inner && !is_sql_aggr(f) && is_groupby(inner->op)
&& inner->l && (exp = rel_bind_column3(sql, inner->l, sname, tname, cname, f)))
{
+ if (inner && !is_sql_aggr(f) && is_groupby(inner->op)
&& inner->l &&
+ (exp = rel_bind_column3(sql, inner->l, sname,
tname, cname, f))) {
if (group_by_pk_project_uk_cond(sql, inner,
exp, sname, tname)) {
/* SQL23 feature: very special case
where primary key is used in GROUP BY expression and
* unique key is in the project list or
ORDER BY clause */
@@ -1742,27 +1777,40 @@ rel_column_ref(sql_query *query, sql_rel
sql->errstr[0] = 0;
exp->card = CARD_AGGR;
list_append(inner->exps, exp);
+ } else {
+ return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(42000)
+
"SELECT: cannot use non GROUP BY column '%s.%s'"
+ " in
query results without an aggregate function", tname, cname);
}
- else
- return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query
results without an aggregate function", tname, cname);
}
}
-
if (!exp)
return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S22)
"SELECT: no such column '%s.%s'", tname, cname);
- if (exp && inner && inner->card <= CARD_AGGR && exp->card >
CARD_AGGR && (is_sql_sel(f) || is_sql_having(f)) && !is_sql_aggr(f))
- return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000)
"SELECT: cannot use non GROUP BY column '%s.%s' in query results without an
aggregate function", tname, cname);
+ if (exp && inner && inner->card <= CARD_AGGR && exp->card >
CARD_AGGR &&
+ (is_sql_sel(f) || is_sql_having(f)) && !is_sql_aggr(f))
+ return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000)
+ "SELECT: cannot use
non GROUP BY column '%s.%s' in query"
+ " results without an
aggregate function", tname, cname);
if (exp && inner && is_groupby(inner->op) && !is_sql_aggr(f) &&
!is_freevar(exp))
exp = rel_groupby_add_aggr(sql, inner, exp);
+
} else if (dlist_length(l) > 3) {
return sql_error(sql, 02, SQLSTATE(42000) "cross-database
references are not implemented");
}
+
if (exp && !exp_is_atom(exp) && rel && !outer) {
if (query->last_exp && query->last_rel == *rel &&
!is_sql_aggr(query->last_state) && is_sql_aggr(f)) {
- if (!is_groupby(query->last_rel->op) ||
list_empty(query->last_rel->r) || !exps_find_exp(query->last_rel->r,
query->last_exp)) {
+ if (!is_groupby(query->last_rel->op) ||
+ list_empty(query->last_rel->r) ||
+ !exps_find_exp(query->last_rel->r,
query->last_exp)) {
if (exp_relname(query->last_exp) &&
exp_name(query->last_exp) && !has_label(query->last_exp))
- return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query
results without an aggregate function", exp_relname(query->last_exp),
exp_name(query->last_exp));
- return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results
without an aggregate function");
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000)
+
"SELECT: cannot use non GROUP BY column '%s.%s'"
+ " in
query results without an aggregate function",
+
exp_relname(query->last_exp), exp_name(query->last_exp));
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000)
+ "SELECT:
cannot use non GROUP BY column in query"
+ " results
without an aggregate function");
}
}
query->prev = query->last_exp;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]