Coverage Report

Created: 2025-06-15 06:31

/src/postgres/src/backend/optimizer/path/indxpath.c
Line
Count
Source (jump to first uncovered line)
1
/*-------------------------------------------------------------------------
2
 *
3
 * indxpath.c
4
 *    Routines to determine which indexes are usable for scanning a
5
 *    given relation, and create Paths accordingly.
6
 *
7
 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8
 * Portions Copyright (c) 1994, Regents of the University of California
9
 *
10
 *
11
 * IDENTIFICATION
12
 *    src/backend/optimizer/path/indxpath.c
13
 *
14
 *-------------------------------------------------------------------------
15
 */
16
#include "postgres.h"
17
18
#include <math.h>
19
20
#include "access/stratnum.h"
21
#include "access/sysattr.h"
22
#include "catalog/pg_am.h"
23
#include "catalog/pg_amop.h"
24
#include "catalog/pg_operator.h"
25
#include "catalog/pg_opfamily.h"
26
#include "catalog/pg_type.h"
27
#include "nodes/makefuncs.h"
28
#include "nodes/nodeFuncs.h"
29
#include "nodes/supportnodes.h"
30
#include "optimizer/cost.h"
31
#include "optimizer/optimizer.h"
32
#include "optimizer/pathnode.h"
33
#include "optimizer/paths.h"
34
#include "optimizer/prep.h"
35
#include "optimizer/restrictinfo.h"
36
#include "utils/lsyscache.h"
37
#include "utils/selfuncs.h"
38
39
40
/* XXX see PartCollMatchesExprColl */
41
#define IndexCollMatchesExprColl(idxcollation, exprcollation) \
42
0
  ((idxcollation) == InvalidOid || (idxcollation) == (exprcollation))
43
44
/* Whether we are looking for plain indexscan, bitmap scan, or either */
45
typedef enum
46
{
47
  ST_INDEXSCAN,       /* must support amgettuple */
48
  ST_BITMAPSCAN,        /* must support amgetbitmap */
49
  ST_ANYSCAN,         /* either is okay */
50
} ScanTypeControl;
51
52
/* Data structure for collecting qual clauses that match an index */
53
typedef struct
54
{
55
  bool    nonempty;   /* True if lists are not all empty */
56
  /* Lists of IndexClause nodes, one list per index column */
57
  List     *indexclauses[INDEX_MAX_KEYS];
58
} IndexClauseSet;
59
60
/* Per-path data used within choose_bitmap_and() */
61
typedef struct
62
{
63
  Path     *path;     /* IndexPath, BitmapAndPath, or BitmapOrPath */
64
  List     *quals;      /* the WHERE clauses it uses */
65
  List     *preds;      /* predicates of its partial index(es) */
66
  Bitmapset  *clauseids;    /* quals+preds represented as a bitmapset */
67
  bool    unclassifiable; /* has too many quals+preds to process? */
68
} PathClauseUsage;
69
70
/* Callback argument for ec_member_matches_indexcol */
71
typedef struct
72
{
73
  IndexOptInfo *index;    /* index we're considering */
74
  int     indexcol;   /* index column we want to match to */
75
} ec_member_matches_arg;
76
77
78
static void consider_index_join_clauses(PlannerInfo *root, RelOptInfo *rel,
79
                    IndexOptInfo *index,
80
                    IndexClauseSet *rclauseset,
81
                    IndexClauseSet *jclauseset,
82
                    IndexClauseSet *eclauseset,
83
                    List **bitindexpaths);
84
static void consider_index_join_outer_rels(PlannerInfo *root, RelOptInfo *rel,
85
                       IndexOptInfo *index,
86
                       IndexClauseSet *rclauseset,
87
                       IndexClauseSet *jclauseset,
88
                       IndexClauseSet *eclauseset,
89
                       List **bitindexpaths,
90
                       List *indexjoinclauses,
91
                       int considered_clauses,
92
                       List **considered_relids);
93
static void get_join_index_paths(PlannerInfo *root, RelOptInfo *rel,
94
                 IndexOptInfo *index,
95
                 IndexClauseSet *rclauseset,
96
                 IndexClauseSet *jclauseset,
97
                 IndexClauseSet *eclauseset,
98
                 List **bitindexpaths,
99
                 Relids relids,
100
                 List **considered_relids);
101
static bool eclass_already_used(EquivalenceClass *parent_ec, Relids oldrelids,
102
                List *indexjoinclauses);
103
static void get_index_paths(PlannerInfo *root, RelOptInfo *rel,
104
              IndexOptInfo *index, IndexClauseSet *clauses,
105
              List **bitindexpaths);
106
static List *build_index_paths(PlannerInfo *root, RelOptInfo *rel,
107
                 IndexOptInfo *index, IndexClauseSet *clauses,
108
                 bool useful_predicate,
109
                 ScanTypeControl scantype,
110
                 bool *skip_nonnative_saop);
111
static List *build_paths_for_OR(PlannerInfo *root, RelOptInfo *rel,
112
                List *clauses, List *other_clauses);
113
static List *generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel,
114
                    List *clauses, List *other_clauses);
115
static Path *choose_bitmap_and(PlannerInfo *root, RelOptInfo *rel,
116
                 List *paths);
117
static int  path_usage_comparator(const void *a, const void *b);
118
static Cost bitmap_scan_cost_est(PlannerInfo *root, RelOptInfo *rel,
119
                 Path *ipath);
120
static Cost bitmap_and_cost_est(PlannerInfo *root, RelOptInfo *rel,
121
                List *paths);
122
static PathClauseUsage *classify_index_clause_usage(Path *path,
123
                          List **clauselist);
124
static void find_indexpath_quals(Path *bitmapqual, List **quals, List **preds);
125
static int  find_list_position(Node *node, List **nodelist);
126
static bool check_index_only(RelOptInfo *rel, IndexOptInfo *index);
127
static double get_loop_count(PlannerInfo *root, Index cur_relid, Relids outer_relids);
128
static double adjust_rowcount_for_semijoins(PlannerInfo *root,
129
                      Index cur_relid,
130
                      Index outer_relid,
131
                      double rowcount);
132
static double approximate_joinrel_size(PlannerInfo *root, Relids relids);
133
static void match_restriction_clauses_to_index(PlannerInfo *root,
134
                         IndexOptInfo *index,
135
                         IndexClauseSet *clauseset);
136
static void match_join_clauses_to_index(PlannerInfo *root,
137
                    RelOptInfo *rel, IndexOptInfo *index,
138
                    IndexClauseSet *clauseset,
139
                    List **joinorclauses);
140
static void match_eclass_clauses_to_index(PlannerInfo *root,
141
                      IndexOptInfo *index,
142
                      IndexClauseSet *clauseset);
143
static void match_clauses_to_index(PlannerInfo *root,
144
                   List *clauses,
145
                   IndexOptInfo *index,
146
                   IndexClauseSet *clauseset);
147
static void match_clause_to_index(PlannerInfo *root,
148
                  RestrictInfo *rinfo,
149
                  IndexOptInfo *index,
150
                  IndexClauseSet *clauseset);
151
static IndexClause *match_clause_to_indexcol(PlannerInfo *root,
152
                       RestrictInfo *rinfo,
153
                       int indexcol,
154
                       IndexOptInfo *index);
155
static bool IsBooleanOpfamily(Oid opfamily);
156
static IndexClause *match_boolean_index_clause(PlannerInfo *root,
157
                         RestrictInfo *rinfo,
158
                         int indexcol, IndexOptInfo *index);
159
static IndexClause *match_opclause_to_indexcol(PlannerInfo *root,
160
                         RestrictInfo *rinfo,
161
                         int indexcol,
162
                         IndexOptInfo *index);
163
static IndexClause *match_funcclause_to_indexcol(PlannerInfo *root,
164
                         RestrictInfo *rinfo,
165
                         int indexcol,
166
                         IndexOptInfo *index);
167
static IndexClause *get_index_clause_from_support(PlannerInfo *root,
168
                          RestrictInfo *rinfo,
169
                          Oid funcid,
170
                          int indexarg,
171
                          int indexcol,
172
                          IndexOptInfo *index);
173
static IndexClause *match_saopclause_to_indexcol(PlannerInfo *root,
174
                         RestrictInfo *rinfo,
175
                         int indexcol,
176
                         IndexOptInfo *index);
177
static IndexClause *match_rowcompare_to_indexcol(PlannerInfo *root,
178
                         RestrictInfo *rinfo,
179
                         int indexcol,
180
                         IndexOptInfo *index);
181
static IndexClause *match_orclause_to_indexcol(PlannerInfo *root,
182
                         RestrictInfo *rinfo,
183
                         int indexcol,
184
                         IndexOptInfo *index);
185
static IndexClause *expand_indexqual_rowcompare(PlannerInfo *root,
186
                        RestrictInfo *rinfo,
187
                        int indexcol,
188
                        IndexOptInfo *index,
189
                        Oid expr_op,
190
                        bool var_on_left);
191
static void match_pathkeys_to_index(IndexOptInfo *index, List *pathkeys,
192
                  List **orderby_clauses_p,
193
                  List **clause_columns_p);
194
static Expr *match_clause_to_ordering_op(IndexOptInfo *index,
195
                     int indexcol, Expr *clause, Oid pk_opfamily);
196
static bool ec_member_matches_indexcol(PlannerInfo *root, RelOptInfo *rel,
197
                     EquivalenceClass *ec, EquivalenceMember *em,
198
                     void *arg);
199
200
201
/*
202
 * create_index_paths()
203
 *    Generate all interesting index paths for the given relation.
204
 *    Candidate paths are added to the rel's pathlist (using add_path).
205
 *
206
 * To be considered for an index scan, an index must match one or more
207
 * restriction clauses or join clauses from the query's qual condition,
208
 * or match the query's ORDER BY condition, or have a predicate that
209
 * matches the query's qual condition.
210
 *
211
 * There are two basic kinds of index scans.  A "plain" index scan uses
212
 * only restriction clauses (possibly none at all) in its indexqual,
213
 * so it can be applied in any context.  A "parameterized" index scan uses
214
 * join clauses (plus restriction clauses, if available) in its indexqual.
215
 * When joining such a scan to one of the relations supplying the other
216
 * variables used in its indexqual, the parameterized scan must appear as
217
 * the inner relation of a nestloop join; it can't be used on the outer side,
218
 * nor in a merge or hash join.  In that context, values for the other rels'
219
 * attributes are available and fixed during any one scan of the indexpath.
220
 *
221
 * An IndexPath is generated and submitted to add_path() for each plain or
222
 * parameterized index scan this routine deems potentially interesting for
223
 * the current query.
224
 *
225
 * 'rel' is the relation for which we want to generate index paths
226
 *
227
 * Note: check_index_predicates() must have been run previously for this rel.
228
 *
229
 * Note: in cases involving LATERAL references in the relation's tlist, it's
230
 * possible that rel->lateral_relids is nonempty.  Currently, we include
231
 * lateral_relids into the parameterization reported for each path, but don't
232
 * take it into account otherwise.  The fact that any such rels *must* be
233
 * available as parameter sources perhaps should influence our choices of
234
 * index quals ... but for now, it doesn't seem worth troubling over.
235
 * In particular, comments below about "unparameterized" paths should be read
236
 * as meaning "unparameterized so far as the indexquals are concerned".
237
 */
238
void
239
create_index_paths(PlannerInfo *root, RelOptInfo *rel)
240
0
{
241
0
  List     *indexpaths;
242
0
  List     *bitindexpaths;
243
0
  List     *bitjoinpaths;
244
0
  List     *joinorclauses;
245
0
  IndexClauseSet rclauseset;
246
0
  IndexClauseSet jclauseset;
247
0
  IndexClauseSet eclauseset;
248
0
  ListCell   *lc;
249
250
  /* Skip the whole mess if no indexes */
251
0
  if (rel->indexlist == NIL)
252
0
    return;
253
254
  /* Bitmap paths are collected and then dealt with at the end */
255
0
  bitindexpaths = bitjoinpaths = joinorclauses = NIL;
256
257
  /* Examine each index in turn */
258
0
  foreach(lc, rel->indexlist)
259
0
  {
260
0
    IndexOptInfo *index = (IndexOptInfo *) lfirst(lc);
261
262
    /* Protect limited-size array in IndexClauseSets */
263
0
    Assert(index->nkeycolumns <= INDEX_MAX_KEYS);
264
265
    /*
266
     * Ignore partial indexes that do not match the query.
267
     * (generate_bitmap_or_paths() might be able to do something with
268
     * them, but that's of no concern here.)
269
     */
270
0
    if (index->indpred != NIL && !index->predOK)
271
0
      continue;
272
273
    /*
274
     * Identify the restriction clauses that can match the index.
275
     */
276
0
    MemSet(&rclauseset, 0, sizeof(rclauseset));
277
0
    match_restriction_clauses_to_index(root, index, &rclauseset);
278
279
    /*
280
     * Build index paths from the restriction clauses.  These will be
281
     * non-parameterized paths.  Plain paths go directly to add_path(),
282
     * bitmap paths are added to bitindexpaths to be handled below.
283
     */
284
0
    get_index_paths(root, rel, index, &rclauseset,
285
0
            &bitindexpaths);
286
287
    /*
288
     * Identify the join clauses that can match the index.  For the moment
289
     * we keep them separate from the restriction clauses.  Note that this
290
     * step finds only "loose" join clauses that have not been merged into
291
     * EquivalenceClasses.  Also, collect join OR clauses for later.
292
     */
293
0
    MemSet(&jclauseset, 0, sizeof(jclauseset));
294
0
    match_join_clauses_to_index(root, rel, index,
295
0
                  &jclauseset, &joinorclauses);
296
297
    /*
298
     * Look for EquivalenceClasses that can generate joinclauses matching
299
     * the index.
300
     */
301
0
    MemSet(&eclauseset, 0, sizeof(eclauseset));
302
0
    match_eclass_clauses_to_index(root, index,
303
0
                    &eclauseset);
304
305
    /*
306
     * If we found any plain or eclass join clauses, build parameterized
307
     * index paths using them.
308
     */
309
0
    if (jclauseset.nonempty || eclauseset.nonempty)
310
0
      consider_index_join_clauses(root, rel, index,
311
0
                    &rclauseset,
312
0
                    &jclauseset,
313
0
                    &eclauseset,
314
0
                    &bitjoinpaths);
315
0
  }
316
317
  /*
318
   * Generate BitmapOrPaths for any suitable OR-clauses present in the
319
   * restriction list.  Add these to bitindexpaths.
320
   */
321
0
  indexpaths = generate_bitmap_or_paths(root, rel,
322
0
                      rel->baserestrictinfo, NIL);
323
0
  bitindexpaths = list_concat(bitindexpaths, indexpaths);
324
325
  /*
326
   * Likewise, generate BitmapOrPaths for any suitable OR-clauses present in
327
   * the joinclause list.  Add these to bitjoinpaths.
328
   */
329
0
  indexpaths = generate_bitmap_or_paths(root, rel,
330
0
                      joinorclauses, rel->baserestrictinfo);
331
0
  bitjoinpaths = list_concat(bitjoinpaths, indexpaths);
332
333
  /*
334
   * If we found anything usable, generate a BitmapHeapPath for the most
335
   * promising combination of restriction bitmap index paths.  Note there
336
   * will be only one such path no matter how many indexes exist.  This
337
   * should be sufficient since there's basically only one figure of merit
338
   * (total cost) for such a path.
339
   */
340
0
  if (bitindexpaths != NIL)
341
0
  {
342
0
    Path     *bitmapqual;
343
0
    BitmapHeapPath *bpath;
344
345
0
    bitmapqual = choose_bitmap_and(root, rel, bitindexpaths);
346
0
    bpath = create_bitmap_heap_path(root, rel, bitmapqual,
347
0
                    rel->lateral_relids, 1.0, 0);
348
0
    add_path(rel, (Path *) bpath);
349
350
    /* create a partial bitmap heap path */
351
0
    if (rel->consider_parallel && rel->lateral_relids == NULL)
352
0
      create_partial_bitmap_paths(root, rel, bitmapqual);
353
0
  }
354
355
  /*
356
   * Likewise, if we found anything usable, generate BitmapHeapPaths for the
357
   * most promising combinations of join bitmap index paths.  Our strategy
358
   * is to generate one such path for each distinct parameterization seen
359
   * among the available bitmap index paths.  This may look pretty
360
   * expensive, but usually there won't be very many distinct
361
   * parameterizations.  (This logic is quite similar to that in
362
   * consider_index_join_clauses, but we're working with whole paths not
363
   * individual clauses.)
364
   */
365
0
  if (bitjoinpaths != NIL)
366
0
  {
367
0
    List     *all_path_outers;
368
369
    /* Identify each distinct parameterization seen in bitjoinpaths */
370
0
    all_path_outers = NIL;
371
0
    foreach(lc, bitjoinpaths)
372
0
    {
373
0
      Path     *path = (Path *) lfirst(lc);
374
0
      Relids    required_outer = PATH_REQ_OUTER(path);
375
376
0
      all_path_outers = list_append_unique(all_path_outers,
377
0
                         required_outer);
378
0
    }
379
380
    /* Now, for each distinct parameterization set ... */
381
0
    foreach(lc, all_path_outers)
382
0
    {
383
0
      Relids    max_outers = (Relids) lfirst(lc);
384
0
      List     *this_path_set;
385
0
      Path     *bitmapqual;
386
0
      Relids    required_outer;
387
0
      double    loop_count;
388
0
      BitmapHeapPath *bpath;
389
0
      ListCell   *lcp;
390
391
      /* Identify all the bitmap join paths needing no more than that */
392
0
      this_path_set = NIL;
393
0
      foreach(lcp, bitjoinpaths)
394
0
      {
395
0
        Path     *path = (Path *) lfirst(lcp);
396
397
0
        if (bms_is_subset(PATH_REQ_OUTER(path), max_outers))
398
0
          this_path_set = lappend(this_path_set, path);
399
0
      }
400
401
      /*
402
       * Add in restriction bitmap paths, since they can be used
403
       * together with any join paths.
404
       */
405
0
      this_path_set = list_concat(this_path_set, bitindexpaths);
406
407
      /* Select best AND combination for this parameterization */
408
0
      bitmapqual = choose_bitmap_and(root, rel, this_path_set);
409
410
      /* And push that path into the mix */
411
0
      required_outer = PATH_REQ_OUTER(bitmapqual);
412
0
      loop_count = get_loop_count(root, rel->relid, required_outer);
413
0
      bpath = create_bitmap_heap_path(root, rel, bitmapqual,
414
0
                      required_outer, loop_count, 0);
415
0
      add_path(rel, (Path *) bpath);
416
0
    }
417
0
  }
418
0
}
419
420
/*
421
 * consider_index_join_clauses
422
 *    Given sets of join clauses for an index, decide which parameterized
423
 *    index paths to build.
424
 *
425
 * Plain indexpaths are sent directly to add_path, while potential
426
 * bitmap indexpaths are added to *bitindexpaths for later processing.
427
 *
428
 * 'rel' is the index's heap relation
429
 * 'index' is the index for which we want to generate paths
430
 * 'rclauseset' is the collection of indexable restriction clauses
431
 * 'jclauseset' is the collection of indexable simple join clauses
432
 * 'eclauseset' is the collection of indexable clauses from EquivalenceClasses
433
 * '*bitindexpaths' is the list to add bitmap paths to
434
 */
435
static void
436
consider_index_join_clauses(PlannerInfo *root, RelOptInfo *rel,
437
              IndexOptInfo *index,
438
              IndexClauseSet *rclauseset,
439
              IndexClauseSet *jclauseset,
440
              IndexClauseSet *eclauseset,
441
              List **bitindexpaths)
442
0
{
443
0
  int     considered_clauses = 0;
444
0
  List     *considered_relids = NIL;
445
0
  int     indexcol;
446
447
  /*
448
   * The strategy here is to identify every potentially useful set of outer
449
   * rels that can provide indexable join clauses.  For each such set,
450
   * select all the join clauses available from those outer rels, add on all
451
   * the indexable restriction clauses, and generate plain and/or bitmap
452
   * index paths for that set of clauses.  This is based on the assumption
453
   * that it's always better to apply a clause as an indexqual than as a
454
   * filter (qpqual); which is where an available clause would end up being
455
   * applied if we omit it from the indexquals.
456
   *
457
   * This looks expensive, but in most practical cases there won't be very
458
   * many distinct sets of outer rels to consider.  As a safety valve when
459
   * that's not true, we use a heuristic: limit the number of outer rel sets
460
   * considered to a multiple of the number of clauses considered.  (We'll
461
   * always consider using each individual join clause, though.)
462
   *
463
   * For simplicity in selecting relevant clauses, we represent each set of
464
   * outer rels as a maximum set of clause_relids --- that is, the indexed
465
   * relation itself is also included in the relids set.  considered_relids
466
   * lists all relids sets we've already tried.
467
   */
468
0
  for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++)
469
0
  {
470
    /* Consider each applicable simple join clause */
471
0
    considered_clauses += list_length(jclauseset->indexclauses[indexcol]);
472
0
    consider_index_join_outer_rels(root, rel, index,
473
0
                     rclauseset, jclauseset, eclauseset,
474
0
                     bitindexpaths,
475
0
                     jclauseset->indexclauses[indexcol],
476
0
                     considered_clauses,
477
0
                     &considered_relids);
478
    /* Consider each applicable eclass join clause */
479
0
    considered_clauses += list_length(eclauseset->indexclauses[indexcol]);
480
0
    consider_index_join_outer_rels(root, rel, index,
481
0
                     rclauseset, jclauseset, eclauseset,
482
0
                     bitindexpaths,
483
0
                     eclauseset->indexclauses[indexcol],
484
0
                     considered_clauses,
485
0
                     &considered_relids);
486
0
  }
487
0
}
488
489
/*
490
 * consider_index_join_outer_rels
491
 *    Generate parameterized paths based on clause relids in the clause list.
492
 *
493
 * Workhorse for consider_index_join_clauses; see notes therein for rationale.
494
 *
495
 * 'rel', 'index', 'rclauseset', 'jclauseset', 'eclauseset', and
496
 *    'bitindexpaths' as above
497
 * 'indexjoinclauses' is a list of IndexClauses for join clauses
498
 * 'considered_clauses' is the total number of clauses considered (so far)
499
 * '*considered_relids' is a list of all relids sets already considered
500
 */
501
static void
502
consider_index_join_outer_rels(PlannerInfo *root, RelOptInfo *rel,
503
                 IndexOptInfo *index,
504
                 IndexClauseSet *rclauseset,
505
                 IndexClauseSet *jclauseset,
506
                 IndexClauseSet *eclauseset,
507
                 List **bitindexpaths,
508
                 List *indexjoinclauses,
509
                 int considered_clauses,
510
                 List **considered_relids)
