On Wed, 22 Jul 2026 at 18:02, ZizhuanLiu X-MAN <[email protected]> wrote:
>
> >Hi everyone,
> >
> >While revisiting the discussion for `CF6749 — Disallow whole-row index 
> >references with virtual generated columns? `
> >Based on version V7, I’ve added support for whole-row references within 
> >partial indexes, attached V8 patch.
> >
> >There is one point I may have overlooked: the current implementation appears 
> >to only work for btree indexes.
> >
> >I welcome everyone’s thoughts and look forward to your feedback.
> >
> >Below are the test results:
> >-- test creation of a predicate index with a whole-row expression
> >DROP TABLE IF EXISTS test_pg_wholerow;
> >NOTICE:  table "test_pg_wholerow" does not exist, skipping
> >CREATE TABLE test_pg_wholerow(a int, b int GENERATED ALWAYS AS (a * 2) 
> >VIRTUAL, c text);
> >CREATE UNIQUE INDEX test_pg_wholerow_pred_idx ON test_pg_wholerow(a) WHERE 
> >test_pg_wholerow IS NOT NULL;
> >INSERT INTO test_pg_wholerow(a,c) SELECT NULL, NULL FROM generate_series(1, 
> >1000);
> >INSERT INTO test_pg_wholerow(a,c) SELECT 1, '1';
> >ANALYZE test_pg_wholerow;
> >SELECT relname,reltuples FROM pg_catalog.pg_class WHERE relname IN 
> >('test_pg_wholerow', 'test_pg_wholerow_pred_idx') ORDER BY OID;
> >          relname          | reltuples
> >---------------------------+-----------
> > test_pg_wholerow          |      1001
> > test_pg_wholerow_pred_idx |         1
> >(2 rows)
> >
> >EXPLAIN (COSTS OFF) SELECT *   FROM test_pg_wholerow WHERE test_pg_wholerow 
> >IS NOT NULL;
> >                           QUERY PLAN
> >----------------------------------------------------------------
> > Index Scan using test_pg_wholerow_pred_idx on test_pg_wholerow
> >(1 row)
> >
> >EXPLAIN (COSTS OFF) SELECT a   FROM test_pg_wholerow WHERE test_pg_wholerow 
> >IS NOT NULL;
> >                             QUERY PLAN
> >---------------------------------------------------------------------
> > Index Only Scan using test_pg_wholerow_pred_idx on test_pg_wholerow
> >(1 row)
> >
> >EXPLAIN (COSTS OFF) SELECT a,b FROM test_pg_wholerow WHERE test_pg_wholerow 
> >IS NOT NULL;
> >                             QUERY PLAN
> >---------------------------------------------------------------------
> > Index Only Scan using test_pg_wholerow_pred_idx on test_pg_wholerow
> >(1 row)
> >
> >
> >regards,
> >--
> >ZizhuanLiu (X-MAN)
> >[email protected]
>
>
> Hi, everyone
>
>   Rebase V8 to V9.
>
>
> regards,
> --
> ZizhuanLiu (X-MAN)
> [email protected]

Hi!

There is a different implementation here[0] and there [1], which is
more simple, it simply makes a functional index on VGC. In new v9 the
proposed solution (SGC-like) is much more complex (and ambitious). It
makes a real index on column value itself.

First, patch does not applies after dc5f8cb93467

On dc5f8cb93467~1 there are problems in v9, which are new to jian's v8 [1]:

1)
ALTER TABLE SET EXPRESSION corrupts index.

CREATE TABLE t(a int, v int GENERATED ALWAYS AS(a*2) VIRTUAL)
WITH(fillfactor=50);
CREATE INDEX t_v ON t(v);
INSERT INTO t(a) VALUES(1);
 ALTER TABLE t ALTER COLUMN v SET EXPRESSION AS(a*3);

db1=# SELECT bt_index_check('t_v',true);
ERROR:  heap tuple (0,1) from table "t" lacks matching index tuple
within index "t_v"
HINT:  Retrying verification using the function
bt_index_parent_check() might provide a more specific error.


2)
CREATE TABLE defer_v(a int, v int GENERATED ALWAYS AS(a*2) VIRTUAL
    UNIQUE DEFERRABLE INITIALLY DEFERRED);
BEGIN; INSERT INTO defer_v(a) VALUES(1),(1); COMMIT;

-- server fail due to SIGSEGV



[0] 
https://www.postgresql.org/message-id/flat/cambws4811ng3w_3slxps+eauusffa_83zq-1aceh_jqeq11...@mail.gmail.com
[1] 
https://www.postgresql.org/message-id/CACJufxGhTjcc-z1%3DejgtXCk7L3iy%2BB8aoDAvczaszDM4NPpDVw%40mail.gmail.com

-- 
Best regards,
Kirill Reshke


Reply via email to