mirror of
https://github.com/postgres/postgres.git
synced 2025-07-26 01:22:12 +03:00
Change predecence of phrase operator.
<-> operator now have higher predecence than & (AND) operator. This change was motivated by unexpected difference of similar queries: 'a & b <-> c'::tsquery and 'b <-> c & a'. Before first query means (a & b) <-> c and second one - '(b <-> c) & a', now phrase operator evaluates first. Per suggestion from Tom Lane 32260.1465402409@sss.pgh.pa.us
This commit is contained in:
@ -217,33 +217,19 @@ typedef struct
|
||||
|
||||
/*
|
||||
* Legal values for QueryOperator.operator.
|
||||
* They should be ordered by priority! We assume that phrase
|
||||
* has highest priority, but this agreement is only
|
||||
* for query transformation! That's need to simplify
|
||||
* algorithm of query transformation.
|
||||
*/
|
||||
#define OP_NOT 1
|
||||
#define OP_AND 2
|
||||
#define OP_OR 3
|
||||
#define OP_PHRASE 4
|
||||
#define OP_PHRASE 4 /* highest code, tsquery_cleanup.c */
|
||||
#define OP_COUNT 4
|
||||
|
||||
extern const int tsearch_op_priority[OP_COUNT];
|
||||
|
||||
#define NOT_PHRASE_P 5 /* OP_PHRASE negation operations must have
|
||||
* greater priority in order to force infix()
|
||||
* to surround the whole OP_PHRASE expression
|
||||
* with parentheses. */
|
||||
|
||||
#define TOP_PRIORITY 6 /* highest priority for val nodes */
|
||||
|
||||
/* get operation priority by its code*/
|
||||
#define OP_PRIORITY(x) ( tsearch_op_priority[(x) - 1] )
|
||||
/* get QueryOperator priority */
|
||||
#define QO_PRIORITY(x) OP_PRIORITY(((QueryOperator *) (x))->oper)
|
||||
/* special case: get QueryOperator priority for correct printing !(a <-> b>) */
|
||||
#define PRINT_PRIORITY(x) \
|
||||
( (((QueryOperator *) (x))->oper == OP_NOT) ? NOT_PHRASE_P : QO_PRIORITY(x) )
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
Reference in New Issue
Block a user