511
0
{
512
0
  ListCell   *lc;
513
514
  /* Examine relids of each joinclause in the given list */
515
0
  foreach(lc, indexjoinclauses)
516
0
  {
517
0
    IndexClause *iclause = (IndexClause *) lfirst(lc);
518
0
    Relids    clause_relids = iclause->rinfo->clause_relids;
519
0
    EquivalenceClass *parent_ec = iclause->rinfo->parent_ec;
520
0
    int     num_considered_relids;
521
522
    /* If we already tried its relids set, no need to do so again */
523
0
    if (list_member(*considered_relids, clause_relids))
524
0
      continue;
525
526
    /*
527
     * Generate the union of this clause's relids set with each
528
     * previously-tried set.  This ensures we try this clause along with
529
     * every interesting subset of previous clauses.  However, to avoid
530
     * exponential growth of planning time when there are many clauses,
531
     * limit the number of relid sets accepted to 10 * considered_clauses.
532
     *
533
     * Note: get_join_index_paths appends entries to *considered_relids,
534
     * but we do not need to visit such newly-added entries within this
535
     * loop, so we don't use foreach() here.  No real harm would be done
536
     * if we did visit them, since the subset check would reject them; but
537
     * it would waste some cycles.
538
     */
539
0
    num_considered_relids = list_length(*considered_relids);
540
0
    for (int pos = 0; pos < num_considered_relids; pos++)
541
0
    {
542
0
      Relids    oldrelids = (Relids) list_nth(*considered_relids, pos);
543
544
      /*
545
       * If either is a subset of the other, no new set is possible.
546
       * This isn't a complete test for redundancy, but it's easy and
547
       * cheap.  get_join_index_paths will check more carefully if we
548
       * already generated the same relids set.
549
       */
550
0
      if (bms_subset_compare(clause_relids, oldrelids) != BMS_DIFFERENT)
551
0
        continue;
552
553
      /*
554
       * If this clause was derived from an equivalence class, the
555
       * clause list may contain other clauses derived from the same
556
       * eclass.  We should not consider that combining this clause with
557
       * one of those clauses generates a usefully different
558
       * parameterization; so skip if any clause derived from the same
559
       * eclass would already have been included when using oldrelids.
560
       */
561
0
      if (parent_ec &&
562
0
        eclass_already_used(parent_ec, oldrelids,
563
0
                  indexjoinclauses))
564
0
        continue;
565
566
      /*
567
       * If the number of relid sets considered exceeds our heuristic
568
       * limit, stop considering combinations of clauses.  We'll still
569
       * consider the current clause alone, though (below this loop).
570
       */
571
0
      if (list_length(*considered_relids) >= 10 * considered_clauses)
572
0
        break;
573
574
      /* OK, try the union set */
575
0
      get_join_index_paths(root, rel, index,
576
0
                 rclauseset, jclauseset, eclauseset,
577
0
                 bitindexpaths,
578
0
                 bms_union(clause_relids, oldrelids),
579
0
                 considered_relids);
580
0
    }
581
582
    /* Also try this set of relids by itself */
583
0
    get_join_index_paths(root, rel, index,
584
0
               rclauseset, jclauseset, eclauseset,
585
0
               bitindexpaths,
586
0
               clause_relids,
587
0
               considered_relids);
588
0
  }
589
0
}
590
591
/*
592
 * get_join_index_paths
593
 *    Generate index paths using clauses from the specified outer relations.
594
 *    In addition to generating paths, relids is added to *considered_relids
595
 *    if not already present.
596
 *
597
 * Workhorse for consider_index_join_clauses; see notes therein for rationale.
598
 *
599
 * 'rel', 'index', 'rclauseset', 'jclauseset', 'eclauseset',
600
 *    'bitindexpaths', 'considered_relids' as above
601
 * 'relids' is the current set of relids to consider (the target rel plus
602
 *    one or more outer rels)
603
 */
604
static void
605
get_join_index_paths(PlannerInfo *root, RelOptInfo *rel,
606
           IndexOptInfo *index,
607
           IndexClauseSet *rclauseset,
608
           IndexClauseSet *jclauseset,
609
           IndexClauseSet *eclauseset,
610
           List **bitindexpaths,
611
           Relids relids,
612
           List **considered_relids)
613
0
{
614
0
  IndexClauseSet clauseset;
615
0
  int     indexcol;
616
617
  /* If we already considered this relids set, don't repeat the work */
618
0
  if (list_member(*considered_relids, relids))
619
0
    return;
620
621
  /* Identify indexclauses usable with this relids set */
622
0
  MemSet(&clauseset, 0, sizeof(clauseset));
623
624
0
  for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++)
625
0
  {
626
0
    ListCell   *lc;
627
628
    /* First find applicable simple join clauses */
629
0
    foreach(lc, jclauseset->indexclauses[indexcol])
630
0
    {
631
0
      IndexClause *iclause = (IndexClause *) lfirst(lc);
632
633
0
      if (bms_is_subset(iclause->rinfo->clause_relids, relids))
634
0
        clauseset.indexclauses[indexcol] =
635
0
          lappend(clauseset.indexclauses[indexcol], iclause);
636
0
    }
637
638
    /*
639
     * Add applicable eclass join clauses.  The clauses generated for each
640
     * column are redundant (cf generate_implied_equalities_for_column),
641
     * so we need at most one.  This is the only exception to the general
642
     * rule of using all available index clauses.
643
     */
644
0
    foreach(lc, eclauseset->indexclauses[indexcol])
645
0
    {
646
0
      IndexClause *iclause = (IndexClause *) lfirst(lc);
647
648
0
      if (bms_is_subset(iclause->rinfo->clause_relids, relids))
649
0
      {
650
0
        clauseset.indexclauses[indexcol] =
651
0
          lappend(clauseset.indexclauses[indexcol], iclause);
652
0
        break;
653
0
      }
654
0
    }
655
656
    /* Add restriction clauses */
657
0
    clauseset.indexclauses[indexcol] =
658
0
      list_concat(clauseset.indexclauses[indexcol],
659
0
            rclauseset->indexclauses[indexcol]);
660
661
0
    if (clauseset.indexclauses[indexcol] != NIL)
662
0
      clauseset.nonempty = true;
663
0
  }
664
665
  /* We should have found something, else caller passed silly relids */
666
0
  Assert(clauseset.nonempty);
667
668
  /* Build index path(s) using the collected set of clauses */
669
0
  get_index_paths(root, rel, index, &clauseset, bitindexpaths);
670
671
  /*
672
   * Remember we considered paths for this set of relids.
673
   */
674
0
  *considered_relids = lappend(*considered_relids, relids);
675
0
}
676
677
/*
678
 * eclass_already_used
679
 *    True if any join clause usable with oldrelids was generated from
680
 *    the specified equivalence class.
681
 */
682
static bool
683
eclass_already_used(EquivalenceClass *parent_ec, Relids oldrelids,
684
          List *indexjoinclauses)
685
0
{
686
0
  ListCell   *lc;
687
688
0
  foreach(lc, indexjoinclauses)
689
0
  {
690
0
    IndexClause *iclause = (IndexClause *) lfirst(lc);
691
0
    RestrictInfo *rinfo = iclause->rinfo;
692
693
0
    if (rinfo->parent_ec == parent_ec &&
694
0
      bms_is_subset(rinfo->clause_relids, oldrelids))
695
0
      return true;
696
0
  }
697
0
  return false;
698
0
}
699
700
701
/*
702
 * get_index_paths
703
 *    Given an index and a set of index clauses for it, construct IndexPaths.
704
 *
705
 * Plain indexpaths are sent directly to add_path, while potential
706
 * bitmap indexpaths are added to *bitindexpaths for later processing.
707
 *
708
 * This is a fairly simple frontend to build_index_paths().  Its reason for
709
 * existence is mainly to handle ScalarArrayOpExpr quals properly.  If the
710
 * index AM supports them natively, we should just include them in simple
711
 * index paths.  If not, we should exclude them while building simple index
712
 * paths, and then make a separate attempt to include them in bitmap paths.
713
 */
714
static void
715
get_index_paths(PlannerInfo *root, RelOptInfo *rel,
716
        IndexOptInfo *index, IndexClauseSet *clauses,
717
        List **bitindexpaths)
718
0
{
719
0
  List     *indexpaths;
720
0
  bool    skip_nonnative_saop = false;
721
0
  ListCell   *lc;
722
723
  /*
724
   * Build simple index paths using the clauses.  Allow ScalarArrayOpExpr
725
   * clauses only if the index AM supports them natively.
726
   */
727
0
  indexpaths = build_index_paths(root, rel,
728
0
                   index, clauses,
729
0
                   index->predOK,
730
0
                   ST_ANYSCAN,
731
0
                   &skip_nonnative_saop);
732
733
  /*
734
   * Submit all the ones that can form plain IndexScan plans to add_path. (A
735
   * plain IndexPath can represent either a plain IndexScan or an
736
   * IndexOnlyScan, but for our purposes here that distinction does not
737
   * matter.  However, some of the indexes might support only bitmap scans,
738
   * and those we mustn't submit to add_path here.)
739
   *
740
   * Also, pick out the ones that are usable as bitmap scans.  For that, we
741
   * must discard indexes that don't support bitmap scans, and we also are
742
   * only interested in paths that have some selectivity; we should discard
743
   * anything that was generated solely for ordering purposes.
744
   */
745
0
  foreach(lc, indexpaths)
746
0
  {
747
0
    IndexPath  *ipath = (IndexPath *) lfirst(lc);
748
749
0
    if (index->amhasgettuple)
750
0
      add_path(rel, (Path *) ipath);
751
752
0
    if (index->amhasgetbitmap &&
753
0
      (ipath->path.pathkeys == NIL ||
754
0
       ipath->indexselectivity < 1.0))
755
0
      *bitindexpaths = lappend(*bitindexpaths, ipath);
756
0
  }
757
758
  /*
759
   * If there were ScalarArrayOpExpr clauses that the index can't handle
760
   * natively, generate bitmap scan paths relying on executor-managed
761
   * ScalarArrayOpExpr.
762
   */
763
0
  if (skip_nonnative_saop)
764
0
  {
765
0
    indexpaths = build_index_paths(root, rel,
766
0
                     index, clauses,
767
0
                     false,
768
0
                     ST_BITMAPSCAN,
769
0
                     NULL);
770
0
    *bitindexpaths = list_concat(*bitindexpaths, indexpaths);
771
0
  }
772
0
}
773
774
/*
775
 * build_index_paths
776
 *    Given an index and a set of index clauses for it, construct zero
777
 *    or more IndexPaths. It also constructs zero or more partial IndexPaths.
778
 *
779
 * We return a list of paths because (1) this routine checks some cases
780
 * that should cause us to not generate any IndexPath, and (2) in some
781
 * cases we want to consider both a forward and a backward scan, so as
782
 * to obtain both sort orders.  Note that the paths are just returned
783
 * to the caller and not immediately fed to add_path().
784
 *
785
 * At top level, useful_predicate should be exactly the index's predOK flag
786
 * (ie, true if it has a predicate that was proven from the restriction
787
 * clauses).  When working on an arm of an OR clause, useful_predicate
788
 * should be true if the predicate required the current OR list to be proven.
789
 * Note that this routine should never be called at all if the index has an
790
 * unprovable predicate.
791
 *
792
 * scantype indicates whether we want to create plain indexscans, bitmap
793
 * indexscans, or both.  When it's ST_BITMAPSCAN, we will not consider
794
 * index ordering while deciding if a Path is worth generating.
795
 *
796
 * If skip_nonnative_saop is non-NULL, we ignore ScalarArrayOpExpr clauses
797
 * unless the index AM supports them directly, and we set *skip_nonnative_saop
798
 * to true if we found any such clauses (caller must initialize the variable
799
 * to false).  If it's NULL, we do not ignore ScalarArrayOpExpr clauses.
800
 *
801
 * 'rel' is the index's heap relation
802
 * 'index' is the index for which we want to generate paths
803
 * 'clauses' is the collection of indexable clauses (IndexClause nodes)
804
 * 'useful_predicate' indicates whether the index has a useful predicate
805
 * 'scantype' indicates whether we need plain or bitmap scan support
806
 * 'skip_nonnative_saop' indicates whether to accept SAOP if index AM doesn't
807
 */
808
static List *
809
build_index_paths(PlannerInfo *root, RelOptInfo *rel,
810
          IndexOptInfo *index, IndexClauseSet *clauses,
811
          bool useful_predicate,
812
          ScanTypeControl scantype,
813
          bool *skip_nonnative_saop)
814
0
{
815
0
  List     *result = NIL;
816
0
  IndexPath  *ipath;
817
0
  List     *index_clauses;
818
0
  Relids    outer_relids;
819
0
  double    loop_count;
820
0
  List     *orderbyclauses;
821
0
  List     *orderbyclausecols;
822
0
  List     *index_pathkeys;
823
0
  List     *useful_pathkeys;
824
0
  bool    pathkeys_possibly_useful;
825
0
  bool    index_is_ordered;
826
0
  bool    index_only_scan;
827
0
  int     indexcol;
828
829
0
  Assert(skip_nonnative_saop != NULL || scantype == ST_BITMAPSCAN);
830
831
  /*
832
   * Check that index supports the desired scan type(s)
833
   */
834
0
  switch (scantype)
835
0
  {
836
0
    case ST_INDEXSCAN:
837
0
      if (!index->amhasgettuple)
838
0
        return NIL;
839
0
      break;
840
0
    case ST_BITMAPSCAN:
841
0
      if (!index->amhasgetbitmap)
842
0
        return NIL;
843
0
      break;
844
0
    case ST_ANYSCAN:
845
      /* either or both are OK */
846
0
      break;
847
0
  }
848
849
  /*
850
   * 1. Combine the per-column IndexClause lists into an overall list.
851
   *
852
   * In the resulting list, clauses are ordered by index key, so that the
853
   * column numbers form a nondecreasing sequence.  (This order is depended
854
   * on by btree and possibly other places.)  The list can be empty, if the
855
   * index AM allows that.
856
   *
857
   * We also build a Relids set showing which outer rels are required by the
858
   * selected clauses.  Any lateral_relids are included in that, but not
859
   * otherwise accounted for.
860
   */
861
0
  index_clauses = NIL;
862
0
  outer_relids = bms_copy(rel->lateral_relids);
863
0
  for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++)
864
0
  {
865
0
    ListCell   *lc;
866
867
0
    foreach(lc, clauses->indexclauses[indexcol])
868
0
    {
869
0
      IndexClause *iclause = (IndexClause *) lfirst(lc);
870
0
      RestrictInfo *rinfo = iclause->rinfo;
871
872
0
      if (skip_nonnative_saop && !index->amsearcharray &&
873
0
        IsA(rinfo->clause, ScalarArrayOpExpr))
874
0
      {
875
        /*
876
         * Caller asked us to generate IndexPaths that omit any
877
         * ScalarArrayOpExpr clauses when the underlying index AM
878
         * lacks native support.
879
         *
880
         * We must omit this clause (and tell caller about it).
881
         */
882
0
        *skip_nonnative_saop = true;
883
0
        continue;
884
0
      }
885
886
      /* OK to include this clause */
887
0
      index_clauses = lappend(index_clauses, iclause);
888
0
      outer_relids = bms_add_members(outer_relids,
889
0
                       rinfo->clause_relids);
890
0
    }
891
892
    /*
893
     * If no clauses match the first index column, check for amoptionalkey
894
     * restriction.  We can't generate a scan over an index with
895
     * amoptionalkey = false unless there's at least one index clause.
896
     * (When working on columns after the first, this test cannot fail. It
897
     * is always okay for columns after the first to not have any
898
     * clauses.)
899
     */
900
0
    if (index_clauses == NIL && !index->amoptionalkey)
901
0
      return NIL;
902
0
  }
903
904
  /* We do not want the index's rel itself listed in outer_relids */
905
0
  outer_relids = bms_del_member(outer_relids, rel->relid);
906
907
  /* Compute loop_count for cost estimation purposes */
908
0
  loop_count = get_loop_count(root, rel->relid, outer_relids);
909
910
  /*
911
   * 2. Compute pathkeys describing index's ordering, if any, then see how
912
   * many of them are actually useful for this query.  This is not relevant
913
   * if we are only trying to build bitmap indexscans.
914
   */
915
0
  pathkeys_possibly_useful = (scantype != ST_BITMAPSCAN &&
916
0
                has_useful_pathkeys(root, rel));
917
0
  index_is_ordered = (index->sortopfamily != NULL);
918
0
  if (index_is_ordered && pathkeys_possibly_useful)
919
0
  {
920
0
    index_pathkeys = build_index_pathkeys(root, index,
921
0
                        ForwardScanDirection);
922
0
    useful_pathkeys = truncate_useless_pathkeys(root, rel,
923
0
                          index_pathkeys);
924
0
    orderbyclauses = NIL;
925
0
    orderbyclausecols = NIL;
926
0
  }
927
0
  else if (index->amcanorderbyop && pathkeys_possibly_useful)
928
0
  {
929
    /*
930
     * See if we can generate ordering operators for query_pathkeys or at
931
     * least some prefix thereof.  Matching to just a prefix of the
932
     * query_pathkeys will allow an incremental sort to be considered on
933
     * the index's partially sorted results.
934
     */
935
0
    match_pathkeys_to_index(index, root->query_pathkeys,
936
0
                &orderbyclauses,
937
0
                &orderbyclausecols);
938
0
    if (list_length(root->query_pathkeys) == list_length(orderbyclauses))
939
0
      useful_pathkeys = root->query_pathkeys;
940
0
    else
941
0
      useful_pathkeys = list_copy_head(root->query_pathkeys,
942
0
                       list_length(orderbyclauses));
943
0
  }
944
0
  else
945
0
  {
946
0
    useful_pathkeys = NIL;
947
0
    orderbyclauses = NIL;
948
0
    orderbyclausecols = NIL;
949
0
  }
950
951
  /*
952
   * 3. Check if an index-only scan is possible.  If we're not building
953
   * plain indexscans, this isn't relevant since bitmap scans don't support
954
   * index data retrieval anyway.
955
   */
956
0
  index_only_scan = (scantype != ST_BITMAPSCAN &&
957
0
             check_index_only(rel, index));
958
959
  /*
960
   * 4. Generate an indexscan path if there are relevant restriction clauses
961
   * in the current clauses, OR the index ordering is potentially useful for
962
   * later merging or final output ordering, OR the index has a useful
963
   * predicate, OR an index-only scan is possible.
964
   */
965
0
  if (index_clauses != NIL || useful_pathkeys != NIL || useful_predicate ||
966
0
    index_only_scan)
967
0
  {
968
0
    ipath = create_index_path(root, index,
969
0
                  index_clauses,
970
0
                  orderbyclauses,
971
0
                  orderbyclausecols,
972
0
                  useful_pathkeys,
973
0
                  ForwardScanDirection,
974
0
                  index_only_scan,
975
0
                  outer_relids,
976
0
                  loop_count,
977
0
                  false);
978
0
    result = lappend(result, ipath);
979
980
    /*
981
     * If appropriate, consider parallel index scan.  We don't allow
982
     * parallel index scan for bitmap index scans.
983
     */
984
0
    if (index->amcanparallel &&
985
0
      rel->consider_parallel && outer_relids == NULL &&
986
0
      scantype != ST_BITMAPSCAN)
987
0
    {
988
0
      ipath = create_index_path(root, index,
989
0
                    index_clauses,
990
0
                    orderbyclauses,
991
0
                    orderbyclausecols,
992
0
                    useful_pathkeys,
993
0
                    ForwardScanDirection,
994
0
                    index_only_scan,
995
0
                    outer_relids,
996
0
                    loop_count,
997
0
                    true);
998
999
      /*
1000
       * if, after costing the path, we find that it's not worth using
1001
       * parallel workers, just free it.
1002
       */
1003
0
      if (ipath->path.parallel_workers > 0)
1004
0
        add_partial_path(rel, (Path *) ipath);
1005
0
      else
1006
0
        pfree(ipath);
1007
0
    }
1008
0
  }
1009
1010
  /*
1011
   * 5. If the index is ordered, a backwards scan might be interesting.
1012
   */
1013
0
  if (index_is_ordered && pathkeys_possibly_useful)
1014
0
  {
1015
0
    index_pathkeys = build_index_pathkeys(root, index,
1016
0
                        BackwardScanDirection);
1017
0
    useful_pathkeys = truncate_useless_pathkeys(root, rel,
1018
0
                          index_pathkeys);
1019
0
    if (useful_pathkeys != NIL)
1020
0
    {
1021
0
      ipath = create_index_path(root, index,
1022
0
                    index_clauses,
1023
0
                    NIL,
1024
0
                    NIL,
1025
0
                    useful_pathkeys,
1026
0
                    BackwardScanDirection,
1027
0
                    index_only_scan,
1028
0
                    outer_relids,
1029
0
                    loop_count,
1030
0
                    false);
1031
0
      result = lappend(result, ipath);
1032
1033
      /* If appropriate, consider parallel index scan */
1034
0
      if (index->amcanparallel &&
1035
0
        rel->consider_parallel && outer_relids == NULL &&
1036
0
        scantype != ST_BITMAPSCAN)
1037
0
      {
1038
0
        ipath = create_index_path(root, index,
1039
0
                      index_clauses,
1040
0
                      NIL,
1041
0
                      NIL,
1042
0
                      useful_pathkeys,
1043
0
                      BackwardScanDirection,
1044
0
                      index_only_scan,
1045
0
                      outer_relids,
1046
0
                      loop_count,
1047
0
                      true);
1048
1049
        /*
1050
         * if, after costing the path, we find that it's not worth
1051
         * using parallel workers, just free it.
1052
         */
1053
0
        if (ipath->path.parallel_workers > 0)
1054
0
          add_partial_path(rel, (Path *) ipath);
1055
0
        else
1056
0
          pfree(ipath);
1057
0
      }
1058
0
    }
1059
0
  }
1060
1061
0
  return result;
1062
0
}
1063
1064
/*
1065
 * build_paths_for_OR
1066
 *    Given a list of restriction clauses from one arm of an OR clause,
1067
 *    construct all matching IndexPaths for the relation.
1068
 *
1069
 * Here we must scan all indexes of the relation, since a bitmap OR tree
1070
 * can use multiple indexes.
1071
 *
1072
 * The caller actually supplies two lists of restriction clauses: some
1073
 * "current" ones and some "other" ones.  Both lists can be used freely
1074
 * to match keys of the index, but an index must use at least one of the
1075
 * "current" clauses to be considered usable.  The motivation for this is
1076
 * examples like
1077
 *    WHERE (x = 42) AND (... OR (y = 52 AND z = 77) OR ....)
1078
 * While we are considering the y/z subclause of the OR, we can use "x = 42"
1079
 * as one of the available index conditions; but we shouldn't match the
1080
 * subclause to any index on x alone, because such a Path would already have
1081
 * been generated at the upper level.  So we could use an index on x,y,z
1082
 * or an index on x,y for the OR subclause, but not an index on just x.
1083
 * When dealing with a partial index, a match of the index predicate to
1084
 * one of the "current" clauses also makes the index usable.
1085
 *
1086
 * 'rel' is the relation for which we want to generate index paths
1087
 * 'clauses' is the current list of clauses (RestrictInfo nodes)
1088
 * 'other_clauses' is the list of additional upper-level clauses
1089
 */
1090
static List *
1091
build_paths_for_OR(PlannerInfo *root, RelOptInfo *rel,
1092
           List *clauses, List *other_clauses)
