diff options
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 150 |
1 files changed, 79 insertions, 71 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 95e457c261f..213dc61202b 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -3,7 +3,7 @@ * back to source text * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.166 2004/05/10 22:44:46 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.167 2004/05/26 04:41:38 neilc Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -627,6 +627,7 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, int prettyFlags) Form_pg_class idxrelrec; Form_pg_am amrec; List *indexprs; + ListCell *indexpr_item; List *context; Oid indrelid; int keyno; @@ -691,6 +692,8 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, int prettyFlags) else indexprs = NIL; + indexpr_item = list_head(indexprs); + context = deparse_context_for(get_rel_name(indrelid), indrelid); /* @@ -733,10 +736,10 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, int prettyFlags) /* expressional index */ Node *indexkey; - if (indexprs == NIL) + if (indexpr_item == NULL) elog(ERROR, "too few entries in indexprs list"); - indexkey = (Node *) lfirst(indexprs); - indexprs = lnext(indexprs); + indexkey = (Node *) lfirst(indexpr_item); + indexpr_item = lnext(indexpr_item); /* Deparse */ str = deparse_expression_pretty(indexkey, context, false, false, prettyFlags, 0); @@ -1358,7 +1361,7 @@ deparse_context_for_subplan(const char *name, List *tlist, List *attrs = NIL; int nattrs = 0; int rtablelength = length(rtable); - List *tl; + ListCell *tl; char buf[32]; foreach(tl, tlist) @@ -1526,7 +1529,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, * (which can only be references to OLD and NEW). Use the rtable * of the first query in the action list for this purpose. */ - query = (Query *) lfirst(actions); + query = (Query *) linitial(actions); /* * If the action is INSERT...SELECT, OLD/NEW have been pushed down @@ -1556,7 +1559,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, /* Finally the rules actions */ if (length(actions) > 1) { - List *action; + ListCell *action; Query *query; appendStringInfo(buf, "("); @@ -1579,7 +1582,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, { Query *query; - query = (Query *) lfirst(actions); + query = (Query *) linitial(actions); get_query_def(query, buf, NIL, NULL, prettyFlags, 0); appendStringInfo(buf, ";"); } @@ -1636,7 +1639,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, return; } - query = (Query *) lfirst(actions); + query = (Query *) linitial(actions); if (ev_type != '1' || ev_attr >= 0 || !is_instead || strcmp(ev_qual, "<>") != 0 || query->commandType != CMD_SELECT) @@ -1670,7 +1673,7 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace, deparse_namespace dpns; context.buf = buf; - context.namespaces = lcons(&dpns, parentnamespace); + context.namespaces = lcons(&dpns, list_copy(parentnamespace)); context.varprefix = (parentnamespace != NIL || length(query->rtable) != 1); context.prettyFlags = prettyFlags; @@ -1725,7 +1728,7 @@ get_select_query_def(Query *query, deparse_context *context, StringInfo buf = context->buf; bool force_colno; char *sep; - List *l; + ListCell *l; /* * If the Query node has a setOperations tree, then it's the top level @@ -1802,7 +1805,7 @@ get_basic_select_query(Query *query, deparse_context *context, { StringInfo buf = context->buf; char *sep; - List *l; + ListCell *l; int colno; /* @@ -2057,7 +2060,7 @@ get_insert_query_def(Query *query, deparse_context *context) RangeTblEntry *select_rte = NULL; RangeTblEntry *rte; char *sep; - List *l; + ListCell *l; /* * If it's an INSERT ... SELECT there will be a single subquery RTE @@ -2136,10 +2139,10 @@ get_insert_query_def(Query *query, deparse_context *context) static void get_update_query_def(Query *query, deparse_context *context) { - StringInfo buf = context->buf; - char *sep; - RangeTblEntry *rte; - List *l; + StringInfo buf = context->buf; + char *sep; + RangeTblEntry *rte; + ListCell *l; /* * Start the query with UPDATE relname SET @@ -2271,17 +2274,17 @@ static void get_names_for_var(Var *var, deparse_context *context, char **schemaname, char **refname, char **attname) { - List *nslist = context->namespaces; + ListCell *nslist_item = list_head(context->namespaces); int sup = var->varlevelsup; deparse_namespace *dpns; RangeTblEntry *rte; /* Find appropriate nesting depth */ - while (sup-- > 0 && nslist != NIL) - nslist = lnext(nslist); - if (nslist == NIL) + while (sup-- > 0 && nslist_item != NULL) + nslist_item = lnext(nslist_item); + if (nslist_item == NULL) elog(ERROR, "bogus varlevelsup: %d", var->varlevelsup); - dpns = (deparse_namespace *) lfirst(nslist); + dpns = (deparse_namespace *) lfirst(nslist_item); /* Find the relevant RTE */ if (var->varno >= 1 && var->varno <= length(dpns->rtable)) @@ -2342,13 +2345,13 @@ get_names_for_var(Var *var, deparse_context *context, static RangeTblEntry * find_rte_by_refname(const char *refname, deparse_context *context) { - RangeTblEntry *result = NULL; - List *nslist; + RangeTblEntry *result = NULL; + ListCell *nslist; foreach(nslist, context->namespaces) { deparse_namespace *dpns = (deparse_namespace *) lfirst(nslist); - List *rtlist; + ListCell *rtlist; foreach(rtlist, dpns->rtable) { @@ -2396,7 +2399,7 @@ get_simple_binary_op_name(OpExpr *expr) if (length(args) == 2) { /* binary operator */ - Node *arg1 = (Node *) lfirst(args); + Node *arg1 = (Node *) linitial(args); Node *arg2 = (Node *) lsecond(args); const char *op; @@ -2501,7 +2504,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) * Operators are same priority --- can skip parens * only if we have (a - b) - c, not a - (b - c). */ - if (node == (Node *) lfirst(((OpExpr *) parentNode)->args)) + if (node == (Node *) linitial(((OpExpr *) parentNode)->args)) return true; return false; @@ -2759,8 +2762,8 @@ get_rule_expr(Node *node, deparse_context *context, ArrayRef *aref = (ArrayRef *) node; bool savevarprefix = context->varprefix; bool need_parens; - List *lowlist; - List *uplist; + ListCell *lowlist_item; + ListCell *uplist_item; /* * If we are doing UPDATE array[n] = expr, we need to @@ -2783,18 +2786,19 @@ get_rule_expr(Node *node, deparse_context *context, if (need_parens) appendStringInfoChar(buf, ')'); context->varprefix = savevarprefix; - lowlist = aref->reflowerindexpr; - foreach(uplist, aref->refupperindexpr) + lowlist_item = list_head(aref->reflowerindexpr); + foreach(uplist_item, aref->refupperindexpr) { appendStringInfo(buf, "["); - if (lowlist) + if (lowlist_item) { - get_rule_expr((Node *) lfirst(lowlist), context, + get_rule_expr((Node *) lfirst(lowlist_item), context, false); appendStringInfo(buf, ":"); - lowlist = lnext(lowlist); + lowlist_item = lnext(lowlist_item); } - get_rule_expr((Node *) lfirst(uplist), context, false); + get_rule_expr((Node *) lfirst(uplist_item), + context, false); appendStringInfo(buf, "]"); } if (aref->refassgnexpr) @@ -2818,7 +2822,7 @@ get_rule_expr(Node *node, deparse_context *context, { DistinctExpr *expr = (DistinctExpr *) node; List *args = expr->args; - Node *arg1 = (Node *) lfirst(args); + Node *arg1 = (Node *) linitial(args); Node *arg2 = (Node *) lsecond(args); if (!PRETTY_PAREN(context)) @@ -2835,7 +2839,7 @@ get_rule_expr(Node *node, deparse_context *context, { ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) node; List *args = expr->args; - Node *arg1 = (Node *) lfirst(args); + Node *arg1 = (Node *) linitial(args); Node *arg2 = (Node *) lsecond(args); if (!PRETTY_PAREN(context)) @@ -2856,20 +2860,22 @@ get_rule_expr(Node *node, deparse_context *context, case T_BoolExpr: { BoolExpr *expr = (BoolExpr *) node; - List *args = expr->args; + Node *first_arg = linitial(expr->args); + ListCell *arg = lnext(list_head(expr->args)); switch (expr->boolop) { case AND_EXPR: if (!PRETTY_PAREN(context)) appendStringInfoChar(buf, '('); - get_rule_expr_paren((Node *) lfirst(args), context, + get_rule_expr_paren(first_arg, context, false, node); - while ((args = lnext(args)) != NIL) + while (arg) { appendStringInfo(buf, " AND "); - get_rule_expr_paren((Node *) lfirst(args), context, + get_rule_expr_paren((Node *) lfirst(arg), context, false, node); + arg = lnext(arg); } if (!PRETTY_PAREN(context)) appendStringInfoChar(buf, ')'); @@ -2878,13 +2884,14 @@ get_rule_expr(Node *node, deparse_context *context, case OR_EXPR: if (!PRETTY_PAREN(context)) appendStringInfoChar(buf, '('); - get_rule_expr_paren((Node *) lfirst(args), context, + get_rule_expr_paren(first_arg, context, false, node); - while ((args = lnext(args)) != NIL) + while (arg) { appendStringInfo(buf, " OR "); - get_rule_expr_paren((Node *) lfirst(args), context, + get_rule_expr_paren((Node *) lfirst(arg), context, false, node); + arg = lnext(arg); } if (!PRETTY_PAREN(context)) appendStringInfoChar(buf, ')'); @@ -2894,7 +2901,7 @@ get_rule_expr(Node *node, deparse_context *context, if (!PRETTY_PAREN(context)) appendStringInfoChar(buf, '('); appendStringInfo(buf, "NOT "); - get_rule_expr_paren((Node *) lfirst(args), context, + get_rule_expr_paren(first_arg, context, false, node); if (!PRETTY_PAREN(context)) appendStringInfoChar(buf, ')'); @@ -2989,7 +2996,7 @@ get_rule_expr(Node *node, deparse_context *context, case T_CaseExpr: { CaseExpr *caseexpr = (CaseExpr *) node; - List *temp; + ListCell *temp; appendContextKeyword(context, "CASE", 0, PRETTYINDENT_VAR, 0); @@ -3035,7 +3042,7 @@ get_rule_expr(Node *node, deparse_context *context, case T_ArrayExpr: { ArrayExpr *arrayexpr = (ArrayExpr *) node; - List *element; + ListCell *element; char *sep; appendStringInfo(buf, "ARRAY["); @@ -3055,7 +3062,7 @@ get_rule_expr(Node *node, deparse_context *context, case T_RowExpr: { RowExpr *rowexpr = (RowExpr *) node; - List *arg; + ListCell *arg; char *sep; /* @@ -3082,7 +3089,7 @@ get_rule_expr(Node *node, deparse_context *context, case T_CoalesceExpr: { CoalesceExpr *coalesceexpr = (CoalesceExpr *) node; - List *arg; + ListCell *arg; char *sep; appendStringInfo(buf, "COALESCE("); @@ -3102,7 +3109,7 @@ get_rule_expr(Node *node, deparse_context *context, case T_NullIfExpr: { NullIfExpr *nullifexpr = (NullIfExpr *) node; - List *arg; + ListCell *arg; char *sep; appendStringInfo(buf, "NULLIF("); @@ -3239,7 +3246,7 @@ get_oper_expr(OpExpr *expr, deparse_context *context) if (length(args) == 2) { /* binary operator */ - Node *arg1 = (Node *) lfirst(args); + Node *arg1 = (Node *) linitial(args); Node *arg2 = (Node *) lsecond(args); get_rule_expr_paren(arg1, context, true, (Node *) expr); @@ -3252,7 +3259,7 @@ get_oper_expr(OpExpr *expr, deparse_context *context) else { /* unary operator --- but which side? */ - Node *arg = (Node *) lfirst(args); + Node *arg = (Node *) linitial(args); HeapTuple tp; Form_pg_operator optup; @@ -3298,7 +3305,7 @@ get_func_expr(FuncExpr *expr, deparse_context *context, Oid funcoid = expr->funcid; Oid argtypes[FUNC_MAX_ARGS]; int nargs; - List *l; + ListCell *l; char *sep; /* @@ -3308,7 +3315,7 @@ get_func_expr(FuncExpr *expr, deparse_context *context, */ if (expr->funcformat == COERCE_IMPLICIT_CAST && !showimplicit) { - get_rule_expr_paren((Node *) lfirst(expr->args), context, + get_rule_expr_paren((Node *) linitial(expr->args), context, showimplicit, (Node *) expr); return; } @@ -3320,7 +3327,7 @@ get_func_expr(FuncExpr *expr, deparse_context *context, if (expr->funcformat == COERCE_EXPLICIT_CAST || expr->funcformat == COERCE_IMPLICIT_CAST) { - Node *arg = lfirst(expr->args); + Node *arg = linitial(expr->args); Oid rettype = expr->funcresulttype; int32 coercedTypmod; @@ -3424,7 +3431,7 @@ strip_type_coercion(Node *expr, Oid resultType) if (exprIsLengthCoercion(expr, NULL)) return expr; - return (Node *) lfirst(func->args); + return (Node *) linitial(func->args); } return expr; @@ -3580,7 +3587,7 @@ get_sublink_expr(SubLink *sublink, deparse_context *context) { StringInfo buf = context->buf; Query *query = (Query *) (sublink->subselect); - List *l; + ListCell *l; char *sep; bool need_paren; @@ -3625,7 +3632,7 @@ get_sublink_expr(SubLink *sublink, deparse_context *context) case ANY_SUBLINK: if (length(sublink->operName) == 1 && - strcmp(strVal(lfirst(sublink->operName)), "=") == 0) + strcmp(strVal(linitial(sublink->operName)), "=") == 0) { /* Represent = ANY as IN */ appendStringInfo(buf, "IN "); @@ -3680,7 +3687,7 @@ get_from_clause(Query *query, deparse_context *context) { StringInfo buf = context->buf; bool first = true; - List *l; + ListCell *l; /* * We use the query's jointree as a guide to what to print. However, @@ -3763,12 +3770,12 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context) gavealias = true; if (rte->alias->colnames != NIL && coldeflist == NIL) { - List *col; + ListCell *col; appendStringInfoChar(buf, '('); foreach(col, rte->alias->colnames) { - if (col != rte->alias->colnames) + if (col != list_head(rte->alias->colnames)) appendStringInfo(buf, ", "); appendStringInfoString(buf, quote_identifier(strVal(lfirst(col)))); @@ -3897,12 +3904,12 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context) { if (j->using) { - List *col; + ListCell *col; appendStringInfo(buf, " USING ("); foreach(col, j->using) { - if (col != j->using) + if (col != list_head(j->using)) appendStringInfo(buf, ", "); appendStringInfoString(buf, quote_identifier(strVal(lfirst(col)))); @@ -3929,12 +3936,12 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context) quote_identifier(j->alias->aliasname)); if (j->alias->colnames != NIL) { - List *col; + ListCell *col; appendStringInfoChar(buf, '('); foreach(col, j->alias->colnames) { - if (col != j->alias->colnames) + if (col != list_head(j->alias->colnames)) appendStringInfo(buf, ", "); appendStringInfoString(buf, quote_identifier(strVal(lfirst(col)))); @@ -3958,7 +3965,7 @@ static void get_from_clause_coldeflist(List *coldeflist, deparse_context *context) { StringInfo buf = context->buf; - List *col; + ListCell *col; int i = 0; appendStringInfoChar(buf, '('); @@ -4337,20 +4344,21 @@ generate_operator_name(Oid operid, Oid arg1, Oid arg2) static void print_operator_name(StringInfo buf, List *opname) { - int nnames = length(opname); + ListCell *op = list_head(opname); + int nnames = length(opname); if (nnames == 1) - appendStringInfoString(buf, strVal(lfirst(opname))); + appendStringInfoString(buf, strVal(lfirst(op))); else { appendStringInfo(buf, "OPERATOR("); while (nnames-- > 1) { appendStringInfo(buf, "%s.", - quote_identifier(strVal(lfirst(opname)))); - opname = lnext(opname); + quote_identifier(strVal(lfirst(op)))); + op = lnext(op); } - appendStringInfo(buf, "%s)", strVal(lfirst(opname))); + appendStringInfo(buf, "%s)", strVal(lfirst(op))); } } |