1
0
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:
Teodor Sigaev
2016-06-27 20:55:24 +03:00
parent 3dbbd0f02a
commit 6734a1cacd
6 changed files with 121 additions and 134 deletions

View File

@ -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
{