From 945c582b179bc0cb4b7a95a134526eb4fb8c792d Mon Sep 17 00:00:00 2001 From: Dmitry Maranik <40249835+dmitrymaranik@users.noreply.github.com> Date: Fri, 3 Jul 2026 19:36:10 -0700 Subject: [PATCH 1/4] perf(rls): wrap current_setting() in the generated tenant policy for per-statement eval --- src/RLS/PolicyManagers/TraitRLSManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RLS/PolicyManagers/TraitRLSManager.php b/src/RLS/PolicyManagers/TraitRLSManager.php index 52ed15ea..f6cb5060 100644 --- a/src/RLS/PolicyManagers/TraitRLSManager.php +++ b/src/RLS/PolicyManagers/TraitRLSManager.php @@ -67,7 +67,7 @@ class TraitRLSManager implements RLSPolicyManager return <<getForeignKeyName()} IN ( SELECT {$parent->getKeyName()} FROM {$parent->getTable()} - WHERE {$tenantKeyColumn}::text = current_setting('{$sessionTenantKey}') + WHERE {$tenantKeyColumn}::text = (select current_setting('{$sessionTenantKey}')) ) ); SQL; From 7a1a2162ac8a5f48baf92d2cdb155d924ba803ca Mon Sep 17 00:00:00 2001 From: Dmitry Maranik <40249835+dmitrymaranik@users.noreply.github.com> Date: Fri, 3 Jul 2026 19:36:11 -0700 Subject: [PATCH 2/4] perf(rls): wrap current_setting() in the generated tenant policy for per-statement eval --- src/RLS/PolicyManagers/TableRLSManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/RLS/PolicyManagers/TableRLSManager.php b/src/RLS/PolicyManagers/TableRLSManager.php index 3f87bf3e..64b0334c 100644 --- a/src/RLS/PolicyManagers/TableRLSManager.php +++ b/src/RLS/PolicyManagers/TableRLSManager.php @@ -528,7 +528,7 @@ class TableRLSManager implements RLSPolicyManager if ($table === tenancy()->model()->getTable()) { // Convert tenant key to text to match the session variable type - $query .= "{$column}::text = current_setting('{$sessionTenantKey}')\n"; + $query .= "{$column}::text = (select current_setting('{$sessionTenantKey}'))\n"; continue; } From a09ea639671f44a264c67a797f067e85bdbef451 Mon Sep 17 00:00:00 2001 From: Dmitry Maranik <40249835+dmitrymaranik@users.noreply.github.com> Date: Fri, 3 Jul 2026 19:36:12 -0700 Subject: [PATCH 3/4] perf(rls): wrap current_setting() in the generated tenant policy for per-statement eval --- tests/RLS/TraitManagerTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/RLS/TraitManagerTest.php b/tests/RLS/TraitManagerTest.php index b88b147b..23835194 100644 --- a/tests/RLS/TraitManagerTest.php +++ b/tests/RLS/TraitManagerTest.php @@ -279,7 +279,7 @@ test('trait rls manager generates queries correctly', function() { expect($manager->generateQueries())->toContain( << Date: Fri, 3 Jul 2026 19:36:14 -0700 Subject: [PATCH 4/4] perf(rls): wrap current_setting() in the generated tenant policy for per-statement eval --- tests/RLS/TableManagerTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/RLS/TableManagerTest.php b/tests/RLS/TableManagerTest.php index c5c8d254..a1592f6f 100644 --- a/tests/RLS/TableManagerTest.php +++ b/tests/RLS/TableManagerTest.php @@ -582,7 +582,7 @@ test('table rls manager generates queries correctly', function() { expect(array_values(app(TableRLSManager::class)->generateQueries()))->toEqualCanonicalizing([ <<generateQueries($paths))->toContain( <<