clean up codes
This commit is contained in:
parent
b3603c776d
commit
6b9df6a8d5
2 changed files with 28 additions and 22 deletions
33
createas.c
33
createas.c
|
|
@ -465,7 +465,7 @@ makeIvmAggColumn(ParseState *pstate, Aggref *aggref, char *resname, AttrNumber *
|
||||||
|
|
||||||
/* Make a Func with a dummy arg, and then override this by the original agg's args. */
|
/* Make a Func with a dummy arg, and then override this by the original agg's args. */
|
||||||
node = ParseFuncOrColumn(pstate, fn->funcname, list_make1(dmy_arg), NULL, fn, false, -1);
|
node = ParseFuncOrColumn(pstate, fn->funcname, list_make1(dmy_arg), NULL, fn, false, -1);
|
||||||
((Aggref *)node)->args = aggref->args;
|
((Aggref *) node)->args = aggref->args;
|
||||||
|
|
||||||
tle_count = makeTargetEntry((Expr *) node,
|
tle_count = makeTargetEntry((Expr *) node,
|
||||||
*next_resno,
|
*next_resno,
|
||||||
|
|
@ -501,7 +501,7 @@ makeIvmAggColumn(ParseState *pstate, Aggref *aggref, char *resname, AttrNumber *
|
||||||
|
|
||||||
/* Make a Func with dummy args, and then override this by the original agg's args. */
|
/* Make a Func with dummy args, and then override this by the original agg's args. */
|
||||||
node = ParseFuncOrColumn(pstate, fn->funcname, dmy_args, NULL, fn, false, -1);
|
node = ParseFuncOrColumn(pstate, fn->funcname, dmy_args, NULL, fn, false, -1);
|
||||||
((Aggref *)node)->args = aggref->args;
|
((Aggref *) node)->args = aggref->args;
|
||||||
|
|
||||||
tle_count = makeTargetEntry((Expr *) node,
|
tle_count = makeTargetEntry((Expr *) node,
|
||||||
*next_resno,
|
*next_resno,
|
||||||
|
|
@ -572,7 +572,7 @@ CreateIvmTriggersOnBaseTablesRecurse(Query *qry, Node *node, Oid matviewOid,
|
||||||
Query *query = (Query *) node;
|
Query *query = (Query *) node;
|
||||||
ListCell *lc;
|
ListCell *lc;
|
||||||
|
|
||||||
CreateIvmTriggersOnBaseTablesRecurse(qry, (Node *)query->jointree, matviewOid, relids, ex_lock);
|
CreateIvmTriggersOnBaseTablesRecurse(qry, (Node *) query->jointree, matviewOid, relids, ex_lock);
|
||||||
foreach(lc, query->cteList)
|
foreach(lc, query->cteList)
|
||||||
{
|
{
|
||||||
CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc);
|
CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc);
|
||||||
|
|
@ -604,7 +604,7 @@ CreateIvmTriggersOnBaseTablesRecurse(Query *qry, Node *node, Oid matviewOid,
|
||||||
{
|
{
|
||||||
Query *subquery = rte->subquery;
|
Query *subquery = rte->subquery;
|
||||||
Assert(rte->subquery != NULL);
|
Assert(rte->subquery != NULL);
|
||||||
CreateIvmTriggersOnBaseTablesRecurse(subquery, (Node *)subquery, matviewOid, relids, ex_lock);
|
CreateIvmTriggersOnBaseTablesRecurse(subquery, (Node *) subquery, matviewOid, relids, ex_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -767,7 +767,7 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context)
|
||||||
{
|
{
|
||||||
case T_Query:
|
case T_Query:
|
||||||
{
|
{
|
||||||
Query *qry = (Query *)node;
|
Query *qry = (Query *) node;
|
||||||
ListCell *lc;
|
ListCell *lc;
|
||||||
List *vars;
|
List *vars;
|
||||||
|
|
||||||
|
|
@ -823,7 +823,7 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context)
|
||||||
if (IsA(lfirst(lc), Var))
|
if (IsA(lfirst(lc), Var))
|
||||||
{
|
{
|
||||||
Var *var = (Var *) lfirst(lc);
|
Var *var = (Var *) lfirst(lc);
|
||||||
/* if system column, return error */
|
/* if the view has a system column, raise an error */
|
||||||
if (var->varattno < 0)
|
if (var->varattno < 0)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
|
@ -831,7 +831,7 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if type in the top target list had an equality operator */
|
/* check that each type in the target list has an equality operator */
|
||||||
if (context->sublevels_up == 0)
|
if (context->sublevels_up == 0)
|
||||||
{
|
{
|
||||||
foreach(lc, qry->targetList)
|
foreach(lc, qry->targetList)
|
||||||
|
|
@ -902,6 +902,7 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
errmsg("VALUES is not supported on incrementally maintainable materialized view")));
|
errmsg("VALUES is not supported on incrementally maintainable materialized view")));
|
||||||
|
|
||||||
if (rte->relkind == RELKIND_RELATION && isImmv(rte->relid))
|
if (rte->relkind == RELKIND_RELATION && isImmv(rte->relid))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
|
@ -920,9 +921,11 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context)
|
||||||
/*
|
/*
|
||||||
* additional restriction checks for exists subquery
|
* additional restriction checks for exists subquery
|
||||||
*
|
*
|
||||||
* If the query has any EXISTS clauses and columns in them refer to
|
* If the query has an EXISTS subquery and columns of a table in
|
||||||
* columns in tables in the output query, those columns must be
|
* the outer query are used in the EXISTS subquery, those columns
|
||||||
* included in the target list.
|
* must be included in the target list. These columns are required
|
||||||
|
* to identify tuples in the view to be affected by modification
|
||||||
|
* of tables in the EXISTS subquery.
|
||||||
*/
|
*/
|
||||||
if (context->exists_qual_vars != NIL && context->sublevels_up == 0)
|
if (context->exists_qual_vars != NIL && context->sublevels_up == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -986,12 +989,13 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context)
|
||||||
}
|
}
|
||||||
case T_TargetEntry:
|
case T_TargetEntry:
|
||||||
{
|
{
|
||||||
TargetEntry *tle = (TargetEntry *)node;
|
TargetEntry *tle = (TargetEntry *) node;
|
||||||
|
|
||||||
if (isIvmName(tle->resname))
|
if (isIvmName(tle->resname))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
errmsg("column name %s is not supported on incrementally maintainable materialized view", tle->resname)));
|
errmsg("column name %s is not supported on incrementally maintainable materialized view", tle->resname)));
|
||||||
|
|
||||||
if (context->has_agg && !IsA(tle->expr, Aggref) && contain_aggs_of_level((Node *) tle->expr, 0))
|
if (context->has_agg && !IsA(tle->expr, Aggref) && contain_aggs_of_level((Node *) tle->expr, 0))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
|
@ -1015,7 +1019,7 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context)
|
||||||
}
|
}
|
||||||
case T_JoinExpr:
|
case T_JoinExpr:
|
||||||
{
|
{
|
||||||
JoinExpr *joinexpr = (JoinExpr *)node;
|
JoinExpr *joinexpr = (JoinExpr *) node;
|
||||||
|
|
||||||
if (joinexpr->jointype > JOIN_INNER)
|
if (joinexpr->jointype > JOIN_INNER)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
|
|
@ -1117,7 +1121,8 @@ check_ivm_restriction_walker(Node *node, check_ivm_restriction_context *context)
|
||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
errmsg("nested sublink is not supported on incrementally maintainable materialized view")));
|
errmsg("nested sublink is not supported on incrementally maintainable materialized view")));
|
||||||
|
|
||||||
subselect = (Query *)sublink->subselect;
|
subselect = (Query *) sublink->subselect;
|
||||||
|
|
||||||
/* raise ERROR if the sublink has CTE */
|
/* raise ERROR if the sublink has CTE */
|
||||||
if (subselect->cteList)
|
if (subselect->cteList)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
|
|
@ -1647,7 +1652,7 @@ get_primary_key_attnos_from_query(Query *query, List **constraintList)
|
||||||
i = 1;
|
i = 1;
|
||||||
foreach(lc, key_attnos_list)
|
foreach(lc, key_attnos_list)
|
||||||
{
|
{
|
||||||
Bitmapset *bms = (Bitmapset *)lfirst(lc);
|
Bitmapset *bms = (Bitmapset *) lfirst(lc);
|
||||||
if (!bms_is_empty(bms) && bms_is_member(i, rels_in_from))
|
if (!bms_is_empty(bms) && bms_is_member(i, rels_in_from))
|
||||||
return NULL;
|
return NULL;
|
||||||
i++;
|
i++;
|
||||||
|
|
|
||||||
15
matview.c
15
matview.c
|
|
@ -1606,7 +1606,8 @@ rewrite_exists_subquery_walker(Query *query, Node *node, int *count)
|
||||||
if (fromexpr->quals != NULL)
|
if (fromexpr->quals != NULL)
|
||||||
{
|
{
|
||||||
query = rewrite_exists_subquery_walker(query, fromexpr->quals, count);
|
query = rewrite_exists_subquery_walker(query, fromexpr->quals, count);
|
||||||
/* drop subquery in WHERE clause */
|
|
||||||
|
/* drop WHERE clause when it has only one EXISTS */
|
||||||
if (IsA(fromexpr->quals, SubLink))
|
if (IsA(fromexpr->quals, SubLink))
|
||||||
fromexpr->quals = NULL;
|
fromexpr->quals = NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -1691,7 +1692,7 @@ rewrite_exists_subquery_walker(Query *query, Node *node, int *count)
|
||||||
/* assume the new RTE is at the end */
|
/* assume the new RTE is at the end */
|
||||||
rtr = makeNode(RangeTblRef);
|
rtr = makeNode(RangeTblRef);
|
||||||
rtr->rtindex = list_length(query->rtable);
|
rtr->rtindex = list_length(query->rtable);
|
||||||
((FromExpr *)query->jointree)->fromlist = lappend(((FromExpr *)query->jointree)->fromlist, rtr);
|
((FromExpr *) query->jointree)->fromlist = lappend(((FromExpr *) query->jointree)->fromlist, rtr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EXISTS condition is converted to HAVING count(*) > 0.
|
* EXISTS condition is converted to HAVING count(*) > 0.
|
||||||
|
|
@ -1699,13 +1700,13 @@ rewrite_exists_subquery_walker(Query *query, Node *node, int *count)
|
||||||
*/
|
*/
|
||||||
opId = OpernameGetOprid(list_make2(makeString("pg_catalog"), makeString(">")), INT8OID, INT4OID);
|
opId = OpernameGetOprid(list_make2(makeString("pg_catalog"), makeString(">")), INT8OID, INT4OID);
|
||||||
opexpr = make_opclause(opId, BOOLOID, false,
|
opexpr = make_opclause(opId, BOOLOID, false,
|
||||||
(Expr *)fn_node,
|
(Expr *) fn_node,
|
||||||
(Expr *)makeConst(INT4OID, -1, InvalidOid, sizeof(int32), Int32GetDatum(0), false, true),
|
(Expr *) makeConst(INT4OID, -1, InvalidOid, sizeof(int32), Int32GetDatum(0), false, true),
|
||||||
InvalidOid, InvalidOid);
|
InvalidOid, InvalidOid);
|
||||||
fix_opfuncids((Node *) opexpr);
|
fix_opfuncids((Node *) opexpr);
|
||||||
query->hasSubLinks = false;
|
query->hasSubLinks = false;
|
||||||
|
|
||||||
subselect->havingQual = (Node *)opexpr;
|
subselect->havingQual = (Node *) opexpr;
|
||||||
(*count)++;
|
(*count)++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1728,7 +1729,7 @@ rewrite_exists_subquery_walker(Query *query, Node *node, int *count)
|
||||||
* SELECT 1, COUNT(*) AS __ivm_exists_count_0__
|
* SELECT 1, COUNT(*) AS __ivm_exists_count_0__
|
||||||
* FROM t2
|
* FROM t2
|
||||||
* WHERE t1.key = t2.key
|
* WHERE t1.key = t2.key
|
||||||
* HAVING __ivm_exists_count_0__ > 0) AS ex
|
* HAVING COUNT(*) > 0) AS ex
|
||||||
*/
|
*/
|
||||||
Query *
|
Query *
|
||||||
rewrite_query_for_exists_subquery(Query *query)
|
rewrite_query_for_exists_subquery(Query *query)
|
||||||
|
|
@ -1740,7 +1741,7 @@ rewrite_query_for_exists_subquery(Query *query)
|
||||||
errmsg("this query is not allowed on incrementally maintainable materialized view"),
|
errmsg("this query is not allowed on incrementally maintainable materialized view"),
|
||||||
errhint("aggregate function and EXISTS condition are not supported at the same time")));
|
errhint("aggregate function and EXISTS condition are not supported at the same time")));
|
||||||
|
|
||||||
return rewrite_exists_subquery_walker(query, (Node *)query, &count);
|
return rewrite_exists_subquery_walker(query, (Node *) query, &count);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue