From 8d2b8de0a1f1b6965a4b2019112de3b3c512681d Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 12 Apr 2025 21:45:51 +0200 Subject: [PATCH 1/8] postgresqlPackages: add "asserts" option to postgresqlTestExtension --- .../postgresql/ext/pgvectorscale/package.nix | 60 ++++++++----------- .../postgresql/postgresqlTestExtension.nix | 24 +++++++- 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/pkgs/servers/sql/postgresql/ext/pgvectorscale/package.nix b/pkgs/servers/sql/postgresql/ext/pgvectorscale/package.nix index f25c7efc67b5..15b2ad9240bd 100644 --- a/pkgs/servers/sql/postgresql/ext/pgvectorscale/package.nix +++ b/pkgs/servers/sql/postgresql/ext/pgvectorscale/package.nix @@ -35,44 +35,32 @@ buildPgrxExtension (finalAttrs: { passthru.tests.extension = postgresqlTestExtension { inherit (finalAttrs) finalPackage; withPackages = [ "pgvector" ]; - sql = - let - genCheck = - id: compare: expected: - let - vecStr = "[${lib.concatMapStringsSep "," toString compare}]"; - in - '' - ASSERT ( - SELECT id - FROM document_embedding - WHERE ${toString expected} = (embedding <-> '${vecStr}') - ) = ${toString id}, - 'Expected vector of row with ID=${toString id} to have a euclidean distance from ${vecStr} of ${toString expected}'; - ''; - in - '' - CREATE EXTENSION vectorscale CASCADE; - CREATE TABLE IF NOT EXISTS document_embedding ( - id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, - embedding VECTOR(3) - ); + sql = '' + CREATE EXTENSION vectorscale CASCADE; + CREATE TABLE document_embedding ( + id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, + embedding VECTOR(3) + ); - INSERT INTO document_embedding (id, embedding) VALUES - (1, '[1,2,4]'), - (2, '[1,2,5]'); + INSERT INTO document_embedding (id, embedding) VALUES + (10, '[1,2,4]'), + (20, '[1,2,5]'); - CREATE INDEX document_embedding_idx ON document_embedding - USING diskann (embedding vector_cosine_ops); - - DO $$ - BEGIN - ${genCheck 1 [ 1 2 3 ] 1} - ${genCheck 2 [ 1 2 3 ] 2} - END; - $$ - LANGUAGE PLPGSQL; - ''; + CREATE INDEX document_embedding_idx ON document_embedding + USING diskann (embedding vector_cosine_ops); + ''; + asserts = [ + { + query = "SELECT id FROM document_embedding WHERE embedding <-> '[1,2,3]' = 1"; + expected = "10"; + description = "Expected vector of row with ID=10 to have an euclidean distance from [1,2,3] of 1."; + } + { + query = "SELECT id FROM document_embedding WHERE embedding <-> '[1,2,3]' = 2"; + expected = "20"; + description = "Expected vector of row with ID=20 to have an euclidean distance from [1,2,3] of 2."; + } + ]; }; meta = { diff --git a/pkgs/servers/sql/postgresql/postgresqlTestExtension.nix b/pkgs/servers/sql/postgresql/postgresqlTestExtension.nix index 468a89a3b2e2..fead59db740c 100644 --- a/pkgs/servers/sql/postgresql/postgresqlTestExtension.nix +++ b/pkgs/servers/sql/postgresql/postgresqlTestExtension.nix @@ -1,11 +1,14 @@ { + lib, postgresql, postgresqlTestHook, stdenvNoCC, }: { + asserts ? [ ], finalPackage, + sql, withPackages ? [ ], ... }@extraArgs: @@ -21,6 +24,20 @@ stdenvNoCC.mkDerivation ( failureHook = "postgresqlStop"; postgresqlTestUserOptions = "LOGIN SUPERUSER"; passAsFile = [ "sql" ]; + sql = + sql + + lib.concatMapStrings ( + { + query, + expected, + description, + }: + '' + DO $$ BEGIN + ASSERT (${query}) = (${expected}), '${lib.replaceStrings [ "'" ] [ "''" ] description}'; + END $$; + '' + ) asserts; checkPhase = '' runHook preCheck psql -a -v ON_ERROR_STOP=1 -f "$sqlPath" @@ -28,5 +45,10 @@ stdenvNoCC.mkDerivation ( ''; installPhase = "touch $out"; } - // extraArgs + // lib.removeAttrs extraArgs [ + "asserts" + "finalPackage" + "sql" + "withPackages" + ] ) From 3ebdd4913c66cd93a4388612b05a49e5e6f0b311 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 12 Apr 2025 21:46:07 +0200 Subject: [PATCH 2/8] postgresqlPackages.pg_byteamagic: improve tests with assertion --- pkgs/servers/sql/postgresql/ext/pg_byteamagic.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkgs/servers/sql/postgresql/ext/pg_byteamagic.nix b/pkgs/servers/sql/postgresql/ext/pg_byteamagic.nix index 8de8850d04eb..83bccbdf5cfa 100644 --- a/pkgs/servers/sql/postgresql/ext/pg_byteamagic.nix +++ b/pkgs/servers/sql/postgresql/ext/pg_byteamagic.nix @@ -29,6 +29,13 @@ postgresqlBuildExtension (finalAttrs: { CREATE EXTENSION byteamagic; SELECT byteamagic_mime('test'); ''; + asserts = [ + { + query = "SELECT byteamagic_mime('test')"; + expected = "'text/plain'"; + description = "`byteamagic_mime(...) should return proper mimetype."; + } + ]; }; }; From debf86e09e2a8c21a22c189baab94ba514356187 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 12 Apr 2025 21:49:59 +0200 Subject: [PATCH 3/8] postgresqlPackages.rum: use postgresqlTestExtension helper --- pkgs/servers/sql/postgresql/ext/rum.nix | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/pkgs/servers/sql/postgresql/ext/rum.nix b/pkgs/servers/sql/postgresql/ext/rum.nix index 1124ab9a445a..d6a11d6cec4a 100644 --- a/pkgs/servers/sql/postgresql/ext/rum.nix +++ b/pkgs/servers/sql/postgresql/ext/rum.nix @@ -3,7 +3,7 @@ lib, postgresql, postgresqlBuildExtension, - postgresqlTestHook, + postgresqlTestExtension, stdenv, }: @@ -20,32 +20,13 @@ postgresqlBuildExtension (finalAttrs: { makeFlags = [ "USE_PGXS=1" ]; - passthru.tests.extension = stdenv.mkDerivation { - inherit (finalAttrs) version; - pname = "rum-test"; - - dontUnpack = true; - doCheck = true; - nativeCheckInputs = [ - postgresqlTestHook - (postgresql.withPackages (_: [ finalAttrs.finalPackage ])) - ]; - failureHook = "postgresqlStop"; - postgresqlTestUserOptions = "LOGIN SUPERUSER"; - passAsFile = [ "sql" ]; + passthru.tests.extension = postgresqlTestExtension { + inherit (finalAttrs) finalPackage; sql = '' CREATE EXTENSION rum; CREATE TABLE test_table (t text, v tsvector); CREATE INDEX test_table_rumindex ON test_table USING rum (v rum_tsvector_ops); ''; - checkPhase = '' - runHook preCheck - - psql -a -v ON_ERROR_STOP=1 -f $sqlPath - - runHook postCheck - ''; - installPhase = "touch $out"; }; meta = { From 6cc89cd16e252f86e35004136f1d963b2dedae7f Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 12 Apr 2025 22:12:44 +0200 Subject: [PATCH 4/8] postgresqlPackages.citus: move test from VM to postgresqlTestExtension --- nixos/tests/postgresql/citus.nix | 73 ----------------------- nixos/tests/postgresql/default.nix | 1 - pkgs/servers/sql/postgresql/ext/citus.nix | 28 +++++++++ 3 files changed, 28 insertions(+), 74 deletions(-) delete mode 100644 nixos/tests/postgresql/citus.nix diff --git a/nixos/tests/postgresql/citus.nix b/nixos/tests/postgresql/citus.nix deleted file mode 100644 index 6739b32d5642..000000000000 --- a/nixos/tests/postgresql/citus.nix +++ /dev/null @@ -1,73 +0,0 @@ -{ - pkgs, - makeTest, - genTests, -}: - -let - inherit (pkgs) lib; - - test-sql = pkgs.writeText "postgresql-test" '' - CREATE EXTENSION citus; - - CREATE TABLE examples ( - id bigserial, - shard_key int, - PRIMARY KEY (id, shard_key) - ); - - SELECT create_distributed_table('examples', 'shard_key'); - - INSERT INTO examples (shard_key) SELECT shard % 10 FROM generate_series(1,1000) shard; - ''; - - makeTestFor = - package: - makeTest { - name = "citus-${package.name}"; - meta = with lib.maintainers; { - maintainers = [ typetetris ]; - }; - - nodes.machine = - { ... }: - { - services.postgresql = { - inherit package; - enable = true; - enableJIT = lib.hasInfix "-jit-" package.name; - extensions = - ps: with ps; [ - citus - ]; - settings = { - shared_preload_libraries = "citus"; - }; - }; - }; - - testScript = '' - def check_count(statement, lines): - return 'test $(sudo -u postgres psql postgres -tAc "{}") -eq {}'.format( - statement, lines - ) - - - machine.start() - machine.wait_for_unit("postgresql") - - with subtest("Postgresql with extension citus is available just after unit start"): - machine.succeed( - "sudo -u postgres psql -f ${test-sql}" - ) - - machine.succeed(check_count("SELECT count(*) FROM examples;", 1000)) - - machine.shutdown() - ''; - }; -in -genTests { - inherit makeTestFor; - filter = _: p: !p.pkgs.citus.meta.broken; -} diff --git a/nixos/tests/postgresql/default.nix b/nixos/tests/postgresql/default.nix index 474f54a17201..91f7694208b1 100644 --- a/nixos/tests/postgresql/default.nix +++ b/nixos/tests/postgresql/default.nix @@ -36,7 +36,6 @@ in # extensions anonymizer = importWithArgs ./anonymizer.nix; - citus = importWithArgs ./citus.nix; pgjwt = importWithArgs ./pgjwt.nix; pgvecto-rs = importWithArgs ./pgvecto-rs.nix; timescaledb = importWithArgs ./timescaledb.nix; diff --git a/pkgs/servers/sql/postgresql/ext/citus.nix b/pkgs/servers/sql/postgresql/ext/citus.nix index 9298156aacd5..a0861ae0aebc 100644 --- a/pkgs/servers/sql/postgresql/ext/citus.nix +++ b/pkgs/servers/sql/postgresql/ext/citus.nix @@ -6,6 +6,7 @@ lz4, postgresql, postgresqlBuildExtension, + postgresqlTestExtension, stdenv, }: @@ -35,6 +36,33 @@ postgresqlBuildExtension (finalAttrs: { lz4 ]; + passthru.tests.extension = postgresqlTestExtension { + inherit (finalAttrs) finalPackage; + postgresqlExtraSettings = '' + shared_preload_libraries=citus + ''; + sql = '' + CREATE EXTENSION citus; + + CREATE TABLE examples ( + id bigserial, + shard_key int, + PRIMARY KEY (id, shard_key) + ); + + SELECT create_distributed_table('examples', 'shard_key'); + + INSERT INTO examples (shard_key) SELECT shard % 10 FROM generate_series(1,1000) shard; + ''; + asserts = [ + { + query = "SELECT count(*) FROM examples"; + expected = "1000"; + description = "Distributed table can be queried successfully."; + } + ]; + }; + meta = { # "Our soft policy for Postgres version compatibility is to support Citus' # latest release with Postgres' 3 latest releases." From e06b22b25468c790815aa3e6d897e2a4b6047c1f Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 12 Apr 2025 22:13:13 +0200 Subject: [PATCH 5/8] postgresqlPackages.timescaledb: move test from VM to postgresqlTestExtension --- nixos/tests/postgresql/default.nix | 1 - nixos/tests/postgresql/timescaledb.nix | 98 ------------------- .../sql/postgresql/ext/timescaledb.nix | 46 ++++++++- 3 files changed, 45 insertions(+), 100 deletions(-) delete mode 100644 nixos/tests/postgresql/timescaledb.nix diff --git a/nixos/tests/postgresql/default.nix b/nixos/tests/postgresql/default.nix index 91f7694208b1..dade2542edb7 100644 --- a/nixos/tests/postgresql/default.nix +++ b/nixos/tests/postgresql/default.nix @@ -38,7 +38,6 @@ in anonymizer = importWithArgs ./anonymizer.nix; pgjwt = importWithArgs ./pgjwt.nix; pgvecto-rs = importWithArgs ./pgvecto-rs.nix; - timescaledb = importWithArgs ./timescaledb.nix; tsja = importWithArgs ./tsja.nix; wal2json = importWithArgs ./wal2json.nix; } diff --git a/nixos/tests/postgresql/timescaledb.nix b/nixos/tests/postgresql/timescaledb.nix deleted file mode 100644 index 7ad8b0fcc972..000000000000 --- a/nixos/tests/postgresql/timescaledb.nix +++ /dev/null @@ -1,98 +0,0 @@ -{ - pkgs, - makeTest, - genTests, -}: - -let - inherit (pkgs) lib; - - test-sql = pkgs.writeText "postgresql-test" '' - CREATE EXTENSION timescaledb; - CREATE EXTENSION timescaledb_toolkit; - - CREATE TABLE sth ( - time TIMESTAMPTZ NOT NULL, - value DOUBLE PRECISION - ); - - SELECT create_hypertable('sth', 'time'); - - INSERT INTO sth (time, value) VALUES - ('2003-04-12 04:05:06 America/New_York', 1.0), - ('2003-04-12 04:05:07 America/New_York', 2.0), - ('2003-04-12 04:05:08 America/New_York', 3.0), - ('2003-04-12 04:05:09 America/New_York', 4.0), - ('2003-04-12 04:05:10 America/New_York', 5.0) - ; - - WITH t AS ( - SELECT - time_bucket('1 day'::interval, time) AS dt, - stats_agg(value) AS stats - FROM sth - GROUP BY time_bucket('1 day'::interval, time) - ) - SELECT - average(stats) - FROM t; - - SELECT * FROM sth; - ''; - - makeTestFor = - package: - makeTest { - name = "timescaledb-${package.name}"; - meta = with lib.maintainers; { - maintainers = [ typetetris ]; - }; - - nodes.machine = - { ... }: - { - services.postgresql = { - inherit package; - enable = true; - enableJIT = lib.hasInfix "-jit-" package.name; - extensions = - ps: with ps; [ - timescaledb - timescaledb_toolkit - ]; - settings = { - shared_preload_libraries = "timescaledb, timescaledb_toolkit"; - }; - }; - }; - - testScript = '' - def check_count(statement, lines): - return 'test $(sudo -u postgres psql postgres -tAc "{}"|wc -l) -eq {}'.format( - statement, lines - ) - - - machine.start() - machine.wait_for_unit("postgresql") - - with subtest("Postgresql with extensions timescaledb and timescaledb_toolkit is available just after unit start"): - machine.succeed( - "sudo -u postgres psql -f ${test-sql}" - ) - - machine.fail(check_count("SELECT * FROM sth;", 3)) - machine.succeed(check_count("SELECT * FROM sth;", 5)) - machine.fail(check_count("SELECT * FROM sth;", 4)) - - machine.shutdown() - ''; - }; -in -# Not run by default, because this requires allowUnfree. -# To run these tests: -# NIXPKGS_ALLOW_UNFREE=1 nix-build -A nixosTests.postgresql.timescaledb -lib.dontRecurseIntoAttrs (genTests { - inherit makeTestFor; - filter = _: p: !p.pkgs.timescaledb.meta.broken; -}) diff --git a/pkgs/servers/sql/postgresql/ext/timescaledb.nix b/pkgs/servers/sql/postgresql/ext/timescaledb.nix index 579706e1afa0..5997b18410bb 100644 --- a/pkgs/servers/sql/postgresql/ext/timescaledb.nix +++ b/pkgs/servers/sql/postgresql/ext/timescaledb.nix @@ -7,6 +7,7 @@ openssl, postgresql, postgresqlBuildExtension, + postgresqlTestExtension, stdenv, enableUnfree ? true, @@ -50,7 +51,50 @@ postgresqlBuildExtension (finalAttrs: { done ''; - passthru.tests = nixosTests.postgresql.timescaledb.passthru.override postgresql; + passthru.tests.extension = postgresqlTestExtension { + inherit (finalAttrs) finalPackage; + withPackages = [ "timescaledb_toolkit" ]; + postgresqlExtraSettings = '' + shared_preload_libraries='timescaledb,timescaledb_toolkit' + ''; + sql = '' + CREATE EXTENSION timescaledb; + CREATE EXTENSION timescaledb_toolkit; + + CREATE TABLE sth ( + time TIMESTAMPTZ NOT NULL, + value DOUBLE PRECISION + ); + + SELECT create_hypertable('sth', 'time'); + + INSERT INTO sth (time, value) VALUES + ('2003-04-12 04:05:06 America/New_York', 1.0), + ('2003-04-12 04:05:07 America/New_York', 2.0), + ('2003-04-12 04:05:08 America/New_York', 3.0), + ('2003-04-12 04:05:09 America/New_York', 4.0), + ('2003-04-12 04:05:10 America/New_York', 5.0) + ; + + WITH t AS ( + SELECT + time_bucket('1 day'::interval, time) AS dt, + stats_agg(value) AS stats + FROM sth + GROUP BY time_bucket('1 day'::interval, time) + ) + SELECT + average(stats) + FROM t; + ''; + asserts = [ + { + query = "SELECT count(*) FROM sth"; + expected = "5"; + description = "hypertable can be queried successfully."; + } + ]; + }; meta = { description = "Scales PostgreSQL for time-series data via automatic partitioning across time and space"; From 3af009b416db3ced8119bf757b2af860d82c0047 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 12 Apr 2025 22:13:30 +0200 Subject: [PATCH 6/8] postgresqlPackages.tsja: move test from VM to postgresqlTestExtension --- nixos/tests/postgresql/default.nix | 1 - nixos/tests/postgresql/tsja.nix | 48 ------------------------ pkgs/servers/sql/postgresql/ext/tsja.nix | 15 +++++++- 3 files changed, 14 insertions(+), 50 deletions(-) delete mode 100644 nixos/tests/postgresql/tsja.nix diff --git a/nixos/tests/postgresql/default.nix b/nixos/tests/postgresql/default.nix index dade2542edb7..8dd0619570cc 100644 --- a/nixos/tests/postgresql/default.nix +++ b/nixos/tests/postgresql/default.nix @@ -38,6 +38,5 @@ in anonymizer = importWithArgs ./anonymizer.nix; pgjwt = importWithArgs ./pgjwt.nix; pgvecto-rs = importWithArgs ./pgvecto-rs.nix; - tsja = importWithArgs ./tsja.nix; wal2json = importWithArgs ./wal2json.nix; } diff --git a/nixos/tests/postgresql/tsja.nix b/nixos/tests/postgresql/tsja.nix deleted file mode 100644 index 4cc5bd124139..000000000000 --- a/nixos/tests/postgresql/tsja.nix +++ /dev/null @@ -1,48 +0,0 @@ -{ - pkgs, - makeTest, - genTests, -}: - -let - inherit (pkgs) lib; - - makeTestFor = - package: - makeTest { - name = "tsja-${package.name}"; - meta = { - maintainers = with lib.maintainers; [ chayleaf ]; - }; - - nodes.master = - { ... }: - { - services.postgresql = { - inherit package; - enable = true; - enableJIT = lib.hasInfix "-jit-" package.name; - extensions = - ps: with ps; [ - tsja - ]; - }; - }; - - testScript = '' - start_all() - master.wait_for_unit("postgresql") - master.succeed("sudo -u postgres psql -f /run/current-system/sw/share/postgresql/extension/libtsja_dbinit.sql") - # make sure "日本語" is parsed as a separate lexeme - master.succeed(""" - sudo -u postgres \\ - psql -c "SELECT * FROM ts_debug('japanese', 'PostgreSQLで日本語のテキスト検索ができます。')" \\ - | grep "{日本語}" - """) - ''; - }; -in -genTests { - inherit makeTestFor; - filter = _: p: !p.pkgs.tsja.meta.broken; -} diff --git a/pkgs/servers/sql/postgresql/ext/tsja.nix b/pkgs/servers/sql/postgresql/ext/tsja.nix index 74517651b4b7..f9ea021b76b2 100644 --- a/pkgs/servers/sql/postgresql/ext/tsja.nix +++ b/pkgs/servers/sql/postgresql/ext/tsja.nix @@ -4,6 +4,7 @@ mecab, nixosTests, postgresql, + postgresqlTestExtension, stdenv, }: @@ -35,7 +36,19 @@ stdenv.mkDerivation (finalAttrs: { mv dbinit_libtsja.txt $out/share/postgresql/extension/libtsja_dbinit.sql ''; - passthru.tests = nixosTests.postgresql.tsja.passthru.override postgresql; + passthru.tests.extension = postgresqlTestExtension { + inherit (finalAttrs) finalPackage; + sql = '' + \i ${finalAttrs.finalPackage}/share/postgresql/extension/libtsja_dbinit.sql + ''; + asserts = [ + { + query = "EXISTS (SELECT 1 FROM ts_debug('japanese', 'PostgreSQLで日本語のテキスト検索ができます。') WHERE lexemes = '{日本語}')"; + expected = "true"; + description = "make sure '日本語' is parsed as a separate lexeme"; + } + ]; + }; meta = { description = "PostgreSQL extension implementing Japanese text search"; From 8ebdf3362434e2ed0c0786dc22af2a436e4a0d47 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 12 Apr 2025 22:46:06 +0200 Subject: [PATCH 7/8] postgresqlPackages.postgis: use postgresqlTestExtension's asserts option --- pkgs/servers/sql/postgresql/ext/postgis.nix | 29 +++++++++------------ 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/pkgs/servers/sql/postgresql/ext/postgis.nix b/pkgs/servers/sql/postgresql/ext/postgis.nix index 2317105dd130..067409a230ff 100644 --- a/pkgs/servers/sql/postgresql/ext/postgis.nix +++ b/pkgs/servers/sql/postgresql/ext/postgis.nix @@ -125,31 +125,15 @@ postgresqlBuildExtension (finalAttrs: { passthru.tests.extension = postgresqlTestExtension { inherit (finalAttrs) finalPackage; sql = - let - expectedVersion = "${lib.versions.major finalAttrs.version}.${lib.versions.minor finalAttrs.version} USE_GEOS=1 USE_PROJ=1 USE_STATS=1"; - in '' CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; CREATE EXTENSION postgis_topology; - select postgis_version(); - do $$ - begin - if postgis_version() <> '${expectedVersion}' then - raise '"%" does not match "${expectedVersion}"', postgis_version(); - end if; - end$$; -- st_makepoint goes through c code select st_makepoint(1, 1); '' + lib.optionalString withSfcgal '' CREATE EXTENSION postgis_sfcgal; - do $$ - begin - if postgis_sfcgal_version() <> '${sfcgal.version}' then - raise '"%" does not match "${sfcgal.version}"', postgis_sfcgal_version(); - end if; - end$$; CREATE TABLE geometries ( name varchar, geom geometry(PolygonZ) NOT NULL @@ -161,6 +145,19 @@ postgresqlBuildExtension (finalAttrs: { SELECT name from geometries where cg_isplanar(geom); ''; + asserts = + [ + { + query = "postgis_version()"; + expected = "'${lib.versions.major finalAttrs.version}.${lib.versions.minor finalAttrs.version} USE_GEOS=1 USE_PROJ=1 USE_STATS=1'"; + description = "postgis_version() returns correct values."; + } + ] + ++ lib.optional withSfcgal { + query = "postgis_sfcgal_version()"; + expected = "'${sfcgal.version}'"; + description = "postgis_sfcgal_version() returns correct value."; + }; }; meta = { From 722e4bf4ffa4ba34fb8dadfabfe073664eb6ebce Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Mon, 21 Apr 2025 12:56:19 +0200 Subject: [PATCH 8/8] postgresqlPackages.pgvecto-rs: move test from VM to postgresqlTestExtension --- nixos/tests/postgresql/default.nix | 1 - nixos/tests/postgresql/pgvecto-rs.nix | 79 ------------------- .../sql/postgresql/ext/pgvecto-rs/package.nix | 35 +++++++- 3 files changed, 34 insertions(+), 81 deletions(-) delete mode 100644 nixos/tests/postgresql/pgvecto-rs.nix diff --git a/nixos/tests/postgresql/default.nix b/nixos/tests/postgresql/default.nix index 8dd0619570cc..f7266c2e9db2 100644 --- a/nixos/tests/postgresql/default.nix +++ b/nixos/tests/postgresql/default.nix @@ -37,6 +37,5 @@ in # extensions anonymizer = importWithArgs ./anonymizer.nix; pgjwt = importWithArgs ./pgjwt.nix; - pgvecto-rs = importWithArgs ./pgvecto-rs.nix; wal2json = importWithArgs ./wal2json.nix; } diff --git a/nixos/tests/postgresql/pgvecto-rs.nix b/nixos/tests/postgresql/pgvecto-rs.nix deleted file mode 100644 index 506ef921acb7..000000000000 --- a/nixos/tests/postgresql/pgvecto-rs.nix +++ /dev/null @@ -1,79 +0,0 @@ -{ - pkgs, - makeTest, - genTests, -}: - -let - inherit (pkgs) lib; - - # Test cases from https://docs.vectorchord.ai/use-case/hybrid-search.html - test-sql = pkgs.writeText "postgresql-test" '' - CREATE EXTENSION vectors; - - CREATE TABLE items ( - id bigserial PRIMARY KEY, - content text NOT NULL, - embedding vectors.vector(3) NOT NULL -- 3 dimensions - ); - - INSERT INTO items (content, embedding) VALUES - ('a fat cat sat on a mat and ate a fat rat', '[1, 2, 3]'), - ('a fat dog sat on a mat and ate a fat rat', '[4, 5, 6]'), - ('a thin cat sat on a mat and ate a thin rat', '[7, 8, 9]'), - ('a thin dog sat on a mat and ate a thin rat', '[10, 11, 12]'); - ''; - - makeTestFor = - package: - makeTest { - name = "pgvecto-rs-${package.name}"; - meta = with lib.maintainers; { - maintainers = [ diogotcorreia ]; - }; - - nodes.machine = - { ... }: - { - services.postgresql = { - inherit package; - enable = true; - enableJIT = lib.hasInfix "-jit-" package.name; - extensions = - ps: with ps; [ - pgvecto-rs - ]; - settings.shared_preload_libraries = "vectors"; - }; - }; - - testScript = - { nodes, ... }: - let - inherit (nodes.machine.services.postgresql.package.pkgs) pgvecto-rs; - in - '' - def check_count(statement, lines): - return 'test $(sudo -u postgres psql postgres -tAc "{}"|wc -l) -eq {}'.format( - statement, lines - ) - - - machine.start() - machine.wait_for_unit("postgresql") - - with subtest("Postgresql with extension vectors is available just after unit start"): - machine.succeed(check_count("SELECT * FROM pg_available_extensions WHERE name = 'vectors' AND default_version = '${pgvecto-rs.version}';", 1)) - - machine.succeed("sudo -u postgres psql -f ${test-sql}") - - machine.succeed(check_count("SELECT content, embedding FROM items WHERE to_tsvector('english', content) @@ 'cat & rat'::tsquery;", 2)) - - machine.shutdown() - ''; - }; -in -genTests { - inherit makeTestFor; - filter = _: p: !p.pkgs.pgvecto-rs.meta.broken; -} diff --git a/pkgs/servers/sql/postgresql/ext/pgvecto-rs/package.nix b/pkgs/servers/sql/postgresql/ext/pgvecto-rs/package.nix index 1f0b4046fcd5..3f5be0b2e4a3 100644 --- a/pkgs/servers/sql/postgresql/ext/pgvecto-rs/package.nix +++ b/pkgs/servers/sql/postgresql/ext/pgvecto-rs/package.nix @@ -9,6 +9,7 @@ openssl, pkg-config, postgresql, + postgresqlTestExtension, replaceVars, rustPlatform, }: @@ -80,7 +81,39 @@ in passthru = { updateScript = nix-update-script { }; - tests = nixosTests.postgresql.pgvecto-rs.passthru.override postgresql; + tests.extension = postgresqlTestExtension { + inherit (finalAttrs) finalPackage; + postgresqlExtraSettings = '' + shared_preload_libraries='vectors' + ''; + sql = '' + CREATE EXTENSION vectors; + + CREATE TABLE items ( + id bigserial PRIMARY KEY, + content text NOT NULL, + embedding vectors.vector(3) NOT NULL -- 3 dimensions + ); + + INSERT INTO items (content, embedding) VALUES + ('a fat cat sat on a mat and ate a fat rat', '[1, 2, 3]'), + ('a fat dog sat on a mat and ate a fat rat', '[4, 5, 6]'), + ('a thin cat sat on a mat and ate a thin rat', '[7, 8, 9]'), + ('a thin dog sat on a mat and ate a thin rat', '[10, 11, 12]'); + ''; + asserts = [ + { + query = "SELECT default_version FROM pg_available_extensions WHERE name = 'vectors'"; + expected = "'${finalAttrs.version}'"; + description = "Extension vectors has correct version."; + } + { + query = "SELECT COUNT(embedding) FROM items WHERE to_tsvector('english', content) @@ 'cat & rat'::tsquery"; + expected = "2"; + description = "Stores and returns vectors."; + } + ]; + }; }; meta = {