1093
0
{
1094
0
  List     *result = NIL;
1095
0
  List     *all_clauses = NIL; /* not computed till needed */
1096
0
  ListCell   *lc;
1097
1098
0
  foreach(lc, rel->indexlist)
1099
0
  {
1100
0
    IndexOptInfo *index = (IndexOptInfo *) lfirst(lc);
1101
0
    IndexClauseSet clauseset;
1102
0
    List     *indexpaths;
1103
0
    bool    useful_predicate;
1104
1105
    /* Ignore index if it doesn't support bitmap scans */
1106
0
    if (!index->amhasgetbitmap)
1107
0
      continue;
1108
1109
    /*
1110
     * Ignore partial indexes that do not match the query.  If a partial
1111
     * index is marked predOK then we know it's OK.  Otherwise, we have to
1112
     * test whether the added clauses are sufficient to imply the
1113
     * predicate. If so, we can use the index in the current context.
1114
     *
1115
     * We set useful_predicate to true iff the predicate was proven using
1116
     * the current set of clauses.  This is needed to prevent matching a
1117
     * predOK index to an arm of an OR, which would be a legal but
1118
     * pointlessly inefficient plan.  (A better plan will be generated by
1119
     * just scanning the predOK index alone, no OR.)
1120
     */
1121
0
    useful_predicate = false;
1122
0
    if (index->indpred != NIL)
1123
0
    {
1124
0
      if (index->predOK)
1125
0
      {
1126
        /* Usable, but don't set useful_predicate */
1127
0
      }
1128
0
      else
1129
0
      {
1130
        /* Form all_clauses if not done already */
1131
0
        if (all_clauses == NIL)
1132
0
          all_clauses = list_concat_copy(clauses, other_clauses);
1133
1134
0
        if (!predicate_implied_by(index->indpred, all_clauses, false))
1135
0
          continue; /* can't use it at all */
1136
1137
0
        if (!predicate_implied_by(index->indpred, other_clauses, false))
1138
0
          useful_predicate = true;
1139
0
      }
1140
0
    }
1141
1142
    /*
1143
     * Identify the restriction clauses that can match the index.
1144
     */
1145
0
    MemSet(&clauseset, 0, sizeof(clauseset));
1146
0
    match_clauses_to_index(root, clauses, index, &clauseset);
1147
1148
    /*
1149
     * If no matches so far, and the index predicate isn't useful, we
1150
     * don't want it.
1151
     */
1152
0
    if (!clauseset.nonempty && !useful_predicate)
1153
0
      continue;
1154
1155
    /*
1156
     * Add "other" restriction clauses to the clauseset.
1157
     */
1158
0
    match_clauses_to_index(root, other_clauses, index, &clauseset);
1159
1160
    /*
1161
     * Construct paths if possible.
1162
     */
1163
0
    indexpaths = build_index_paths(root, rel,
1164
0
                     index, &clauseset,
1165
0
                     useful_predicate,
1166
0
                     ST_BITMAPSCAN,
1167
0
                     NULL);
1168
0
    result = list_concat(result, indexpaths);
1169
0
  }
1170
1171
0
  return result;
1172
0
}
1173
1174
/*
1175
 * Utility structure used to group similar OR-clause arguments in
1176
 * group_similar_or_args().  It represents information about the OR-clause
1177
 * argument and its matching index key.
1178
 */
1179
typedef struct
1180
{
1181
  int     indexnum;   /* index of the matching index, or -1 if no
1182
                 * matching index */
1183
  int     colnum;     /* index of the matching column, or -1 if no
1184
                 * matching index */
1185
  Oid     opno;     /* OID of the OpClause operator, or InvalidOid
1186
                 * if not an OpExpr */
1187
  Oid     inputcollid;  /* OID of the OpClause input collation */
1188
  int     argindex;   /* index of the clause in the list of
1189
                 * arguments */
1190
  int     groupindex;   /* value of argindex for the fist clause in
1191
                 * the group of similar clauses */
1192
} OrArgIndexMatch;
1193
1194
/*
1195
 * Comparison function for OrArgIndexMatch which provides sort order placing
1196
 * similar OR-clause arguments together.
1197
 */
1198
static int
1199
or_arg_index_match_cmp(const void *a, const void *b)
1200
0
{
1201
0
  const OrArgIndexMatch *match_a = (const OrArgIndexMatch *) a;
1202
0
  const OrArgIndexMatch *match_b = (const OrArgIndexMatch *) b;
1203
1204
0
  if (match_a->indexnum < match_b->indexnum)
1205
0
    return -1;
1206
0
  else if (match_a->indexnum > match_b->indexnum)
1207
0
    return 1;
1208
1209
0
  if (match_a->colnum < match_b->colnum)
1210
0
    return -1;
1211
0
  else if (match_a->colnum > match_b->colnum)
1212
0
    return 1;
1213
1214
0
  if (match_a->opno < match_b->opno)
1215
0
    return -1;
1216
0
  else if (match_a->opno > match_b->opno)
1217
0
    return 1;
1218
1219
0
  if (match_a->inputcollid < match_b->inputcollid)
1220
0
    return -1;
1221
0
  else if (match_a->inputcollid > match_b->inputcollid)
1222
0
    return 1;
1223
1224
0
  if (match_a->argindex < match_b->argindex)
1225
0
    return -1;
1226
0
  else if (match_a->argindex > match_b->argindex)
1227
0
    return 1;
1228
1229
0
  return 0;
1230
0
}
1231
1232
/*
1233
 * Another comparison function for OrArgIndexMatch.  It sorts groups together
1234
 * using groupindex.  The group items are then sorted by argindex.
1235
 */
1236
static int
1237
or_arg_index_match_cmp_group(const void *a, const void *b)
1238
0
{
1239
0
  const OrArgIndexMatch *match_a = (const OrArgIndexMatch *) a;
1240
0
  const OrArgIndexMatch *match_b = (const OrArgIndexMatch *) b;
1241
1242
0
  if (match_a->groupindex < match_b->groupindex)
1243
0
    return -1;
1244
0
  else if (match_a->groupindex > match_b->groupindex)
1245
0
    return 1;
1246
1247
0
  if (match_a->argindex < match_b->argindex)
1248
0
    return -1;
1249
0
  else if (match_a->argindex > match_b->argindex)
1250
0
    return 1;
1251
1252
0
  return 0;
1253
0
}
1254
1255
/*
1256
 * group_similar_or_args
1257
 *    Transform incoming OR-restrictinfo into a list of sub-restrictinfos,
1258
 *    each of them containing a subset of similar OR-clause arguments from
1259
 *    the source rinfo.
1260
 *
1261
 * Similar OR-clause arguments are of the form "indexkey op constant" having
1262
 * the same indexkey, operator, and collation.  Constant may comprise either
1263
 * Const or Param.  It may be employed later, during the
1264
 * match_clause_to_indexcol() to transform the whole OR-sub-rinfo to an SAOP
1265
 * clause.
1266
 *
1267
 * Returns the processed list of OR-clause arguments.
1268
 */
1269
static List *
1270
group_similar_or_args(PlannerInfo *root, RelOptInfo *rel, RestrictInfo *rinfo)
1271
0
{
1272
0
  int     n;
1273
0
  int     i;
1274
0
  int     group_start;
1275
0
  OrArgIndexMatch *matches;
1276
0
  bool    matched = false;
1277
0
  ListCell   *lc;
1278
0
  ListCell   *lc2;
1279
0
  List     *orargs;
1280
0
  List     *result = NIL;
1281
0
  Index   relid = rel->relid;
1282
1283
0
  Assert(IsA(rinfo->orclause, BoolExpr));
1284
0
  orargs = ((BoolExpr *) rinfo->orclause)->args;
1285
0
  n = list_length(orargs);
1286
1287
  /*
1288
   * To avoid N^2 behavior, take utility pass along the list of OR-clause
1289
   * arguments.  For each argument, fill the OrArgIndexMatch structure,
1290
   * which will be used to sort these arguments at the next step.
1291
   */
1292
0
  i = -1;
1293
0
  matches = (OrArgIndexMatch *) palloc(sizeof(OrArgIndexMatch) * n);
1294
0
  foreach(lc, orargs)
1295
0
  {
1296
0
    Node     *arg = lfirst(lc);
1297
0
    RestrictInfo *argrinfo;
1298
0
    OpExpr     *clause;
1299
0
    Oid     opno;
1300
0
    Node     *leftop,
1301
0
           *rightop;
1302
0
    Node     *nonConstExpr;
1303
0
    int     indexnum;
1304
0
    int     colnum;
1305
1306
0
    i++;
1307
0
    matches[i].argindex = i;
1308
0
    matches[i].groupindex = i;
1309
0
    matches[i].indexnum = -1;
1310
0
    matches[i].colnum = -1;
1311
0
    matches[i].opno = InvalidOid;
1312
0
    matches[i].inputcollid = InvalidOid;
1313
1314
0
    if (!IsA(arg, RestrictInfo))
1315
0
      continue;
1316
1317
0
    argrinfo = castNode(RestrictInfo, arg);
1318
1319
    /* Only operator clauses can match  */
1320
0
    if (!IsA(argrinfo->clause, OpExpr))
1321
0
      continue;
1322
1323
0
    clause = (OpExpr *) argrinfo->clause;
1324
0
    opno = clause->opno;
1325
1326
    /* Only binary operators can match  */
1327
0
    if (list_length(clause->args) != 2)
1328
0
      continue;
1329
1330
    /*
1331
     * Ignore any RelabelType node above the operands.  This is needed to
1332
     * be able to apply indexscanning in binary-compatible-operator cases.
1333
     * Note: we can assume there is at most one RelabelType node;
1334
     * eval_const_expressions() will have simplified if more than one.
1335
     */
1336
0
    leftop = get_leftop(clause);
1337
0
    if (IsA(leftop, RelabelType))
1338
0
      leftop = (Node *) ((RelabelType *) leftop)->arg;
1339
1340
0
    rightop = get_rightop(clause);
1341
0
    if (IsA(rightop, RelabelType))
1342
0
      rightop = (Node *) ((RelabelType *) rightop)->arg;
1343
1344
    /*
1345
     * Check for clauses of the form: (indexkey operator constant) or
1346
     * (constant operator indexkey).  But we don't know a particular index
1347
     * yet.  Therefore, we try to distinguish the potential index key and
1348
     * constant first, then search for a matching index key among all
1349
     * indexes.
1350
     */
1351
0
    if (bms_is_member(relid, argrinfo->right_relids) &&
1352
0
      !bms_is_member(relid, argrinfo->left_relids) &&
1353
0
      !contain_volatile_functions(leftop))
1354
0
    {
1355
0
      opno = get_commutator(opno);
1356
1357
0
      if (!OidIsValid(opno))
1358
0
      {
1359
        /* commutator doesn't exist, we can't reverse the order */
1360
0
        continue;
1361
0
      }
1362
0
      nonConstExpr = rightop;
1363
0
    }
1364
0
    else if (bms_is_member(relid, argrinfo->left_relids) &&
1365
0
         !bms_is_member(relid, argrinfo->right_relids) &&
1366
0
         !contain_volatile_functions(rightop))
1367
0
    {
1368
0
      nonConstExpr = leftop;
1369
0
    }
1370
0
    else
1371
0
    {
1372
0
      continue;
1373
0
    }
1374
1375
    /*
1376
     * Match non-constant part to the index key.  It's possible that a
1377
     * single non-constant part matches multiple index keys.  It's OK, we
1378
     * just stop with first matching index key.  Given that this choice is
1379
     * determined the same for every clause, we will group similar clauses
1380
     * together anyway.
1381
     */
1382
0
    indexnum = 0;
1383
0
    foreach(lc2, rel->indexlist)
1384
0
    {
1385
0
      IndexOptInfo *index = (IndexOptInfo *) lfirst(lc2);
1386
1387
      /*
1388
       * Ignore index if it doesn't support bitmap scans or SAOP
1389
       * clauses.
1390
       */
1391
0
      if (!index->amhasgetbitmap || !index->amsearcharray)
1392
0
        continue;
1393
1394
0
      for (colnum = 0; colnum < index->nkeycolumns; colnum++)
1395
0
      {
1396
0
        if (match_index_to_operand(nonConstExpr, colnum, index))
1397
0
        {
1398
0
          matches[i].indexnum = indexnum;
1399
0
          matches[i].colnum = colnum;
1400
0
          matches[i].opno = opno;
1401
0
          matches[i].inputcollid = clause->inputcollid;
1402
0
          matched = true;
1403
0
          break;
1404
0
        }
1405
0
      }
1406
1407
      /*
1408
       * Stop looping through the indexes, if we managed to match
1409
       * nonConstExpr to any index column.
1410
       */
1411
0
      if (matches[i].indexnum >= 0)
1412
0
        break;
1413
0
      indexnum++;
1414
0
    }
1415
0
  }
1416
1417
  /*
1418
   * Fast-path check: if no clause is matching to the index column, we can
1419
   * just give up at this stage and return the clause list as-is.
1420
   */
1421
0
  if (!matched)
1422
0
  {
1423
0
    pfree(matches);
1424
0
    return orargs;
1425
0
  }
1426
1427
  /*
1428
   * Sort clauses to make similar clauses go together.  But at the same
1429
   * time, we would like to change the order of clauses as little as
1430
   * possible.  To do so, we reorder each group of similar clauses so that
1431
   * the first item of the group stays in place, and all the other items are
1432
   * moved after it.  So, if there are no similar clauses, the order of
1433
   * clauses stays the same.  When there are some groups, required
1434
   * reordering happens while the rest of the clauses remain in their
1435
   * places.  That is achieved by assigning a 'groupindex' to each clause:
1436
   * the number of the first item in the group in the original clause list.
1437
   */
1438
0
  qsort(matches, n, sizeof(OrArgIndexMatch), or_arg_index_match_cmp);
1439
1440
  /* Assign groupindex to the sorted clauses */
1441
0
  for (i = 1; i < n; i++)
1442
0
  {
1443
    /*
1444
     * When two clauses are similar and should belong to the same group,
1445
     * copy the 'groupindex' from the previous clause.  Given we are
1446
     * considering clauses in direct order, all the clauses would have a
1447
     * 'groupindex' equal to the 'groupindex' of the first clause in the
1448
     * group.
1449
     */
1450
0
    if (matches[i].indexnum == matches[i - 1].indexnum &&
1451
0
      matches[i].colnum == matches[i - 1].colnum &&
1452
0
      matches[i].opno == matches[i - 1].opno &&
1453
0
      matches[i].inputcollid == matches[i - 1].inputcollid &&
1454
0
      matches[i].indexnum != -1)
1455
0
      matches[i].groupindex = matches[i - 1].groupindex;
1456
0
  }
1457
1458
  /* Re-sort clauses first by groupindex then by argindex */
1459
0
  qsort(matches, n, sizeof(OrArgIndexMatch), or_arg_index_match_cmp_group);
1460
1461
  /*
1462
   * Group similar clauses into single sub-restrictinfo. Side effect: the
1463
   * resulting list of restrictions will be sorted by indexnum and colnum.
1464
   */
1465
0
  group_start = 0;
1466
0
  for (i = 1; i <= n; i++)
1467
0
  {
1468
    /* Check if it's a group boundary */
1469
0
    if (group_start >= 0 &&
1470
0
      (i == n ||
1471
0
       matches[i].indexnum != matches[group_start].indexnum ||
1472
0
       matches[i].colnum != matches[group_start].colnum ||
1473
0
       matches[i].opno != matches[group_start].opno ||
1474
0
       matches[i].inputcollid != matches[group_start].inputcollid ||
1475
0
       matches[i].indexnum == -1))
1476
0
    {
1477
      /*
1478
       * One clause in group: add it "as is" to the upper-level OR.
1479
       */
1480
0
      if (i - group_start == 1)
1481
0
      {
1482
0
        result = lappend(result,
1483
0
                 list_nth(orargs,
1484
0
                      matches[group_start].argindex));
1485
0
      }
1486
0
      else
1487
0
      {
1488
        /*
1489
         * Two or more clauses in a group: create a nested OR.
1490
         */
1491
0
        List     *args = NIL;
1492
0
        List     *rargs = NIL;
1493
0
        RestrictInfo *subrinfo;
1494
0
        int     j;
1495
1496
0
        Assert(i - group_start >= 2);
1497
1498
        /* Construct the list of nested OR arguments */
1499
0
        for (j = group_start; j < i; j++)
1500
0
        {
1501
0
          Node     *arg = list_nth(orargs, matches[j].argindex);
1502
1503
0
          rargs = lappend(rargs, arg);
1504
0
          if (IsA(arg, RestrictInfo))
1505
0
            args = lappend(args, ((RestrictInfo *) arg)->clause);
1506
0
          else
1507
0
            args = lappend(args, arg);
1508
0
        }
1509
1510
        /* Construct the nested OR and wrap it with RestrictInfo */
1511
0
        subrinfo = make_plain_restrictinfo(root,
1512
0
                           make_orclause(args),
1513
0
                           make_orclause(rargs),
1514
0
                           rinfo->is_pushed_down,
1515
0
                           rinfo->has_clone,
1516
0
                           rinfo->is_clone,
1517
0
                           rinfo->pseudoconstant,
1518
0
                           rinfo->security_level,
1519
0
                           rinfo->required_relids,
1520
0
                           rinfo->incompatible_relids,
1521
0
                           rinfo->outer_relids);
1522
0
        result = lappend(result, subrinfo);
1523
0
      }
1524
1525
0
      group_start = i;
1526
0
    }
1527
0
  }
1528
0
  pfree(matches);
1529
0
  return result;
1530
0
}
1531
1532
/*
1533
 * make_bitmap_paths_for_or_group
1534
 *    Generate bitmap paths for a group of similar OR-clause arguments
1535
 *    produced by group_similar_or_args().
1536
 *
1537
 * This function considers two cases: (1) matching a group of clauses to
1538
 * the index as a whole, and (2) matching the individual clauses one-by-one.
1539
 * (1) typically comprises an optimal solution.  If not, (2) typically
1540
 * comprises fair alternative.
1541
 *
1542
 * Ideally, we could consider all arbitrary splits of arguments into
1543
 * subgroups, but that could lead to unacceptable computational complexity.
1544
 * This is why we only consider two cases of above.
1545
 */
1546
static List *
1547
make_bitmap_paths_for_or_group(PlannerInfo *root, RelOptInfo *rel,
1548
                 RestrictInfo *ri, List *other_clauses)
1549
0
{
1550
0
  List     *jointlist = NIL;
1551
0
  List     *splitlist = NIL;
1552
0
  ListCell   *lc;
1553
0
  List     *orargs;
1554
0
  List     *args = ((BoolExpr *) ri->orclause)->args;
1555
0
  Cost    jointcost = 0.0,
1556
0
        splitcost = 0.0;
1557
0
  Path     *bitmapqual;
1558
0
  List     *indlist;
1559
1560
  /*
1561
   * First, try to match the whole group to the one index.
1562
   */
1563
0
  orargs = list_make1(ri);
1564
0
  indlist = build_paths_for_OR(root, rel,
1565
0
                 orargs,
1566
0
                 other_clauses);
1567
0
  if (indlist != NIL)
1568
0
  {
1569
0
    bitmapqual = choose_bitmap_and(root, rel, indlist);
1570
0
    jointcost = bitmapqual->total_cost;
1571
0
    jointlist = list_make1(bitmapqual);
1572
0
  }
1573
1574
  /*
1575
   * If we manage to find a bitmap scan, which uses the group of OR-clause
1576
   * arguments as a whole, we can skip matching OR-clause arguments
1577
   * one-by-one as long as there are no other clauses, which can bring more
1578
   * efficiency to one-by-one case.
1579
   */
1580
0
  if (jointlist != NIL && other_clauses == NIL)
1581
0
    return jointlist;
1582
1583
  /*
1584
   * Also try to match all containing clauses one-by-one.
1585
   */
1586
0
  foreach(lc, args)
1587
0
  {
1588
0
    orargs = list_make1(lfirst(lc));
1589
1590
0
    indlist = build_paths_for_OR(root, rel,
1591
0
                   orargs,
1592
0
                   other_clauses);
1593
1594
0
    if (indlist == NIL)
1595
0
    {
1596
0
      splitlist = NIL;
1597
0
      break;
1598
0
    }
1599
1600
0
    bitmapqual = choose_bitmap_and(root, rel, indlist);
1601
0
    splitcost += bitmapqual->total_cost;
1602
0
    splitlist = lappend(splitlist, bitmapqual);
1603
0
  }
1604
1605
  /*
1606
   * Pick the best option.
1607
   */
1608
0
  if (splitlist == NIL)
1609
0
    return jointlist;
1610
0
  else if (jointlist == NIL)
1611
0
    return splitlist;
1612
0
  else
1613
0
    return (jointcost < splitcost) ? jointlist : splitlist;
1614
0
}
1615
1616
1617
/*
1618
 * generate_bitmap_or_paths
1619
 *    Look through the list of clauses to find OR clauses, and generate
1620
 *    a BitmapOrPath for each one we can handle that way.  Return a list
1621
 *    of the generated BitmapOrPaths.
1622
 *
1623
 * other_clauses is a list of additional clauses that can be assumed true
1624
 * for the purpose of generating indexquals, but are not to be searched for
1625
 * ORs.  (See build_paths_for_OR() for motivation.)
1626
 */
1627
static List *
1628
generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel,
1629
             List *clauses, List *other_clauses)
