Skip to content

Commit 7e32ed4

Browse files
authored
Fix DB prefixing for Postgres and SQLite (#386)
1 parent d5fc21c commit 7e32ed4

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

src/Storage/DatabaseStorage.php

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,9 @@ protected function upsertCount(array $values): int
179179
[
180180
'value' => match ($driver = $this->connection()->getDriverName()) {
181181
'mariadb', 'mysql' => new Expression('`value` + values(`value`)'),
182-
'pgsql', 'sqlite' => new Expression('"pulse_aggregates"."value" + "excluded"."value"'),
182+
'pgsql', 'sqlite' => new Expression(<<<SQL
183+
{$this->wrap('pulse_aggregates.value')} + "excluded"."value"
184+
SQL),
183185
default => throw new RuntimeException("Unsupported database driver [{$driver}]"),
184186
},
185187
]
@@ -199,8 +201,12 @@ protected function upsertMin(array $values): int
199201
[
200202
'value' => match ($driver = $this->connection()->getDriverName()) {
201203
'mariadb', 'mysql' => new Expression('least(`value`, values(`value`))'),
202-
'pgsql' => new Expression('least("pulse_aggregates"."value", "excluded"."value")'),
203-
'sqlite' => new Expression('min("pulse_aggregates"."value", "excluded"."value")'),
204+
'pgsql' => new Expression(<<<SQL
205+
least({$this->wrap('pulse_aggregates.value')}, "excluded"."value")
206+
SQL),
207+
'sqlite' => new Expression(<<<SQL
208+
min({$this->wrap('pulse_aggregates.value')}, "excluded"."value")
209+
SQL),
204210
default => throw new RuntimeException("Unsupported database driver [{$driver}]"),
205211
},
206212
]
@@ -220,8 +226,12 @@ protected function upsertMax(array $values): int
220226
[
221227
'value' => match ($driver = $this->connection()->getDriverName()) {
222228
'mariadb', 'mysql' => new Expression('greatest(`value`, values(`value`))'),
223-
'pgsql' => new Expression('greatest("pulse_aggregates"."value", "excluded"."value")'),
224-
'sqlite' => new Expression('max("pulse_aggregates"."value", "excluded"."value")'),
229+
'pgsql' => new Expression(<<<SQL
230+
greatest({$this->wrap('pulse_aggregates.value')}, "excluded"."value")
231+
SQL),
232+
'sqlite' => new Expression(<<<SQL
233+
max({$this->wrap('pulse_aggregates.value')}, "excluded"."value")
234+
SQL),
225235
default => throw new RuntimeException("Unsupported database driver [{$driver}]"),
226236
},
227237
]
@@ -241,7 +251,9 @@ protected function upsertSum(array $values): int
241251
[
242252
'value' => match ($driver = $this->connection()->getDriverName()) {
243253
'mariadb', 'mysql' => new Expression('`value` + values(`value`)'),
244-
'pgsql', 'sqlite' => new Expression('"pulse_aggregates"."value" + "excluded"."value"'),
254+
'pgsql', 'sqlite' => new Expression(<<<SQL
255+
{$this->wrap('pulse_aggregates.value')} + "excluded"."value"
256+
SQL),
245257
default => throw new RuntimeException("Unsupported database driver [{$driver}]"),
246258
},
247259
]
@@ -264,8 +276,12 @@ protected function upsertAvg(array $values): int
264276
'count' => new Expression('`count` + values(`count`)'),
265277
],
266278
'pgsql', 'sqlite' => [
267-
'value' => new Expression('("pulse_aggregates"."value" * "pulse_aggregates"."count" + ("excluded"."value" * "excluded"."count")) / ("pulse_aggregates"."count" + "excluded"."count")'),
268-
'count' => new Expression('"pulse_aggregates"."count" + "excluded"."count"'),
279+
'value' => new Expression(<<<SQL
280+
({$this->wrap('pulse_aggregates.value')} * {$this->wrap('pulse_aggregates.count')} + ("excluded"."value" * "excluded"."count")) / ({$this->wrap('pulse_aggregates.count')} + "excluded"."count")
281+
SQL),
282+
'count' => new Expression(<<<SQL
283+
{$this->wrap('pulse_aggregates.count')} + "excluded"."count"
284+
SQL),
269285
],
270286
default => throw new RuntimeException("Unsupported database driver [{$driver}]"),
271287
}

