You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
convert advisor and auth queries in pgmeta to safesql (supabase#44998)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Refactor**
* Improved SQL construction across the studio to make queries safer and
more consistent.
* Safer parameter handling for optional schema and remediation links to
prevent injection risks.
* Deterministic query header formatting and stable date/comments in
generated SQL.
* More robust user-count and paginated-user queries for accurate counts,
sorting and pagination.
* Updated tests to align with the new safe query handling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
'${docsUrl}/guides/database/database-linter?lint=0001_unindexed_foreign_keys' as remediation,
75
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0001_unindexed_foreign_keys`)} as remediation,
74
76
jsonb_build_object(
75
77
'schema', fk.schema_name,
76
78
'name', fk.table_name,
@@ -110,7 +112,7 @@ select
110
112
'View/Materialized View "%s" in the public schema may expose \`auth.users\` data to anon or authenticated roles.',
111
113
c.relname
112
114
) as detail,
113
-
'${docsUrl}/guides/database/database-linter?lint=0002_auth_users_exposed' as remediation,
115
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0002_auth_users_exposed`)} as remediation,
114
116
jsonb_build_object(
115
117
'schema', n.nspname,
116
118
'name', c.relname,
@@ -224,12 +226,12 @@ select
224
226
array['PERFORMANCE'] as categories,
225
227
'Detects if calls to \`current_setting()\` and \`auth.<function>()\` in RLS policies are being unnecessarily re-evaluated for each row' as description,
226
228
format(
227
-
'Table \`%s.%s\` has a row level security policy \`%s\` that re-evaluates current_setting() or auth.<function>() for each row. This produces suboptimal query performance at scale. Resolve the issue by replacing \`auth.<function>()\` with \`(select auth.<function>())\`. See [docs](${docsUrl}/guides/database/postgres/row-level-security#call-functions-with-select) for more info.',
229
+
${literal(`Table \`%s.%s\` has a row level security policy \`%s\` that re-evaluates current_setting() or auth.<function>() for each row. This produces suboptimal query performance at scale. Resolve the issue by replacing \`auth.<function>()\` with \`(select auth.<function>())\`. See [docs](${docsUrl}/guides/database/postgres/row-level-security#call-functions-with-select) for more info.`)},
228
230
schema_name,
229
231
table_name,
230
232
policy_name
231
233
) as detail,
232
-
'${docsUrl}/guides/database/database-linter?lint=0003_auth_rls_initplan' as remediation,
234
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0003_auth_rls_initplan`)} as remediation,
233
235
jsonb_build_object(
234
236
'schema', schema_name,
235
237
'name', table_name,
@@ -301,7 +303,7 @@ select
301
303
pgns.nspname,
302
304
pgc.relname
303
305
) as detail,
304
-
'${docsUrl}/guides/database/database-linter?lint=0004_no_primary_key' as remediation,
306
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0004_no_primary_key`)} as remediation,
305
307
jsonb_build_object(
306
308
'schema', pgns.nspname,
307
309
'name', pgc.relname,
@@ -348,7 +350,7 @@ select
348
350
psui.schemaname,
349
351
psui.relname
350
352
) as detail,
351
-
'${docsUrl}/guides/database/database-linter?lint=0005_unused_index' as remediation,
353
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0005_unused_index`)} as remediation,
352
354
jsonb_build_object(
353
355
'schema', psui.schemaname,
354
356
'name', psui.relname,
@@ -393,7 +395,7 @@ select
393
395
act.cmd,
394
396
array_agg(p.polname order by p.polname)
395
397
) as detail,
396
-
'${docsUrl}/guides/database/database-linter?lint=0006_multiple_permissive_policies' as remediation,
398
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0006_multiple_permissive_policies`)} as remediation,
397
399
jsonb_build_object(
398
400
'schema', n.nspname,
399
401
'name', c.relname,
@@ -464,7 +466,7 @@ select
464
466
c.relname,
465
467
array_agg(p.polname order by p.polname)
466
468
) as detail,
467
-
'${docsUrl}/guides/database/database-linter?lint=0007_policy_exists_rls_disabled' as remediation,
469
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0007_policy_exists_rls_disabled`)} as remediation,
468
470
jsonb_build_object(
469
471
'schema', n.nspname,
470
472
'name', c.relname,
@@ -509,7 +511,7 @@ select
509
511
n.nspname,
510
512
c.relname
511
513
) as detail,
512
-
'${docsUrl}/guides/database/database-linter?lint=0008_rls_enabled_no_policy' as remediation,
514
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0008_rls_enabled_no_policy`)} as remediation,
513
515
jsonb_build_object(
514
516
'schema', n.nspname,
515
517
'name', c.relname,
@@ -556,7 +558,7 @@ select
556
558
c.relname,
557
559
array_agg(pi.indexname order by pi.indexname)
558
560
) as detail,
559
-
'${docsUrl}/guides/database/database-linter?lint=0009_duplicate_index' as remediation,
561
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0009_duplicate_index`)} as remediation,
560
562
jsonb_build_object(
561
563
'schema', n.nspname,
562
564
'name', c.relname,
@@ -610,7 +612,7 @@ select
610
612
n.nspname,
611
613
c.relname
612
614
) as detail,
613
-
'${docsUrl}/guides/database/database-linter?lint=0010_security_definer_view' as remediation,
615
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0010_security_definer_view`)} as remediation,
614
616
jsonb_build_object(
615
617
'schema', n.nspname,
616
618
'name', c.relname,
@@ -663,7 +665,7 @@ select
663
665
n.nspname,
664
666
p.proname
665
667
) as detail,
666
-
'${docsUrl}/guides/database/database-linter?lint=0011_function_search_path_mutable' as remediation,
668
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0011_function_search_path_mutable`)} as remediation,
667
669
jsonb_build_object(
668
670
'schema', n.nspname,
669
671
'name', p.proname,
@@ -707,7 +709,7 @@ select
707
709
n.nspname,
708
710
c.relname
709
711
) as detail,
710
-
'${docsUrl}/guides/database/database-linter?lint=0013_rls_disabled_in_public' as remediation,
712
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0013_rls_disabled_in_public`)} as remediation,
711
713
jsonb_build_object(
712
714
'schema', n.nspname,
713
715
'name', c.relname,
@@ -747,7 +749,7 @@ select
747
749
'Extension \`%s\` is installed in the public schema. Move it to another schema.',
748
750
pe.extname
749
751
) as detail,
750
-
'${docsUrl}/guides/database/database-linter?lint=0014_extension_in_public' as remediation,
752
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0014_extension_in_public`)} as remediation,
751
753
jsonb_build_object(
752
754
'schema', pe.extnamespace::regnamespace,
753
755
'name', pe.extname,
@@ -801,7 +803,7 @@ select
801
803
table_name,
802
804
policy_name
803
805
) as detail,
804
-
'${docsUrl}/guides/database/database-linter?lint=0015_rls_references_user_metadata' as remediation,
806
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0015_rls_references_user_metadata`)} as remediation,
805
807
jsonb_build_object(
806
808
'schema', schema_name,
807
809
'name', table_name,
@@ -837,7 +839,7 @@ select
837
839
n.nspname,
838
840
c.relname
839
841
) as detail,
840
-
'${docsUrl}/guides/database/database-linter?lint=0016_materialized_view_in_api' as remediation,
842
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0016_materialized_view_in_api`)} as remediation,
841
843
jsonb_build_object(
842
844
'schema', n.nspname,
843
845
'name', c.relname,
@@ -880,7 +882,7 @@ select
880
882
n.nspname,
881
883
c.relname
882
884
) as detail,
883
-
'${docsUrl}/guides/database/database-linter?lint=0017_foreign_table_in_api' as remediation,
885
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0017_foreign_table_in_api`)} as remediation,
884
886
jsonb_build_object(
885
887
'schema', n.nspname,
886
888
'name', c.relname,
@@ -925,7 +927,7 @@ select
925
927
a.attname,
926
928
t.typname
927
929
) as detail,
928
-
'${docsUrl}/guides/database/database-linter?lint=unsupported_reg_types' as remediation,
930
+
${literal(`${docsUrl}/guides/database/database-linter?lint=unsupported_reg_types`)} as remediation,
929
931
jsonb_build_object(
930
932
'schema', n.nspname,
931
933
'name', c.relname,
@@ -966,7 +968,7 @@ select
966
968
n.nspname,
967
969
c.relname
968
970
) as detail,
969
-
'${docsUrl}/guides/database/database-linter?lint=0019_insecure_queue_exposed_in_api' as remediation,
971
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0019_insecure_queue_exposed_in_api`)} as remediation,
970
972
jsonb_build_object(
971
973
'schema', n.nspname,
972
974
'name', c.relname,
@@ -1149,7 +1151,7 @@ select
1149
1151
ext.installed_version,
1150
1152
ext.default_version
1151
1153
) as detail,
1152
-
'${docsUrl}/guides/database/database-linter?lint=0022_extension_versions_outdated' as remediation,
1154
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0022_extension_versions_outdated`)} as remediation,
1153
1155
jsonb_build_object(
1154
1156
'extension_name', ext.name,
1155
1157
'installed_version', ext.installed_version,
@@ -1260,7 +1262,7 @@ select
1260
1262
table_name,
1261
1263
string_agg(distinct column_name, ', ' order by column_name)
1262
1264
) as detail,
1263
-
'${docsUrl}/guides/database/database-linter?lint=0023_sensitive_columns_exposed' as remediation,
1265
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0023_sensitive_columns_exposed`)} as remediation,
1264
1266
jsonb_build_object(
1265
1267
'schema', schema_name,
1266
1268
'name', table_name,
@@ -1382,7 +1384,7 @@ select
1382
1384
end,
1383
1385
array_to_string(roles, ', ')
1384
1386
) as detail,
1385
-
'${docsUrl}/guides/database/database-linter?lint=0024_permissive_rls_policy' as remediation,
1387
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0024_permissive_rls_policy`)} as remediation,
1386
1388
jsonb_build_object(
1387
1389
'schema', schema_name,
1388
1390
'name', table_name,
@@ -1491,7 +1493,7 @@ select
1491
1493
end,
1492
1494
array_to_string(policy_names, ', ')
1493
1495
) as detail,
1494
-
'${docsUrl}/guides/database/database-linter?lint=0025_public_bucket_allows_listing' as remediation,
1496
+
${literal(`${docsUrl}/guides/database/database-linter?lint=0025_public_bucket_allows_listing`)} as remediation,
`(select jsonb_agg(case when value ~ '^sso' then 'sso' else value end) from jsonb_array_elements_text((raw_app_meta_data ->> 'providers')::jsonb)) ?| array[${literal(mappedProviders)}]`.trim()
77
+
safeSql`(select jsonb_agg(case when value ~ '^sso' then 'sso' else value end) from jsonb_array_elements_text((raw_app_meta_data ->> 'providers')::jsonb)) ?| array[${literal(mappedProviders)}]`
0 commit comments