1630
0
{
1631
0
  List     *result = NIL;
1632
0
  List     *all_clauses;
1633
0
  ListCell   *lc;
1634
1635
  /*
1636
   * We can use both the current and other clauses as context for
1637
   * build_paths_for_OR; no need to remove ORs from the lists.
1638
   */
1639
0
  all_clauses = list_concat_copy(clauses, other_clauses);
1640
1641
0
  foreach(lc, clauses)
1642
0
  {
1643
0
    RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc);
1644
0
    List     *pathlist;
1645
0
    Path     *bitmapqual;
1646
0
    ListCell   *j;
1647
0
    List     *groupedArgs;
1648
0
    List     *inner_other_clauses = NIL;
1649
1650
    /* Ignore RestrictInfos that aren't ORs */
1651
0
    if (!restriction_is_or_clause(rinfo))
1652
0
      continue;
1653
1654
    /*
1655
     * We must be able to match at least one index to each of the arms of
1656
     * the OR, else we can't use it.
1657
     */
1658
0
    pathlist = NIL;
1659
1660
    /*
1661
     * Group the similar OR-clause arguments into dedicated RestrictInfos,
1662
     * because each of those RestrictInfos has a chance to match the index
1663
     * as a whole.
1664
     */
1665
0
    groupedArgs = group_similar_or_args(root, rel, rinfo);
1666
1667
0
    if (groupedArgs != ((BoolExpr *) rinfo->orclause)->args)
1668
0
    {
1669
      /*
1670
       * Some parts of the rinfo were probably grouped.  In this case,
1671
       * we have a set of sub-rinfos that together are an exact
1672
       * duplicate of rinfo.  Thus, we need to remove the rinfo from
1673
       * other clauses. match_clauses_to_index detects duplicated
1674
       * iclauses by comparing pointers to original rinfos that would be
1675
       * different.  So, we must delete rinfo to avoid de-facto
1676
       * duplicated clauses in the index clauses list.
1677
       */
1678
0
      inner_other_clauses = list_delete(list_copy(all_clauses), rinfo);
1679
0
    }
1680
1681
0
    foreach(j, groupedArgs)
1682
0
    {
1683
0
      Node     *orarg = (Node *) lfirst(j);
1684
0
      List     *indlist;
1685
1686
      /* OR arguments should be ANDs or sub-RestrictInfos */
1687
0
      if (is_andclause(orarg))
1688
0
      {
1689
0
        List     *andargs = ((BoolExpr *) orarg)->args;
1690
1691
0
        indlist = build_paths_for_OR(root, rel,
1692
0
                       andargs,
1693
0
                       all_clauses);
1694
1695
        /* Recurse in case there are sub-ORs */
1696
0
        indlist = list_concat(indlist,
1697
0
                    generate_bitmap_or_paths(root, rel,
1698
0
                                 andargs,
1699
0
                                 all_clauses));
1700
0
      }
1701
0
      else if (restriction_is_or_clause(castNode(RestrictInfo, orarg)))
1702
0
      {
1703
0
        RestrictInfo *ri = castNode(RestrictInfo, orarg);
1704
1705
        /*
1706
         * Generate bitmap paths for the group of similar OR-clause
1707
         * arguments.
1708
         */
1709
0
        indlist = make_bitmap_paths_for_or_group(root,
1710
0
                             rel, ri,
1711
0
                             inner_other_clauses);
1712
1713
0
        if (indlist == NIL)
1714
0
        {
1715
0
          pathlist = NIL;
1716
0
          break;
1717
0
        }
1718
0
        else
1719
0
        {
1720
0
          pathlist = list_concat(pathlist, indlist);
1721
0
          continue;
1722
0
        }
1723
0
      }
1724
0
      else
1725
0
      {
1726
0
        RestrictInfo *ri = castNode(RestrictInfo, orarg);
1727
0
        List     *orargs;
1728
1729
0
        orargs = list_make1(ri);
1730
1731
0
        indlist = build_paths_for_OR(root, rel,
1732
0
                       orargs,
1733
0
                       all_clauses);
1734
0
      }
1735
1736
      /*
1737
       * If nothing matched this arm, we can't do anything with this OR
1738
       * clause.
1739
       */
1740
0
      if (indlist == NIL)
1741
0
      {
1742
0
        pathlist = NIL;
1743
0
        break;
1744
0
      }
1745
1746
      /*
1747
       * OK, pick the most promising AND combination, and add it to
1748
       * pathlist.
1749
       */
1750
0
      bitmapqual = choose_bitmap_and(root, rel, indlist);
1751
0
      pathlist = lappend(pathlist, bitmapqual);
1752
0
    }
1753
1754
0
    if (inner_other_clauses != NIL)
1755
0
      list_free(inner_other_clauses);
1756
1757
    /*
1758
     * If we have a match for every arm, then turn them into a
1759
     * BitmapOrPath, and add to result list.
1760
     */
1761
0
    if (pathlist != NIL)
1762
0
    {
1763
0
      bitmapqual = (Path *) create_bitmap_or_path(root, rel, pathlist);
1764
0
      result = lappend(result, bitmapqual);
1765
0
    }
1766
0
  }
1767
1768
0
  return result;
1769
0
}
1770
1771
1772
/*
1773
 * choose_bitmap_and
1774
 *    Given a nonempty list of bitmap paths, AND them into one path.
1775
 *
1776
 * This is a nontrivial decision since we can legally use any subset of the
1777
 * given path set.  We want to choose a good tradeoff between selectivity
1778
 * and cost of computing the bitmap.
1779
 *
1780
 * The result is either a single one of the inputs, or a BitmapAndPath
1781
 * combining multiple inputs.
1782
 */
1783
static Path *
1784
choose_bitmap_and(PlannerInfo *root, RelOptInfo *rel, List *paths)
1785
0
{
1786
0
  int     npaths = list_length(paths);
1787
0
  PathClauseUsage **pathinfoarray;
1788
0
  PathClauseUsage *pathinfo;
1789
0
  List     *clauselist;
1790
0
  List     *bestpaths = NIL;
1791
0
  Cost    bestcost = 0;
1792
0
  int     i,
1793
0
        j;
1794
0
  ListCell   *l;
1795
1796
0
  Assert(npaths > 0);     /* else caller error */
1797
0
  if (npaths == 1)
1798
0
    return (Path *) linitial(paths);  /* easy case */
1799
1800
  /*
1801
   * In theory we should consider every nonempty subset of the given paths.
1802
   * In practice that seems like overkill, given the crude nature of the
1803
   * estimates, not to mention the possible effects of higher-level AND and
1804
   * OR clauses.  Moreover, it's completely impractical if there are a large
1805
   * number of paths, since the work would grow as O(2^N).
1806
   *
1807
   * As a heuristic, we first check for paths using exactly the same sets of
1808
   * WHERE clauses + index predicate conditions, and reject all but the
1809
   * cheapest-to-scan in any such group.  This primarily gets rid of indexes
1810
   * that include the interesting columns but also irrelevant columns.  (In
1811
   * situations where the DBA has gone overboard on creating variant
1812
   * indexes, this can make for a very large reduction in the number of
1813
   * paths considered further.)
1814
   *
1815
   * We then sort the surviving paths with the cheapest-to-scan first, and
1816
   * for each path, consider using that path alone as the basis for a bitmap
1817
   * scan.  Then we consider bitmap AND scans formed from that path plus
1818
   * each subsequent (higher-cost) path, adding on a subsequent path if it
1819
   * results in a reduction in the estimated total scan cost. This means we
1820
   * consider about O(N^2) rather than O(2^N) path combinations, which is
1821
   * quite tolerable, especially given than N is usually reasonably small
1822
   * because of the prefiltering step.  The cheapest of these is returned.
1823
   *
1824
   * We will only consider AND combinations in which no two indexes use the
1825
   * same WHERE clause.  This is a bit of a kluge: it's needed because
1826
   * costsize.c and clausesel.c aren't very smart about redundant clauses.
1827
   * They will usually double-count the redundant clauses, producing a
1828
   * too-small selectivity that makes a redundant AND step look like it
1829
   * reduces the total cost.  Perhaps someday that code will be smarter and
1830
   * we can remove this limitation.  (But note that this also defends
1831
   * against flat-out duplicate input paths, which can happen because
1832
   * match_join_clauses_to_index will find the same OR join clauses that
1833
   * extract_restriction_or_clauses has pulled OR restriction clauses out
1834
   * of.)
1835
   *
1836
   * For the same reason, we reject AND combinations in which an index
1837
   * predicate clause duplicates another clause.  Here we find it necessary
1838
   * to be even stricter: we'll reject a partial index if any of its
1839
   * predicate clauses are implied by the set of WHERE clauses and predicate
1840
   * clauses used so far.  This covers cases such as a condition "x = 42"
1841
   * used with a plain index, followed by a clauseless scan of a partial
1842
   * index "WHERE x >= 40 AND x < 50".  The partial index has been accepted
1843
   * only because "x = 42" was present, and so allowing it would partially
1844
   * double-count selectivity.  (We could use predicate_implied_by on
1845
   * regular qual clauses too, to have a more intelligent, but much more
1846
   * expensive, check for redundancy --- but in most cases simple equality
1847
   * seems to suffice.)
1848
   */
1849
1850
  /*
1851
   * Extract clause usage info and detect any paths that use exactly the
1852
   * same set of clauses; keep only the cheapest-to-scan of any such groups.
1853
   * The surviving paths are put into an array for qsort'ing.
1854
   */
1855
0
  pathinfoarray = (PathClauseUsage **)
1856
0
    palloc(npaths * sizeof(PathClauseUsage *));
1857
0
  clauselist = NIL;
1858
0
  npaths = 0;
1859
0
  foreach(l, paths)
1860
0
  {
1861
0
    Path     *ipath = (Path *) lfirst(l);
1862
1863
0
    pathinfo = classify_index_clause_usage(ipath, &clauselist);
1864
1865
    /* If it's unclassifiable, treat it as distinct from all others */
1866
0
    if (pathinfo->unclassifiable)
1867
0
    {
1868
0
      pathinfoarray[npaths++] = pathinfo;
1869
0
      continue;
1870
0
    }
1871
1872
0
    for (i = 0; i < npaths; i++)
1873
0
    {
1874
0
      if (!pathinfoarray[i]->unclassifiable &&
1875
0
        bms_equal(pathinfo->clauseids, pathinfoarray[i]->clauseids))
1876
0
        break;
1877
0
    }
1878
0
    if (i < npaths)
1879
0
    {
1880
      /* duplicate clauseids, keep the cheaper one */
1881
0
      Cost    ncost;
1882
0
      Cost    ocost;
1883
0
      Selectivity nselec;
1884
0
      Selectivity oselec;
1885
1886
0
      cost_bitmap_tree_node(pathinfo->path, &ncost, &nselec);
1887
0
      cost_bitmap_tree_node(pathinfoarray[i]->path, &ocost, &oselec);
1888
0
      if (ncost < ocost)
1889
0
        pathinfoarray[i] = pathinfo;
1890
0
    }
1891
0
    else
1892
0
    {
1893
      /* not duplicate clauseids, add to array */
1894
0
      pathinfoarray[npaths++] = pathinfo;
1895
0
    }
1896
0
  }
1897
1898
  /* If only one surviving path, we're done */
1899
0
  if (npaths == 1)
1900
0
    return pathinfoarray[0]->path;
1901
1902
  /* Sort the surviving paths by index access cost */
1903
0
  qsort(pathinfoarray, npaths, sizeof(PathClauseUsage *),
1904
0
      path_usage_comparator);
1905
1906
  /*
1907
   * For each surviving index, consider it as an "AND group leader", and see
1908
   * whether adding on any of the later indexes results in an AND path with
1909
   * cheaper total cost than before.  Then take the cheapest AND group.
1910
   *
1911
   * Note: paths that are either clauseless or unclassifiable will have
1912
   * empty clauseids, so that they will not be rejected by the clauseids
1913
   * filter here, nor will they cause later paths to be rejected by it.
1914
   */
1915
0
  for (i = 0; i < npaths; i++)
1916
0
  {
1917
0
    Cost    costsofar;
1918
0
    List     *qualsofar;
1919
0
    Bitmapset  *clauseidsofar;
1920
1921
0
    pathinfo = pathinfoarray[i];
1922
0
    paths = list_make1(pathinfo->path);
1923
0
    costsofar = bitmap_scan_cost_est(root, rel, pathinfo->path);
1924
0
    qualsofar = list_concat_copy(pathinfo->quals, pathinfo->preds);
1925
0
    clauseidsofar = bms_copy(pathinfo->clauseids);
1926
1927
0
    for (j = i + 1; j < npaths; j++)
1928
0
    {
1929
0
      Cost    newcost;
1930
1931
0
      pathinfo = pathinfoarray[j];
1932
      /* Check for redundancy */
1933
0
      if (bms_overlap(pathinfo->clauseids, clauseidsofar))
1934
0
        continue;   /* consider it redundant */
1935
0
      if (pathinfo->preds)
1936
0
      {
1937
0
        bool    redundant = false;
1938
1939
        /* we check each predicate clause separately */
1940
0
        foreach(l, pathinfo->preds)
1941
0
        {
1942
0
          Node     *np = (Node *) lfirst(l);
1943
1944
0
          if (predicate_implied_by(list_make1(np), qualsofar, false))
1945
0
          {
1946
0
            redundant = true;
1947
0
            break;  /* out of inner foreach loop */
1948
0
          }
1949
0
        }
1950
0
        if (redundant)
1951
0
          continue;
1952
0
      }
1953
      /* tentatively add new path to paths, so we can estimate cost */
1954
0
      paths = lappend(paths, pathinfo->path);
1955
0
      newcost = bitmap_and_cost_est(root, rel, paths);
1956
0
      if (newcost < costsofar)
1957
0
      {
1958
        /* keep new path in paths, update subsidiary variables */
1959
0
        costsofar = newcost;
1960
0
        qualsofar = list_concat(qualsofar, pathinfo->quals);
1961
0
        qualsofar = list_concat(qualsofar, pathinfo->preds);
1962
0
        clauseidsofar = bms_add_members(clauseidsofar,
1963
0
                        pathinfo->clauseids);
1964
0
      }
1965
0
      else
1966
0
      {
1967
        /* reject new path, remove it from paths list */
1968
0
        paths = list_truncate(paths, list_length(paths) - 1);
1969
0
      }
1970
0
    }
1971
1972
    /* Keep the cheapest AND-group (or singleton) */
1973
0
    if (i == 0 || costsofar < bestcost)
1974
0
    {
1975
0
      bestpaths = paths;
1976
0
      bestcost = costsofar;
1977
0
    }
1978
1979
    /* some easy cleanup (we don't try real hard though) */
1980
0
    list_free(qualsofar);
1981
0
  }
1982
1983
0
  if (list_length(bestpaths) == 1)
1984
0
    return (Path *) linitial(bestpaths);  /* no need for AND */
1985
0
  return (Path *) create_bitmap_and_path(root, rel, bestpaths);
1986
0
}
1987
1988
/* qsort comparator to sort in increasing index access cost order */
1989
static int
1990
path_usage_comparator(const void *a, const void *b)
1991
0
{
1992
0
  PathClauseUsage *pa = *(PathClauseUsage *const *) a;
1993
0
  PathClauseUsage *pb = *(PathClauseUsage *const *) b;
1994
0
  Cost    acost;
1995
0
  Cost    bcost;
1996
0
  Selectivity aselec;
1997
0
  Selectivity bselec;
1998
1999
0
  cost_bitmap_tree_node(pa->path, &acost, &aselec);
2000
0
  cost_bitmap_tree_node(pb->path, &bcost, &bselec);
2001
2002
  /*
2003
   * If costs are the same, sort by selectivity.
2004
   */
2005
0
  if (acost < bcost)
2006
0
    return -1;
2007
0
  if (acost > bcost)
2008
0
    return 1;
2009
2010
0
  if (aselec < bselec)
2011
0
    return -1;
2012
0
  if (aselec > bselec)
2013
0
    return 1;
2014
2015
0
  return 0;
2016
0
}
2017
2018
/*
2019
 * Estimate the cost of actually executing a bitmap scan with a single
2020
 * index path (which could be a BitmapAnd or BitmapOr node).
2021
 */
2022
static Cost
2023
bitmap_scan_cost_est(PlannerInfo *root, RelOptInfo *rel, Path *ipath)
2024
0
{
2025
0
  BitmapHeapPath bpath;
2026
2027
  /* Set up a dummy BitmapHeapPath */
2028
0
  bpath.path.type = T_BitmapHeapPath;
2029
0
  bpath.path.pathtype = T_BitmapHeapScan;
2030
0
  bpath.path.parent = rel;
2031
0
  bpath.path.pathtarget = rel->reltarget;
2032
0
  bpath.path.param_info = ipath->param_info;
2033
0
  bpath.path.pathkeys = NIL;
2034
0
  bpath.bitmapqual = ipath;
2035
2036
  /*
2037
   * Check the cost of temporary path without considering parallelism.
2038
   * Parallel bitmap heap path will be considered at later stage.
2039
   */
2040
0
  bpath.path.parallel_workers = 0;
2041
2042
  /* Now we can do cost_bitmap_heap_scan */
2043
0
  cost_bitmap_heap_scan(&bpath.path, root, rel,
2044
0
              bpath.path.param_info,
2045
0
              ipath,
2046
0
              get_loop_count(root, rel->relid,
2047
0
                     PATH_REQ_OUTER(ipath)));
2048
2049
0
  return bpath.path.total_cost;
2050
0
}
2051
2052
/*
2053
 * Estimate the cost of actually executing a BitmapAnd scan with the given
2054
 * inputs.
2055
 */
2056
static Cost
2057
bitmap_and_cost_est(PlannerInfo *root, RelOptInfo *rel, List *paths)
2058
0
{
2059
0
  BitmapAndPath *apath;
2060
2061
  /*
2062
   * Might as well build a real BitmapAndPath here, as the work is slightly
2063
   * too complicated to be worth repeating just to save one palloc.
2064
   */
2065
0
  apath = create_bitmap_and_path(root, rel, paths);
2066
2067
0
  return bitmap_scan_cost_est(root, rel, (Path *) apath);
2068
0
}
2069
2070
2071
/*
2072
 * classify_index_clause_usage
2073
 *    Construct a PathClauseUsage struct describing the WHERE clauses and
2074
 *    index predicate clauses used by the given indexscan path.
2075
 *    We consider two clauses the same if they are equal().
2076
 *
2077
 * At some point we might want to migrate this info into the Path data
2078
 * structure proper, but for the moment it's only needed within
2079
 * choose_bitmap_and().
2080
 *
2081
 * *clauselist is used and expanded as needed to identify all the distinct
2082
 * clauses seen across successive calls.  Caller must initialize it to NIL
2083
 * before first call of a set.
2084
 */
2085
static PathClauseUsage *
2086
classify_index_clause_usage(Path *path, List **clauselist)
2087
0
{
2088
0
  PathClauseUsage *result;
2089
0
  Bitmapset  *clauseids;
2090
0
  ListCell   *lc;
2091
2092
0
  result = (PathClauseUsage *) palloc(sizeof(PathClauseUsage));
2093
0
  result->path = path;
2094
2095
  /* Recursively find the quals and preds used by the path */
2096
0
  result->quals = NIL;
2097
0
  result->preds = NIL;
2098
0
  find_indexpath_quals(path, &result->quals, &result->preds);
2099
2100
  /*
2101
   * Some machine-generated queries have outlandish numbers of qual clauses.
2102
   * To avoid getting into O(N^2) behavior even in this preliminary
2103
   * classification step, we want to limit the number of entries we can
2104
   * accumulate in *clauselist.  Treat any path with more than 100 quals +
2105
   * preds as unclassifiable, which will cause calling code to consider it
2106
   * distinct from all other paths.
2107
   */
2108
0
  if (list_length(result->quals) + list_length(result->preds) > 100)
2109
0
  {
2110
0
    result->clauseids = NULL;
2111
0
    result->unclassifiable = true;
2112
0
    return result;
2113
0
  }
2114
2115
  /* Build up a bitmapset representing the quals and preds */
2116
0
  clauseids = NULL;
2117
0
  foreach(lc, result->quals)
2118
0
  {
2119
0
    Node     *node = (Node *) lfirst(lc);
2120
2121
0
    clauseids = bms_add_member(clauseids,
2122
0
                   find_list_position(node, clauselist));
2123
0
  }
2124
0
  foreach(lc, result->preds)
2125
0
  {
2126
0
    Node     *node = (Node *) lfirst(lc);
2127
2128
0
    clauseids = bms_add_member(clauseids,
2129
0
                   find_list_position(node, clauselist));
2130
0
  }
2131
0
  result->clauseids = clauseids;
2132
0
  result->unclassifiable = false;
2133
2134
0
  return result;
2135
0
}
2136
2137
2138
/*
2139
 * find_indexpath_quals
2140
 *
2141
 * Given the Path structure for a plain or bitmap indexscan, extract lists
2142
 * of all the index clauses and index predicate conditions used in the Path.
2143
 * These are appended to the initial contents of *quals and *preds (hence
2144
 * caller should initialize those to NIL).
2145
 *
2146
 * Note we are not trying to produce an accurate representation of the AND/OR
2147
 * semantics of the Path, but just find out all the base conditions used.
2148
 *
2149
 * The result lists contain pointers to the expressions used in the Path,
2150
 * but all the list cells are freshly built, so it's safe to destructively
2151
 * modify the lists (eg, by concat'ing with other lists).
2152
 */
2153
static void
2154
find_indexpath_quals(Path *bitmapqual, List **quals, List **preds)
2155
0
{
2156
0
  if (IsA(bitmapqual, BitmapAndPath))
2157
0
  {
2158
0
    BitmapAndPath *apath = (BitmapAndPath *) bitmapqual;
2159
0
    ListCell   *l;
2160
2161
0
    foreach(l, apath->bitmapquals)
2162
0
    {
2163
0
      find_indexpath_quals((Path *) lfirst(l), quals, preds);
2164
0
    }
2165
0
  }
2166
0
  else if (IsA(bitmapqual, BitmapOrPath))
2167
0
  {
2168
0
    BitmapOrPath *opath = (BitmapOrPath *) bitmapqual;
2169
0
    ListCell   *l;
2170
2171
0
    foreach(l, opath->bitmapquals)
2172
0
    {
2173
0
      find_indexpath_quals((Path *) lfirst(l), quals, preds);
2174
0
    }
2175
0
  }
2176
0
  else if (IsA(bitmapqual, IndexPath))
2177
0
  {
2178
0
    IndexPath  *ipath = (IndexPath *) bitmapqual;
2179
0
    ListCell   *l;
2180
2181
0
    foreach(l, ipath->indexclauses)
2182
0
    {
2183
0
      IndexClause *iclause = (IndexClause *) lfirst(l);
2184
2185
0
      *quals = lappend(*quals, iclause->rinfo->clause);
2186
0
    }
2187
0
    *preds = list_concat(*preds, ipath->indexinfo->indpred);
2188
0
  }
2189
0
  else
2190
0
    elog(ERROR, "unrecognized node type: %d", nodeTag(bitmapqual));
2191
0
}
2192
2193
2194
/*
2195
 * find_list_position
2196
 *    Return the given node's position (counting from 0) in the given
2197
 *    list of nodes.  If it's not equal() to any existing list member,
2198
 *    add it at the end, and return that position.
2199
 */
2200
static int
2201
find_list_position(Node *node, List **nodelist)
2202
0
{
2203
0
  int     i;
2204
0
  ListCell   *lc;
2205
2206
0
  i = 0;
2207
0
  foreach(lc, *nodelist)
2208
0
  {
2209
0
    Node     *oldnode = (Node *) lfirst(lc);
2210
2211
0
    if (equal(node, oldnode))
2212
0
      return i;
2213
0
    i++;
2214
0
  }
2215
2216
0
  *nodelist = lappend(*nodelist, node);
2217
2218
0
  return i;
2219
0
}
2220
2221
2222
/*
2223
 * check_index_only
2224
 *    Determine whether an index-only scan is possible for this index.
2225
 */