tests/Feature/Recorders/SlowQueriesTest.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
$event->time = 5000;
1515
});
1616

17-
DB::connection()->statement('select * from users');
17+
DB::connection()->statement($sql = 'select * from '.DB::getTablePrefix().'users');
1818

1919
Pulse::ingest();
2020

@@ -26,7 +26,7 @@
2626
'value' => 5000,
2727
]);
2828
$key = json_decode($entries[0]->key);
29-
expect($key[0])->toBe('select * from users');
29+
expect($key[0])->toBe($sql);
3030
expect($key[1])->not->toBeNull();
3131
$aggregates = Pulse::ignore(fn () => DB::table('pulse_aggregates')->orderBy('period')->orderBy('aggregate')->get());
3232
expect($aggregates)->toHaveCount(8);
@@ -38,7 +38,7 @@
3838
'value' => 1,
3939
]);
4040
$key = json_decode($aggregates[0]->key);
41-
expect($key[0])->toBe('select * from users');
41+
expect($key[0])->toBe($sql);
4242
expect($key[1])->not->toBeNull();
4343
expect($aggregates[1])->toHaveProperties([
4444
'bucket' => (int) (floor((now()->timestamp - 5) / 60) * 60),
@@ -48,7 +48,7 @@
4848
'value' => 5000,
4949
]);
5050
$key = json_decode($aggregates[1]->key);
51-
expect($key[0])->toBe('select * from users');
51+
expect($key[0])->toBe($sql);
5252
expect($key[1])->not->toBeNull();
5353
});
5454

@@ -59,7 +59,8 @@
5959
$event->time = 5000;
6060
});
6161

62-
DB::connection()->statement('select * from users');
62+
DB::connection()->statement($sql = 'select * from '.DB::getTablePrefix().'users');
63+
6364
Pulse::ingest();
6465

6566
$entries = Pulse::ignore(fn () => DB::table('pulse_entries')->get());
@@ -70,7 +71,7 @@
7071
'value' => 5000,
7172
]);
7273
$key = json_decode($entries[0]->key);
73-
expect($key[0])->toBe('select * from users');
74+
expect($key[0])->toBe($sql);
7475
expect($key[1])->toBeNull();
7576
$aggregates = Pulse::ignore(fn () => DB::table('pulse_aggregates')->orderBy('period')->orderBy('aggregate')->get());
7677
expect($aggregates)->toHaveCount(8);
@@ -82,7 +83,7 @@
8283
'value' => 1,
8384
]);
8485
$key = json_decode($aggregates[0]->key);
85-
expect($key[0])->toBe('select * from users');
86+
expect($key[0])->toBe($sql);
8687
expect($key[1])->toBeNull();
8788
expect($aggregates[1])->toHaveProperties([
8889
'bucket' => (int) (floor((now()->timestamp - 5) / 60) * 60),
@@ -92,7 +93,7 @@
9293
'value' => 5000,
9394
]);
9495
$key = json_decode($aggregates[1]->key);
95-
expect($key[0])->toBe('select * from users');
96+
expect($key[0])->toBe($sql);
9697
expect($key[1])->toBeNull();
9798
});
9899

@@ -130,7 +131,7 @@
130131
expect($entries[0]->key)->toContain('one_second_threshold');
131132
expect($entries[0]->value)->toBe(1_000);
132133

133-
DB::table('pulse_entries')->delete();
134+
Pulse::ignore(fn () => DB::table('pulse_entries')->delete());
134135

135136
$queryDuration = 2_000;
136137
DB::pretend(function () {

0 commit comments

Comments
 (0)