> For the complete documentation index, see [llms.txt](https://alex-25.gitbook.io/welcome/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://alex-25.gitbook.io/welcome/gsoc.md).

# GSoC

## Google Summer of Code 2025 – Work Report

**Contributor:** Alex Jia\
**Project:** SQLancer – PostgreSQL Testing Enhancements\
**Organization:** SQLancer Project

***

### Overview

My GSoC 2025 project focused on extending SQLancer’s PostgreSQL module to better support features introduced in PostgreSQL versions 13 through 16. The work ranged from analyzing version-specific grammar changes to implementing support for newly introduced SQL constructs such as `MERGE`, new CTE functions, and updates to `EXTRACT`.

***

### Contributions

#### PostgreSQL 13

For PostgreSQL 13, I performed a detailed analysis of new SQL features and their relevance to SQLancer’s grammar. Most of the constructs introduced in this version are **not yet supported in SQLancer’s base grammar** and were therefore marked as *not applicable* for implementation in this cycle. Examples include:

* `ALTER NO DEPENDS ON`
* `ALTER STATISTICS SET STATISTICS`
* `ALTER TYPE`
* `ALTER VIEW RENAME COLUMN`
* `CREATE DATABASE WITH LOCALE`
* `CREATE TABLESPACE`
* `DROP DATABASE FORCE`
* `EXPLAIN ANALYSE`
* `ROW`
* `SELECT WITH TIES`

Additionally, I confirmed that certain changes required **no modification** in SQLancer, such as:

* `ALTER TABLE SET STORAGE`
* `CREATE INDEX deduplication`

This gave SQLancer maintainers a clear mapping of what v13 introduced and which parts do not affect current grammar support.

***

#### PostgreSQL 14

* **EXTRACT function updates:**
  * Added grammar support for the new EXTRACT fields that return **numeric results**.
  * Changed the return type of `EXTRACT()` from `FLOAT8` to **NUMERIC**, matching the PostgreSQL v14 update.

***

#### PostgreSQL 15

* **New CTE Function Support:**
  * Implemented generation of the new CTE functionality introduced in v15.
  * Extended SQLancer’s AST to capture additional recursive/non-recursive structures.
* **MERGE Statement Generator:**
  * Added a generator for the `MERGE` statement introduced in PostgreSQL 15.
  * Supported `WHEN MATCHED` and `WHEN NOT MATCHED` branches to fuzz-test conditional updates and inserts.

***

#### PostgreSQL 16 (Partial)

* **Generic Plan in EXPLAIN:**
  * Added grammar support for PostgreSQL 16’s generic plan option in `EXPLAIN`.
* **Renaming `force_parallel_mode`:**
  * Updated SQLancer references to reflect the renamed parameter in PostgreSQL 16, ensuring compatibility.

***

### Skills and Learning Outcomes

* **SQL grammar evolution:** Learned how to adapt SQLancer’s query generator to account for Postgres version-specific changes.
* **AST/grammar implementation:** Implemented new constructs (`MERGE`, EXTRACT numeric, CTEs) within SQLancer’s existing framework.
* **Code quality and review:** Improved maintainability and consistency through mentor feedback and iterative pull requests.

***

### Future Work

* Extend PostgreSQL 16 support further (beyond EXPLAIN and parameter renames).
* Continue reviewing new Postgres versions to keep SQLancer aligned with grammar changes.
* Improve documentation around version-specific features for future contributors.

***

### Acknowledgments

I’d like to thank my mentor **Robins** and the SQLancer community for their detailed reviews, helpful guidance, and encouragement throughout the program.

### PR Merged:

* <https://github.com/sqlancer/sqlancer/pull/1227>
* <https://github.com/sqlancer/sqlancer/pull/1228>
* <https://github.com/sqlancer/sqlancer/pull/1229>
* <https://github.com/sqlancer/sqlancer/pull/1232>
* <https://github.com/sqlancer/sqlancer/pull/1233>
* <https://github.com/sqlancer/sqlancer/pull/1234>
* <https://github.com/sqlancer/sqlancer/pull/1236>
* <https://github.com/sqlancer/sqlancer/pull/1237>

### PR In Progress

* <https://github.com/sqlancer/sqlancer/pull/1230>
* <https://github.com/sqlancer/sqlancer/pull/1231>
* <https://github.com/sqlancer/sqlancer/pull/1243>
* <https://github.com/sqlancer/sqlancer/pull/1253>
* <https://github.com/sqlancer/sqlancer/pull/1255>
* <https://github.com/sqlancer/sqlancer/pull/1264>
* <https://github.com/sqlancer/sqlancer/pull/1265>
* <https://github.com/sqlancer/sqlancer/pull/1266>
