summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/postgresql/json.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2016-09-30 10:09:56 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2016-10-01 09:46:11 -0400
commit333414fe94941a6a58e7d8e45042548eb2d58119 (patch)
treed4e82336605dbfbeda0afb5735b3c56449db9b56 /lib/sqlalchemy/dialects/postgresql/json.py
parent9bfd0289383bfcaf650fe516862df545dcf95c2e (diff)
downloadsqlalchemy-333414fe94941a6a58e7d8e45042548eb2d58119.tar.gz
Add "eager_parenthesis" late-compilation rule, use w/ PG JSON/HSTORE
Added compiler-level flags used by Postgresql to place additional parenthesis than would normally be generated by precedence rules around operations involving JSON, HSTORE indexing operators as well as within their operands since it has been observed that Postgresql's precedence rules for at least the HSTORE indexing operator is not consistent between 9.4 and 9.5. Fixes: #3806 Change-Id: I5899677b330595264543b055abd54f3c76bfabf2
Diffstat (limited to 'lib/sqlalchemy/dialects/postgresql/json.py')
-rw-r--r--lib/sqlalchemy/dialects/postgresql/json.py23
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/json.py b/lib/sqlalchemy/dialects/postgresql/json.py
index 05c4d014d..821018471 100644
--- a/lib/sqlalchemy/dialects/postgresql/json.py
+++ b/lib/sqlalchemy/dialects/postgresql/json.py
@@ -17,33 +17,42 @@ from ... import util
__all__ = ('JSON', 'JSONB')
+idx_precedence = operators._PRECEDENCE[operators.json_getitem_op]
+
ASTEXT = operators.custom_op(
- "->>", precedence=15, natural_self_precedent=True,
+ "->>", precedence=idx_precedence, natural_self_precedent=True,
+ eager_grouping=True
)
JSONPATH_ASTEXT = operators.custom_op(
- "#>>", precedence=15, natural_self_precedent=True,
+ "#>>", precedence=idx_precedence, natural_self_precedent=True,
+ eager_grouping=True
)
HAS_KEY = operators.custom_op(
- "?", precedence=15, natural_self_precedent=True
+ "?", precedence=idx_precedence, natural_self_precedent=True,
+ eager_grouping=True
)
HAS_ALL = operators.custom_op(
- "?&", precedence=15, natural_self_precedent=True
+ "?&", precedence=idx_precedence, natural_self_precedent=True,
+ eager_grouping=True
)
HAS_ANY = operators.custom_op(
- "?|", precedence=15, natural_self_precedent=True
+ "?|", precedence=idx_precedence, natural_self_precedent=True,
+ eager_grouping=True
)
CONTAINS = operators.custom_op(
- "@>", precedence=15, natural_self_precedent=True
+ "@>", precedence=idx_precedence, natural_self_precedent=True,
+ eager_grouping=True
)
CONTAINED_BY = operators.custom_op(
- "<@", precedence=15, natural_self_precedent=True
+ "<@", precedence=idx_precedence, natural_self_precedent=True,
+ eager_grouping=True
)