diff --git a/doc/native-params.md b/doc/native-params.md index 997e275..f913dbc 100644 --- a/doc/native-params.md +++ b/doc/native-params.md @@ -58,12 +58,24 @@ $db->selectWithParams( ['id' => UUID::fromString('6d38d288-5b13-4714-b6e4-faa59ffd49d8')] ); -// Array +// Array of integers $db->selectWithParams( 'SELECT {arr:Array(UInt32)} as arr', ['arr' => [1, 2, 3]] ); +// Array of strings — encoded as ['val1','val2'] (single-quoted, not JSON double-quoted) +$db->selectWithParams( + 'SELECT {arr:Array(String)} as arr', + ['arr' => ['foo', 'bar', 'baz']] +); + +// Nested arrays +$db->selectWithParams( + 'SELECT {arr:Array(Array(UInt32))} as arr', + ['arr' => [[1, 2], [3, 4]]] +); + // IPv4 / IPv6 $db->selectWithParams( 'SELECT {ip:IPv4} as ip', diff --git a/docs/native-params.md b/docs/native-params.md index 433f0db..6ccbb68 100644 --- a/docs/native-params.md +++ b/docs/native-params.md @@ -65,12 +65,24 @@ $db->selectWithParams( ['id' => UUID::fromString('6d38d288-5b13-4714-b6e4-faa59ffd49d8')] ); -// Array +// Array of integers $db->selectWithParams( 'SELECT {arr:Array(UInt32)} as arr', ['arr' => [1, 2, 3]] ); +// Array of strings — encoded as ['val1','val2'] (single-quoted, not JSON double-quoted) +$db->selectWithParams( + 'SELECT {arr:Array(String)} as arr', + ['arr' => ['foo', 'bar', 'baz']] +); + +// Nested arrays +$db->selectWithParams( + 'SELECT {arr:Array(Array(UInt32))} as arr', + ['arr' => [[1, 2], [3, 4]]] +); + // IPv4 / IPv6 $db->selectWithParams( 'SELECT {ip:IPv4} as ip', diff --git a/src/Transport/Http.php b/src/Transport/Http.php index 819aa78..f0c7c5f 100644 --- a/src/Transport/Http.php +++ b/src/Transport/Http.php @@ -837,7 +837,15 @@ private function convertParamValue(mixed $value): string return $value ? '1' : '0'; } if (is_array($value)) { - return json_encode($value); + $arrayValues = []; + foreach ($value as $val) { + if (is_string($val)) { + $arrayValues[] = sprintf("'%s'", $val); + continue; + } + $arrayValues[] = $this->convertParamValue($val); + } + return sprintf('[%s]', implode(',', $arrayValues)); } if ($value === null) { return '\\N'; diff --git a/tests/NativeParamsTest.php b/tests/NativeParamsTest.php index 8e600a5..eabdf1e 100644 --- a/tests/NativeParamsTest.php +++ b/tests/NativeParamsTest.php @@ -94,6 +94,36 @@ public function testSelectWithNullableParam(): void $this->assertNull($result->fetchOne('val')); } + public function testSelectWithUInt32ArrayParam(): void + { + $result = $this->client->selectWithParams( + 'SELECT {arr:Array(UInt32)} as arr', + ['arr' => [1, 2, 3]] + ); + + $this->assertEquals([1, 2, 3], $result->fetchOne('arr')); + } + + public function testSelectWithStringArrayParam(): void + { + $result = $this->client->selectWithParams( + 'SELECT {arr:Array(String)} as arr', + ['arr' => ['foo', 'bar', 'baz']] + ); + + $this->assertEquals(['foo', 'bar', 'baz'], $result->fetchOne('arr')); + } + + public function testSelectWithEmptyArrayParam(): void + { + $result = $this->client->selectWithParams( + 'SELECT {arr:Array(UInt32)} as arr', + ['arr' => []] + ); + + $this->assertEquals([], $result->fetchOne('arr')); + } + public function testSelectWithPerQuerySettings(): void { $result = $this->client->selectWithParams(