From eccbc92f01b19367ab68c55fc16efcb6ab121ff2 Mon Sep 17 00:00:00 2001 From: Wayne Date: Tue, 28 Oct 2025 18:02:45 +0000 Subject: [PATCH 1/3] Define more precise synthesized columns for different FTS extension versions --- .../psi/mixins/CreateVirtualTableMixin.kt | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateVirtualTableMixin.kt b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateVirtualTableMixin.kt index 368823f4..6777f784 100644 --- a/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateVirtualTableMixin.kt +++ b/core/src/main/kotlin/com/alecstrong/sql/psi/core/psi/mixins/CreateVirtualTableMixin.kt @@ -45,18 +45,31 @@ internal abstract class CreateVirtualTableMixin( ) .mapNotNull { it.moduleArgumentDef?.moduleColumnDef?.columnName ?: it.moduleArgumentDef?.columnDef?.columnName } - val synthesizedColumns = if (usesFtsModule) { - val columnNames = columnNameElements.map { it.name } - - listOf( - SynthesizedColumn( - table = this, - acceptableValues = listOf("docid", "rowid", "oid", "_rowid_", tableName.name) - .filter { it !in columnNames }, - ), - ) - } else { - emptyList() + val synthesizedColumns = when { + usesFts3Module || usesFts4Module -> { + val columnNames = columnNameElements.map { it.name } + + listOf( + SynthesizedColumn( + table = this, + acceptableValues = listOf("docid", "rowid", "oid", "_rowid_", tableName.name) + .filter { it !in columnNames }, + ), + ) + } + usesFts5Module -> { + val columnNames = columnNameElements.map { it.name } + + listOf( + SynthesizedColumn( + table = this, + acceptableValues = listOf("rowid", "_row_id_", "rank", tableName.name) + .filter { it !in columnNames }, + ), + ) + } + + else -> emptyList() } return LazyQuery(tableName) { @@ -77,3 +90,12 @@ internal class CreateVirtualTableElementType(name: String) : val SqlCreateVirtualTableStmt.usesFtsModule: Boolean get() = this.moduleName?.text?.startsWith(prefix = "fts", ignoreCase = true) == true + +val SqlCreateVirtualTableStmt.usesFts3Module: Boolean + get() = this.moduleName?.text?.startsWith(prefix = "fts3", ignoreCase = true) == true + +val SqlCreateVirtualTableStmt.usesFts4Module: Boolean + get() = this.moduleName?.text?.startsWith(prefix = "fts4", ignoreCase = true) == true + +val SqlCreateVirtualTableStmt.usesFts5Module: Boolean + get() = this.moduleName?.text?.startsWith(prefix = "fts5", ignoreCase = true) == true From f0816314284122d7f5f696c8882b3faa4e97f708 Mon Sep 17 00:00:00 2001 From: Wayne Date: Tue, 28 Oct 2025 18:06:18 +0000 Subject: [PATCH 2/3] Test that it's possible to query and order by rank if using an fts5 virtual table. --- .../resources/fixtures/fts5-hidden-columns/Test.s | 14 ++++++++++++++ .../fixtures/fts5-hidden-columns/failure.txt | 1 + 2 files changed, 15 insertions(+) create mode 100644 core/src/testFixtures/resources/fixtures/fts5-hidden-columns/Test.s create mode 100644 core/src/testFixtures/resources/fixtures/fts5-hidden-columns/failure.txt diff --git a/core/src/testFixtures/resources/fixtures/fts5-hidden-columns/Test.s b/core/src/testFixtures/resources/fixtures/fts5-hidden-columns/Test.s new file mode 100644 index 00000000..93da3ee4 --- /dev/null +++ b/core/src/testFixtures/resources/fixtures/fts5-hidden-columns/Test.s @@ -0,0 +1,14 @@ +CREATE VIRTUAL TABLE data USING fts5(text, content=other_table, content_rowid=rowid, prefix='2 3 4 5 6'); + +SELECT rank, rowid +FROM data +WHERE text MATCH 'fts5'; + +SELECT rank, rowid +FROM data +WHERE text MATCH 'fts5' ORDER BY rank; + +-- Expected failure - it's not valid to query for oid or docid in FTS5 tables. +SELECT oid +FROM data +WHERE text MATCH 'fts5'; \ No newline at end of file diff --git a/core/src/testFixtures/resources/fixtures/fts5-hidden-columns/failure.txt b/core/src/testFixtures/resources/fixtures/fts5-hidden-columns/failure.txt new file mode 100644 index 00000000..778548c5 --- /dev/null +++ b/core/src/testFixtures/resources/fixtures/fts5-hidden-columns/failure.txt @@ -0,0 +1 @@ +Test.s line 12:7 - No column found with name oid \ No newline at end of file From ccb56bdd9977a29a57d15ecc693e1ecaf5f74b7b Mon Sep 17 00:00:00 2001 From: Wayne Date: Wed, 29 Oct 2025 10:05:32 +0000 Subject: [PATCH 3/3] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e16c1e3c..e2bf3a03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## Unreleased - +- Improve handling of FTS5 hidden columns (https://github.com/sqldelight/sql-psi/pull/717) ## [0.7.0] - 2025-09-02 [0.7.0]: https://github.com/sqldelight/sql-psi/releases/tag/0.7.0