Changeset: 63e038204127 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/63e038204127
Modified Files:
        sql/server/rel_select.c
Branch: literal_features
Log Message:

rudimentary check for pk-uk pair in group by


diffs (57 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
@@ -1414,8 +1414,51 @@ rel_column_ref(sql_query *query, sql_rel
                        }
                }
                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)))
-                               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 (inner && !is_sql_aggr(f) && is_groupby(inner->op) 
&& inner->l && (exp = rel_bind_column3(sql, inner->l, sname, tname, cname, f))) 
{
+                               sql_table* t = find_table_or_view_on_scope(sql, 
NULL, sname, tname, "SELECT", false);
+                               bool check_pk_with_uk = false;
+                               if (t) {
+                                       sql_idx* pki = NULL;
+                                       sql_idx* uki = NULL;
+                                       for (node * n = ol_first_node(t->idxs); 
n; n = n->next) {
+                                               sql_idx *i = n->data;
+
+                                               switch (i->key->type) {
+                                               case pkey:
+                                                       pki = i;
+                                                       continue;
+                                               case ukey:
+                                               case unndkey:
+                                                       uki = i;
+                                                       continue;
+                                               default:
+                                                       continue;
+                                               }
+                                       }
+
+                                       if (uki && pki) {
+                                               if (pki->columns->cnt == 1 && 
uki->columns->cnt == 1 && ((list*) inner->r)->cnt == 1) {
+                                                       sql_column* pkc = 
((sql_kc *)pki->columns->h->data)->c;
+                                                       sql_column* ukc = 
((sql_kc *)uki->columns->h->data)->c;
+                                                       (void) pkc;
+                                                       (void) ukc;
+                                                       sql_exp* gbe = ((list*) 
inner->r)->h->data;
+                                                       assert(gbe->type == 
e_column);
+                                                       if 
(strcmp(gbe->alias.name, pkc->base.name) == 0 && strcmp(exp->alias.name, 
ukc->base.name) == 0)
+                                                               
check_pk_with_uk = true;
+                                               }
+                                       }
+                               }
+
+                               if (check_pk_with_uk) {
+                                       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", tname, cname);
+                       }
                }
 
                if (!exp)
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to