|
| 1 | +# plan_filter is a shared-library-only module, not a CREATE EXTENSION type |
| 2 | +# extension. It's loaded via shared_preload_libraries and configured via GUC |
| 3 | +# parameters (plan_filter.statement_cost_limit, plan_filter.limit_select_only). |
| 4 | +# See: https://github.com/pgexperts/pg_plan_filter |
1 | 5 | { self, pkgs }: |
2 | 6 | let |
3 | | - pname = "plan_filter"; |
4 | | - inherit (pkgs) lib; |
5 | | - installedExtension = |
6 | | - postgresMajorVersion: |
7 | | - self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}."psql_${postgresMajorVersion}".exts."${ |
8 | | - pname |
9 | | - }"; |
10 | | - versions = postgresqlMajorVersion: (installedExtension postgresqlMajorVersion).versions; |
11 | | - postgresqlWithExtension = |
12 | | - postgresql: |
13 | | - let |
14 | | - majorVersion = lib.versions.major postgresql.version; |
15 | | - pkg = pkgs.pkgsLinux.buildEnv { |
16 | | - name = "postgresql-${majorVersion}-${pname}"; |
17 | | - paths = [ |
18 | | - postgresql |
19 | | - postgresql.lib |
20 | | - (installedExtension majorVersion) |
21 | | - ]; |
22 | | - passthru = { |
23 | | - inherit (postgresql) version psqlSchema; |
24 | | - installedExtensions = [ (installedExtension majorVersion) ]; |
25 | | - lib = pkg; |
26 | | - withPackages = _: pkg; |
27 | | - withJIT = pkg; |
28 | | - withoutJIT = pkg; |
29 | | - }; |
30 | | - nativeBuildInputs = [ pkgs.pkgsLinux.makeWrapper ]; |
31 | | - pathsToLink = [ |
32 | | - "/" |
33 | | - "/bin" |
34 | | - "/lib" |
35 | | - ]; |
36 | | - postBuild = '' |
37 | | - wrapProgram $out/bin/postgres --set NIX_PGLIBDIR $out/lib |
38 | | - wrapProgram $out/bin/pg_ctl --set NIX_PGLIBDIR $out/lib |
39 | | - wrapProgram $out/bin/pg_upgrade --set NIX_PGLIBDIR $out/lib |
40 | | - ''; |
41 | | - }; |
42 | | - in |
43 | | - pkg; |
44 | | - psql_15 = |
45 | | - postgresqlWithExtension |
46 | | - self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15; |
47 | | - psql_17 = |
48 | | - postgresqlWithExtension |
49 | | - self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17; |
| 7 | + testLib = import ./lib.nix { inherit self pkgs; }; |
50 | 8 | in |
51 | 9 | pkgs.testers.runNixOSTest { |
52 | | - name = pname; |
| 10 | + name = "plan_filter"; |
53 | 11 | nodes.server = |
54 | | - { config, ... }: |
| 12 | + { ... }: |
55 | 13 | { |
56 | | - services.postgresql = { |
57 | | - enable = true; |
58 | | - package = psql_15; |
59 | | - settings = (installedExtension "15").defaultSettings or { }; |
60 | | - }; |
61 | | - |
62 | | - specialisation.postgresql17.configuration = { |
63 | | - services.postgresql = { |
64 | | - package = lib.mkForce psql_17; |
65 | | - settings = (installedExtension "15").defaultSettings or { }; |
66 | | - }; |
67 | | - |
68 | | - systemd.services.postgresql-migrate = { |
69 | | - serviceConfig = { |
70 | | - Type = "oneshot"; |
71 | | - RemainAfterExit = true; |
72 | | - User = "postgres"; |
73 | | - Group = "postgres"; |
74 | | - StateDirectory = "postgresql"; |
75 | | - WorkingDirectory = "${builtins.dirOf config.services.postgresql.dataDir}"; |
76 | | - }; |
77 | | - script = |
78 | | - let |
79 | | - oldPostgresql = psql_15; |
80 | | - newPostgresql = psql_17; |
81 | | - oldDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${oldPostgresql.psqlSchema}"; |
82 | | - newDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema}"; |
83 | | - in |
84 | | - '' |
85 | | - if [[ ! -d ${newDataDir} ]]; then |
86 | | - install -d -m 0700 -o postgres -g postgres "${newDataDir}" |
87 | | - ${newPostgresql}/bin/initdb -D "${newDataDir}" |
88 | | - ${newPostgresql}/bin/pg_upgrade --old-datadir "${oldDataDir}" --new-datadir "${newDataDir}" \ |
89 | | - --old-bindir "${oldPostgresql}/bin" --new-bindir "${newPostgresql}/bin" |
90 | | - else |
91 | | - echo "${newDataDir} already exists" |
92 | | - fi |
93 | | - ''; |
94 | | - }; |
| 14 | + imports = [ |
| 15 | + (testLib.makeSupabaseTestConfig { |
| 16 | + majorVersion = "15"; |
| 17 | + }) |
| 18 | + ]; |
95 | 19 |
|
96 | | - systemd.services.postgresql = { |
97 | | - after = [ "postgresql-migrate.service" ]; |
98 | | - requires = [ "postgresql-migrate.service" ]; |
99 | | - }; |
| 20 | + specialisation.postgresql17.configuration = testLib.makeUpgradeSpecialisation { |
| 21 | + fromMajorVersion = "15"; |
| 22 | + toMajorVersion = "17"; |
100 | 23 | }; |
| 24 | + |
| 25 | + specialisation.orioledb17.configuration = testLib.makeOrioledbSpecialisation { }; |
101 | 26 | }; |
102 | 27 | testScript = |
103 | 28 | { nodes, ... }: |
104 | 29 | let |
105 | 30 | pg17-configuration = "${nodes.server.system.build.toplevel}/specialisation/postgresql17"; |
| 31 | + orioledb17-configuration = "${nodes.server.system.build.toplevel}/specialisation/orioledb17"; |
106 | 32 | in |
107 | 33 | '' |
108 | | - from pathlib import Path |
109 | | - versions = { |
110 | | - "15": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "15"))}], |
111 | | - "17": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "17"))}], |
112 | | - } |
113 | | - extension_name = "${pname}" |
114 | | - support_upgrade = False |
115 | 34 | pg17_configuration = "${pg17-configuration}" |
116 | | - ext_has_background_worker = ${ |
117 | | - if (installedExtension "15") ? hasBackgroundWorker then "True" else "False" |
118 | | - } |
119 | | - sql_test_directory = Path("${../../tests}") |
120 | | - pg_regress_test_name = "${(installedExtension "15").pgRegressTestName or pname}" |
| 35 | + orioledb17_configuration = "${orioledb17-configuration}" |
| 36 | +
|
| 37 | + def check_plan_filter(server): |
| 38 | + """Verify plan_filter is loaded and its GUC parameters are functional.""" |
| 39 | + spl = server.succeed( |
| 40 | + "psql -U supabase_admin -d postgres -t -A -c \"SHOW shared_preload_libraries;\"" |
| 41 | + ).strip() |
| 42 | + assert "plan_filter" in spl, ( |
| 43 | + f"Expected plan_filter in shared_preload_libraries, got: {spl}" |
| 44 | + ) |
121 | 45 |
|
122 | | - ${builtins.readFile ./lib.py} |
| 46 | + # Verify GUC parameter is registered (default: 0 = no filter) |
| 47 | + cost_limit = server.succeed( |
| 48 | + "psql -U supabase_admin -d postgres -t -A -c \"SHOW plan_filter.statement_cost_limit;\"" |
| 49 | + ).strip() |
| 50 | + assert cost_limit is not None, "plan_filter.statement_cost_limit GUC not available" |
| 51 | +
|
| 52 | + # Verify the parameter can be set |
| 53 | + server.succeed( |
| 54 | + "psql -U supabase_admin -d postgres -c \"SET plan_filter.statement_cost_limit = 100000.0;\"" |
| 55 | + ) |
123 | 56 |
|
124 | 57 | start_all() |
125 | 58 |
|
126 | | - server.wait_for_unit("multi-user.target") |
127 | | - server.wait_for_unit("postgresql.service") |
| 59 | + # Wait for full Supabase initialization (postgres + init-scripts + migrations) |
| 60 | + server.wait_for_unit("supabase-db-init.service") |
128 | 61 |
|
129 | | - test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory, support_upgrade) |
| 62 | + with subtest("Verify PostgreSQL 15 is our custom build"): |
| 63 | + pg_version = server.succeed( |
| 64 | + "psql -U supabase_admin -d postgres -t -A -c \"SELECT version();\"" |
| 65 | + ).strip() |
| 66 | + assert "${testLib.expectedVersions."15"}" in pg_version, ( |
| 67 | + f"Expected version ${testLib.expectedVersions."15"}, got: {pg_version}" |
| 68 | + ) |
130 | 69 |
|
131 | | - with subtest("Check pg_regress with postgresql 15 after extension upgrade"): |
132 | | - test.check_pg_regress(Path("${psql_15}/lib/pgxs/src/test/regress/pg_regress"), "15", pg_regress_test_name) |
| 70 | + with subtest("Verify plan_filter is loaded on PostgreSQL 15"): |
| 71 | + check_plan_filter(server) |
133 | 72 |
|
134 | 73 | with subtest("switch to postgresql 17"): |
135 | 74 | server.succeed( |
136 | 75 | f"{pg17_configuration}/bin/switch-to-configuration test >&2" |
137 | 76 | ) |
| 77 | + server.wait_for_unit("postgresql.service") |
| 78 | +
|
| 79 | + with subtest("Verify PostgreSQL 17 is our custom build"): |
| 80 | + pg_version = server.succeed( |
| 81 | + "psql -U supabase_admin -d postgres -t -A -c \"SELECT version();\"" |
| 82 | + ).strip() |
| 83 | + assert "${testLib.expectedVersions."17"}" in pg_version, ( |
| 84 | + f"Expected version ${testLib.expectedVersions."17"}, got: {pg_version}" |
| 85 | + ) |
| 86 | +
|
| 87 | + with subtest("Verify plan_filter is loaded on PostgreSQL 17"): |
| 88 | + check_plan_filter(server) |
| 89 | +
|
| 90 | + with subtest("switch to orioledb 17"): |
| 91 | + server.succeed( |
| 92 | + f"{orioledb17_configuration}/bin/switch-to-configuration test >&2" |
| 93 | + ) |
| 94 | + server.wait_for_unit("supabase-db-init.service") |
| 95 | +
|
| 96 | + with subtest("Verify OrioleDB is running"): |
| 97 | + installed_extensions = server.succeed( |
| 98 | + "psql -U supabase_admin -d postgres -t -A -c \"SELECT extname FROM pg_extension WHERE extname = 'orioledb';\"" |
| 99 | + ).strip() |
| 100 | + assert "orioledb" in installed_extensions, ( |
| 101 | + f"Expected orioledb extension to be installed, got: {installed_extensions}" |
| 102 | + ) |
138 | 103 |
|
139 | | - with subtest("Check pg_regress with postgresql 17 after extension upgrade"): |
140 | | - test.check_pg_regress(Path("${psql_17}/lib/pgxs/src/test/regress/pg_regress"), "17", pg_regress_test_name) |
| 104 | + with subtest("Verify plan_filter is loaded on OrioleDB"): |
| 105 | + check_plan_filter(server) |
141 | 106 | ''; |
142 | 107 | } |
0 commit comments