Changeset: d12a12f4c5b2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d12a12f4c5b2
Modified Files:
sql/server/rel_select.c
sql/test/nested/Tests/webclicks.test.in
Branch: nested
Log Message:
small change in lookup of 4 level naming
diffs (141 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
@@ -1685,16 +1685,17 @@ set_dependent_( sql_rel *r)
set_dependent(r);
}
-static
-sql_rel* find_union(visitor *v, sql_rel *rel) {
+static sql_rel*
+find_union(visitor *v, sql_rel *rel) {
if (rel->op == op_union || rel->op == op_munion)
v->data = rel;
return rel;
}
-static inline
-bool group_by_pk_project_uk_cond(mvc* sql, sql_rel* inner, sql_exp* exp,const
char* sname, const char* tname) {
- sql_table* t = find_table_or_view_on_scope(sql, NULL, sname, tname,
"SELECT", false);
+static inline bool
+group_by_pk_project_uk_cond(mvc* sql, sql_rel* inner, sql_exp* exp, sql_alias
*sa, const char* tname)
+{
+ sql_table* t = find_table_or_view_on_scope(sql, NULL, sa?sa->name:NULL,
tname, "SELECT", false);
bool allow = false;
if (t) {
sql_idx* pki = NULL;
@@ -1854,20 +1855,16 @@ rel_column_ref(sql_query *query, sql_rel
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;
- const char *cname = l->h->next->data.sval;
- sql_alias *ta = a_create(sql->sa, tname);
- if (dlist_length(l) == 3) {
- sname = l->h->data.sval;
- tname = l->h->next->data.sval;
- cname = l->h->next->next->data.sval;
- sql_alias *na = a_create(sql->sa, tname);
- na->parent = ta;
- ta = na;
- }
- if (!cname)
+ } else if (dlist_length(l) >= 2) {
+ dnode *dn = l->h;
+ sql_alias *ta = NULL;
+ for(; dn->next; dn = dn->next) {
+ sql_alias *nta = a_create(sql->sa, dn->data.sval);
+ nta->parent = ta;
+ ta = nta;
+ }
+ const char *cname = dn->data.sval;
+ if (!cname || !ta)
return NULL;
if (!exp && rel && inner)
@@ -1899,9 +1896,9 @@ rel_column_ref(sql_query *query, sql_rel
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);
+ return sql_error(sql, ERR_GROUPBY,
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query
results without an aggregate function", ta?ta->name:"", 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", ta?ta->name:"", 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);
@@ -1928,11 +1925,11 @@ 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 (rel && sql->use_views && ta) {
+ sql_rel *v = stack_find_rel_view(sql, ta->name);
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);
+ return sql_error(sql, ERR_AMBIGUOUS,
SQLSTATE(42000) "SELECT: identifier '%s.%s' ambiguous", ta->name, cname);
if (v && !exp) {
if (*rel)
*rel = rel_crossproduct(sql->sa, *rel,
rel_dup(v), op_join);
@@ -1942,36 +1939,36 @@ rel_column_ref(sql_query *query, sql_rel
return NULL;
}
}
- if (!exp) { /* If no column was found, try a global variable */
+ if (!exp && ta) { /* 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 */
+ if (find_variable_on_scope(sql, ta->name, cname, &var,
&a, &tpe, &level, "SELECT")) { /* search schema with table name, ugh */
assert(level == 0);
exp = exp_param_or_declared(sql->sa,
sa_strdup(sql->sa, var->sname), sa_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_column2(sql, inner->l, ta, cname, f))) {
- if (group_by_pk_project_uk_cond(sql, inner,
exp, sname, tname)) {
+ if (inner && !is_sql_aggr(f) && is_groupby(inner->op)
&& inner->l && (exp = rel_bind_column2(sql, inner->l, ta, cname, f)) && ta) {
+ if (group_by_pk_project_uk_cond(sql, inner,
exp, ta?ta->parent:NULL, ta->name)) {
/* 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 */
sql->session->status = 0;
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", ta->name, 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);
+ return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S22)
"SELECT: no such column '%s.%s'", ta?ta->name:"", 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);
+ return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000)
"SELECT: cannot use non GROUP BY column '%s.%s' in query results without an
aggregate function", ta?ta->name:"", 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) {
diff --git a/sql/test/nested/Tests/webclicks.test.in
b/sql/test/nested/Tests/webclicks.test.in
--- a/sql/test/nested/Tests/webclicks.test.in
+++ b/sql/test/nested/Tests/webclicks.test.in
@@ -160,7 +160,7 @@ SELECT
CASE WHEN u.element.key = 'customerid' THEN u.element.value END AS
customerid,
CASE WHEN eal.element.key = 'brand' THEN eal.element.value END AS
ecom_attributes_brand
FROM events,
- unnest(location.list),
+ unnest(location.list) as l,
unnest(ecommerce.objects.list) as eol,
unnest("user".list) as u,
unnest(eol.element.attributes.list) as eal
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]