postgresql/src/backend
Tom Lane 4ace456776 Fix index-only scan plans when not all index columns can be returned.
If an index has both returnable and non-returnable columns, and one of
the non-returnable columns is an expression using a Var that is in a
returnable column, then a query returning that expression could result
in an index-only scan plan that attempts to read the non-returnable
column, instead of recomputing the expression from the returnable
column as intended.

To fix, redefine the "indextlist" list of an IndexOnlyScan plan node
as containing null Consts in place of any non-returnable columns.
This solves the problem by preventing setrefs.c from falsely matching
to such entries.  The executor is happy since it only cares about the
exposed types of the entries, and ruleutils.c doesn't care because a
correct plan won't reference those entries.  I considered some other
ways to prevent setrefs.c from doing the wrong thing, but this way
seems good since (a) it allows a very localized fix, (b) it makes
the indextlist structure more compact in many cases, and (c) the
indextlist is now a more faithful representation of what the index AM
will actually produce, viz. nulls for any non-returnable columns.

This is easier to hit since we introduced included columns, but it's
possible to construct failing examples without that, as per the
added regression test.  Hence, back-patch to all supported branches.

Per bug #17350 from Louis Jachiet.

Discussion: https://postgr.es/m/17350-b5bdcf476e5badbb@postgresql.org
2022-01-01 16:12:03 -05:00
..
access Fix incorrect format placeholders 2021-12-29 10:08:41 +01:00
bootstrap Fix bogus assertion in BootstrapModeMain(). 2021-08-09 08:28:53 -07:00
catalog Small cleanups related to PUBLICATION framework code 2021-12-30 19:24:26 -03:00
commands Small cleanups related to PUBLICATION framework code 2021-12-30 19:24:26 -03:00
executor Always use ReleaseTupleDesc after lookup_rowtype_tupdesc et al. 2021-12-15 18:58:20 -05:00
foreign Improve HINT message that FDW reports when there are no valid options. 2021-10-27 00:46:52 +09:00
jit Fix some typos with {a,an} 2021-12-09 15:20:36 +09:00
lib Improve sift up/down code in binaryheap.c and logtape.c. 2021-12-14 13:35:22 -05:00
libpq On Windows, also call shutdown() while closing the client socket. 2021-12-07 13:34:06 -05:00
main process startup: Split single user code out of PostgresMain(). 2021-09-17 19:56:47 -07:00
nodes Remove unused include 2021-12-22 15:06:02 +01:00
optimizer Fix index-only scan plans when not all index columns can be returned. 2022-01-01 16:12:03 -05:00
parser Small cleanups related to PUBLICATION framework code 2021-12-30 19:24:26 -03:00
partitioning Fix duplicate words in comments 2021-10-04 15:12:57 +02:00
po Translation updates 2021-06-21 12:33:50 +02:00
port Check for STATUS_DELETE_PENDING on Windows. 2021-12-10 16:19:43 +13:00
postmaster Fix issues in pgarch's new directory-scanning logic. 2021-12-29 17:02:50 -05:00
regex Make pg_regexec() robust against out-of-range search_start. 2021-09-11 15:19:31 -04:00
replication Fix some typos with {a,an} 2021-12-09 15:20:36 +09:00
rewrite Fix rewriter to set hasModifyingCTE correctly on rewritten queries. 2021-09-08 12:05:47 -04:00
snowball Update snowball 2021-12-07 07:04:05 +01:00
statistics Clean up more code using "(expr) ? true : false" 2021-10-11 09:36:42 +09:00
storage Fix typo in code comment 2021-12-22 07:52:18 +01:00
tcop Replace random(), pg_erand48(), etc with a better PRNG API and algorithm. 2021-11-28 21:33:07 -05:00
tsearch Clean up more code using "(expr) ? true : false" 2021-10-11 09:36:42 +09:00
utils Revert changes about warnings/errors for placeholders. 2021-12-27 16:01:10 -05:00
.gitignore Add .gitignore entries for AIX-specific intermediate build artifacts. 2015-07-08 20:44:22 -04:00
common.mk Remove PARTIAL_LINKING build mode. 2018-03-30 17:33:04 -07:00
Makefile Use sort_template.h for qsort_tuple() and qsort_ssup(). 2021-03-03 17:02:32 +13:00
nls.mk Report progress of startup operations that take a long time. 2021-10-25 11:51:57 -04:00