diff options
author | Michael Paquier <michael@paquier.xyz> | 2021-10-21 10:39:01 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2021-10-21 10:39:01 +0900 |
commit | 98ec35b0bbf6003e89fc06aa140e12fd90bbad47 (patch) | |
tree | 60ae28cd54e5d77e3534527f507fad42d0bbacdf /src | |
parent | f45dc59a38cab1d2af6baaedb79559fe2e9b3781 (diff) | |
download | postgresql-98ec35b0bbf6003e89fc06aa140e12fd90bbad47.tar.gz postgresql-98ec35b0bbf6003e89fc06aa140e12fd90bbad47.zip |
Fix corruption of pg_shdepend when copying deps from template database
Using for a new database a template database with shared dependencies
that need to be copied over was causing a corruption of pg_shdepend
because of an off-by-one computation error of the index number used for
the values inserted with a slot.
Issue introduced by e3931d0. Monitoring the rest of the code, there are
no similar mistakes.
Reported-by: Sven Klemm
Author: Aleksander Alekseev
Reviewed-by: Daniel Gustafsson, Michael Paquier
Discussion: https://postgr.es/m/CAJ7c6TP0AowkUgNL6zcAK-s5HYsVHVBRWfu69FRubPpfwZGM9A@mail.gmail.com
Backpatch-through: 14
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/pg_shdepend.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c index 4b676f56078..56a9a7662fd 100644 --- a/src/backend/catalog/pg_shdepend.c +++ b/src/backend/catalog/pg_shdepend.c @@ -905,13 +905,13 @@ copyTemplateDependencies(Oid templateDbId, Oid newDbId) shdep = (Form_pg_shdepend) GETSTRUCT(tup); - slot[slot_stored_count]->tts_values[Anum_pg_shdepend_dbid] = ObjectIdGetDatum(newDbId); - slot[slot_stored_count]->tts_values[Anum_pg_shdepend_classid] = shdep->classid; - slot[slot_stored_count]->tts_values[Anum_pg_shdepend_objid] = shdep->objid; - slot[slot_stored_count]->tts_values[Anum_pg_shdepend_objsubid] = shdep->objsubid; - slot[slot_stored_count]->tts_values[Anum_pg_shdepend_refclassid] = shdep->refclassid; - slot[slot_stored_count]->tts_values[Anum_pg_shdepend_refobjid] = shdep->refobjid; - slot[slot_stored_count]->tts_values[Anum_pg_shdepend_deptype] = shdep->deptype; + slot[slot_stored_count]->tts_values[Anum_pg_shdepend_dbid - 1] = ObjectIdGetDatum(newDbId); + slot[slot_stored_count]->tts_values[Anum_pg_shdepend_classid - 1] = shdep->classid; + slot[slot_stored_count]->tts_values[Anum_pg_shdepend_objid - 1] = shdep->objid; + slot[slot_stored_count]->tts_values[Anum_pg_shdepend_objsubid - 1] = shdep->objsubid; + slot[slot_stored_count]->tts_values[Anum_pg_shdepend_refclassid - 1] = shdep->refclassid; + slot[slot_stored_count]->tts_values[Anum_pg_shdepend_refobjid - 1] = shdep->refobjid; + slot[slot_stored_count]->tts_values[Anum_pg_shdepend_deptype - 1] = shdep->deptype; ExecStoreVirtualTuple(slot[slot_stored_count]); slot_stored_count++; |