Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wAihO-000G8H-26 for pgsql-hackers@arkaria.postgresql.org; Thu, 09 Apr 2026 06:17:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wAihM-003yR5-3C for pgsql-hackers@arkaria.postgresql.org; Thu, 09 Apr 2026 06:17:05 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wAihM-003yQx-1V for pgsql-hackers@lists.postgresql.org; Thu, 09 Apr 2026 06:17:05 +0000 Received: from mail-ed1-x532.google.com ([2a00:1450:4864:20::532]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wAihK-000000007Nm-2krv for pgsql-hackers@lists.postgresql.org; Thu, 09 Apr 2026 06:17:04 +0000 Received: by mail-ed1-x532.google.com with SMTP id 4fb4d7f45d1cf-66dd0531d01so734045a12.3 for ; Wed, 08 Apr 2026 23:17:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775715421; cv=none; d=google.com; s=arc-20240605; b=JQ7SzCY3/G4blZbeMbGzDlV+igdrbCMcnyWhG1xL+S1mIhH5c2x6PHvnrT6Jn9oJAs AbBTyAhFqQVqHaztaZLIPWoMgMHeaPUD2lwesijgvFhF1I3TjcNGZ4j9m1vijddanb1o K/0P4EuWG5CZiU8pdHiduZMn8+cuS7unyIFoqQXWf4+2LWz7dGYjwNINCvLf1AMueliU +T70exdzCyIiVeVYs1F+ikeyvciPGBtm3hlNF7SpFd0U1vQ8xQazXuaYc8NIFVsNLT3b z4a7/cuu0sY+A/SHlURSZFdVSa47ARSvaEbQF49Jz/lmEQo6Dcp5orSLmKDjcOiJhkm6 ifyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=TbLMyB6p3ozI57WmKr/EZcXm7R2tGfww8kyj9ix8y4Y=; fh=nwNxTtLLPTU0ewfLM7SSbrjMajMl+wwnFkCY/fi90vE=; b=NLQCVbCXAaZ9YeONx8eeZKnevROgytcAUG6kIznKhWB73Zi02WwYf0sWqxi6Qs1QO3 7US7Y4LWSRy586yj1eve6yapB91+FpyklRWN1SPSNlsweLnmj6VA9Dewanjubyigki7O LGxbxQ/zEnEJSy5IaIu7TGUm19F58KGy/ZG9VHmu1Nky93AXj60T+nYdY8S9pqdCbl3c y/HLDuCiCnI3wJzj7ZzVbB+1E4vtTe9feHEkrVFYYbLEfuqGOYd8ldD9NPMxka6j9s3y 2ssO3kdcSgJwe0uNB14uKhGjBNRSxgUFWZDJ1VfsthVBwtEocMqz3BP0RCumVDJwvMt4 waHQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775715421; x=1776320221; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=TbLMyB6p3ozI57WmKr/EZcXm7R2tGfww8kyj9ix8y4Y=; b=g4RbYMvwhYmCu5i3pFqzgzbnLs9EucBLJebAx+mN5pCROZwVvthE39Z1QeEuaWhQam rD7RvCphQncLa+ff3YNF7iSQmVg1SXcCesFB2Fs4G2jTL3iRqMiYSe90zmQYTbiXCMJP 0I3RM/6q5XQitt5+cEl4qoGGTH02x7VYtIXU4PG/6tTrDCykYFotS+hZ5Vm6+DZVaztf k0cWmU9Vs/OVIIJc5i1JByee+Ds8gKNuoUpMc4B3r0QQXSykm3J01YqATe9exGdhFBK+ TCKSaJV1cIF2gddp6Af3/N0UbM91tRl1kF1fE2XO8ZTTs8/GJQoRJgLRlMkVTDoTBil2 KHmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775715421; x=1776320221; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=TbLMyB6p3ozI57WmKr/EZcXm7R2tGfww8kyj9ix8y4Y=; b=IsUqdTdSIYOhmVtwfFFJgTQ6yI28zp89bs8PeoWt4FtsbZ5ozsCPaMrGUruXcn7F8N KJVsc4oVQ8hfRZXItxMuFrlXWWp8GIa9Usmi5J9UFekLI6xefH6c1mShLfhUswmlvpID uTJSMa85AWdkKTZnIx8lxVc8K+GsyewgBTeN1+rtqKJ8QvZso2GvgRDZ3I5oIN3Y5AOG yq5W7uN/yACaQh1V3k3KwLG4UWq3QbeqmAe1h/+zhTn/7OmLSZ5UhHsb+LaehK2Sm0G1 LzylgK5mr4ry2JjTax/Xx3dq0ShXEYPaodnhdnUHID0HRUCOnDRHTEGVnG1X8zni4eQQ spxA== X-Gm-Message-State: AOJu0Ywv1cevUpLHoDfVFmwzPZYRC2FwCy+wXmhEBNO4rZSUeaydnAGv Z8Zym+Fr6C6rRmmvHGLExe0fhmAvsa2RXAeqA5Aw+C8TaseKsRY4Z3Smei1rOa4TJ36vhBLYN7W FLEnBBQBM3s+RO/981OgsL8kBxfHgEvz15CM+ X-Gm-Gg: AeBDievM7x3cLkUaYJ9A2o/eNBkNO8hB2WMNY4OXP6vforYPi9ahEGS20NUv+HC4jqd UWHm3LLFEu2g1+BE5DYm3+QNv/5BvlN0HG7uvQcik3+B9DNqJfArkpvpg8//w841nZh/aH+MIJD rVDdyzApr1YRVHEsHrkL5/3bDhTeUzeyKTcfyFfxdXxVLgf97gbV8T1Pc/nRjNPOfXAXE9h2W7r g4gVl/4lIBkqBJc/0UjhVxwSv05KIA5sISXPRx1e7Hoeji05PPAMgPHvEZk9WjISs9rMqB8dsXP LtXNs8A= X-Received: by 2002:a17:907:e101:b0:b97:bc8a:f45e with SMTP id a640c23a62f3a-b9c67691485mr877705666b.1.1775715420846; Wed, 08 Apr 2026 23:17:00 -0700 (PDT) MIME-Version: 1.0 From: Mohamed ALi Date: Wed, 8 Apr 2026 23:16:48 -0700 X-Gm-Features: AQROBzCNlTPwV1dexjvzwLi80c5bpebqu7mgxNZiOKdBzSWKNxRZK0-P73dReeA Message-ID: Subject: [PATCH] Fix: Partitioned parent index remains invalid after child indexes are repaired To: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000e25580064f00f69f" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e25580064f00f69f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi hackers, A partitioned (parent) index in PostgreSQL can become permanently stuck with `indisvalid =3D false` even after all of its child partition indexes have been repaired and are valid. There is no built-in mechanism to re-validate the parent index after a child is fixed via `REINDEX`. This affects all currently supported PostgreSQL versions (13 through 18) The root cause is that `validatePartitionedIndex()` =E2=80=94 the only function that can mark a partitioned index as valid is never called after `REINDEX` operations, and is skipped when re-running `ALTER INDEX ATTACH PARTITION` on an already-attached index. How the Bug Manifests Typical Scenario : 1. A partitioned table has multiple partitions. 2. The user creates indexes on partitions concurrently. One fails (due to deadlock, cancellation, timeout, etc.), leaving an invalid partition index. 3. A parent index is created (or the invalid index is attached to an existing parent). The parent is correctly marked `indisvalid =3D false` because at least one child is invalid. 4. The user fixes the broken child index with `REINDEX INDEX CONCURRENTLY`. 5. The child index becomes valid (`indisvalid =3D true`). 6. The parent index remains `indisvalid =3D false` permanently. No SQL command can fix it. Reproduction steps: ```sql -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- SETUP: Partitioned table with two partitions and sample data -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D DROP TABLE IF EXISTS orders; CREATE TABLE orders ( id serial, order_date date NOT NULL, amount numeric ) PARTITION BY RANGE (order_date); CREATE TABLE orders_2023 PARTITION OF orders FOR VALUES FROM ('2023-01-01') TO ('2024-01-01'); CREATE TABLE orders_2024 PARTITION OF orders FOR VALUES FROM ('2024-01-01') TO ('2025-01-01'); INSERT INTO orders (order_date, amount) SELECT d, random() * 1000 FROM generate_series('2023-01-01'::date, '2023-12-31'::date, '1 day') d; INSERT INTO orders (order_date, amount) SELECT d, random() * 1000 FROM generate_series('2024-01-01'::date, '2024-12-31'::date, '1 day') d; -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- STEP 1: Create parent index with ONLY (starts as invalid) -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D CREATE INDEX orders_amount_idx ON ONLY orders (amount); -- Verify: parent index is invalid (no children attached yet) SELECT c.relname, i.indisvalid FROM pg_class c JOIN pg_index i ON c.oid =3D i.indexrelid WHERE c.relname LIKE 'orders%idx%' ORDER BY c.relname; -- Expected: -- orders_amount_idx | f -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- STEP 2: Create valid index on first partition -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D CREATE INDEX CONCURRENTLY orders_2023_amount_idx ON orders_2023 (amount); -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- STEP 3: Create an INVALID index on second partition -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- In a separate session, hold a lock: BEGIN; LOCK TABLE orders_2024 IN SHARE MODE; -- Then in the main session: SET statement_timeout =3D '1ms'; CREATE INDEX CONCURRENTLY orders_2024_amount_idx ON orders_2024 (amount); RESET statement_timeout; -- it will fail/timeout, leaving an invalid index. -- Verify state: SELECT c.relname, i.indisvalid FROM pg_class c JOIN pg_index i ON c.oid =3D i.indexrelid WHERE c.relname LIKE 'orders%idx%' ORDER BY c.relname; -- Expected: -- orders_2023_amount_idx | t (valid) -- orders_2024_amount_idx | f (invalid) -- orders_amount_idx | f (invalid, created with ONLY) -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- STEP 4: Attach both partition indexes to the parent -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- Attach the invalid one first ALTER INDEX orders_amount_idx ATTACH PARTITION orders_2024_amount_idx; -- Succeeds. Parent stays invalid (correct =E2=80=94 child is invalid). -- Attach the valid one ALTER INDEX orders_amount_idx ATTACH PARTITION orders_2023_amount_idx; -- Succeeds. Parent still invalid (correct =E2=80=94 one child still invali= d). -- Verify attachment and validity: SELECT c.relname, i.indisvalid, pg_get_indexdef(i.indexrelid) AS indexdef FROM pg_class c JOIN pg_index i ON c.oid =3D i.indexrelid WHERE c.relname LIKE 'orders%amount%' ORDER BY c.relname; -- Expected: -- orders_2023_amount_idx | t -- orders_2024_amount_idx | f -- orders_amount_idx | f -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- STEP 5: Fix the invalid child index via REINDEX -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D REINDEX INDEX CONCURRENTLY orders_2024_amount_idx; -- Verify: child is now valid SELECT c.relname, i.indisvalid FROM pg_class c JOIN pg_index i ON c.oid =3D i.indexrelid WHERE c.relname LIKE 'orders%amount%' ORDER BY c.relname; -- ACTUAL (buggy) result: -- orders_2023_amount_idx | t (valid) -- orders_2024_amount_idx | t (valid =E2=80=94 fixed by REINDEX) -- orders_amount_idx | f (STILL INVALID =E2=80=94 this is the bug!) -- -- EXPECTED result (if bug were fixed): -- orders_2023_amount_idx | t -- orders_2024_amount_idx | t -- orders_amount_idx | t (should be valid now) -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- STEP 6: Demonstrate that re-running ATTACH does not help -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ALTER INDEX orders_amount_idx ATTACH PARTITION orders_2024_amount_idx; -- Returns "ALTER INDEX" (succeeds silently, does nothing) SELECT c.relname, i.indisvalid FROM pg_class c JOIN pg_index i ON c.oid =3D i.indexrelid WHERE c.relname LIKE 'orders%amount%' ORDER BY c.relname; -- Parent is STILL invalid. The "silently do nothing" path -- skips validatePartitionedIndex() entirely. -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -- CLEANUP -- =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D DROP TABLE orders; ``` Root Cause Analysis: Where `validatePartitionedIndex()` Is Called The function is called in exactly these code paths: 1. During `ALTER INDEX ... ATTACH PARTITION` =E2=80=94 inside `ATExecAttachPartitionIdx()` 2. During `ALTER TABLE ... ATTACH PARTITION` =E2=80=94 via `AttachPartitionEnsureIndexes()` 3. During `CREATE INDEX` on partitioned tables =E2=80=94 via `DefineIndex()= ` It is NOT called: - After `REINDEX` of a partitioned index - During any maintenance operation - As any periodic validation check Bug 1: REINDEX Does Not Validate Parent When `reindex_index()` in `src/backend/catalog/index.c` marks a partition index as valid (setting `indisvalid =3D true`), it does not check whether the parent partitioned index should also become valid. The function simply updates the child's `pg_index` entry and returns. Bug 2: Re-running ATTACH Skips Validation In `ATExecAttachPartitionIdx()` (tablecmds.c, around line 21923 in PG 16 / line ~22900 in HEAD): https://github.com/postgres/postgres/blob/master/src/backend/commands/table= cmds.c#L21923 ```c /* Silently do nothing if already in the right state */ currParent =3D partIdx->rd_rel->relispartition ? get_partition_parent(partIdxId, false) : InvalidOid; if (currParent !=3D RelationGetRelid(parentIdx)) { // ... all validation checks and attachment logic ... validatePartitionedIndex(parentIdx, parentTbl); // ONLY called here } // If already attached, entire block is skipped =E2=80=94 no validation! ``` When the child is already attached (`currParent =3D=3D parentIdx`), the condition is false, the entire if-block is skipped, and `validatePartitionedIndex()` is never called. The comment "Silently do nothing if already in the right state" is misleading "already attached" does not mean "parent validity is correct." Proposed Fixes: Fix 1 : Always Validate Parent Index in ALTER INDEX ATTACH PARTITION Patch File : 0001-Always-validate-parent-index-in-ALTER-INDEX-ATTACH.patch Move the validatePartitionedIndex() call outside the if-block so it runs unconditionally =E2=80=94 both when a new attachment is made and when the p= artition is already attached. This provides a user-accessible recovery path: after fixi= ng a child index with REINDEX, re-running ALTER INDEX ATTACH PARTITION triggers parent validation. When the partition is already attached, a NOTICE is emitted: NOTICE: partition index "child_idx" is already attached to "parent_idx", validating parent index This follows PostgreSQL's existing convention of using NOTICE for informational messages about no-op or reduced-scope operations (e.g., DROP TABLE IF EXISTS, CREATE INDEX IF NOT EXISTS). It tells the user: 1- Nothing went wrong 2- The index was already attached (so they know the state) 3- Validation still happened (so they know the fix path works) Fix 2: Validate Parent Partitioned Index After REINDEX of Child Patch File : 0001-Validate-parent-partitioned-index-after-REINDEX.patch Same underlying bug but this patch addresses it from the REINDEX side. When a partition index is repaired via REINDEX or REINDEX CONCURRENTLY, the parent partitioned index remains permanently stuck with indisvalid =3D false even though all children are now valid. This is because validatePartitionedIndex() =E2=80=94 the only function that= can mark a partitioned index as valid is never called from any REINDEX code path. validatePartitionedIndex() is only called during: 1- ALTER INDEX ... ATTACH PARTITION (tablecmds.c) 2- ALTER TABLE ... ATTACH PARTITION (tablecmds.c) 3- CREATE INDEX on partitioned tables (indexcmds.c) It is NOT called after: 1- REINDEX INDEX (regular) =E2=80=94 handled by reindex_index() in index.c 2- REINDEX INDEX CONCURRENTLY =E2=80=94 handled by ReindexRelationConcurren= tly() in indexcmds.c, which uses index_concurrently_swap() in index.c Three changes are made: 1. Make validatePartitionedIndex() public The function was static in tablecmds.c. It is now exported via tablecmds.h so it can be called from index.c and indexcmds.c. Files changed: src/backend/commands/tablecmds.c =E2=80=94 remove static, update comment src/include/commands/tablecmds.h =E2=80=94 add extern declaration 2. Call from reindex_index() (regular REINDEX) After reindex_index() marks a partition index as valid (indisvalid =3D true= ), check if the index is a partition (iRel->rd_rel->relispartition) and if so, look up the parent and call validatePartitionedIndex(). A CommandCounterIncrement() is required before the call so that the child's updated indisvalid is visible to the syscache lookup that validatePartitionedIndex() performs internally. File changed: src/backend/catalog/index.c 3. Call from ReindexRelationConcurrently() (REINDEX CONCURRENTLY) REINDEX CONCURRENTLY uses a completely different code path: it creates a ne= w index, builds it concurrently, then swaps it with the old one via index_concurrently_swap(). The new index inherits the old index's partition status during the swap. After the swap and the existing CommandCounterIncrement() (which makes the swap visible), check if the new index is a partition and call validatePartitionedIndex() on the parent. File changed: src/backend/commands/indexcmds.c Multi-level Hierarchy Support validatePartitionedIndex() already handles multi-level partition hierarchie= s. When it marks a mid-level parent valid, it checks if that parent is itself = a partition and recursively validates the grandparent. No additional recursio= n logic is needed in the REINDEX patches. Thanks, Mohamed Ali Senior DBE AWS RDS --000000000000e25580064f00f69f Content-Type: application/octet-stream; name="0001-Validate-parent-partitioned-index-after-REINDEX.patch" Content-Disposition: attachment; filename="0001-Validate-parent-partitioned-index-after-REINDEX.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnr2v0lf0 RnJvbSA1MGRhN2NhZDJjZDBmNzFjNjY5YjM2NGQ3ZWI2ODJkNzFjMTQzNDkxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNb2hhbWVkIEFsaSA8bW9hbGkucGdAZ21haWwuY29tPgpEYXRl OiBGcmksIDI3IE1hciAyMDI2IDE5OjM4OjMyIC0wNzAwClN1YmplY3Q6IFtQQVRDSF0gZml4OiBW YWxpZGF0ZSBwYXJlbnQgcGFydGl0aW9uZWQgaW5kZXggYWZ0ZXIgUkVJTkRFWCBvZiBjaGlsZAoK QWZ0ZXIgUkVJTkRFWCAob3IgUkVJTkRFWCBDT05DVVJSRU5UTFkpIHJlcGFpcnMgYW4gaW52YWxp ZCBwYXJ0aXRpb24KaW5kZXgsIHRoZSBwYXJlbnQgcGFydGl0aW9uZWQgaW5kZXggcmVtYWlucyBw ZXJtYW5lbnRseSBzdHVjayB3aXRoCmluZGlzdmFsaWQ9ZmFsc2UgYmVjYXVzZSB2YWxpZGF0ZVBh cnRpdGlvbmVkSW5kZXgoKSBpcyBuZXZlciBjYWxsZWQKZnJvbSBhbnkgUkVJTkRFWCBjb2RlIHBh dGguCgpGaXggdGhpcyBieToKCjEuIE1ha2luZyB2YWxpZGF0ZVBhcnRpdGlvbmVkSW5kZXgoKSBu b24tc3RhdGljIGFuZCBhZGRpbmcgaXRzCiAgIGRlY2xhcmF0aW9uIHRvIHRhYmxlY21kcy5oIHNv IGl0IGNhbiBiZSBjYWxsZWQgZnJvbSBvdGhlciBtb2R1bGVzLgoKMi4gQ2FsbGluZyB2YWxpZGF0 ZVBhcnRpdGlvbmVkSW5kZXgoKSBmcm9tIHJlaW5kZXhfaW5kZXgoKSAoZm9yCiAgIHJlZ3VsYXIg UkVJTkRFWCkgYWZ0ZXIgbWFya2luZyBhIHBhcnRpdGlvbiBpbmRleCB2YWxpZC4gIEEKICAgQ29t bWFuZENvdW50ZXJJbmNyZW1lbnQoKSBpcyBuZWVkZWQgYmVmb3JlIHRoZSBjYWxsIHNvIHRoYXQg dGhlCiAgIGNoaWxkJ3MgdXBkYXRlZCBpbmRpc3ZhbGlkIGlzIHZpc2libGUgdG8gdGhlIHN5c2Nh Y2hlIGxvb2t1cAogICBwZXJmb3JtZWQgYnkgdmFsaWRhdGVQYXJ0aXRpb25lZEluZGV4KCkuCgoz LiBDYWxsaW5nIHZhbGlkYXRlUGFydGl0aW9uZWRJbmRleCgpIGZyb20KICAgUmVpbmRleFJlbGF0 aW9uQ29uY3VycmVudGx5KCkgKGZvciBSRUlOREVYIENPTkNVUlJFTlRMWSkgYWZ0ZXIKICAgdGhl IGluZGV4IHN3YXAgYW5kIENvbW1hbmRDb3VudGVySW5jcmVtZW50LCBhdCB3aGljaCBwb2ludCB0 aGUKICAgbmV3IHZhbGlkIGluZGV4IGhhcyB0YWtlbiB0aGUgb2xkIGludmFsaWQgaW5kZXgncyBw bGFjZSBpbiB0aGUKICAgcGFydGl0aW9uIGhpZXJhcmNoeS4KCnZhbGlkYXRlUGFydGl0aW9uZWRJ bmRleCgpIGFscmVhZHkgaGFuZGxlcyBtdWx0aS1sZXZlbCBwYXJ0aXRpb24KaGllcmFyY2hpZXMg YnkgcmVjdXJzaW5nIHVwd2FyZCB3aGVuIGl0IG1hcmtzIGEgbWlkLWxldmVsIHBhcmVudAp2YWxp ZCwgc28gdGhpcyBmaXggYXV0b21hdGljYWxseSBjYXNjYWRlcyB0aHJvdWdoIGdyYW5kcGFyZW50 IGFuZApoaWdoZXItbGV2ZWwgcGFydGl0aW9uZWQgaW5kZXhlcy4KCi0tLQogc3JjL2JhY2tlbmQv Y2F0YWxvZy9pbmRleC5jICAgICAgfCAzMiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Kwogc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMgfCAyOSArKysrKysrKysrKysrKysr KysrKysrKysrKysrKwogc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMgfCAgOSArKysr KystLS0KIHNyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oIHwgIDIgKysKIDQgZmlsZXMg Y2hhbmdlZCwgNjkgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMgYi9zcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMK aW5kZXggZDgyMTliMS4uYmYxYTI1YyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9p bmRleC5jCisrKyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXguYwpAQCAtMzg4NSw2ICszODg1 LDM4IEBAIHJlaW5kZXhfaW5kZXgoY29uc3QgUmVpbmRleFN0bXQgKnN0bXQsIE9pZCBpbmRleElk LAogCQkJQ2FjaGVJbnZhbGlkYXRlUmVsY2FjaGUoaGVhcFJlbGF0aW9uKTsKIAkJfQogCisJCS8q CisJCSAqIElmIHRoaXMgaW5kZXggaXMgYSBwYXJ0aXRpb24gb2YgYSBwYXJ0aXRpb25lZCBpbmRl eCwgYW5kIHdlIGp1c3QKKwkJICogbWFya2VkIGl0IHZhbGlkLCBjaGVjayBpZiB0aGUgcGFyZW50 IHBhcnRpdGlvbmVkIGluZGV4IGNhbiBub3cgYmUKKwkJICogbWFya2VkIHZhbGlkIHRvby4gIFRo aXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBhbiBpbnZhbGlkIHBhcnRpdGlvbgorCQkgKiBpbmRl eCB3YXMgYXR0YWNoZWQgdG8gYSBwYXJ0aXRpb25lZCBpbmRleCAobWFraW5nIHRoZSBwYXJlbnQK KwkJICogaW52YWxpZCksIHRoZW4gbGF0ZXIgZml4ZWQgdmlhIFJFSU5ERVguICB2YWxpZGF0ZVBh cnRpdGlvbmVkSW5kZXgKKwkJICogd2lsbCByZWN1cnNlIHVwIHRoZSBoaWVyYXJjaHkgaWYgbmVl ZGVkLgorCQkgKi8KKwkJaWYgKGluZGV4X2JhZCAmJiBpUmVsLT5yZF9yZWwtPnJlbGlzcGFydGl0 aW9uKQorCQl7CisJCQlPaWQJCQlwYXJlbnRJZHhJZDsKKworCQkJLyogTWFrZSB0aGUgY2hpbGQn cyBpbmRpc3ZhbGlkIHVwZGF0ZSB2aXNpYmxlIGZvciB2YWxpZGF0aW9uICovCisJCQlDb21tYW5k Q291bnRlckluY3JlbWVudCgpOworCisJCQlwYXJlbnRJZHhJZCA9IGdldF9wYXJ0aXRpb25fcGFy ZW50KGluZGV4SWQsIGZhbHNlKTsKKwkJCWlmIChPaWRJc1ZhbGlkKHBhcmVudElkeElkKSkKKwkJ CXsKKwkJCQlSZWxhdGlvbglwYXJlbnRJZHg7CisJCQkJUmVsYXRpb24JcGFyZW50VGJsOworCisJ CQkJcGFyZW50SWR4ID0gaW5kZXhfb3BlbihwYXJlbnRJZHhJZCwgQWNjZXNzU2hhcmVMb2NrKTsK KwkJCQlwYXJlbnRUYmwgPSB0YWJsZV9vcGVuKHBhcmVudElkeC0+cmRfaW5kZXgtPmluZHJlbGlk LAorCQkJCQkJCQkJICAgQWNjZXNzU2hhcmVMb2NrKTsKKworCQkJCXZhbGlkYXRlUGFydGl0aW9u ZWRJbmRleChwYXJlbnRJZHgsIHBhcmVudFRibCk7CisKKwkJCQl0YWJsZV9jbG9zZShwYXJlbnRU YmwsIEFjY2Vzc1NoYXJlTG9jayk7CisJCQkJaW5kZXhfY2xvc2UocGFyZW50SWR4LCBBY2Nlc3NT aGFyZUxvY2spOworCQkJfQorCQl9CisKIAkJdGFibGVfY2xvc2UocGdfaW5kZXgsIFJvd0V4Y2x1 c2l2ZUxvY2spOwogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhj bWRzLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYwppbmRleCBkZDU5M2NjLi5h YjY3N2Q3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYworKysg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9pbmRleGNtZHMuYwpAQCAtMzQsNiArMzQsNyBAQAogI2lu Y2x1ZGUgImNhdGFsb2cvcGdfY29uc3RyYWludC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGF0 YWJhc2UuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2luaGVyaXRzLmgiCisjaW5jbHVkZSAiY2F0 YWxvZy9wYXJ0aXRpb24uaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX25hbWVzcGFjZS5oIgogI2lu Y2x1ZGUgImNhdGFsb2cvcGdfb3BjbGFzcy5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdGFibGVz cGFjZS5oIgpAQCAtNDMxNyw2ICs0MzE4LDM0IEBAIFJlaW5kZXhSZWxhdGlvbkNvbmN1cnJlbnRs eShjb25zdCBSZWluZGV4U3RtdCAqc3RtdCwgT2lkIHJlbGF0aW9uT2lkLCBjb25zdCBSZWluCiAJ CSAqIGNoYXJhY3RlcnMuCiAJCSAqLwogCQlDb21tYW5kQ291bnRlckluY3JlbWVudCgpOworCisJ CS8qCisJCSAqIElmIHRoZSBuZXcgKHN3YXBwZWQtaW4pIGluZGV4IGlzIGEgcGFydGl0aW9uIG9m IGEgcGFydGl0aW9uZWQKKwkJICogaW5kZXgsIGNoZWNrIGlmIHRoZSBwYXJlbnQgY2FuIG5vdyBi ZSBtYXJrZWQgdmFsaWQuICBUaGlzIGhhbmRsZXMKKwkJICogUkVJTkRFWCBDT05DVVJSRU5UTFkg b24gYSBwYXJ0aXRpb24gaW5kZXggdGhhdCB3YXMgcHJldmlvdXNseQorCQkgKiBpbnZhbGlkOiB0 aGUgbmV3ICh2YWxpZCkgaW5kZXggcmVwbGFjZXMgdGhlIG9sZCAoaW52YWxpZCkgb25lLAorCQkg KiBhbmQgdGhlIHBhcmVudCBzaG91bGQgYmUgcmUtdmFsaWRhdGVkLgorCQkgKi8KKwkJaWYgKGdl dF9yZWxfcmVsaXNwYXJ0aXRpb24obmV3aWR4LT5pbmRleElkKSkKKwkJeworCQkJT2lkCQkJcGFy ZW50SWR4SWQ7CisKKwkJCXBhcmVudElkeElkID0gZ2V0X3BhcnRpdGlvbl9wYXJlbnQobmV3aWR4 LT5pbmRleElkLCB0cnVlKTsKKwkJCWlmIChPaWRJc1ZhbGlkKHBhcmVudElkeElkKSkKKwkJCXsK KwkJCQlSZWxhdGlvbglwYXJlbnRJZHg7CisJCQkJUmVsYXRpb24JcGFyZW50VGJsOworCisJCQkJ cGFyZW50SWR4ID0gaW5kZXhfb3BlbihwYXJlbnRJZHhJZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkJ CQlwYXJlbnRUYmwgPSB0YWJsZV9vcGVuKHBhcmVudElkeC0+cmRfaW5kZXgtPmluZHJlbGlkLAor CQkJCQkJCQkJICAgQWNjZXNzU2hhcmVMb2NrKTsKKworCQkJCXZhbGlkYXRlUGFydGl0aW9uZWRJ bmRleChwYXJlbnRJZHgsIHBhcmVudFRibCk7CisKKwkJCQl0YWJsZV9jbG9zZShwYXJlbnRUYmws IEFjY2Vzc1NoYXJlTG9jayk7CisJCQkJaW5kZXhfY2xvc2UocGFyZW50SWR4LCBBY2Nlc3NTaGFy ZUxvY2spOworCQkJfQorCQl9CiAJfQogCiAJLyogQ29tbWl0IHRoaXMgdHJhbnNhY3Rpb24gYW5k IG1ha2UgaW5kZXggc3dhcHMgdmlzaWJsZSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29t bWFuZHMvdGFibGVjbWRzLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwppbmRl eCBjNjljMTJkLi44NjEyMDY3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJs ZWNtZHMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwpAQCAtNzQ2LDcg Kzc0Niw2IEBAIHN0YXRpYyB2b2lkIERldGFjaFBhcnRpdGlvbkZpbmFsaXplKFJlbGF0aW9uIHJl bCwgUmVsYXRpb24gcGFydFJlbCwKIHN0YXRpYyBPYmplY3RBZGRyZXNzIEFURXhlY0RldGFjaFBh cnRpdGlvbkZpbmFsaXplKFJlbGF0aW9uIHJlbCwgUmFuZ2VWYXIgKm5hbWUpOwogc3RhdGljIE9i amVjdEFkZHJlc3MgQVRFeGVjQXR0YWNoUGFydGl0aW9uSWR4KExpc3QgKip3cXVldWUsIFJlbGF0 aW9uIHBhcmVudElkeCwKIAkJCQkJCQkJCQkJICBSYW5nZVZhciAqbmFtZSk7Ci1zdGF0aWMgdm9p ZCB2YWxpZGF0ZVBhcnRpdGlvbmVkSW5kZXgoUmVsYXRpb24gcGFydGVkSWR4LCBSZWxhdGlvbiBw YXJ0ZWRUYmwpOwogc3RhdGljIHZvaWQgcmVmdXNlRHVwZUluZGV4QXR0YWNoKFJlbGF0aW9uIHBh cmVudElkeCwgUmVsYXRpb24gcGFydElkeCwKIAkJCQkJCQkJICBSZWxhdGlvbiBwYXJ0aXRpb25U YmwpOwogc3RhdGljIHZvaWQgdmVyaWZ5UGFydGl0aW9uSW5kZXhOb3ROdWxsKEluZGV4SW5mbyAq aWluZm8sIFJlbGF0aW9uIHBhcnRpdGlvbik7CkBAIC0yMjA1OCwxMiArMjIwNTcsMTYgQEAgcmVm dXNlRHVwZUluZGV4QXR0YWNoKFJlbGF0aW9uIHBhcmVudElkeCwgUmVsYXRpb24gcGFydElkeCwg UmVsYXRpb24gcGFydGl0aW9uVGIKIH0KIAogLyoKKyAqIHZhbGlkYXRlUGFydGl0aW9uZWRJbmRl eAorICoKICAqIFZlcmlmeSB3aGV0aGVyIHRoZSBzZXQgb2YgYXR0YWNoZWQgcGFydGl0aW9uIGlu ZGV4ZXMgdG8gYSBwYXJlbnQgaW5kZXggb24KICAqIGEgcGFydGl0aW9uZWQgdGFibGUgaXMgY29t cGxldGUuICBJZiBpdCBpcywgbWFyayB0aGUgcGFyZW50IGluZGV4IHZhbGlkLgogICoKLSAqIFRo aXMgc2hvdWxkIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBwYXJ0aXRpb24gaW5kZXggaXMgYXR0YWNo ZWQuCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZWFjaCB0aW1lIGEgcGFydGl0aW9uIGluZGV4 IGlzIGF0dGFjaGVkLCBhbmQgYWxzbworICogYWZ0ZXIgYSBwYXJ0aXRpb24gaW5kZXggaXMgcmVw YWlyZWQgdmlhIFJFSU5ERVgsIHNvIHRoYXQgdGhlIHBhcmVudCBjYW4KKyAqIGJlIG1hcmtlZCB2 YWxpZCBvbmNlIGFsbCBjaGlsZHJlbiBhcmUgdmFsaWQuCiAgKi8KLXN0YXRpYyB2b2lkCit2b2lk CiB2YWxpZGF0ZVBhcnRpdGlvbmVkSW5kZXgoUmVsYXRpb24gcGFydGVkSWR4LCBSZWxhdGlvbiBw YXJ0ZWRUYmwpCiB7CiAJUmVsYXRpb24JaW5oZXJpdHNSZWw7CmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9jb21tYW5kcy90YWJsZWNtZHMuaCBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21k cy5oCmluZGV4IGMzZDg1MTguLjg0OTgzZmIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NvbW1h bmRzL3RhYmxlY21kcy5oCisrKyBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oCkBA IC0xMDgsNCArMTA4LDYgQEAgZXh0ZXJuIHZvaWQgUmFuZ2VWYXJDYWxsYmFja093bnNSZWxhdGlv bihjb25zdCBSYW5nZVZhciAqcmVsYXRpb24sCiBleHRlcm4gYm9vbCBQYXJ0Q29uc3RyYWludElt cGxpZWRCeVJlbENvbnN0cmFpbnQoUmVsYXRpb24gc2NhbnJlbCwKIAkJCQkJCQkJCQkJCSBMaXN0 ICpwYXJ0Q29uc3RyYWludCk7CiAKK2V4dGVybiB2b2lkIHZhbGlkYXRlUGFydGl0aW9uZWRJbmRl eChSZWxhdGlvbiBwYXJ0ZWRJZHgsIFJlbGF0aW9uIHBhcnRlZFRibCk7CisKICNlbmRpZgkJCQkJ CQkvKiBUQUJMRUNNRFNfSCAqLwotLSAKMi41MC4xIChBcHBsZSBHaXQtMTU1KQoK --000000000000e25580064f00f69f Content-Type: application/octet-stream; name="0001-Always-validate-parent-index-in-ALTER-INDEX-ATTACH.patch" Content-Disposition: attachment; filename="0001-Always-validate-parent-index-in-ALTER-INDEX-ATTACH.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnr2v0m01 RnJvbSBhZjRjMmI3YjQzODU4NTI0MGYxMzRhYTUwZWM5MmMwYjgzOGU0NTczIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNb2hhbWVkIEFsaSA8bW9hbGkucGdAZ21haWwuY29tPgpEYXRl OiBGcmksIDI3IE1hciAyMDI2IDE5OjU2OjI4IC0wNzAwClN1YmplY3Q6IFtQQVRDSF0gZml4OiBB bHdheXMgdmFsaWRhdGUgcGFyZW50IGluZGV4IGluIEFMVEVSIElOREVYIEFUVEFDSAogUEFSVElU SU9OCgpXaGVuIEFMVEVSIElOREVYIC4uLiBBVFRBQ0ggUEFSVElUSU9OIGlzIGV4ZWN1dGVkIG9u IGEgcGFydGl0aW9uIGluZGV4CnRoYXQgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGUgcGFyZW50 LCB0aGUgZW50aXJlIGlmLWJsb2NrIGlzIHNraXBwZWQsCmluY2x1ZGluZyB0aGUgY2FsbCB0byB2 YWxpZGF0ZVBhcnRpdGlvbmVkSW5kZXgoKS4gVGhpcyBtZWFucyB0aGF0IGlmIGEKcHJldmlvdXNs eSBpbnZhbGlkIHBhcnRpdGlvbiBpbmRleCBoYXMgYmVlbiByZXBhaXJlZCB2aWEgUkVJTkRFWCwg dGhlcmUKaXMgbm8gd2F5IHRvIHRyaWdnZXIgcmUtdmFsaWRhdGlvbiBvZiB0aGUgcGFyZW50IHBh cnRpdGlvbmVkIGluZGV4LgoKTW92ZSB0aGUgdmFsaWRhdGVQYXJ0aXRpb25lZEluZGV4KCkgY2Fs bCBvdXRzaWRlIHRoZSBpZi1ibG9jayBzbyBpdApydW5zIHVuY29uZGl0aW9uYWxseS4gVGhpcyBh bGxvd3MgdXNlcnMgdG8gcmUtcnVuIEFMVEVSIElOREVYIEFUVEFDSApQQVJUSVRJT04gb24gYW4g YWxyZWFkeS1hdHRhY2hlZCBpbmRleCB0byB0cmlnZ2VyIHBhcmVudCB2YWxpZGF0aW9uCmFmdGVy IGEgY2hpbGQgaGFzIGJlZW4gZml4ZWQuCgpXaGVuIHRoZSBwYXJ0aXRpb24gaXMgYWxyZWFkeSBh dHRhY2hlZCwgZW1pdCBhIE5PVElDRSBpbmZvcm1pbmcgdGhlCnVzZXIgdGhhdCB0aGUgaW5kZXgg aXMgYWxyZWFkeSBhdHRhY2hlZCBhbmQgdGhhdCBvbmx5IHBhcmVudCB2YWxpZGF0aW9uCmlzIGJl aW5nIHBlcmZvcm1lZC4gVGhpcyBmb2xsb3dzIHRoZSBleGlzdGluZyBQb3N0Z3JlU1FMIGNvbnZl bnRpb24gb2YKdXNpbmcgTk9USUNFIGZvciBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFib3V0IG5v LW9wIG9yIHJlZHVjZWQtc2NvcGUKb3BlcmF0aW9ucyAoZS5nLiwgRFJPUCBJRiBFWElTVFMsIENS RUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTKS4KCk5PVElDRTogIHBhcnRpdGlvbiBpbmRleCAiY2hp bGRfaWR4IiBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvICJwYXJlbnRfaWR4IiwgdmFsaWRhdGluZyBw YXJlbnQgaW5kZXgKCnZhbGlkYXRlUGFydGl0aW9uZWRJbmRleCgpIGlzIGlkZW1wb3RlbnQgYW5k IGNoZWFwIChpdCBzY2FucwpwZ19pbmhlcml0cyBhbmQgY291bnRzIHZhbGlkIGNoaWxkcmVuKSwg c28gY2FsbGluZyBpdCB3aGVuIG5vdCBzdHJpY3RseQpuZWVkZWQgaGFzIG5lZ2xpZ2libGUgcGVy Zm9ybWFuY2UgaW1wYWN0LgoKLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYyB8 IDE5ICsrKysrKysrKysrKysrKystLS0KIDEgZmlsZSBjaGFuZ2VkLCAxNiBpbnNlcnRpb25zKCsp LCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxl Y21kcy5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKaW5kZXggYzY5YzEyZC4u MGIyOTE4MCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKysr IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKQEAgLTIxOTE3LDcgKzIxOTE3LDcg QEAgQVRFeGVjQXR0YWNoUGFydGl0aW9uSWR4KExpc3QgKip3cXVldWUsIFJlbGF0aW9uIHBhcmVu dElkeCwgUmFuZ2VWYXIgKm5hbWUpCiAKIAlPYmplY3RBZGRyZXNzU2V0KGFkZHJlc3MsIFJlbGF0 aW9uUmVsYXRpb25JZCwgUmVsYXRpb25HZXRSZWxpZChwYXJ0SWR4KSk7CiAKLQkvKiBTaWxlbnRs eSBkbyBub3RoaW5nIGlmIGFscmVhZHkgaW4gdGhlIHJpZ2h0IHN0YXRlICovCisJLyogQ2hlY2sg aWYgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGlzIHBhcmVudCAqLwogCWN1cnJQYXJlbnQgPSBwYXJ0 SWR4LT5yZF9yZWwtPnJlbGlzcGFydGl0aW9uID8KIAkJZ2V0X3BhcnRpdGlvbl9wYXJlbnQocGFy dElkeElkLCBmYWxzZSkgOiBJbnZhbGlkT2lkOwogCWlmIChjdXJyUGFyZW50ICE9IFJlbGF0aW9u R2V0UmVsaWQocGFyZW50SWR4KSkKQEAgLTIyMDIzLDkgKzIyMDIzLDIyIEBAIEFURXhlY0F0dGFj aFBhcnRpdGlvbklkeChMaXN0ICoqd3F1ZXVlLCBSZWxhdGlvbiBwYXJlbnRJZHgsIFJhbmdlVmFy ICpuYW1lKQogCQkJCQkJCQkJCSAgUmVsYXRpb25HZXRSZWxpZChwYXJ0VGJsKSk7CiAKIAkJZnJl ZV9hdHRybWFwKGF0dG1hcCk7Ci0KLQkJdmFsaWRhdGVQYXJ0aXRpb25lZEluZGV4KHBhcmVudElk eCwgcGFyZW50VGJsKTsKIAl9CisJZWxzZQorCXsKKwkJZXJlcG9ydChOT1RJQ0UsCisJCQkJKGVy cm1zZygicGFydGl0aW9uIGluZGV4IFwiJXNcIiBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIFwiJXNc IiwgdmFsaWRhdGluZyBwYXJlbnQgaW5kZXgiLAorCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5h bWUocGFydElkeCksCisJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShwYXJlbnRJZHgpKSkp OworCX0KKworCS8qCisJICogQWx3YXlzIHZhbGlkYXRlIHRoZSBwYXJlbnQgcGFydGl0aW9uZWQg aW5kZXgsIGV2ZW4gaWYgdGhlIHBhcnRpdGlvbgorCSAqIHdhcyBhbHJlYWR5IGF0dGFjaGVkLiAg VGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGEgcHJldmlvdXNseQorCSAqIGludmFsaWQgcGFy dGl0aW9uIGluZGV4IGhhcyBiZWVuIHJlcGFpcmVkIChlLmcuLCB2aWEgUkVJTkRFWCkgYW5kCisJ ICogdGhlIHBhcmVudCBjYW4gbm93IGJlIG1hcmtlZCB2YWxpZC4KKwkgKi8KKwl2YWxpZGF0ZVBh cnRpdGlvbmVkSW5kZXgocGFyZW50SWR4LCBwYXJlbnRUYmwpOwogCiAJcmVsYXRpb25fY2xvc2Uo cGFyZW50VGJsLCBBY2Nlc3NTaGFyZUxvY2spOwogCS8qIGtlZXAgdGhlc2UgbG9ja3MgdGlsbCBj b21taXQgKi8KLS0gCjIuNTAuMSAoQXBwbGUgR2l0LTE1NSkKCg== --000000000000e25580064f00f69f--