Skip to content

Commit 0dd905b

Browse files
authored
Fix #296: Prevent posible issues with array default values ('{one,two}'::text[])::varchar[], remove ArrayParser::parseString()
1 parent 2a9569a commit 0dd905b

3 files changed

Lines changed: 7 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
- Chg #288: Typecast refactoring (@Tigrov)
1010
- Chg #291: Update phpTypecast for bool type (@Tigrov)
1111
- Enh #294: Refactoring of `Schema::normalizeDefaultValue()` method (@Tigrov)
12+
- Bug #296: Prevent posible issues with array default values `('{one,two}'::text[])::varchar[]`, remove `ArrayParser::parseString()` (@Tigrov)
1213

1314
## 1.0.0 April 12, 2023
1415

src/ArrayParser.php

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ final class ArrayParser
1818
*/
1919
public function parse(string|null $value): array|null
2020
{
21-
return $value !== null
21+
return $value !== null && $value[0] === '{'
2222
? $this->parseArray($value)
2323
: null;
2424
}
@@ -40,7 +40,8 @@ private function parseArray(string $value, int &$i = 0): array
4040
$result[] = match ($value[$i]) {
4141
'{' => $this->parseArray($value, $i),
4242
',', '}' => null,
43-
default => $this->parseString($value, $i),
43+
'"' => $this->parseQuotedString($value, $i),
44+
default => $this->parseUnquotedString($value, $i),
4445
};
4546

4647
if ($value[$i] === '}') {
@@ -50,19 +51,6 @@ private function parseArray(string $value, int &$i = 0): array
5051
}
5152
}
5253

53-
/**
54-
* Parses PostgreSQL encoded string.
55-
*
56-
* @param string $value String to parse.
57-
* @param int $i Parse starting position.
58-
*/
59-
private function parseString(string $value, int &$i): string|null
60-
{
61-
return $value[$i] === '"'
62-
? $this->parseQuotedString($value, $i)
63-
: $this->parseUnquotedString($value, $i);
64-
}
65-
6654
/**
6755
* Parses quoted string.
6856
*/

tests/ArrayParserTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,8 @@ public function testParser(): void
3030
[0 => '[",","null",true,"false","f"]'],
3131
$arrayParse->parse('{"[\",\",\"null\",true,\"false\",\"f\"]"}')
3232
);
33+
34+
// Similar cases can be in default values
35+
$this->assertSame(null, $arrayParse->parse("'{one,two}'::text[]"));
3336
}
3437
}

0 commit comments

Comments
 (0)