aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_coerce.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-10-25 17:19:26 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-10-25 17:19:26 +0000
commit038e45d2cfd4972350024163c36b05fb6cfd474a (patch)
treefe74fae777e45413ef441281fe436d406690ac05 /src/backend/parser/parse_coerce.c
parent642257c0a3aac88af3a28cb6bd60c7841d796cbe (diff)
downloadpostgresql-038e45d2cfd4972350024163c36b05fb6cfd474a.tar.gz
postgresql-038e45d2cfd4972350024163c36b05fb6cfd474a.zip
Add a heuristic to transformAExprIn() to make it prefer expanding "x IN (list)"
into an OR of equality comparisons, rather than x = ANY(ARRAY[...]), when there are Vars in the right-hand side. This avoids a performance regression compared to pre-8.2 releases, in cases where the OR form can be optimized into scans of multiple indexes. Limit the possible downside by preferring this form only when the list isn't very long (I set the cutoff at 32 elements, which is a bit arbitrary but in the right ballpark). Per discussion with Jim Nasby. In passing, also make it try the OR form if it cannot select a common type for the array elements; we've seen a complaint or two about how the OR form worked for such cases and ARRAY doesn't.
Diffstat (limited to 'src/backend/parser/parse_coerce.c')
-rw-r--r--src/backend/parser/parse_coerce.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index a8972342af4..786ec633106 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.146 2006/11/28 12:54:41 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.146.2.1 2008/10/25 17:19:26 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -920,7 +920,8 @@ coerce_to_bigint(ParseState *pstate, Node *node,
* typeids is a nonempty list of type OIDs. Note that earlier items
* in the list will be preferred if there is doubt.
* 'context' is a phrase to use in the error message if we fail to select
- * a usable type.
+ * a usable type. Pass NULL to have the routine return InvalidOid
+ * rather than throwing an error on failure.
*/
Oid
select_common_type(List *typeids, const char *context)
@@ -951,6 +952,8 @@ select_common_type(List *typeids, const char *context)
/*
* both types in different categories? then not much hope...
*/
+ if (context == NULL)
+ return InvalidOid;
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),