2226
static bool
2227
check_index_only(RelOptInfo *rel, IndexOptInfo *index)
2228
0
{
2229
0
  bool    result;
2230
0
  Bitmapset  *attrs_used = NULL;
2231
0
  Bitmapset  *index_canreturn_attrs = NULL;
2232
0
  ListCell   *lc;
2233
0
  int     i;
2234
2235
  /* Index-only scans must be enabled */
2236
0
  if (!enable_indexonlyscan)
2237
0
    return false;
2238
2239
  /*
2240
   * Check that all needed attributes of the relation are available from the
2241
   * index.
2242
   */
2243
2244
  /*
2245
   * First, identify all the attributes needed for joins or final output.
2246
   * Note: we must look at rel's targetlist, not the attr_needed data,
2247
   * because attr_needed isn't computed for inheritance child rels.
2248
   */
2249
0
  pull_varattnos((Node *) rel->reltarget->exprs, rel->relid, &attrs_used);
2250
2251
  /*
2252
   * Add all the attributes used by restriction clauses; but consider only
2253
   * those clauses not implied by the index predicate, since ones that are
2254
   * so implied don't need to be checked explicitly in the plan.
2255
   *
2256
   * Note: attributes used only in index quals would not be needed at
2257
   * runtime either, if we are certain that the index is not lossy.  However
2258
   * it'd be complicated to account for that accurately, and it doesn't
2259
   * matter in most cases, since we'd conclude that such attributes are
2260
   * available from the index anyway.
2261
   */
2262
0
  foreach(lc, index->indrestrictinfo)
2263
0
  {
2264
0
    RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
2265
2266
0
    pull_varattnos((Node *) rinfo->clause, rel->relid, &attrs_used);
2267
0
  }
2268
2269
  /*
2270
   * Construct a bitmapset of columns that the index can return back in an
2271
   * index-only scan.
2272
   */
2273
0
  for (i = 0; i < index->ncolumns; i++)
2274
0
  {
2275
0
    int     attno = index->indexkeys[i];
2276
2277
    /*
2278
     * For the moment, we just ignore index expressions.  It might be nice
2279
     * to do something with them, later.
2280
     */
2281
0
    if (attno == 0)
2282
0
      continue;
2283
2284
0
    if (index->canreturn[i])
2285
0
      index_canreturn_attrs =
2286
0
        bms_add_member(index_canreturn_attrs,
2287
0
                 attno - FirstLowInvalidHeapAttributeNumber);
2288
0
  }
2289
2290
  /* Do we have all the necessary attributes? */
2291
0
  result = bms_is_subset(attrs_used, index_canreturn_attrs);
2292
2293
0
  bms_free(attrs_used);
2294
0
  bms_free(index_canreturn_attrs);
2295
2296
0
  return result;
2297
0
}
2298
2299
/*
2300
 * get_loop_count
2301
 *    Choose the loop count estimate to use for costing a parameterized path
2302
 *    with the given set of outer relids.
2303
 *
2304
 * Since we produce parameterized paths before we've begun to generate join
2305
 * relations, it's impossible to predict exactly how many times a parameterized
2306
 * path will be iterated; we don't know the size of the relation that will be
2307
 * on the outside of the nestloop.  However, we should try to account for
2308
 * multiple iterations somehow in costing the path.  The heuristic embodied
2309
 * here is to use the rowcount of the smallest other base relation needed in
2310
 * the join clauses used by the path.  (We could alternatively consider the
2311
 * largest one, but that seems too optimistic.)  This is of course the right
2312
 * answer for single-other-relation cases, and it seems like a reasonable
2313
 * zero-order approximation for multiway-join cases.
2314
 *
2315
 * In addition, we check to see if the other side of each join clause is on
2316
 * the inside of some semijoin that the current relation is on the outside of.
2317
 * If so, the only way that a parameterized path could be used is if the
2318
 * semijoin RHS has been unique-ified, so we should use the number of unique
2319
 * RHS rows rather than using the relation's raw rowcount.
2320
 *
2321
 * Note: for this to work, allpaths.c must establish all baserel size
2322
 * estimates before it begins to compute paths, or at least before it
2323
 * calls create_index_paths().
2324
 */
2325
static double
2326
get_loop_count(PlannerInfo *root, Index cur_relid, Relids outer_relids)
2327
0
{
2328
0
  double    result;
2329
0
  int     outer_relid;
2330
2331
  /* For a non-parameterized path, just return 1.0 quickly */
2332
0
  if (outer_relids == NULL)
2333
0
    return 1.0;
2334
2335
0
  result = 0.0;
2336
0
  outer_relid = -1;
2337
0
  while ((outer_relid = bms_next_member(outer_relids, outer_relid)) >= 0)
2338
0
  {
2339
0
    RelOptInfo *outer_rel;
2340
0
    double    rowcount;
2341
2342
    /* Paranoia: ignore bogus relid indexes */
2343
0
    if (outer_relid >= root->simple_rel_array_size)
2344
0
      continue;
2345
0
    outer_rel = root->simple_rel_array[outer_relid];
2346
0
    if (outer_rel == NULL)
2347
0
      continue;
2348
0
    Assert(outer_rel->relid == outer_relid);  /* sanity check on array */
2349
2350
    /* Other relation could be proven empty, if so ignore */
2351
0
    if (IS_DUMMY_REL(outer_rel))
2352
0
      continue;
2353
2354
    /* Otherwise, rel's rows estimate should be valid by now */
2355
0
    Assert(outer_rel->rows > 0);
2356
2357
    /* Check to see if rel is on the inside of any semijoins */
2358
0
    rowcount = adjust_rowcount_for_semijoins(root,
2359
0
                         cur_relid,
2360
0
                         outer_relid,
2361
0
                         outer_rel->rows);
2362
2363
    /* Remember smallest row count estimate among the outer rels */
2364
0
    if (result == 0.0 || result > rowcount)
2365
0
      result = rowcount;
2366
0
  }
2367
  /* Return 1.0 if we found no valid relations (shouldn't happen) */
2368
0
  return (result > 0.0) ? result : 1.0;
2369
0
}
2370
2371
/*
2372
 * Check to see if outer_relid is on the inside of any semijoin that cur_relid
2373
 * is on the outside of.  If so, replace rowcount with the estimated number of
2374
 * unique rows from the semijoin RHS (assuming that's smaller, which it might
2375
 * not be).  The estimate is crude but it's the best we can do at this stage
2376
 * of the proceedings.
2377
 */
2378
static double
2379
adjust_rowcount_for_semijoins(PlannerInfo *root,
2380
                Index cur_relid,
2381
                Index outer_relid,
2382
                double rowcount)
2383
0
{
2384
0
  ListCell   *lc;
2385
2386
0
  foreach(lc, root->join_info_list)
2387
0
  {
2388
0
    SpecialJoinInfo *sjinfo = (SpecialJoinInfo *) lfirst(lc);
2389
2390
0
    if (sjinfo->jointype == JOIN_SEMI &&
2391
0
      bms_is_member(cur_relid, sjinfo->syn_lefthand) &&
2392
0
      bms_is_member(outer_relid, sjinfo->syn_righthand))
2393
0
    {
2394
      /* Estimate number of unique-ified rows */
2395
0
      double    nraw;
2396
0
      double    nunique;
2397
2398
0
      nraw = approximate_joinrel_size(root, sjinfo->syn_righthand);
2399
0
      nunique = estimate_num_groups(root,
2400
0
                      sjinfo->semi_rhs_exprs,
2401
0
                      nraw,
2402
0
                      NULL,
2403
0
                      NULL);
2404
0
      if (rowcount > nunique)
2405
0
        rowcount = nunique;
2406
0
    }
2407
0
  }
2408
0
  return rowcount;
2409
0
}
2410
2411
/*
2412
 * Make an approximate estimate of the size of a joinrel.
2413
 *
2414
 * We don't have enough info at this point to get a good estimate, so we
2415
 * just multiply the base relation sizes together.  Fortunately, this is
2416
 * the right answer anyway for the most common case with a single relation
2417
 * on the RHS of a semijoin.  Also, estimate_num_groups() has only a weak
2418
 * dependency on its input_rows argument (it basically uses it as a clamp).
2419
 * So we might be able to get a fairly decent end result even with a severe
2420
 * overestimate of the RHS's raw size.
2421
 */
2422
static double
2423
approximate_joinrel_size(PlannerInfo *root, Relids relids)
2424
0
{
2425
0
  double    rowcount = 1.0;
2426
0
  int     relid;
2427
2428
0
  relid = -1;
2429
0
  while ((relid = bms_next_member(relids, relid)) >= 0)
2430
0
  {
2431
0
    RelOptInfo *rel;
2432
2433
    /* Paranoia: ignore bogus relid indexes */
2434
0
    if (relid >= root->simple_rel_array_size)
2435
0
      continue;
2436
0
    rel = root->simple_rel_array[relid];
2437
0
    if (rel == NULL)
2438
0
      continue;
2439
0
    Assert(rel->relid == relid);  /* sanity check on array */
2440
2441
    /* Relation could be proven empty, if so ignore */
2442
0
    if (IS_DUMMY_REL(rel))
2443
0
      continue;
2444
2445
    /* Otherwise, rel's rows estimate should be valid by now */
2446
0
    Assert(rel->rows > 0);
2447
2448
    /* Accumulate product */
2449
0
    rowcount *= rel->rows;
2450
0
  }
2451
0
  return rowcount;
2452
0
}
2453
2454
2455
/****************************************************************************
2456
 *        ----  ROUTINES TO CHECK QUERY CLAUSES  ----
2457
 ****************************************************************************/
2458
2459
/*
2460
 * match_restriction_clauses_to_index
2461
 *    Identify restriction clauses for the rel that match the index.
2462
 *    Matching clauses are added to *clauseset.
2463
 */
2464
static void
2465
match_restriction_clauses_to_index(PlannerInfo *root,
2466
                   IndexOptInfo *index,
2467
                   IndexClauseSet *clauseset)
2468
0
{
2469
  /* We can ignore clauses that are implied by the index predicate */
2470
0
  match_clauses_to_index(root, index->indrestrictinfo, index, clauseset);
2471
0
}
2472
2473
/*
2474
 * match_join_clauses_to_index
2475
 *    Identify join clauses for the rel that match the index.
2476
 *    Matching clauses are added to *clauseset.
2477
 *    Also, add any potentially usable join OR clauses to *joinorclauses.
2478
 *    They also might be processed by match_clause_to_index() as a whole.
2479
 */
2480
static void
2481
match_join_clauses_to_index(PlannerInfo *root,
2482
              RelOptInfo *rel, IndexOptInfo *index,
2483
              IndexClauseSet *clauseset,
2484
              List **joinorclauses)
2485
0
{
2486
0
  ListCell   *lc;
2487
2488
  /* Scan the rel's join clauses */
2489
0
  foreach(lc, rel->joininfo)
2490
0
  {
2491
0
    RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
2492
2493
    /* Check if clause can be moved to this rel */
2494
0
    if (!join_clause_is_movable_to(rinfo, rel))
2495
0
      continue;
2496
2497
    /*
2498
     * Potentially usable, so see if it matches the index or is an OR. Use
2499
     * list_append_unique_ptr() here to avoid possible duplicates when
2500
     * processing the same clauses with different indexes.
2501
     */
2502
0
    if (restriction_is_or_clause(rinfo))
2503
0
      *joinorclauses = list_append_unique_ptr(*joinorclauses, rinfo);
2504
2505
0
    match_clause_to_index(root, rinfo, index, clauseset);
2506
0
  }
2507
0
}
2508
2509
/*
2510
 * match_eclass_clauses_to_index
2511
 *    Identify EquivalenceClass join clauses for the rel that match the index.
2512
 *    Matching clauses are added to *clauseset.
2513
 */
2514
static void
2515
match_eclass_clauses_to_index(PlannerInfo *root, IndexOptInfo *index,
2516
                IndexClauseSet *clauseset)
2517
0
{
2518
0
  int     indexcol;
2519
2520
  /* No work if rel is not in any such ECs */
2521
0
  if (!index->rel->has_eclass_joins)
2522
0
    return;
2523
2524
0
  for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++)
2525
0
  {
2526
0
    ec_member_matches_arg arg;
2527
0
    List     *clauses;
2528
2529
    /* Generate clauses, skipping any that join to lateral_referencers */
2530
0
    arg.index = index;
2531
0
    arg.indexcol = indexcol;
2532
0
    clauses = generate_implied_equalities_for_column(root,
2533
0
                             index->rel,
2534
0
                             ec_member_matches_indexcol,
2535
0
                             &arg,
2536
0
                             index->rel->lateral_referencers);
2537
2538
    /*
2539
     * We have to check whether the results actually do match the index,
2540
     * since for non-btree indexes the EC's equality operators might not
2541
     * be in the index opclass (cf ec_member_matches_indexcol).
2542
     */
2543
0
    match_clauses_to_index(root, clauses, index, clauseset);
2544
0
  }
2545
0
}
2546
2547
/*
2548
 * match_clauses_to_index
2549
 *    Perform match_clause_to_index() for each clause in a list.
2550
 *    Matching clauses are added to *clauseset.
2551
 */
2552
static void
2553
match_clauses_to_index(PlannerInfo *root,
2554
             List *clauses,
2555
             IndexOptInfo *index,
2556
             IndexClauseSet *clauseset)
2557
0
{
2558
0
  ListCell   *lc;
2559
2560
0
  foreach(lc, clauses)
2561
0
  {
2562
0
    RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc);
2563
2564
0
    match_clause_to_index(root, rinfo, index, clauseset);
2565
0
  }
2566
0
}
2567
2568
/*
2569
 * match_clause_to_index
2570
 *    Test whether a qual clause can be used with an index.
2571
 *
2572
 * If the clause is usable, add an IndexClause entry for it to the appropriate
2573
 * list in *clauseset.  (*clauseset must be initialized to zeroes before first
2574
 * call.)
2575
 *
2576
 * Note: in some circumstances we may find the same RestrictInfos coming from
2577
 * multiple places.  Defend against redundant outputs by refusing to add a
2578
 * clause twice (pointer equality should be a good enough check for this).
2579
 *
2580
 * Note: it's possible that a badly-defined index could have multiple matching
2581
 * columns.  We always select the first match if so; this avoids scenarios
2582
 * wherein we get an inflated idea of the index's selectivity by using the
2583
 * same clause multiple times with different index columns.
2584
 */
2585
static void
2586
match_clause_to_index(PlannerInfo *root,
2587
            RestrictInfo *rinfo,
2588
            IndexOptInfo *index,
2589
            IndexClauseSet *clauseset)
2590
0
{
2591
0
  int     indexcol;
2592
2593
  /*
2594
   * Never match pseudoconstants to indexes.  (Normally a match could not
2595
   * happen anyway, since a pseudoconstant clause couldn't contain a Var,
2596
   * but what if someone builds an expression index on a constant? It's not
2597
   * totally unreasonable to do so with a partial index, either.)
2598
   */
2599
0
  if (rinfo->pseudoconstant)
2600
0
    return;
2601
2602
  /*
2603
   * If clause can't be used as an indexqual because it must wait till after
2604
   * some lower-security-level restriction clause, reject it.
2605
   */
2606
0
  if (!restriction_is_securely_promotable(rinfo, index->rel))
2607
0
    return;
2608
2609
  /* OK, check each index key column for a match */
2610
0
  for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++)
2611
0
  {
2612
0
    IndexClause *iclause;
2613
0
    ListCell   *lc;
2614
2615
    /* Ignore duplicates */
2616
0
    foreach(lc, clauseset->indexclauses[indexcol])
2617
0
    {
2618
0
      iclause = (IndexClause *) lfirst(lc);
2619
2620
0
      if (iclause->rinfo == rinfo)
2621
0
        return;
2622
0
    }
2623
2624
    /* OK, try to match the clause to the index column */
2625
0
    iclause = match_clause_to_indexcol(root,
2626
0
                       rinfo,
2627
0
                       indexcol,
2628
0
                       index);
2629
0
    if (iclause)
2630
0
    {
2631
      /* Success, so record it */
2632
0
      clauseset->indexclauses[indexcol] =
2633
0
        lappend(clauseset->indexclauses[indexcol], iclause);
2634
0
      clauseset->nonempty = true;
2635
0
      return;
2636
0
    }
2637
0
  }
2638
0
}
2639
2640
/*
2641
 * match_clause_to_indexcol()
2642
 *    Determine whether a restriction clause matches a column of an index,
2643
 *    and if so, build an IndexClause node describing the details.
2644
 *
2645
 *    To match an index normally, an operator clause:
2646
 *
2647
 *    (1)  must be in the form (indexkey op const) or (const op indexkey);
2648
 *       and
2649
 *    (2)  must contain an operator which is in the index's operator family
2650
 *       for this column; and
2651
 *    (3)  must match the collation of the index, if collation is relevant.
2652
 *
2653
 *    Our definition of "const" is exceedingly liberal: we allow anything that
2654
 *    doesn't involve a volatile function or a Var of the index's relation.
2655
 *    In particular, Vars belonging to other relations of the query are
2656
 *    accepted here, since a clause of that form can be used in a
2657
 *    parameterized indexscan.  It's the responsibility of higher code levels
2658
 *    to manage restriction and join clauses appropriately.
2659
 *
2660
 *    Note: we do need to check for Vars of the index's relation on the
2661
 *    "const" side of the clause, since clauses like (a.f1 OP (b.f2 OP a.f3))
2662
 *    are not processable by a parameterized indexscan on a.f1, whereas
2663
 *    something like (a.f1 OP (b.f2 OP c.f3)) is.
2664
 *
2665
 *    Presently, the executor can only deal with indexquals that have the
2666
 *    indexkey on the left, so we can only use clauses that have the indexkey
2667
 *    on the right if we can commute the clause to put the key on the left.
2668
 *    We handle that by generating an IndexClause with the correctly-commuted
2669
 *    opclause as a derived indexqual.
2670
 *
2671
 *    If the index has a collation, the clause must have the same collation.
2672
 *    For collation-less indexes, we assume it doesn't matter; this is
2673
 *    necessary for cases like "hstore ? text", wherein hstore's operators
2674
 *    don't care about collation but the clause will get marked with a
2675
 *    collation anyway because of the text argument.  (This logic is
2676
 *    embodied in the macro IndexCollMatchesExprColl.)
2677
 *
2678
 *    It is also possible to match RowCompareExpr clauses to indexes (but
2679
 *    currently, only btree indexes handle this).
2680
 *
2681
 *    It is also possible to match ScalarArrayOpExpr clauses to indexes, when
2682
 *    the clause is of the form "indexkey op ANY (arrayconst)".
2683
 *
2684
 *    It is also possible to match a list of OR clauses if it might be
2685
 *    transformed into a single ScalarArrayOpExpr clause.  On success,
2686
 *    the returning index clause will contain a transformed clause.
2687
 *
2688
 *    For boolean indexes, it is also possible to match the clause directly
2689
 *    to the indexkey; or perhaps the clause is (NOT indexkey).
2690
 *
2691
 *    And, last but not least, some operators and functions can be processed
2692
 *    to derive (typically lossy) indexquals from a clause that isn't in
2693
 *    itself indexable.  If we see that any operand of an OpExpr or FuncExpr
2694
 *    matches the index key, and the function has a planner support function
2695
 *    attached to it, we'll invoke the support function to see if such an
2696
 *    indexqual can be built.
2697
 *
2698
 * 'rinfo' is the clause to be tested (as a RestrictInfo node).
2699
 * 'indexcol' is a column number of 'index' (counting from 0).
2700
 * 'index' is the index of interest.
2701
 *
2702
 * Returns an IndexClause if the clause can be used with this index key,
2703
 * or NULL if not.
2704
 *
2705
 * NOTE:  This routine always returns NULL if the clause is an AND clause.
2706
 * Higher-level routines deal with OR and AND clauses. OR clause can be
2707
 * matched as a whole by match_orclause_to_indexcol() though.
2708
 */
2709
static IndexClause *
2710
match_clause_to_indexcol(PlannerInfo *root,
2711
             RestrictInfo *rinfo,
2712
             int indexcol,
2713
             IndexOptInfo *index)
2714
0
{
2715
0
  IndexClause *iclause;
2716
0
  Expr     *clause = rinfo->clause;
2717
0
  Oid     opfamily;
2718
2719
0
  Assert(indexcol < index->nkeycolumns);
2720
2721
  /*
2722
   * Historically this code has coped with NULL clauses.  That's probably
2723
   * not possible anymore, but we might as well continue to cope.
2724
   */
2725
0
  if (clause == NULL)
2726
0
    return NULL;
2727
2728
  /* First check for boolean-index cases. */
2729
0
  opfamily = index->opfamily[indexcol];
2730
0
  if (IsBooleanOpfamily(opfamily))
2731
0
  {
2732
0
    iclause = match_boolean_index_clause(root, rinfo, indexcol, index);
2733
0
    if (iclause)
2734
0
      return iclause;
2735
0
  }
2736
2737
  /*
2738
   * Clause must be an opclause, funcclause, ScalarArrayOpExpr,
2739
   * RowCompareExpr, or OR-clause that could be converted to SAOP.  Or, if
2740
   * the index supports it, we can handle IS NULL/NOT NULL clauses.
2741
   */
2742
0
  if (IsA(clause, OpExpr))
2743
0
  {
2744
0
    return match_opclause_to_indexcol(root, rinfo, indexcol, index);
2745
0
  }
2746
0
  else if (IsA(clause, FuncExpr))
2747
0
  {
2748
0
    return match_funcclause_to_indexcol(root, rinfo, indexcol, index);
2749
0
  }
2750
0
  else if (IsA(clause, ScalarArrayOpExpr))
2751
0
  {
2752
0
    return match_saopclause_to_indexcol(root, rinfo, indexcol, index);
2753
0
  }
2754
0
  else if (IsA(clause, RowCompareExpr))
2755
0
  {
2756
0
    return match_rowcompare_to_indexcol(root, rinfo, indexcol, index);
2757
0
  }
2758
0
  else if (restriction_is_or_clause(rinfo))
2759
0
  {
2760
0
    return match_orclause_to_indexcol(root, rinfo, indexcol, index);
2761
0
  }
2762
0
  else if (index->amsearchnulls && IsA(clause, NullTest))
2763
0
  {
2764
0
    NullTest   *nt = (NullTest *) clause;
2765
2766
0
    if (!nt->argisrow &&
2767
0
      match_index_to_operand((Node *) nt->arg, indexcol, index))
2768
0
    {
2769
0
      iclause = makeNode(IndexClause);
2770
0
      iclause->rinfo = rinfo;
2771
0
      iclause->indexquals = list_make1(rinfo);
2772
0
      iclause->lossy = false;
2773
0
      iclause->indexcol = indexcol;
2774
0
      iclause->indexcols = NIL;
2775
0
      return iclause;
2776
0
    }
2777
0
  }
2778
2779
0
  return NULL;
2780
0
}
2781
2782
/*
2783
 * IsBooleanOpfamily
2784
 *    Detect whether an opfamily supports boolean equality as an operator.
2785
 *
2786
 * If the opfamily OID is in the range of built-in objects, we can rely
2787
 * on hard-wired knowledge of which built-in opfamilies support this.
2788
 * For extension opfamilies, there's no choice but to do a catcache lookup.
2789
 */
2790
static bool
2791
IsBooleanOpfamily(Oid opfamily)
2792
0
{
2793
0
  if (opfamily < FirstNormalObjectId)
2794
0
    return IsBuiltinBooleanOpfamily(opfamily);
2795
0
  else
2796
0
    return op_in_opfamily(BooleanEqualOperator, opfamily);
2797
0
}
2798
2799
/*
2800
 * match_boolean_index_clause
2801
 *    Recognize restriction clauses that can be matched to a boolean index.
2802
 *
2803
 * The idea here is that, for an index on a boolean column that supports the
2804
 * BooleanEqualOperator, we can transform a plain reference to the indexkey
2805
 * into "indexkey = true", or "NOT indexkey" into "indexkey = false", etc,
2806
 * so as to make the expression indexable using the index's "=" operator.
2807
 * Since Postgres 8.1, we must do this because constant simplification does
2808
 * the reverse transformation; without this code there'd be no way to use
2809
 * such an index at all.
2810
 *
2811
 * This should be called only when IsBooleanOpfamily() recognizes the
2812
 * index's operator family.  We check to see if the clause matches the
2813
 * index's key, and if so, build a suitable IndexClause.
2814
 */
2815
static IndexClause *
2816
match_boolean_index_clause(PlannerInfo *root,
2817
               RestrictInfo *rinfo,
2818
               int indexcol,
2819
               IndexOptInfo *index)
