mirror of
https://github.com/postgres/postgres.git
synced 2026-04-28 01:26:56 -04:00
This adds a flag "deterministic" to collations. If that is false, such a collation disables various optimizations that assume that strings are equal only if they are byte-wise equal. That then allows use cases such as case-insensitive or accent-insensitive comparisons or handling of strings with different Unicode normal forms. This functionality is only supported with the ICU provider. At least glibc doesn't appear to have any locales that work in a nondeterministic way, so it's not worth supporting this for the libc provider. The term "deterministic comparison" in this context is from Unicode Technical Standard #10 (https://unicode.org/reports/tr10/#Deterministic_Comparison). This patch makes changes in three areas: - CREATE COLLATION DDL changes and system catalog changes to support this new flag. - Many executor nodes and auxiliary code are extended to track collations. Previously, this code would just throw away collation information, because the eventually-called user-defined functions didn't use it since they only cared about equality, which didn't need collation information. - String data type functions that do equality comparisons and hashing are changed to take the (non-)deterministic flag into account. For comparison, this just means skipping various shortcuts and tie breakers that use byte-wise comparison. For hashing, we first need to convert the input string to a canonical "sort key" using the ICU analogue of strxfrm(). Reviewed-by: Daniel Verite <daniel@manitou-mail.org> Reviewed-by: Peter Geoghegan <pg@bowt.ie> Discussion: https://www.postgresql.org/message-id/flat/1ccc668f-4cbc-0bef-af67-450b47cdfee7@2ndquadrant.com
57 lines
2.2 KiB
C
57 lines
2.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* tlist.h
|
|
* prototypes for tlist.c.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/optimizer/tlist.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef TLIST_H
|
|
#define TLIST_H
|
|
|
|
#include "nodes/pathnodes.h"
|
|
|
|
|
|
extern TargetEntry *tlist_member(Expr *node, List *targetlist);
|
|
extern TargetEntry *tlist_member_ignore_relabel(Expr *node, List *targetlist);
|
|
|
|
extern List *add_to_flat_tlist(List *tlist, List *exprs);
|
|
|
|
extern List *get_tlist_exprs(List *tlist, bool includeJunk);
|
|
|
|
extern bool tlist_same_exprs(List *tlist1, List *tlist2);
|
|
|
|
extern bool tlist_same_datatypes(List *tlist, List *colTypes, bool junkOK);
|
|
extern bool tlist_same_collations(List *tlist, List *colCollations, bool junkOK);
|
|
|
|
extern void apply_tlist_labeling(List *dest_tlist, List *src_tlist);
|
|
|
|
extern Oid *extract_grouping_ops(List *groupClause);
|
|
extern Oid *extract_grouping_collations(List *groupClause, List *tlist);
|
|
extern AttrNumber *extract_grouping_cols(List *groupClause, List *tlist);
|
|
extern bool grouping_is_sortable(List *groupClause);
|
|
extern bool grouping_is_hashable(List *groupClause);
|
|
|
|
extern PathTarget *make_pathtarget_from_tlist(List *tlist);
|
|
extern List *make_tlist_from_pathtarget(PathTarget *target);
|
|
extern PathTarget *copy_pathtarget(PathTarget *src);
|
|
extern PathTarget *create_empty_pathtarget(void);
|
|
extern void add_column_to_pathtarget(PathTarget *target,
|
|
Expr *expr, Index sortgroupref);
|
|
extern void add_new_column_to_pathtarget(PathTarget *target, Expr *expr);
|
|
extern void add_new_columns_to_pathtarget(PathTarget *target, List *exprs);
|
|
extern void apply_pathtarget_labeling_to_tlist(List *tlist, PathTarget *target);
|
|
extern void split_pathtarget_at_srfs(PlannerInfo *root,
|
|
PathTarget *target, PathTarget *input_target,
|
|
List **targets, List **targets_contain_srfs);
|
|
|
|
/* Convenience macro to get a PathTarget with valid cost/width fields */
|
|
#define create_pathtarget(root, tlist) \
|
|
set_pathtarget_cost_width(root, make_pathtarget_from_tlist(tlist))
|
|
|
|
#endif /* TLIST_H */
|