Skip to content

Commit 118bfa3

Browse files
feat: add support for some new functions from PostgreSQL 18 (#464)
1 parent f99623d commit 118bfa3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1294
-16
lines changed

docs/ARRAY-AND-JSON-FUNCTIONS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ This document covers PostgreSQL array and JSON/JSONB operators and functions ava
5252
| array_prepend | ARRAY_PREPEND | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayPrepend` |
5353
| array_remove | ARRAY_REMOVE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayRemove` |
5454
| array_replace | ARRAY_REPLACE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayReplace` |
55+
| array_reverse | ARRAY_REVERSE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayReverse` |
5556
| array_shuffle | ARRAY_SHUFFLE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayShuffle` |
57+
| array_sort | ARRAY_SORT | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArraySort` |
5658
| array_to_json | ARRAY_TO_JSON | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToJson` |
5759
| array_to_string | ARRAY_TO_STRING | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ArrayToString` |
5860
| cardinality | ARRAY_CARDINALITY | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Cardinality` |

docs/AVAILABLE-FUNCTIONS-AND-OPERATORS.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ Complete documentation for PostgreSQL ltree (label tree) operations and hierarch
7474
- `ST_CONTAINS` - Test spatial containment
7575

7676
**Text Operations:** ([Complete documentation](TEXT-AND-PATTERN-FUNCTIONS.md))
77+
- `CASEFOLD` - Advanced case-insensitive text comparison with Unicode support
7778
- `ILIKE` - Case-insensitive pattern matching
7879
- `REGEXP` (`~`) - Regular expression matching
7980
- `STARTS_WITH` - Test if text starts with substring
@@ -84,7 +85,9 @@ Complete documentation for PostgreSQL ltree (label tree) operations and hierarch
8485
- `DATERANGE` - Create date ranges
8586

8687
**Mathematical Operations:** ([Complete documentation](MATHEMATICAL-FUNCTIONS.md))
88+
- `GAMMA` - Gamma function for statistical calculations
8789
- `GREATEST`/`LEAST` - Find maximum/minimum values
90+
- `LGAMMA` - Natural logarithm of gamma function
8891
- `ROUND` - Round numeric values
8992
- `RANDOM` - Generate random numbers
9093

@@ -95,6 +98,13 @@ Complete documentation for PostgreSQL ltree (label tree) operations and hierarch
9598
- `INDEX` - Find position of ltree in another ltree
9699
- `LCA` - Find longest common ancestor
97100

101+
**Utility Operations:**
102+
- `CRC32` - CRC-32 checksum computation
103+
- `CRC32C` - CRC-32C checksum computation
104+
- `REVERSE_BYTES` - Reverse byte order for bytea values
105+
- `UUIDV4` - Explicit UUID version 4 generation
106+
- `UUIDV7` - Generate timestamp-ordered UUIDs (version 7) for better database performance
107+
98108
## 📋 Summary of Available Function Categories
99109

100110
### **Array & JSON Functions**

docs/MATHEMATICAL-FUNCTIONS.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ This document covers PostgreSQL mathematical, utility, and miscellaneous functio
1313
| degrees | DEGREES | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Degrees` |
1414
| exp | EXP | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exp` |
1515
| floor | FLOOR | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Floor` |
16+
| gamma | GAMMA | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Gamma` |
1617
| greatest | GREATEST | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Greatest` |
1718
| least | LEAST | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Least` |
19+
| lgamma | LGAMMA | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Lgamma` |
1820
| ln | LN | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Ln` |
1921
| log | LOG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Log` |
2022
| pi | PI | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Pi` |
@@ -39,8 +41,13 @@ This document covers PostgreSQL mathematical, utility, and miscellaneous functio
3941
| PostgreSQL functions | Register for DQL as | Implemented by |
4042
|---|---|---|
4143
| any_value | ANY_VALUE | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\AnyValue` |
44+
| crc32 | CRC32 | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Crc32` |
45+
| crc32c | CRC32C | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Crc32c` |
46+
| reverse (bytea) | REVERSE_BYTES | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\ReverseBytes` |
4247
| row | ROW | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Row` |
4348
| row_to_json | ROW_TO_JSON | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\RowToJson` |
49+
| uuidv4 | UUIDV4 | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Uuidv4` |
50+
| uuidv7 | UUIDV7 | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Uuidv7` |
4451
| xmlagg | XML_AGG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\XmlAgg` |
4552

4653
## Usage Examples

docs/TEXT-AND-PATTERN-FUNCTIONS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ This document covers PostgreSQL text processing, pattern matching, and regular e
4545

4646
| PostgreSQL functions | Register for DQL as | Implemented by |
4747
|---|---|---|
48+
| casefold | CASEFOLD | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Casefold` |
4849
| split_part | SPLIT_PART | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\SplitPart` |
4950
| starts_with | STARTS_WITH | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StartsWith` |
5051
| string_agg | STRING_AGG | `MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\StringAgg` |
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL ARRAY_REVERSE().
9+
*
10+
* @see https://www.postgresql.org/docs/18/functions-array.html
11+
* @since 3.6
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class ArrayReverse extends BaseFunction
16+
{
17+
protected function customizeFunction(): void
18+
{
19+
$this->setFunctionPrototype('array_reverse(%s)');
20+
$this->addNodeMapping('StringPrimary');
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL ARRAY_SORT().
9+
*
10+
* @see https://www.postgresql.org/docs/18/functions-array.html
11+
* @since 3.6
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class ArraySort extends BaseFunction
16+
{
17+
protected function customizeFunction(): void
18+
{
19+
$this->setFunctionPrototype('array_sort(%s)');
20+
$this->addNodeMapping('StringPrimary');
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL CASEFOLD().
9+
*
10+
* @see https://www.postgresql.org/docs/18/functions-string.html
11+
* @since 3.6
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class Casefold extends BaseFunction
16+
{
17+
protected function customizeFunction(): void
18+
{
19+
$this->setFunctionPrototype('casefold(%s)');
20+
$this->addNodeMapping('StringPrimary');
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL CRC32().
9+
*
10+
* @see https://www.postgresql.org/docs/18/functions-binarystring.html
11+
* @since 3.6
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class Crc32 extends BaseFunction
16+
{
17+
protected function customizeFunction(): void
18+
{
19+
$this->setFunctionPrototype('crc32(%s::bytea)');
20+
$this->addNodeMapping('StringPrimary');
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL CRC32C().
9+
*
10+
* @see https://www.postgresql.org/docs/18/functions-binarystring.html
11+
* @since 3.6
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class Crc32c extends BaseFunction
16+
{
17+
protected function customizeFunction(): void
18+
{
19+
$this->setFunctionPrototype('crc32c(%s::bytea)');
20+
$this->addNodeMapping('StringPrimary');
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6+
7+
/**
8+
* Implementation of PostgreSQL GAMMA().
9+
*
10+
* @see https://www.postgresql.org/docs/18/functions-math.html
11+
* @since 3.6
12+
*
13+
* @author Martin Georgiev <martin.georgiev@gmail.com>
14+
*/
15+
class Gamma extends BaseFunction
16+
{
17+
protected function customizeFunction(): void
18+
{
19+
$this->setFunctionPrototype('gamma(%s)');
20+
$this->addNodeMapping('ArithmeticPrimary');
21+
}
22+
}

0 commit comments

Comments
 (0)