2820
0
{
2821
0
  Node     *clause = (Node *) rinfo->clause;
2822
0
  Expr     *op = NULL;
2823
2824
  /* Direct match? */
2825
0
  if (match_index_to_operand(clause, indexcol, index))
2826
0
  {
2827
    /* convert to indexkey = TRUE */
2828
0
    op = make_opclause(BooleanEqualOperator, BOOLOID, false,
2829
0
               (Expr *) clause,
2830
0
               (Expr *) makeBoolConst(true, false),
2831
0
               InvalidOid, InvalidOid);
2832
0
  }
2833
  /* NOT clause? */
2834
0
  else if (is_notclause(clause))
2835
0
  {
2836
0
    Node     *arg = (Node *) get_notclausearg((Expr *) clause);
2837
2838
0
    if (match_index_to_operand(arg, indexcol, index))
2839
0
    {
2840
      /* convert to indexkey = FALSE */
2841
0
      op = make_opclause(BooleanEqualOperator, BOOLOID, false,
2842
0
                 (Expr *) arg,
2843
0
                 (Expr *) makeBoolConst(false, false),
2844
0
                 InvalidOid, InvalidOid);
2845
0
    }
2846
0
  }
2847
2848
  /*
2849
   * Since we only consider clauses at top level of WHERE, we can convert
2850
   * indexkey IS TRUE and indexkey IS FALSE to index searches as well.  The
2851
   * different meaning for NULL isn't important.
2852
   */
2853
0
  else if (clause && IsA(clause, BooleanTest))
2854
0
  {
2855
0
    BooleanTest *btest = (BooleanTest *) clause;
2856
0
    Node     *arg = (Node *) btest->arg;
2857
2858
0
    if (btest->booltesttype == IS_TRUE &&
2859
0
      match_index_to_operand(arg, indexcol, index))
2860
0
    {
2861
      /* convert to indexkey = TRUE */
2862
0
      op = make_opclause(BooleanEqualOperator, BOOLOID, false,
2863
0
                 (Expr *) arg,
2864
0
                 (Expr *) makeBoolConst(true, false),
2865
0
                 InvalidOid, InvalidOid);
2866
0
    }
2867
0
    else if (btest->booltesttype == IS_FALSE &&
2868
0
         match_index_to_operand(arg, indexcol, index))
2869
0
    {
2870
      /* convert to indexkey = FALSE */
2871
0
      op = make_opclause(BooleanEqualOperator, BOOLOID, false,
2872
0
                 (Expr *) arg,
2873
0
                 (Expr *) makeBoolConst(false, false),
2874
0
                 InvalidOid, InvalidOid);
2875
0
    }
2876
0
  }
2877
2878
  /*
2879
   * If we successfully made an operator clause from the given qual, we must
2880
   * wrap it in an IndexClause.  It's not lossy.
2881
   */
2882
0
  if (op)
2883
0
  {
2884
0
    IndexClause *iclause = makeNode(IndexClause);
2885
2886
0
    iclause->rinfo = rinfo;
2887
0
    iclause->indexquals = list_make1(make_simple_restrictinfo(root, op));
2888
0
    iclause->lossy = false;
2889
0
    iclause->indexcol = indexcol;
2890
0
    iclause->indexcols = NIL;
2891
0
    return iclause;
2892
0
  }
2893
2894
0
  return NULL;
2895
0
}
2896
2897
/*
2898
 * match_opclause_to_indexcol()
2899
 *    Handles the OpExpr case for match_clause_to_indexcol(),
2900
 *    which see for comments.
2901
 */
2902
static IndexClause *
2903
match_opclause_to_indexcol(PlannerInfo *root,
2904
               RestrictInfo *rinfo,
2905
               int indexcol,
2906
               IndexOptInfo *index)
2907
0
{
2908
0
  IndexClause *iclause;
2909
0
  OpExpr     *clause = (OpExpr *) rinfo->clause;
2910
0
  Node     *leftop,
2911
0
         *rightop;
2912
0
  Oid     expr_op;
2913
0
  Oid     expr_coll;
2914
0
  Index   index_relid;
2915
0
  Oid     opfamily;
2916
0
  Oid     idxcollation;
2917
2918
  /*
2919
   * Only binary operators need apply.  (In theory, a planner support
2920
   * function could do something with a unary operator, but it seems
2921
   * unlikely to be worth the cycles to check.)
2922
   */
2923
0
  if (list_length(clause->args) != 2)
2924
0
    return NULL;
2925
2926
0
  leftop = (Node *) linitial(clause->args);
2927
0
  rightop = (Node *) lsecond(clause->args);
2928
0
  expr_op = clause->opno;
2929
0
  expr_coll = clause->inputcollid;
2930
2931
0
  index_relid = index->rel->relid;
2932
0
  opfamily = index->opfamily[indexcol];
2933
0
  idxcollation = index->indexcollations[indexcol];
2934
2935
  /*
2936
   * Check for clauses of the form: (indexkey operator constant) or
2937
   * (constant operator indexkey).  See match_clause_to_indexcol's notes
2938
   * about const-ness.
2939
   *
2940
   * Note that we don't ask the support function about clauses that don't
2941
   * have one of these forms.  Again, in principle it might be possible to
2942
   * do something, but it seems unlikely to be worth the cycles to check.
2943
   */
2944
0
  if (match_index_to_operand(leftop, indexcol, index) &&
2945
0
    !bms_is_member(index_relid, rinfo->right_relids) &&
2946
0
    !contain_volatile_functions(rightop))
2947
0
  {
2948
0
    if (IndexCollMatchesExprColl(idxcollation, expr_coll) &&
2949
0
      op_in_opfamily(expr_op, opfamily))
2950
0
    {
2951
0
      iclause = makeNode(IndexClause);
2952
0
      iclause->rinfo = rinfo;
2953
0
      iclause->indexquals = list_make1(rinfo);
2954
0
      iclause->lossy = false;
2955
0
      iclause->indexcol = indexcol;
2956
0
      iclause->indexcols = NIL;
2957
0
      return iclause;
2958
0
    }
2959
2960
    /*
2961
     * If we didn't find a member of the index's opfamily, try the support
2962
     * function for the operator's underlying function.
2963
     */
2964
0
    set_opfuncid(clause); /* make sure we have opfuncid */
2965
0
    return get_index_clause_from_support(root,
2966
0
                       rinfo,
2967
0
                       clause->opfuncid,
2968
0
                       0, /* indexarg on left */
2969
0
                       indexcol,
2970
0
                       index);
2971
0
  }
2972
2973
0
  if (match_index_to_operand(rightop, indexcol, index) &&
2974
0
    !bms_is_member(index_relid, rinfo->left_relids) &&
2975
0
    !contain_volatile_functions(leftop))
2976
0
  {
2977
0
    if (IndexCollMatchesExprColl(idxcollation, expr_coll))
2978
0
    {
2979
0
      Oid     comm_op = get_commutator(expr_op);
2980
2981
0
      if (OidIsValid(comm_op) &&
2982
0
        op_in_opfamily(comm_op, opfamily))
2983
0
      {
2984
0
        RestrictInfo *commrinfo;
2985
2986
        /* Build a commuted OpExpr and RestrictInfo */
2987
0
        commrinfo = commute_restrictinfo(rinfo, comm_op);
2988
2989
        /* Make an IndexClause showing that as a derived qual */
2990
0
        iclause = makeNode(IndexClause);
2991
0
        iclause->rinfo = rinfo;
2992
0
        iclause->indexquals = list_make1(commrinfo);
2993
0
        iclause->lossy = false;
2994
0
        iclause->indexcol = indexcol;
2995
0
        iclause->indexcols = NIL;
2996
0
        return iclause;
2997
0
      }
2998
0
    }
2999
3000
    /*
3001
     * If we didn't find a member of the index's opfamily, try the support
3002
     * function for the operator's underlying function.
3003
     */
3004
0
    set_opfuncid(clause); /* make sure we have opfuncid */
3005
0
    return get_index_clause_from_support(root,
3006
0
                       rinfo,
3007
0
                       clause->opfuncid,
3008
0
                       1, /* indexarg on right */
3009
0
                       indexcol,
3010
0
                       index);
3011
0
  }
3012
3013
0
  return NULL;
3014
0
}
3015
3016
/*
3017
 * match_funcclause_to_indexcol()
3018
 *    Handles the FuncExpr case for match_clause_to_indexcol(),
3019
 *    which see for comments.
3020
 */
3021
static IndexClause *
3022
match_funcclause_to_indexcol(PlannerInfo *root,
3023
               RestrictInfo *rinfo,
3024
               int indexcol,
3025
               IndexOptInfo *index)
3026
0
{
3027
0
  FuncExpr   *clause = (FuncExpr *) rinfo->clause;
3028
0
  int     indexarg;
3029
0
  ListCell   *lc;
3030
3031
  /*
3032
   * We have no built-in intelligence about function clauses, but if there's
3033
   * a planner support function, it might be able to do something.  But, to
3034
   * cut down on wasted planning cycles, only call the support function if
3035
   * at least one argument matches the target index column.
3036
   *
3037
   * Note that we don't insist on the other arguments being pseudoconstants;
3038
   * the support function has to check that.  This is to allow cases where
3039
   * only some of the other arguments need to be included in the indexqual.
3040
   */
3041
0
  indexarg = 0;
3042
0
  foreach(lc, clause->args)
3043
0
  {
3044
0
    Node     *op = (Node *) lfirst(lc);
3045
3046
0
    if (match_index_to_operand(op, indexcol, index))
3047
0
    {
3048
0
      return get_index_clause_from_support(root,
3049
0
                         rinfo,
3050
0
                         clause->funcid,
3051
0
                         indexarg,
3052
0
                         indexcol,
3053
0
                         index);
3054
0
    }
3055
3056
0
    indexarg++;
3057
0
  }
3058
3059
0
  return NULL;
3060
0
}
3061
3062
/*
3063
 * get_index_clause_from_support()
3064
 *    If the function has a planner support function, try to construct
3065
 *    an IndexClause using indexquals created by the support function.
3066
 */
3067
static IndexClause *
3068
get_index_clause_from_support(PlannerInfo *root,
3069
                RestrictInfo *rinfo,
3070
                Oid funcid,
3071
                int indexarg,
3072
                int indexcol,
3073
                IndexOptInfo *index)
3074
0
{
3075
0
  Oid     prosupport = get_func_support(funcid);
3076
0
  SupportRequestIndexCondition req;
3077
0
  List     *sresult;
3078
3079
0
  if (!OidIsValid(prosupport))
3080
0
    return NULL;
3081
3082
0
  req.type = T_SupportRequestIndexCondition;
3083
0
  req.root = root;
3084
0
  req.funcid = funcid;
3085
0
  req.node = (Node *) rinfo->clause;
3086
0
  req.indexarg = indexarg;
3087
0
  req.index = index;
3088
0
  req.indexcol = indexcol;
3089
0
  req.opfamily = index->opfamily[indexcol];
3090
0
  req.indexcollation = index->indexcollations[indexcol];
3091
3092
0
  req.lossy = true;     /* default assumption */
3093
3094
0
  sresult = (List *)
3095
0
    DatumGetPointer(OidFunctionCall1(prosupport,
3096
0
                     PointerGetDatum(&req)));
3097
3098
0
  if (sresult != NIL)
3099
0
  {
3100
0
    IndexClause *iclause = makeNode(IndexClause);
3101
0
    List     *indexquals = NIL;
3102
0
    ListCell   *lc;
3103
3104
    /*
3105
     * The support function API says it should just give back bare
3106
     * clauses, so here we must wrap each one in a RestrictInfo.
3107
     */
3108
0
    foreach(lc, sresult)
3109
0
    {
3110
0
      Expr     *clause = (Expr *) lfirst(lc);
3111
3112
0
      indexquals = lappend(indexquals,
3113
0
                 make_simple_restrictinfo(root, clause));
3114
0
    }
3115
3116
0
    iclause->rinfo = rinfo;
3117
0
    iclause->indexquals = indexquals;
3118
0
    iclause->lossy = req.lossy;
3119
0
    iclause->indexcol = indexcol;
3120
0
    iclause->indexcols = NIL;
3121
3122
0
    return iclause;
3123
0
  }
3124
3125
0
  return NULL;
3126
0
}
3127
3128
/*
3129
 * match_saopclause_to_indexcol()
3130
 *    Handles the ScalarArrayOpExpr case for match_clause_to_indexcol(),
3131
 *    which see for comments.
3132
 */
3133
static IndexClause *
3134
match_saopclause_to_indexcol(PlannerInfo *root,
3135
               RestrictInfo *rinfo,
3136
               int indexcol,
3137
               IndexOptInfo *index)
3138
0
{
3139
0
  ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) rinfo->clause;
3140
0
  Node     *leftop,
3141
0
         *rightop;
3142
0
  Relids    right_relids;
3143
0
  Oid     expr_op;
3144
0
  Oid     expr_coll;
3145
0
  Index   index_relid;
3146
0
  Oid     opfamily;
3147
0
  Oid     idxcollation;
3148
3149
  /* We only accept ANY clauses, not ALL */
3150
0
  if (!saop->useOr)
3151
0
    return NULL;
3152
0
  leftop = (Node *) linitial(saop->args);
3153
0
  rightop = (Node *) lsecond(saop->args);
3154
0
  right_relids = pull_varnos(root, rightop);
3155
0
  expr_op = saop->opno;
3156
0
  expr_coll = saop->inputcollid;
3157
3158
0
  index_relid = index->rel->relid;
3159
0
  opfamily = index->opfamily[indexcol];
3160
0
  idxcollation = index->indexcollations[indexcol];
3161
3162
  /*
3163
   * We must have indexkey on the left and a pseudo-constant array argument.
3164
   */
3165
0
  if (match_index_to_operand(leftop, indexcol, index) &&
3166
0
    !bms_is_member(index_relid, right_relids) &&
3167
0
    !contain_volatile_functions(rightop))
3168
0
  {
3169
0
    if (IndexCollMatchesExprColl(idxcollation, expr_coll) &&
3170
0
      op_in_opfamily(expr_op, opfamily))
3171
0
    {
3172
0
      IndexClause *iclause = makeNode(IndexClause);
3173
3174
0
      iclause->rinfo = rinfo;
3175
0
      iclause->indexquals = list_make1(rinfo);
3176
0
      iclause->lossy = false;
3177
0
      iclause->indexcol = indexcol;
3178
0
      iclause->indexcols = NIL;
3179
0
      return iclause;
3180
0
    }
3181
3182
    /*
3183
     * We do not currently ask support functions about ScalarArrayOpExprs,
3184
     * though in principle we could.
3185
     */
3186
0
  }
3187
3188
0
  return NULL;
3189
0
}
3190
3191
/*
3192
 * match_rowcompare_to_indexcol()
3193
 *    Handles the RowCompareExpr case for match_clause_to_indexcol(),
3194
 *    which see for comments.
3195
 *
3196
 * In this routine we check whether the first column of the row comparison
3197
 * matches the target index column.  This is sufficient to guarantee that some
3198
 * index condition can be constructed from the RowCompareExpr --- the rest
3199
 * is handled by expand_indexqual_rowcompare().
3200
 */
3201
static IndexClause *
3202
match_rowcompare_to_indexcol(PlannerInfo *root,
3203
               RestrictInfo *rinfo,
3204
               int indexcol,
3205
               IndexOptInfo *index)
3206
0
{
3207
0
  RowCompareExpr *clause = (RowCompareExpr *) rinfo->clause;
3208
0
  Index   index_relid;
3209
0
  Oid     opfamily;
3210
0
  Oid     idxcollation;
3211
0
  Node     *leftop,
3212
0
         *rightop;
3213
0
  bool    var_on_left;
3214
0
  Oid     expr_op;
3215
0
  Oid     expr_coll;
3216
3217
  /* Forget it if we're not dealing with a btree index */
3218
0
  if (index->relam != BTREE_AM_OID)
3219
0
    return NULL;
3220
3221
0
  index_relid = index->rel->relid;
3222
0
  opfamily = index->opfamily[indexcol];
3223
0
  idxcollation = index->indexcollations[indexcol];
3224
3225
  /*
3226
   * We could do the matching on the basis of insisting that the opfamily
3227
   * shown in the RowCompareExpr be the same as the index column's opfamily,
3228
   * but that could fail in the presence of reverse-sort opfamilies: it'd be
3229
   * a matter of chance whether RowCompareExpr had picked the forward or
3230
   * reverse-sort family.  So look only at the operator, and match if it is
3231
   * a member of the index's opfamily (after commutation, if the indexkey is
3232
   * on the right).  We'll worry later about whether any additional
3233
   * operators are matchable to the index.
3234
   */
3235
0
  leftop = (Node *) linitial(clause->largs);
3236
0
  rightop = (Node *) linitial(clause->rargs);
3237
0
  expr_op = linitial_oid(clause->opnos);
3238
0
  expr_coll = linitial_oid(clause->inputcollids);
3239
3240
  /* Collations must match, if relevant */
3241
0
  if (!IndexCollMatchesExprColl(idxcollation, expr_coll))
3242
0
    return NULL;
3243
3244
  /*
3245
   * These syntactic tests are the same as in match_opclause_to_indexcol()
3246
   */
3247
0
  if (match_index_to_operand(leftop, indexcol, index) &&
3248
0
    !bms_is_member(index_relid, pull_varnos(root, rightop)) &&
3249
0
    !contain_volatile_functions(rightop))
3250
0
  {
3251
    /* OK, indexkey is on left */
3252
0
    var_on_left = true;
3253
0
  }
3254
0
  else if (match_index_to_operand(rightop, indexcol, index) &&
3255
0
       !bms_is_member(index_relid, pull_varnos(root, leftop)) &&
3256
0
       !contain_volatile_functions(leftop))
3257
0
  {
3258
    /* indexkey is on right, so commute the operator */
3259
0
    expr_op = get_commutator(expr_op);
3260
0
    if (expr_op == InvalidOid)
3261
0
      return NULL;
3262
0
    var_on_left = false;
3263
0
  }
3264
0
  else
3265
0
    return NULL;
3266
3267
  /* We're good if the operator is the right type of opfamily member */
3268
0
  switch (get_op_opfamily_strategy(expr_op, opfamily))
3269
0
  {
3270
0
    case BTLessStrategyNumber:
3271
0
    case BTLessEqualStrategyNumber:
3272
0
    case BTGreaterEqualStrategyNumber:
3273
0
    case BTGreaterStrategyNumber:
3274
0
      return expand_indexqual_rowcompare(root,
3275
0
                         rinfo,
3276
0
                         indexcol,
3277
0
                         index,
3278
0
                         expr_op,
3279
0
                         var_on_left);
3280
0
  }
3281
3282
0
  return NULL;
3283
0
}
3284
3285
/*
3286
 * match_orclause_to_indexcol()
3287
 *    Handles the OR-expr case for match_clause_to_indexcol() in the case
3288
 *    when it could be transformed to ScalarArrayOpExpr.
3289
 *
3290
 * In this routine, we attempt to transform a list of OR-clause args into a
3291
 * single SAOP expression matching the target index column.  On success,
3292
 * return an IndexClause, containing the transformed expression or NULL,
3293
 * if failed.
3294
 */
3295
static IndexClause *
3296
match_orclause_to_indexcol(PlannerInfo *root,
3297
               RestrictInfo *rinfo,
3298
               int indexcol,
3299
               IndexOptInfo *index)
