Header And Logo

| The world's most advanced open source database.


parse_collate.h File Reference

#include "parser/parse_node.h"
Include dependency graph for parse_collate.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.


void assign_query_collations (ParseState *pstate, Query *query)
void assign_list_collations (ParseState *pstate, List *exprs)
void assign_expr_collations (ParseState *pstate, Node *expr)
Oid select_common_collation (ParseState *pstate, List *exprs, bool none_ok)

Function Documentation

void assign_expr_collations ( ParseState pstate,
Node expr 
void assign_list_collations ( ParseState pstate,
List exprs 

Definition at line 141 of file parse_collate.c.

References assign_expr_collations(), and lfirst.

Referenced by assign_collations_walker(), and assign_query_collations_walker().

    ListCell   *lc;

    foreach(lc, exprs)
        Node       *node = (Node *) lfirst(lc);

        assign_expr_collations(pstate, node);

void assign_query_collations ( ParseState pstate,
Query query 

Definition at line 87 of file parse_collate.c.

References assign_query_collations_walker(), QTW_IGNORE_RANGE_TABLE, and query_tree_walker().

Referenced by transformDeleteStmt(), transformSelectStmt(), transformSetOperationStmt(), transformUpdateStmt(), and transformValuesClause().

     * We just use query_tree_walker() to visit all the contained expressions.
     * We can skip the rangetable and CTE subqueries, though, since RTEs and
     * subqueries had better have been processed already (else Vars referring
     * to them would not get created with the right collation).
    (void) query_tree_walker(query,
                             (void *) pstate,
                             QTW_IGNORE_RANGE_TABLE |

Oid select_common_collation ( ParseState pstate,
List exprs,
bool  none_ok 

Definition at line 194 of file parse_collate.c.

References assign_collations_walker(), COLLATE_CONFLICT, assign_collations_context::collation, assign_collations_context::collation2, ereport, errcode(), errhint(), errmsg(), ERROR, get_collation_name(), assign_collations_context::location, assign_collations_context::location2, parser_errposition(), assign_collations_context::pstate, and assign_collations_context::strength.

Referenced by assign_collations_walker(), transformSetOperationTree(), and transformValuesClause().

    assign_collations_context context;

    /* initialize context for tree walk */
    context.pstate = pstate;
    context.collation = InvalidOid;
    context.strength = COLLATE_NONE;
    context.location = -1;

    /* and away we go */
    (void) assign_collations_walker((Node *) exprs, &context);

    /* deal with collation conflict */
    if (context.strength == COLLATE_CONFLICT)
        if (none_ok)
            return InvalidOid;
                 errmsg("collation mismatch between implicit collations \"%s\" and \"%s\"",
                 errhint("You can choose the collation by applying the COLLATE clause to one or both expressions."),
                 parser_errposition(context.pstate, context.location2)));

     * Note: if strength is still COLLATE_NONE, we'll return InvalidOid, but
     * that's okay because it must mean none of the expressions returned
     * collatable datatypes.
    return context.collation;