Thread

  1. [PATCH v1 4/4] Extra tests

    Nikolay Shaplov <dhyan@nataraj.su> — 2025-08-31T09:10:31Z

    Add more tests for trenary reloptions in dummy_index_am module
    ---
     src/test/modules/dummy_index_am/README        |  1 +
     .../modules/dummy_index_am/dummy_index_am.c   | 36 +++++++++++++-----
     .../dummy_index_am/expected/reloptions.out    | 38 +++++++++++++++++--
     .../modules/dummy_index_am/sql/reloptions.sql | 16 ++++++++
     src/test/regress/expected/reloptions.out      |  4 +-
     src/test/regress/sql/reloptions.sql           |  4 +-
     6 files changed, 81 insertions(+), 18 deletions(-)
    
    diff --git a/src/test/modules/dummy_index_am/README b/src/test/modules/dummy_index_am/README
    index 61510f02fae..78d1d84ed9a 100644
    --- a/src/test/modules/dummy_index_am/README
    +++ b/src/test/modules/dummy_index_am/README
    @@ -6,6 +6,7 @@ access method, whose code is kept a maximum simple.
     
     This includes tests for all relation option types:
     - boolean
    +- trenary
     - enum
     - integer
     - real
    diff --git a/src/test/modules/dummy_index_am/dummy_index_am.c b/src/test/modules/dummy_index_am/dummy_index_am.c
    index 94ef639b6fc..19826e50e6d 100644
    --- a/src/test/modules/dummy_index_am/dummy_index_am.c
    +++ b/src/test/modules/dummy_index_am/dummy_index_am.c
    @@ -22,7 +22,7 @@
     PG_MODULE_MAGIC;
     
     /* parse table for fillRelOptions */
    -static relopt_parse_elt di_relopt_tab[6];
    +static relopt_parse_elt di_relopt_tab[8];
     
     /* Kind of relation options for dummy index */
     static relopt_kind di_relopt_kind;
    @@ -40,6 +40,8 @@ typedef struct DummyIndexOptions
     	int			option_int;
     	double		option_real;
     	bool		option_bool;
    +	trenary		option_trenary1;
    +	trenary		option_trenary2;
     	DummyAmEnum option_enum;
     	int			option_string_val_offset;
     	int			option_string_null_offset;
    @@ -96,23 +98,37 @@ create_reloptions_table(void)
     	di_relopt_tab[2].opttype = RELOPT_TYPE_BOOL;
     	di_relopt_tab[2].offset = offsetof(DummyIndexOptions, option_bool);
     
    +	add_trenary_reloption(di_relopt_kind, "option_trenary1",
    +					   "First trenary option for dummy_index_am",
    +					   TRENARY_UNSET, NULL, AccessExclusiveLock);
    +	di_relopt_tab[3].optname = "option_trenary1";
    +	di_relopt_tab[3].opttype = RELOPT_TYPE_TRENARY;
    +	di_relopt_tab[3].offset = offsetof(DummyIndexOptions, option_trenary1);
    +
    +	add_trenary_reloption(di_relopt_kind, "option_trenary2",
    +					   "Second trenary option for dummy_index_am",
    +					   TRENARY_TRUE, "do_not_know_yet", AccessExclusiveLock);
    +	di_relopt_tab[4].optname = "option_trenary2";
    +	di_relopt_tab[4].opttype = RELOPT_TYPE_TRENARY;
    +	di_relopt_tab[4].offset = offsetof(DummyIndexOptions, option_trenary2);
    +
     	add_enum_reloption(di_relopt_kind, "option_enum",
     					   "Enum option for dummy_index_am",
     					   dummyAmEnumValues,
     					   DUMMY_AM_ENUM_ONE,
     					   "Valid values are \"one\" and \"two\".",
     					   AccessExclusiveLock);
    -	di_relopt_tab[3].optname = "option_enum";
    -	di_relopt_tab[3].opttype = RELOPT_TYPE_ENUM;
    -	di_relopt_tab[3].offset = offsetof(DummyIndexOptions, option_enum);
    +	di_relopt_tab[5].optname = "option_enum";
    +	di_relopt_tab[5].opttype = RELOPT_TYPE_ENUM;
    +	di_relopt_tab[5].offset = offsetof(DummyIndexOptions, option_enum);
     
     	add_string_reloption(di_relopt_kind, "option_string_val",
     						 "String option for dummy_index_am with non-NULL default",
     						 "DefaultValue", &validate_string_option,
     						 AccessExclusiveLock);
    -	di_relopt_tab[4].optname = "option_string_val";
    -	di_relopt_tab[4].opttype = RELOPT_TYPE_STRING;
    -	di_relopt_tab[4].offset = offsetof(DummyIndexOptions,
    +	di_relopt_tab[6].optname = "option_string_val";
    +	di_relopt_tab[6].opttype = RELOPT_TYPE_STRING;
    +	di_relopt_tab[6].offset = offsetof(DummyIndexOptions,
     									   option_string_val_offset);
     
     	/*
    @@ -123,9 +139,9 @@ create_reloptions_table(void)
     						 NULL,	/* description */
     						 NULL, &validate_string_option,
     						 AccessExclusiveLock);
    -	di_relopt_tab[5].optname = "option_string_null";
    -	di_relopt_tab[5].opttype = RELOPT_TYPE_STRING;
    -	di_relopt_tab[5].offset = offsetof(DummyIndexOptions,
    +	di_relopt_tab[7].optname = "option_string_null";
    +	di_relopt_tab[7].opttype = RELOPT_TYPE_STRING;
    +	di_relopt_tab[7].offset = offsetof(DummyIndexOptions,
     									   option_string_null_offset);
     }
     
    diff --git a/src/test/modules/dummy_index_am/expected/reloptions.out b/src/test/modules/dummy_index_am/expected/reloptions.out
    index c873a80bb75..bcf164f5bf7 100644
    --- a/src/test/modules/dummy_index_am/expected/reloptions.out
    +++ b/src/test/modules/dummy_index_am/expected/reloptions.out
    @@ -18,6 +18,8 @@ SET client_min_messages TO 'notice';
     CREATE INDEX dummy_test_idx ON dummy_test_tab
       USING dummy_index_am (i) WITH (
       option_bool = false,
    +  option_trenary1,
    +  option_trenary2 = off,
       option_int = 5,
       option_real = 3.1,
       option_enum = 'two',
    @@ -31,16 +33,20 @@ SELECT unnest(reloptions) FROM pg_class WHERE relname = 'dummy_test_idx';
              unnest         
     ------------------------
      option_bool=false
    + option_trenary1=true
    + option_trenary2=off
      option_int=5
      option_real=3.1
      option_enum=two
      option_string_val=null
      option_string_null=val
    -(6 rows)
    +(8 rows)
     
     -- ALTER INDEX .. SET
     ALTER INDEX dummy_test_idx SET (option_int = 10);
     ALTER INDEX dummy_test_idx SET (option_bool = true);
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = false);
    +ALTER INDEX dummy_test_idx SET (option_trenary2 = Do_Not_Know_YET);
     ALTER INDEX dummy_test_idx SET (option_real = 3.2);
     ALTER INDEX dummy_test_idx SET (option_string_val = 'val2');
     ALTER INDEX dummy_test_idx SET (option_string_null = NULL);
    @@ -49,19 +55,23 @@ ALTER INDEX dummy_test_idx SET (option_enum = 'three');
     ERROR:  invalid value for enum option "option_enum": three
     DETAIL:  Valid values are "one" and "two".
     SELECT unnest(reloptions) FROM pg_class WHERE relname = 'dummy_test_idx';
    -         unnest          
    --------------------------
    +             unnest              
    +---------------------------------
      option_int=10
      option_bool=true
    + option_trenary1=false
    + option_trenary2=do_not_know_yet
      option_real=3.2
      option_string_val=val2
      option_string_null=null
      option_enum=one
    -(6 rows)
    +(8 rows)
     
     -- ALTER INDEX .. RESET
     ALTER INDEX dummy_test_idx RESET (option_int);
     ALTER INDEX dummy_test_idx RESET (option_bool);
    +ALTER INDEX dummy_test_idx RESET (option_trenary1);
    +ALTER INDEX dummy_test_idx RESET (option_trenary2);
     ALTER INDEX dummy_test_idx RESET (option_real);
     ALTER INDEX dummy_test_idx RESET (option_enum);
     ALTER INDEX dummy_test_idx RESET (option_string_val);
    @@ -100,6 +110,26 @@ SELECT unnest(reloptions) FROM pg_class WHERE relname = 'dummy_test_idx';
     (1 row)
     
     ALTER INDEX dummy_test_idx RESET (option_bool);
    +-- Trenary
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 4); -- error
    +ERROR:  invalid value for trenary option "option_trenary1": 4
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 1); -- ok, as true
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 3.4); -- error
    +ERROR:  invalid value for trenary option "option_trenary1": 3.4
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 'val4'); -- error
    +ERROR:  invalid value for trenary option "option_trenary1": val4
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 'do_not_know_yet'); -- error. Valid for trenary2 not for trenary1
    +ERROR:  invalid value for trenary option "option_trenary1": do_not_know_yet
    +ALTER INDEX dummy_test_idx SET (option_trenary2 = 'do_not_know_yet'); -- ok
    +SELECT unnest(reloptions) FROM pg_class WHERE relname = 'dummy_test_idx';
    +             unnest              
    +---------------------------------
    + option_trenary1=1
    + option_trenary2=do_not_know_yet
    +(2 rows)
    +
    +ALTER INDEX dummy_test_idx RESET (option_trenary1);
    +ALTER INDEX dummy_test_idx RESET (option_trenary2);
     -- Float
     ALTER INDEX dummy_test_idx SET (option_real = 4); -- ok
     ALTER INDEX dummy_test_idx SET (option_real = true); -- error
    diff --git a/src/test/modules/dummy_index_am/sql/reloptions.sql b/src/test/modules/dummy_index_am/sql/reloptions.sql
    index 6749d763e6a..7e752b12d16 100644
    --- a/src/test/modules/dummy_index_am/sql/reloptions.sql
    +++ b/src/test/modules/dummy_index_am/sql/reloptions.sql
    @@ -18,6 +18,8 @@ SET client_min_messages TO 'notice';
     CREATE INDEX dummy_test_idx ON dummy_test_tab
       USING dummy_index_am (i) WITH (
       option_bool = false,
    +  option_trenary1,
    +  option_trenary2 = off,
       option_int = 5,
       option_real = 3.1,
       option_enum = 'two',
    @@ -30,6 +32,8 @@ SELECT unnest(reloptions) FROM pg_class WHERE relname = 'dummy_test_idx';
     -- ALTER INDEX .. SET
     ALTER INDEX dummy_test_idx SET (option_int = 10);
     ALTER INDEX dummy_test_idx SET (option_bool = true);
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = false);
    +ALTER INDEX dummy_test_idx SET (option_trenary2 = Do_Not_Know_YET);
     ALTER INDEX dummy_test_idx SET (option_real = 3.2);
     ALTER INDEX dummy_test_idx SET (option_string_val = 'val2');
     ALTER INDEX dummy_test_idx SET (option_string_null = NULL);
    @@ -40,6 +44,8 @@ SELECT unnest(reloptions) FROM pg_class WHERE relname = 'dummy_test_idx';
     -- ALTER INDEX .. RESET
     ALTER INDEX dummy_test_idx RESET (option_int);
     ALTER INDEX dummy_test_idx RESET (option_bool);
    +ALTER INDEX dummy_test_idx RESET (option_trenary1);
    +ALTER INDEX dummy_test_idx RESET (option_trenary2);
     ALTER INDEX dummy_test_idx RESET (option_real);
     ALTER INDEX dummy_test_idx RESET (option_enum);
     ALTER INDEX dummy_test_idx RESET (option_string_val);
    @@ -60,6 +66,16 @@ ALTER INDEX dummy_test_idx SET (option_bool = 3.4); -- error
     ALTER INDEX dummy_test_idx SET (option_bool = 'val4'); -- error
     SELECT unnest(reloptions) FROM pg_class WHERE relname = 'dummy_test_idx';
     ALTER INDEX dummy_test_idx RESET (option_bool);
    +-- Trenary
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 4); -- error
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 1); -- ok, as true
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 3.4); -- error
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 'val4'); -- error
    +ALTER INDEX dummy_test_idx SET (option_trenary1 = 'do_not_know_yet'); -- error. Valid for trenary2 not for trenary1
    +ALTER INDEX dummy_test_idx SET (option_trenary2 = 'do_not_know_yet'); -- ok
    +SELECT unnest(reloptions) FROM pg_class WHERE relname = 'dummy_test_idx';
    +ALTER INDEX dummy_test_idx RESET (option_trenary1);
    +ALTER INDEX dummy_test_idx RESET (option_trenary2);
     -- Float
     ALTER INDEX dummy_test_idx SET (option_real = 4); -- ok
     ALTER INDEX dummy_test_idx SET (option_real = true); -- error
    diff --git a/src/test/regress/expected/reloptions.out b/src/test/regress/expected/reloptions.out
    index e32431ca067..54b3424ef2b 100644
    --- a/src/test/regress/expected/reloptions.out
    +++ b/src/test/regress/expected/reloptions.out
    @@ -98,7 +98,7 @@ SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
      {fillfactor=13,autovacuum_enabled=false}
     (1 row)
     
    --- Tests for future (FIXME) trenary options
    +-- Tests for trenary options
     -- behave as boolean option: accept unassigned name and truncated value
     DROP TABLE reloptions_test;
     CREATE TABLE reloptions_test(i INT) WITH (vacuum_truncate);
    @@ -116,7 +116,7 @@ SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
      {vacuum_truncate=fals}
     (1 row)
     
    --- preferred "true" alias is used when storing
    +-- preferred "true" alias is stored in pg_class
     DROP TABLE reloptions_test;
     CREATE TABLE reloptions_test(i INT) WITH (vacuum_index_cleanup=on);
     SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
    diff --git a/src/test/regress/sql/reloptions.sql b/src/test/regress/sql/reloptions.sql
    index 051142eed5f..1971d460672 100644
    --- a/src/test/regress/sql/reloptions.sql
    +++ b/src/test/regress/sql/reloptions.sql
    @@ -59,7 +59,7 @@ UPDATE pg_class
     ALTER TABLE reloptions_test RESET (illegal_option);
     SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
     
    --- Tests for future (FIXME) trenary options
    +-- Tests for trenary options
     
     -- behave as boolean option: accept unassigned name and truncated value
     DROP TABLE reloptions_test;
    @@ -70,7 +70,7 @@ DROP TABLE reloptions_test;
     CREATE TABLE reloptions_test(i INT) WITH (vacuum_truncate=FaLS);
     SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
     
    --- preferred "true" alias is used when storing
    +-- preferred "true" alias is stored in pg_class
     DROP TABLE reloptions_test;
     CREATE TABLE reloptions_test(i INT) WITH (vacuum_index_cleanup=on);
     SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
    -- 
    2.39.2
    
    
    --nextPart6784952.tM3a2QDmDi--
    
    --nextPart6187903.UjTJXf6HLC
    Content-Type: application/pgp-signature; name="signature.asc"
    Content-Description: This is a digitally signed message part.
    Content-Transfer-Encoding: 7Bit
    
    -----BEGIN PGP SIGNATURE-----
    
    iQEzBAABCgAdFiEE+sk3ebqQKlezKOi8PMbfuIHAGpgFAmi0gCMACgkQPMbfuIHA
    Gpi3Dgf/dQxIJ7WM8rL4szT+d+7gCw1BUzA7H4SkLtGM8E+akUvbjt6lFpCKN7fP
    dHWTY7NeHsLy8hXB7Z+P4edaHAqNQ7pXtESuC0jBB1Ta5r9f0mUz/tNvyaoj1YPV
    SES411gQwABIJ/ZXoqrcAHgmJoyAKZcFWU9HBAhJyL3Da/o7L86wgro4a6ov7cgP
    1mJa6WjH1qf1v4PPrZYxLMmU5v3uacNDFowNsQ8+uHs+slUWjkw4VYatdReWla0a
    4qBnMaht1Xky3f55YfB7Gx28CBUUPMREUVKFOrcopq95kZ9WASoTJfU9Y80IDPWb
    KVcJvYDk5TEL1t48GpFkjZbL9od51w==
    =yrfm
    -----END PGP SIGNATURE-----
    
    --nextPart6187903.UjTJXf6HLC--