3300
0
{
3301
0
  ListCell   *lc;
3302
0
  BoolExpr   *orclause = (BoolExpr *) rinfo->orclause;
3303
0
  Node     *indexExpr = NULL;
3304
0
  List     *consts = NIL;
3305
0
  ScalarArrayOpExpr *saopexpr = NULL;
3306
0
  Oid     matchOpno = InvalidOid;
3307
0
  IndexClause *iclause;
3308
0
  Oid     consttype = InvalidOid;
3309
0
  Oid     arraytype = InvalidOid;
3310
0
  Oid     inputcollid = InvalidOid;
3311
0
  bool    firstTime = true;
3312
0
  bool    haveNonConst = false;
3313
0
  Index   indexRelid = index->rel->relid;
3314
3315
0
  Assert(IsA(orclause, BoolExpr));
3316
0
  Assert(orclause->boolop == OR_EXPR);
3317
3318
  /* Ignore index if it doesn't support SAOP clauses */
3319
0
  if (!index->amsearcharray)
3320
0
    return NULL;
3321
3322
  /*
3323
   * Try to convert a list of OR-clauses to a single SAOP expression. Each
3324
   * OR entry must be in the form: (indexkey operator constant) or (constant
3325
   * operator indexkey).  Operators of all the entries must match.  To be
3326
   * effective, give up on the first non-matching entry.  Exit is
3327
   * implemented as a break from the loop, which is catched afterwards.
3328
   */
3329
0
  foreach(lc, orclause->args)
3330
0
  {
3331
0
    RestrictInfo *subRinfo;
3332
0
    OpExpr     *subClause;
3333
0
    Oid     opno;
3334
0
    Node     *leftop,
3335
0
           *rightop;
3336
0
    Node     *constExpr;
3337
3338
0
    if (!IsA(lfirst(lc), RestrictInfo))
3339
0
      break;
3340
3341
0
    subRinfo = (RestrictInfo *) lfirst(lc);
3342
3343
    /* Only operator clauses can match  */
3344
0
    if (!IsA(subRinfo->clause, OpExpr))
3345
0
      break;
3346
3347
0
    subClause = (OpExpr *) subRinfo->clause;
3348
0
    opno = subClause->opno;
3349
3350
    /* Only binary operators can match  */
3351
0
    if (list_length(subClause->args) != 2)
3352
0
      break;
3353
3354
    /*
3355
     * The parameters below must match between sub-rinfo and its parent as
3356
     * make_restrictinfo() fills them with the same values, and further
3357
     * modifications are also the same for the whole subtree.  However,
3358
     * still make a sanity check.
3359
     */
3360
0
    Assert(subRinfo->is_pushed_down == rinfo->is_pushed_down);
3361
0
    Assert(subRinfo->is_clone == rinfo->is_clone);
3362
0
    Assert(subRinfo->security_level == rinfo->security_level);
3363
0
    Assert(bms_equal(subRinfo->incompatible_relids, rinfo->incompatible_relids));
3364
0
    Assert(bms_equal(subRinfo->outer_relids, rinfo->outer_relids));
3365
3366
    /*
3367
     * Also, check that required_relids in sub-rinfo is subset of parent's
3368
     * required_relids.
3369
     */
3370
0
    Assert(bms_is_subset(subRinfo->required_relids, rinfo->required_relids));
3371
3372
    /* Only the operator returning a boolean suit the transformation. */
3373
0
    if (get_op_rettype(opno) != BOOLOID)
3374
0
      break;
3375
3376
    /*
3377
     * Check for clauses of the form: (indexkey operator constant) or
3378
     * (constant operator indexkey).  See match_clause_to_indexcol's notes
3379
     * about const-ness.
3380
     */
3381
0
    leftop = (Node *) linitial(subClause->args);
3382
0
    rightop = (Node *) lsecond(subClause->args);
3383
0
    if (match_index_to_operand(leftop, indexcol, index) &&
3384
0
      !bms_is_member(indexRelid, subRinfo->right_relids) &&
3385
0
      !contain_volatile_functions(rightop))
3386
0
    {
3387
0
      indexExpr = leftop;
3388
0
      constExpr = rightop;
3389
0
    }
3390
0
    else if (match_index_to_operand(rightop, indexcol, index) &&
3391
0
         !bms_is_member(indexRelid, subRinfo->left_relids) &&
3392
0
         !contain_volatile_functions(leftop))
3393
0
    {
3394
0
      opno = get_commutator(opno);
3395
0
      if (!OidIsValid(opno))
3396
0
      {
3397
        /* commutator doesn't exist, we can't reverse the order */
3398
0
        break;
3399
0
      }
3400
0
      indexExpr = rightop;
3401
0
      constExpr = leftop;
3402
0
    }
3403
0
    else
3404
0
    {
3405
0
      break;
3406
0
    }
3407
3408
    /*
3409
     * Ignore any RelabelType node above the operands.  This is needed to
3410
     * be able to apply indexscanning in binary-compatible-operator cases.
3411
     * Note: we can assume there is at most one RelabelType node;
3412
     * eval_const_expressions() will have simplified if more than one.
3413
     */
3414
0
    if (IsA(constExpr, RelabelType))
3415
0
      constExpr = (Node *) ((RelabelType *) constExpr)->arg;
3416
0
    if (IsA(indexExpr, RelabelType))
3417
0
      indexExpr = (Node *) ((RelabelType *) indexExpr)->arg;
3418
3419
    /* Forbid transformation for composite types, records. */
3420
0
    if (type_is_rowtype(exprType(constExpr)) ||
3421
0
      type_is_rowtype(exprType(indexExpr)))
3422
0
      break;
3423
3424
    /*
3425
     * Save information about the operator, type, and collation for the
3426
     * first matching qual.  Then, check that subsequent quals match the
3427
     * first.
3428
     */
3429
0
    if (firstTime)
3430
0
    {
3431
0
      matchOpno = opno;
3432
0
      consttype = exprType(constExpr);
3433
0
      arraytype = get_array_type(consttype);
3434
0
      inputcollid = subClause->inputcollid;
3435
3436
      /*
3437
       * Check that the operator is presented in the opfamily and that
3438
       * the expression collation matches the index collation.  Also,
3439
       * there must be an array type to construct an array later.
3440
       */
3441
0
      if (!IndexCollMatchesExprColl(index->indexcollations[indexcol], inputcollid) ||
3442
0
        !op_in_opfamily(matchOpno, index->opfamily[indexcol]) ||
3443
0
        !OidIsValid(arraytype))
3444
0
        break;
3445
0
      firstTime = false;
3446
0
    }
3447
0
    else
3448
0
    {
3449
0
      if (opno != matchOpno ||
3450
0
        inputcollid != subClause->inputcollid ||
3451
0
        consttype != exprType(constExpr))
3452
0
        break;
3453
0
    }
3454
3455
    /*
3456
     * Check if our list of constants in match_clause_to_indexcol's
3457
     * understanding of const-ness have something other than Const.
3458
     */
3459
0
    if (!IsA(constExpr, Const))
3460
0
      haveNonConst = true;
3461
0
    consts = lappend(consts, constExpr);
3462
0
  }
3463
3464
  /*
3465
   * Catch the break from the loop above.  Normally, a foreach() loop ends
3466
   * up with a NULL list cell.  A non-NULL list cell indicates a break from
3467
   * the foreach() loop.  Free the consts list and return NULL then.
3468
   */
3469
0
  if (lc != NULL)
3470
0
  {
3471
0
    list_free(consts);
3472
0
    return NULL;
3473
0
  }
3474
3475
0
  saopexpr = make_SAOP_expr(matchOpno, indexExpr, consttype, inputcollid,
3476
0
                inputcollid, consts, haveNonConst);
3477
3478
  /*
3479
   * Finally, build an IndexClause based on the SAOP node.  Use
3480
   * make_simple_restrictinfo() to get RestrictInfo with clean selectivity
3481
   * estimations, because they may differ from the estimation made for an OR
3482
   * clause.  Although it is not a lossy expression, keep the original rinfo
3483
   * in iclause->rinfo as prescribed.
3484
   */
3485
0
  iclause = makeNode(IndexClause);
3486
0
  iclause->rinfo = rinfo;
3487
0
  iclause->indexquals = list_make1(make_simple_restrictinfo(root,
3488
0
                                &saopexpr->xpr));
3489
0
  iclause->lossy = false;
3490
0
  iclause->indexcol = indexcol;
3491
0
  iclause->indexcols = NIL;
3492
0
  return iclause;
3493
0
}
3494
3495
/*
3496
 * expand_indexqual_rowcompare --- expand a single indexqual condition
3497
 *    that is a RowCompareExpr
3498
 *
3499
 * It's already known that the first column of the row comparison matches
3500
 * the specified column of the index.  We can use additional columns of the
3501
 * row comparison as index qualifications, so long as they match the index
3502
 * in the "same direction", ie, the indexkeys are all on the same side of the
3503
 * clause and the operators are all the same-type members of the opfamilies.
3504
 *
3505
 * If all the columns of the RowCompareExpr match in this way, we just use it
3506
 * as-is, except for possibly commuting it to put the indexkeys on the left.
3507
 *
3508
 * Otherwise, we build a shortened RowCompareExpr (if more than one
3509
 * column matches) or a simple OpExpr (if the first-column match is all
3510
 * there is).  In these cases the modified clause is always "<=" or ">="
3511
 * even when the original was "<" or ">" --- this is necessary to match all
3512
 * the rows that could match the original.  (We are building a lossy version
3513
 * of the row comparison when we do this, so we set lossy = true.)
3514
 *
3515
 * Note: this is really just the last half of match_rowcompare_to_indexcol,
3516
 * but we split it out for comprehensibility.
3517
 */
3518
static IndexClause *
3519
expand_indexqual_rowcompare(PlannerInfo *root,
3520
              RestrictInfo *rinfo,
3521
              int indexcol,
3522
              IndexOptInfo *index,
3523
              Oid expr_op,
3524
              bool var_on_left)
3525
0
{
3526
0
  IndexClause *iclause = makeNode(IndexClause);
3527
0
  RowCompareExpr *clause = (RowCompareExpr *) rinfo->clause;
3528
0
  int     op_strategy;
3529
0
  Oid     op_lefttype;
3530
0
  Oid     op_righttype;
3531
0
  int     matching_cols;
3532
0
  List     *expr_ops;
3533
0
  List     *opfamilies;
3534
0
  List     *lefttypes;
3535
0
  List     *righttypes;
3536
0
  List     *new_ops;
3537
0
  List     *var_args;
3538
0
  List     *non_var_args;
3539
3540
0
  iclause->rinfo = rinfo;
3541
0
  iclause->indexcol = indexcol;
3542
3543
0
  if (var_on_left)
3544
0
  {
3545
0
    var_args = clause->largs;
3546
0
    non_var_args = clause->rargs;
3547
0
  }
3548
0
  else
3549
0
  {
3550
0
    var_args = clause->rargs;
3551
0
    non_var_args = clause->largs;
3552
0
  }
3553
3554
0
  get_op_opfamily_properties(expr_op, index->opfamily[indexcol], false,
3555
0
                 &op_strategy,
3556
0
                 &op_lefttype,
3557
0
                 &op_righttype);
3558
3559
  /* Initialize returned list of which index columns are used */
3560
0
  iclause->indexcols = list_make1_int(indexcol);
3561
3562
  /* Build lists of ops, opfamilies and operator datatypes in case needed */
3563
0
  expr_ops = list_make1_oid(expr_op);
3564
0
  opfamilies = list_make1_oid(index->opfamily[indexcol]);
3565
0
  lefttypes = list_make1_oid(op_lefttype);
3566
0
  righttypes = list_make1_oid(op_righttype);
3567
3568
  /*
3569
   * See how many of the remaining columns match some index column in the
3570
   * same way.  As in match_clause_to_indexcol(), the "other" side of any
3571
   * potential index condition is OK as long as it doesn't use Vars from the
3572
   * indexed relation.
3573
   */
3574
0
  matching_cols = 1;
3575
3576
0
  while (matching_cols < list_length(var_args))
3577
0
  {
3578
0
    Node     *varop = (Node *) list_nth(var_args, matching_cols);
3579
0
    Node     *constop = (Node *) list_nth(non_var_args, matching_cols);
3580
0
    int     i;
3581
3582
0
    expr_op = list_nth_oid(clause->opnos, matching_cols);
3583
0
    if (!var_on_left)
3584
0
    {
3585
      /* indexkey is on right, so commute the operator */
3586
0
      expr_op = get_commutator(expr_op);
3587
0
      if (expr_op == InvalidOid)
3588
0
        break;     /* operator is not usable */
3589
0
    }
3590
0
    if (bms_is_member(index->rel->relid, pull_varnos(root, constop)))
3591
0
      break;       /* no good, Var on wrong side */
3592
0
    if (contain_volatile_functions(constop))
3593
0
      break;       /* no good, volatile comparison value */
3594
3595
    /*
3596
     * The Var side can match any key column of the index.
3597
     */
3598
0
    for (i = 0; i < index->nkeycolumns; i++)
3599
0
    {
3600
0
      if (match_index_to_operand(varop, i, index) &&
3601
0
        get_op_opfamily_strategy(expr_op,
3602
0
                     index->opfamily[i]) == op_strategy &&
3603
0
        IndexCollMatchesExprColl(index->indexcollations[i],
3604
0
                     list_nth_oid(clause->inputcollids,
3605
0
                            matching_cols)))
3606
0
        break;
3607
0
    }
3608
0
    if (i >= index->nkeycolumns)
3609
0
      break;       /* no match found */
3610
3611
    /* Add column number to returned list */
3612
0
    iclause->indexcols = lappend_int(iclause->indexcols, i);
3613
3614
    /* Add operator info to lists */
3615
0
    get_op_opfamily_properties(expr_op, index->opfamily[i], false,
3616
0
                   &op_strategy,
3617
0
                   &op_lefttype,
3618
0
                   &op_righttype);
3619
0
    expr_ops = lappend_oid(expr_ops, expr_op);
3620
0
    opfamilies = lappend_oid(opfamilies, index->opfamily[i]);
3621
0
    lefttypes = lappend_oid(lefttypes, op_lefttype);
3622
0
    righttypes = lappend_oid(righttypes, op_righttype);
3623
3624
    /* This column matches, keep scanning */
3625
0
    matching_cols++;
3626
0
  }
3627
3628
  /* Result is non-lossy if all columns are usable as index quals */
3629
0
  iclause->lossy = (matching_cols != list_length(clause->opnos));
3630
3631
  /*
3632
   * We can use rinfo->clause as-is if we have var on left and it's all
3633
   * usable as index quals.
3634
   */
3635
0
  if (var_on_left && !iclause->lossy)
3636
0
    iclause->indexquals = list_make1(rinfo);
3637
0
  else
3638
0
  {
3639
    /*
3640
     * We have to generate a modified rowcompare (possibly just one
3641
     * OpExpr).  The painful part of this is changing < to <= or > to >=,
3642
     * so deal with that first.
3643
     */
3644
0
    if (!iclause->lossy)
3645
0
    {
3646
      /* very easy, just use the commuted operators */
3647
0
      new_ops = expr_ops;
3648
0
    }
3649
0
    else if (op_strategy == BTLessEqualStrategyNumber ||
3650
0
         op_strategy == BTGreaterEqualStrategyNumber)
3651
0
    {
3652
      /* easy, just use the same (possibly commuted) operators */
3653
0
      new_ops = list_truncate(expr_ops, matching_cols);
3654
0
    }
3655
0
    else
3656
0
    {
3657
0
      ListCell   *opfamilies_cell;
3658
0
      ListCell   *lefttypes_cell;
3659
0
      ListCell   *righttypes_cell;
3660
3661
0
      if (op_strategy == BTLessStrategyNumber)
3662
0
        op_strategy = BTLessEqualStrategyNumber;
3663
0
      else if (op_strategy == BTGreaterStrategyNumber)
3664
0
        op_strategy = BTGreaterEqualStrategyNumber;
3665
0
      else
3666
0
        elog(ERROR, "unexpected strategy number %d", op_strategy);
3667
0
      new_ops = NIL;
3668
0
      forthree(opfamilies_cell, opfamilies,
3669
0
           lefttypes_cell, lefttypes,
3670
0
           righttypes_cell, righttypes)
3671
0
      {
3672
0
        Oid     opfam = lfirst_oid(opfamilies_cell);
3673
0
        Oid     lefttype = lfirst_oid(lefttypes_cell);
3674
0
        Oid     righttype = lfirst_oid(righttypes_cell);
3675
3676
0
        expr_op = get_opfamily_member(opfam, lefttype, righttype,
3677
0
                        op_strategy);
3678
0
        if (!OidIsValid(expr_op))  /* should not happen */
3679
0
          elog(ERROR, "missing operator %d(%u,%u) in opfamily %u",
3680
0
             op_strategy, lefttype, righttype, opfam);
3681
0
        new_ops = lappend_oid(new_ops, expr_op);
3682
0
      }
3683
0
    }
3684
3685
    /* If we have more than one matching col, create a subset rowcompare */
3686
0
    if (matching_cols > 1)
3687
0
    {
3688
0
      RowCompareExpr *rc = makeNode(RowCompareExpr);
3689
3690
0
      rc->cmptype = (CompareType) op_strategy;
3691
0
      rc->opnos = new_ops;
3692
0
      rc->opfamilies = list_copy_head(clause->opfamilies,
3693
0
                      matching_cols);
3694
0
      rc->inputcollids = list_copy_head(clause->inputcollids,
3695
0
                        matching_cols);
3696
0
      rc->largs = list_copy_head(var_args, matching_cols);
3697
0
      rc->rargs = list_copy_head(non_var_args, matching_cols);
3698
0
      iclause->indexquals = list_make1(make_simple_restrictinfo(root,
3699
0
                                    (Expr *) rc));
3700
0
    }
3701
0
    else
3702
0
    {
3703
0
      Expr     *op;
3704
3705
      /* We don't report an index column list in this case */
3706
0
      iclause->indexcols = NIL;
3707
3708
0
      op = make_opclause(linitial_oid(new_ops), BOOLOID, false,
3709
0
                 copyObject(linitial(var_args)),
3710
0
                 copyObject(linitial(non_var_args)),
3711
0
                 InvalidOid,
3712
0
                 linitial_oid(clause->inputcollids));
3713
0
      iclause->indexquals = list_make1(make_simple_restrictinfo(root, op));
3714
0
    }
3715
0
  }
3716
3717
0
  return iclause;
3718
0
}
3719
3720
3721
/****************************************************************************
3722
 *        ----  ROUTINES TO CHECK ORDERING OPERATORS  ----
3723
 ****************************************************************************/
3724
3725
/*
3726
 * match_pathkeys_to_index
3727
 *    For the given 'index' and 'pathkeys', output a list of suitable ORDER
3728
 *    BY expressions, each of the form "indexedcol operator pseudoconstant",
3729
 *    along with an integer list of the index column numbers (zero based)
3730
 *    that each clause would be used with.
3731
 *
3732
 * This attempts to find an ORDER BY and index column number for all items in
3733
 * the pathkey list, however, if we're unable to match any given pathkey to an
3734
 * index column, we return just the ones matched by the function so far.  This
3735
 * allows callers who are interested in partial matches to get them.  Callers
3736
 * can determine a partial match vs a full match by checking the outputted
3737
 * list lengths.  A full match will have one item in the output lists for each
3738
 * item in the given 'pathkeys' list.
3739
 */
3740
static void
3741
match_pathkeys_to_index(IndexOptInfo *index, List *pathkeys,
3742
            List **orderby_clauses_p,
3743
            List **clause_columns_p)
3744
0
{
3745
0
  ListCell   *lc1;
3746
3747
0
  *orderby_clauses_p = NIL; /* set default results */
3748
0
  *clause_columns_p = NIL;
3749
3750
  /* Only indexes with the amcanorderbyop property are interesting here */
3751
0
  if (!index->amcanorderbyop)
3752
0
    return;
3753
3754
0
  foreach(lc1, pathkeys)
3755
0
  {
3756
0
    PathKey    *pathkey = (PathKey *) lfirst(lc1);
3757
0
    bool    found = false;
3758
0
    EquivalenceMemberIterator it;
3759
0
    EquivalenceMember *member;
3760
3761
3762
    /* Pathkey must request default sort order for the target opfamily */
3763
0
    if (pathkey->pk_cmptype != COMPARE_LT || pathkey->pk_nulls_first)
3764
0
      return;
3765
3766
    /* If eclass is volatile, no hope of using an indexscan */
3767
0
    if (pathkey->pk_eclass->ec_has_volatile)
3768
0
      return;
3769
3770
    /*
3771
     * Try to match eclass member expression(s) to index.  Note that child
3772
     * EC members are considered, but only when they belong to the target
3773
     * relation.  (Unlike regular members, the same expression could be a
3774
     * child member of more than one EC.  Therefore, the same index could
3775
     * be considered to match more than one pathkey list, which is OK
3776
     * here.  See also get_eclass_for_sort_expr.)
3777
     */
3778
0
    setup_eclass_member_iterator(&it, pathkey->pk_eclass,
3779
0
                   index->rel->relids);
3780
0
    while ((member = eclass_member_iterator_next(&it)) != NULL)
3781
0
    {
3782
0
      int     indexcol;
3783
3784
      /* No possibility of match if it references other relations */
3785
0
      if (!bms_equal(member->em_relids, index->rel->relids))
3786
0
        continue;
3787
3788
      /*
3789
       * We allow any column of the index to match each pathkey; they
3790
       * don't have to match left-to-right as you might expect.  This is
3791
       * correct for GiST, and it doesn't matter for SP-GiST because
3792
       * that doesn't handle multiple columns anyway, and no other
3793
       * existing AMs support amcanorderbyop.  We might need different
3794
       * logic in future for other implementations.
3795
       */
3796
0
      for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++)
3797
0
      {
3798
0
        Expr     *expr;
3799
3800
0
        expr = match_clause_to_ordering_op(index,
3801
0
                           indexcol,
3802
0
                           member->em_expr,
3803
0
                           pathkey->pk_opfamily);
3804
0
        if (expr)
3805
0
        {
3806
0
          *orderby_clauses_p = lappend(*orderby_clauses_p, expr);
3807
0
          *clause_columns_p = lappend_int(*clause_columns_p, indexcol);
3808
0
          found = true;
3809
0
          break;
3810
0
        }
3811
0
      }
3812
3813
0
      if (found)     /* don't want to look at remaining members */
3814
0
        break;
3815
0
    }
3816
3817
    /*
3818
     * Return the matches found so far when this pathkey couldn't be
3819
     * matched to the index.
3820
     */
3821
0
    if (!found)
3822
0
      return;
3823
0
  }
3824
0
}
3825
3826
/*
3827
 * match_clause_to_ordering_op
3828
 *    Determines whether an ordering operator expression matches an
3829
 *    index column.
3830
 *
3831
 *    This is similar to, but simpler than, match_clause_to_indexcol.
3832
 *    We only care about simple OpExpr cases.  The input is a bare
3833
 *    expression that is being ordered by, which must be of the form
3834
 *    (indexkey op const) or (const op indexkey) where op is an ordering
3835
 *    operator for the column's opfamily.
3836
 *
3837
 * 'index' is the index of interest.
3838
 * 'indexcol' is a column number of 'index' (counting from 0).
3839
 * 'clause' is the ordering expression to be tested.
3840
 * 'pk_opfamily' is the btree opfamily describing the required sort order.
3841
 *
3842
 * Note that we currently do not consider the collation of the ordering
3843
 * operator's result.  In practical cases the result type will be numeric
3844
 * and thus have no collation, and it's not very clear what to match to
3845
 * if it did have a collation.  The index's collation should match the
3846
 * ordering operator's input collation, not its result.
3847
 *
3848
 * If successful, return 'clause' as-is if the indexkey is on the left,
3849
 * otherwise a commuted copy of 'clause'.  If no match, return NULL.
3850
 */
3851
static Expr *
3852
match_clause_to_ordering_op(IndexOptInfo *index,
3853
              int indexcol,
3854
              Expr *clause,
3855
              Oid pk_opfamily)
3856
0
{
3857
0
  Oid     opfamily;
3858
0
  Oid     idxcollation;
3859
0
  Node     *leftop,
3860
0
         *rightop;
3861
0
  Oid     expr_op;
3862
0
  Oid     expr_coll;
3863
0
  Oid     sortfamily;
3864
0
  bool    commuted;
3865
3866
0
  Assert(indexcol < index->nkeycolumns);
3867
3868
0
  opfamily = index->opfamily[indexcol];
3869
0
  idxcollation = index->indexcollations[indexcol];
3870
3871
  /*
3872
   * Clause must be a binary opclause.
3873
   */
3874
0
  if (!is_opclause(clause))
3875
0
    return NULL;
3876
0
  leftop = get_leftop(clause);
3877
0
  rightop = get_rightop(clause);
3878
0
  if (!leftop || !rightop)
3879
0
    return NULL;
3880
0
  expr_op = ((OpExpr *) clause)->opno;
3881
0
  expr_coll = ((OpExpr *) clause)->inputcollid;
3882
3883
  /*
3884
   * We can forget the whole thing right away if wrong collation.
3885
   */
3886
0
  if (!IndexCollMatchesExprColl(idxcollation, expr_coll))
3887
0
    return NULL;
3888
3889
  /*
3890
   * Check for clauses of the form: (indexkey operator constant) or
3891
   * (constant operator indexkey).
3892
   */
3893
0
  if (match_index_to_operand(leftop, indexcol, index) &&
3894
0
    !contain_var_clause(rightop) &&
3895
0
    !contain_volatile_functions(rightop))
3896
0
  {
3897
0
    commuted = false;
3898
0
  }
3899
0
  else if (match_index_to_operand(rightop, indexcol, index) &&
3900
0
       !contain_var_clause(leftop) &&
3901
0
       !contain_volatile_functions(leftop))
3902
0
  {
3903
    /* Might match, but we need a commuted operator */
3904
0
    expr_op = get_commutator(expr_op);
3905
0
    if (expr_op == InvalidOid)
3906
0
      return NULL;
3907
0
    commuted = true;
3908
0
  }
3909
0
  else
3910
0
    return NULL;
3911
3912
  /*
3913
   * Is the (commuted) operator an ordering operator for the opfamily? And
3914
   * if so, does it yield the right sorting semantics?
3915
   */
3916
0
  sortfamily = get_op_opfamily_sortfamily(expr_op, opfamily);
3917
0
  if (sortfamily != pk_opfamily)
3918
0
    return NULL;
3919
3920
  /* We have a match.  Return clause or a commuted version thereof. */
3921
0
  if (commuted)
3922
0
  {
3923
0
    OpExpr     *newclause = makeNode(OpExpr);
3924
3925
    /* flat-copy all the fields of clause */
3926
0
    memcpy(newclause, clause, sizeof(OpExpr));
3927
3928
    /* commute it */
3929
0
    newclause->opno = expr_op;
3930
0
    newclause->opfuncid = InvalidOid;
3931
0
    newclause->args = list_make2(rightop, leftop);
3932
3933
0
    clause = (Expr *) newclause;
3934
0
  }
3935
3936
0
  return clause;
3937
0
}
3938
3939
3940
/****************************************************************************
3941
 *        ----  ROUTINES TO DO PARTIAL INDEX PREDICATE TESTS  ----
3942
 ****************************************************************************/
3943
3944
/*
3945
 * check_index_predicates
3946
 *    Set the predicate-derived IndexOptInfo fields for each index
3947
 *    of the specified relation.
3948
 *
3949
 * predOK is set true if the index is partial and its predicate is satisfied
3950
 * for this query, ie the query's WHERE clauses imply the predicate.
3951
 *
3952
 * indrestrictinfo is set to the relation's baserestrictinfo list less any
3953
 * conditions that are implied by the index's predicate.  (Obviously, for a
3954
 * non-partial index, this is the same as baserestrictinfo.)  Such conditions
3955
 * can be dropped from the plan when using the index, in certain cases.
3956
 *
3957
 * At one time it was possible for this to get re-run after adding more
3958
 * restrictions to the rel, thus possibly letting us prove more indexes OK.
3959
 * That doesn't happen any more (at least not in the core code's usage),
3960
 * but this code still supports it in case extensions want to mess with the
3961
 * baserestrictinfo list.  We assume that adding more restrictions can't make
3962
 * an index not predOK.  We must recompute indrestrictinfo each time, though,
3963
 * to make sure any newly-added restrictions get into it if needed.
3964
 */
3965
void
3966
check_index_predicates(PlannerInfo *root, RelOptInfo *rel)
3967
0
{
3968
0
  List     *clauselist;
3969
0
  bool    have_partial;
3970
0
  bool    is_target_rel;
3971
0
  Relids    otherrels;
3972
0
  ListCell   *lc;
3973
3974
  /* Indexes are available only on base or "other" member relations. */
3975
0
  Assert(IS_SIMPLE_REL(rel));
3976
3977
  /*
3978
   * Initialize the indrestrictinfo lists to be identical to
3979
   * baserestrictinfo, and check whether there are any partial indexes.  If
3980
   * not, this is all we need to do.
3981
   */
3982
0
  have_partial = false;
3983
0
  foreach(lc, rel->indexlist)
3984
0
  {
3985
0
    IndexOptInfo *index = (IndexOptInfo *) lfirst(lc);
3986
3987
0
    index->indrestrictinfo = rel->baserestrictinfo;
3988
0
    if (index->indpred)
3989
0
      have_partial = true;
3990
0
  }
3991
0
  if (!have_partial)
3992
0
    return;
3993
3994
  /*
3995
   * Construct a list of clauses that we can assume true for the purpose of
3996
   * proving the index(es) usable.  Restriction clauses for the rel are
3997
   * always usable, and so are any join clauses that are "movable to" this
3998
   * rel.  Also, we can consider any EC-derivable join clauses (which must
3999
   * be "movable to" this rel, by definition).
4000
   */
4001
0
  clauselist = list_copy(rel->baserestrictinfo);
4002
4003
  /* Scan the rel's join clauses */
4004
0
  foreach(lc, rel->joininfo)
4005
0
  {
4006
0
    RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
4007
4008
    /* Check if clause can be moved to this rel */
4009
0
    if (!join_clause_is_movable_to(rinfo, rel))
4010
0
      continue;
4011
4012
0
    clauselist = lappend(clauselist, rinfo);
4013
0
  }
4014
4015
  /*
4016
   * Add on any equivalence-derivable join clauses.  Computing the correct
4017
   * relid sets for generate_join_implied_equalities is slightly tricky
4018
   * because the rel could be a child rel rather than a true baserel, and in
4019
   * that case we must subtract its parents' relid(s) from all_query_rels.
4020
   * Additionally, we mustn't consider clauses that are only computable
4021
   * after outer joins that can null the rel.
4022
   */
4023
0
  if (rel->reloptkind == RELOPT_OTHER_MEMBER_REL)
4024
0
    otherrels = bms_difference(root->all_query_rels,
4025
0
                   find_childrel_parents(root, rel));
4026
0
  else
4027
0
    otherrels = bms_difference(root->all_query_rels, rel->relids);
4028
0
  otherrels = bms_del_members(otherrels, rel->nulling_relids);
4029
4030
0
  if (!bms_is_empty(otherrels))
4031
0
    clauselist =
4032
0
      list_concat(clauselist,
4033
0
            generate_join_implied_equalities(root,
4034
0
                             bms_union(rel->relids,
4035
0
                                   otherrels),
4036
0
                             otherrels,
4037
0
                             rel,
4038
0
                             NULL));
4039
4040
  /*
4041
   * Normally we remove quals that are implied by a partial index's
4042
   * predicate from indrestrictinfo, indicating that they need not be
4043
   * checked explicitly by an indexscan plan using this index.  However, if
4044
   * the rel is a target relation of UPDATE/DELETE/MERGE/SELECT FOR UPDATE,
4045
   * we cannot remove such quals from the plan, because they need to be in
4046
   * the plan so that they will be properly rechecked by EvalPlanQual
4047
   * testing.  Some day we might want to remove such quals from the main
4048
   * plan anyway and pass them through to EvalPlanQual via a side channel;
4049
   * but for now, we just don't remove implied quals at all for target
4050
   * relations.
4051
   */
4052
0
  is_target_rel = (bms_is_member(rel->relid, root->all_result_relids) ||
4053
0
           get_plan_rowmark(root->rowMarks, rel->relid) != NULL);
4054
4055
  /*
4056
   * Now try to prove each index predicate true, and compute the
4057
   * indrestrictinfo lists for partial indexes.  Note that we compute the
4058
   * indrestrictinfo list even for non-predOK indexes; this might seem
4059
   * wasteful, but we may be able to use such indexes in OR clauses, cf
4060
   * generate_bitmap_or_paths().
4061
   */
4062
0
  foreach(lc, rel->indexlist)
4063
0
  {
4064
0
    IndexOptInfo *index = (IndexOptInfo *) lfirst(lc);
4065
0
    ListCell   *lcr;
4066
4067
0
    if (index->indpred == NIL)
4068
0
      continue;     /* ignore non-partial indexes here */
4069
4070
0
    if (!index->predOK)   /* don't repeat work if already proven OK */
4071
0
      index->predOK = predicate_implied_by(index->indpred, clauselist,
4072
0
                         false);
4073
4074
    /* If rel is an update target, leave indrestrictinfo as set above */
4075
0
    if (is_target_rel)
4076
0
      continue;
4077
4078
    /* Else compute indrestrictinfo as the non-implied quals */
4079
0
    index->indrestrictinfo = NIL;
4080
0
    foreach(lcr, rel->baserestrictinfo)
4081
0
    {
4082
0
      RestrictInfo *rinfo = (RestrictInfo *) lfirst(lcr);
4083
4084
      /* predicate_implied_by() assumes first arg is immutable */
4085
0
      if (contain_mutable_functions((Node *) rinfo->clause) ||
4086
0
        !predicate_implied_by(list_make1(rinfo->clause),
4087
0
                    index->indpred, false))
4088
0
        index->indrestrictinfo = lappend(index->indrestrictinfo, rinfo);
4089
0
    }
4090
0
  }
4091
0
}
4092
4093
/****************************************************************************
4094
 *        ----  ROUTINES TO CHECK EXTERNALLY-VISIBLE CONDITIONS  ----
4095
 ****************************************************************************/
4096
4097
/*
4098
 * ec_member_matches_indexcol
4099
 *    Test whether an EquivalenceClass member matches an index column.
4100
 *
4101
 * This is a callback for use by generate_implied_equalities_for_column.
4102
 */
4103
static bool
4104
ec_member_matches_indexcol(PlannerInfo *root, RelOptInfo *rel,
4105
               EquivalenceClass *ec, EquivalenceMember *em,
4106
               void *arg)
4107
0
{
4108
0
  IndexOptInfo *index = ((ec_member_matches_arg *) arg)->index;
4109
0
  int     indexcol = ((ec_member_matches_arg *) arg)->indexcol;
4110
0
  Oid     curFamily;
4111
0
  Oid     curCollation;
4112
4113
0
  Assert(indexcol < index->nkeycolumns);
4114
4115
0
  curFamily = index->opfamily[indexcol];
4116
0
  curCollation = index->indexcollations[indexcol];
4117
4118
  /*
4119
   * If it's a btree index, we can reject it if its opfamily isn't
4120
   * compatible with the EC, since no clause generated from the EC could be
4121
   * used with the index.  For non-btree indexes, we can't easily tell
4122
   * whether clauses generated from the EC could be used with the index, so
4123
   * don't check the opfamily.  This might mean we return "true" for a
4124
   * useless EC, so we have to recheck the results of
4125
   * generate_implied_equalities_for_column; see
4126
   * match_eclass_clauses_to_index.
4127
   */
4128
0
  if (index->relam == BTREE_AM_OID &&
4129
0
    !list_member_oid(ec->ec_opfamilies, curFamily))
4130
0
    return false;
4131
4132
  /* We insist on collation match for all index types, though */
4133
0
  if (!IndexCollMatchesExprColl(curCollation, ec->ec_collation))
4134
0
    return false;
4135
4136
0
  return match_index_to_operand((Node *) em->em_expr, indexcol, index);
4137
0
}
4138
4139
/*
4140
 * relation_has_unique_index_for
4141
 *    Determine whether the relation provably has at most one row satisfying
4142
 *    a set of equality conditions, because the conditions constrain all
4143
 *    columns of some unique index.
4144
 *
4145
 * The conditions can be represented in either or both of two ways:
4146
 * 1. A list of RestrictInfo nodes, where the caller has already determined
4147
 * that each condition is a mergejoinable equality with an expression in
4148
 * this relation on one side, and an expression not involving this relation
4149
 * on the other.  The transient outer_is_left flag is used to identify which
4150
 * side we should look at: left side if outer_is_left is false, right side
4151
 * if it is true.
4152
 * 2. A list of expressions in this relation, and a corresponding list of
4153
 * equality operators. The caller must have already checked that the operators
4154
 * represent equality.  (Note: the operators could be cross-type; the
4155
 * expressions should correspond to their RHS inputs.)
4156
 *
4157
 * The caller need only supply equality conditions arising from joins;
4158
 * this routine automatically adds in any usable baserestrictinfo clauses.
4159
 * (Note that the passed-in restrictlist will be destructively modified!)
4160
 */
4161
bool
4162
relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel,
4163
                List *restrictlist,
4164
                List *exprlist, List *oprlist)
4165
0
{
4166
0
  return relation_has_unique_index_ext(root, rel, restrictlist,
4167
0
                     exprlist, oprlist, NULL);
4168
0
}
4169
4170
/*
4171
 * relation_has_unique_index_ext
4172
 *    Same as relation_has_unique_index_for(), but supports extra_clauses
4173
 *    parameter.  If extra_clauses isn't NULL, return baserestrictinfo clauses
4174
 *    which were used to derive uniqueness.
4175
 */
4176
bool
4177
relation_has_unique_index_ext(PlannerInfo *root, RelOptInfo *rel,
4178
                List *restrictlist,
4179
                List *exprlist, List *oprlist,
4180
                List **extra_clauses)
4181
0
{
4182
0
  ListCell   *ic;
4183
4184
0
  Assert(list_length(exprlist) == list_length(oprlist));
4185
4186
  /* Short-circuit if no indexes... */
4187
0
  if (rel->indexlist == NIL)
4188
0
    return false;
4189
4190
  /*
4191
   * Examine the rel's restriction clauses for usable var = const clauses
4192
   * that we can add to the restrictlist.
4193
   */
4194
0
  foreach(ic, rel->baserestrictinfo)
4195
0
  {
4196
0
    RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(ic);
4197
4198
    /*
4199
     * Note: can_join won't be set for a restriction clause, but
4200
     * mergeopfamilies will be if it has a mergejoinable operator and
4201
     * doesn't contain volatile functions.
4202
     */
4203
0
    if (restrictinfo->mergeopfamilies == NIL)
4204
0
      continue;     /* not mergejoinable */
4205
4206
    /*
4207
     * The clause certainly doesn't refer to anything but the given rel.
4208
     * If either side is pseudoconstant then we can use it.
4209
     */
4210
0
    if (bms_is_empty(restrictinfo->left_relids))
4211
0
    {
4212
      /* righthand side is inner */
4213
0
      restrictinfo->outer_is_left = true;
4214
0
    }
4215
0
    else if (bms_is_empty(restrictinfo->right_relids))
4216
0
    {
4217
      /* lefthand side is inner */
4218
0
      restrictinfo->outer_is_left = false;
4219
0
    }
4220
0
    else
4221
0
      continue;
4222
4223
    /* OK, add to list */
4224
0
    restrictlist = lappend(restrictlist, restrictinfo);
4225
0
  }
4226
4227
  /* Short-circuit the easy case */
4228
0
  if (restrictlist == NIL && exprlist == NIL)
4229
0
    return false;
4230
4231
  /* Examine each index of the relation ... */
4232
0
  foreach(ic, rel->indexlist)
4233
0
  {
4234
0
    IndexOptInfo *ind = (IndexOptInfo *) lfirst(ic);
4235
0
    int     c;
4236
0
    List     *exprs = NIL;
4237
4238
    /*
4239
     * If the index is not unique, or not immediately enforced, or if it's
4240
     * a partial index, it's useless here.  We're unable to make use of
4241
     * predOK partial unique indexes due to the fact that
4242
     * check_index_predicates() also makes use of join predicates to
4243
     * determine if the partial index is usable. Here we need proofs that
4244
     * hold true before any joins are evaluated.
4245
     */
4246
0
    if (!ind->unique || !ind->immediate || ind->indpred != NIL)
4247
0
      continue;
4248
4249
    /*
4250
     * Try to find each index column in the lists of conditions.  This is
4251
     * O(N^2) or worse, but we expect all the lists to be short.
4252
     */
4253
0
    for (c = 0; c < ind->nkeycolumns; c++)
4254
0
    {
4255
0
      bool    matched = false;
4256
0
      ListCell   *lc;
4257
0
      ListCell   *lc2;
4258
4259
0
      foreach(lc, restrictlist)
4260
0
      {
4261
0
        RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
4262
0
        Node     *rexpr;
4263
4264
        /*
4265
         * The condition's equality operator must be a member of the
4266
         * index opfamily, else it is not asserting the right kind of
4267
         * equality behavior for this index.  We check this first
4268
         * since it's probably cheaper than match_index_to_operand().
4269
         */
4270
0
        if (!list_member_oid(rinfo->mergeopfamilies, ind->opfamily[c]))
4271
0
          continue;
4272
4273
        /*
4274
         * XXX at some point we may need to check collations here too.
4275
         * For the moment we assume all collations reduce to the same
4276
         * notion of equality.
4277
         */
4278
4279
        /* OK, see if the condition operand matches the index key */
4280
0
        if (rinfo->outer_is_left)
4281
0
          rexpr = get_rightop(rinfo->clause);
4282
0
        else
4283
0
          rexpr = get_leftop(rinfo->clause);
4284
4285
0
        if (match_index_to_operand(rexpr, c, ind))
4286
0
        {
4287
0
          matched = true; /* column is unique */
4288
4289
0
          if (bms_membership(rinfo->clause_relids) == BMS_SINGLETON)
4290
0
          {
4291
0
            MemoryContext oldMemCtx =
4292
0
              MemoryContextSwitchTo(root->planner_cxt);
4293
4294
            /*
4295
             * Add filter clause into a list allowing caller to
4296
             * know if uniqueness have made not only by join
4297
             * clauses.
4298
             */
4299
0
            Assert(bms_is_empty(rinfo->left_relids) ||
4300
0
                 bms_is_empty(rinfo->right_relids));
4301
0
            if (extra_clauses)
4302
0
              exprs = lappend(exprs, rinfo);
4303
0
            MemoryContextSwitchTo(oldMemCtx);
4304
0
          }
4305
4306
0
          break;
4307
0
        }
4308
0
      }
4309
4310
0
      if (matched)
4311
0
        continue;
4312
4313
0
      forboth(lc, exprlist, lc2, oprlist)
4314
0
      {
4315
0
        Node     *expr = (Node *) lfirst(lc);
4316
0
        Oid     opr = lfirst_oid(lc2);
4317
4318
        /* See if the expression matches the index key */
4319
0
        if (!match_index_to_operand(expr, c, ind))
4320
0
          continue;
4321
4322
        /*
4323
         * The equality operator must be a member of the index
4324
         * opfamily, else it is not asserting the right kind of
4325
         * equality behavior for this index.  We assume the caller
4326
         * determined it is an equality operator, so we don't need to
4327
         * check any more tightly than this.
4328
         */
4329
0
        if (!op_in_opfamily(opr, ind->opfamily[c]))
4330
0
          continue;
4331
4332
        /*
4333
         * XXX at some point we may need to check collations here too.
4334
         * For the moment we assume all collations reduce to the same
4335
         * notion of equality.
4336
         */
4337
4338
0
        matched = true; /* column is unique */
4339
0
        break;
4340
0
      }
4341
4342
0
      if (!matched)
4343
0
        break;     /* no match; this index doesn't help us */
4344
0
    }
4345
4346
    /* Matched all key columns of this index? */
4347
0
    if (c == ind->nkeycolumns)
4348
0
    {
4349
0
      if (extra_clauses)
4350
0
        *extra_clauses = exprs;
4351
0
      return true;
4352
0
    }
4353
0
  }
4354
4355
0
  return false;
4356
0
}
4357
4358
/*
4359
 * indexcol_is_bool_constant_for_query
4360
 *
4361
 * If an index column is constrained to have a constant value by the query's
4362
 * WHERE conditions, then it's irrelevant for sort-order considerations.
4363
 * Usually that means we have a restriction clause WHERE indexcol = constant,
4364
 * which gets turned into an EquivalenceClass containing a constant, which
4365
 * is recognized as redundant by build_index_pathkeys().  But if the index
4366
 * column is a boolean variable (or expression), then we are not going to
4367
 * see WHERE indexcol = constant, because expression preprocessing will have
4368
 * simplified that to "WHERE indexcol" or "WHERE NOT indexcol".  So we are not
4369
 * going to have a matching EquivalenceClass (unless the query also contains
4370
 * "ORDER BY indexcol").  To allow such cases to work the same as they would
4371
 * for non-boolean values, this function is provided to detect whether the
4372
 * specified index column matches a boolean restriction clause.
4373
 */
4374
bool
4375
indexcol_is_bool_constant_for_query(PlannerInfo *root,
4376
                  IndexOptInfo *index,
4377
                  int indexcol)
4378
0
{
4379
0
  ListCell   *lc;
4380
4381
  /* If the index isn't boolean, we can't possibly get a match */
4382
0
  if (!IsBooleanOpfamily(index->opfamily[indexcol]))
4383
0
    return false;
4384
4385
  /* Check each restriction clause for the index's rel */
4386
0
  foreach(lc, index->rel->baserestrictinfo)
4387
0
  {
4388
0
    RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
4389
4390
    /*
4391
     * As in match_clause_to_indexcol, never match pseudoconstants to
4392
     * indexes.  (It might be semantically okay to do so here, but the
4393
     * odds of getting a match are negligible, so don't waste the cycles.)
4394
     */
4395
0
    if (rinfo->pseudoconstant)
4396
0
      continue;
4397
4398
    /* See if we can match the clause's expression to the index column */
4399
0
    if (match_boolean_index_clause(root, rinfo, indexcol, index))
4400
0
      return true;
4401
0
  }
4402
4403
0
  return false;
4404
0
}
4405
4406
4407
/****************************************************************************
4408
 *        ----  ROUTINES TO CHECK OPERANDS  ----
4409
 ****************************************************************************/
4410
4411
/*
4412
 * match_index_to_operand()
4413
 *    Generalized test for a match between an index's key
4414
 *    and the operand on one side of a restriction or join clause.
4415
 *
4416
 * operand: the nodetree to be compared to the index
4417
 * indexcol: the column number of the index (counting from 0)
4418
 * index: the index of interest
4419
 *
4420
 * Note that we aren't interested in collations here; the caller must check
4421
 * for a collation match, if it's dealing with an operator where that matters.
4422
 *
4423
 * This is exported for use in selfuncs.c.
4424
 */
4425
bool
4426
match_index_to_operand(Node *operand,
4427
             int indexcol,
4428
             IndexOptInfo *index)
4429
0
{
4430
0
  int     indkey;
4431
4432
  /*
4433
   * Ignore any RelabelType node above the operand.   This is needed to be
4434
   * able to apply indexscanning in binary-compatible-operator cases. Note:
4435
   * we can assume there is at most one RelabelType node;
4436
   * eval_const_expressions() will have simplified if more than one.
4437
   */
4438
0
  if (operand && IsA(operand, RelabelType))
4439
0
    operand = (Node *) ((RelabelType *) operand)->arg;
4440
4441
0
  indkey = index->indexkeys[indexcol];
4442
0
  if (indkey != 0)
4443
0
  {
4444
    /*
4445
     * Simple index column; operand must be a matching Var.
4446
     */
4447
0
    if (operand && IsA(operand, Var) &&
4448
0
      index->rel->relid == ((Var *) operand)->varno &&
4449
0
      indkey == ((Var *) operand)->varattno &&
4450
0
      ((Var *) operand)->varnullingrels == NULL)
4451
0
      return true;
4452
0
  }
4453
0
  else
4454
0
  {
4455
    /*
4456
     * Index expression; find the correct expression.  (This search could
4457
     * be avoided, at the cost of complicating all the callers of this
4458
     * routine; doesn't seem worth it.)
4459
     */
4460
0
    ListCell   *indexpr_item;
4461
0
    int     i;
4462
0
    Node     *indexkey;
4463
4464
0
    indexpr_item = list_head(index->indexprs);
4465
0
    for (i = 0; i < indexcol; i++)
4466
0
    {
4467
0
      if (index->indexkeys[i] == 0)
4468
0
      {
4469
0
        if (indexpr_item == NULL)
4470
0
          elog(ERROR, "wrong number of index expressions");
4471
0
        indexpr_item = lnext(index->indexprs, indexpr_item);
4472
0
      }
4473
0
    }
4474
0
    if (indexpr_item == NULL)
4475
0
      elog(ERROR, "wrong number of index expressions");
4476
0
    indexkey = (Node *) lfirst(indexpr_item);
4477
4478
    /*
4479
     * Does it match the operand?  Again, strip any relabeling.
4480
     */
4481
0
    if (indexkey && IsA(indexkey, RelabelType))
4482
0
      indexkey = (Node *) ((RelabelType *) indexkey)->arg;
4483
4484
0
    if (equal(indexkey, operand))
4485
0
      return true;
4486
0
  }
4487
4488
0
  return false;
4489
0
}
4490
4491
/*
4492
 * is_pseudo_constant_for_index()
4493
 *    Test whether the given expression can be used as an indexscan
4494
 *    comparison value.
4495
 *
4496
 * An indexscan comparison value must not contain any volatile functions,
4497
 * and it can't contain any Vars of the index's own table.  Vars of
4498
 * other tables are okay, though; in that case we'd be producing an
4499
 * indexqual usable in a parameterized indexscan.  This is, therefore,
4500
 * a weaker condition than is_pseudo_constant_clause().
4501
 *
4502
 * This function is exported for use by planner support functions,
4503
 * which will have available the IndexOptInfo, but not any RestrictInfo
4504
 * infrastructure.  It is making the same test made by functions above
4505
 * such as match_opclause_to_indexcol(), but those rely where possible
4506
 * on RestrictInfo information about variable membership.
4507
 *
4508
 * expr: the nodetree to be checked
4509
 * index: the index of interest
4510
 */
4511
bool
4512
is_pseudo_constant_for_index(PlannerInfo *root, Node *expr, IndexOptInfo *index)
4513
0
{
4514
  /* pull_varnos is cheaper than volatility check, so do that first */
4515
0
  if (bms_is_member(index->rel->relid, pull_varnos(root, expr)))
4516
0
    return false;     /* no good, contains Var of table */
4517
0
  if (contain_volatile_functions(expr))
4518
0
    return false;     /* no good, volatile comparison value */
4519
0
  return true;
4520
0
}