fix(duckdb): ignore prefix aliases as SQL parameters

Closes #5408
This commit is contained in:
t8y2 2026-08-06 18:56:19 +08:00
parent 25dc3ec2f2
commit 835864e8a8
No known key found for this signature in database
2 changed files with 31 additions and 1 deletions

View File

@ -321,6 +321,30 @@ describe("extractSqlParameters", () => {
expect(extractSqlParameters(sql, { databaseType: "duckdb" })).toEqual(["column", "nested_column", "later"]);
});
it("ignores compact DuckDB prefix alias separators", () => {
const sql = 'select total:price * quantity, "order":sum(amount) from sales';
expect(extractSqlParameters(sql, { databaseType: "duckdb" })).toEqual([]);
expect(substituteSqlParameters(sql, {}, { databaseType: "duckdb" })).toBe(sql);
expect(extractSqlParameters(sql, { databaseType: "postgres" })).toEqual(["price", "sum"]);
});
it("keeps named parameters inside DuckDB prefix alias expressions", () => {
const sql = "from r:range(:row_count) select total:r.range + :offset";
expect(extractSqlParameters(sql, { databaseType: "duckdb" })).toEqual(["row_count", "offset"]);
expect(
substituteSqlParameters(
sql,
{
row_count: { kind: "number", value: "3" },
offset: { kind: "number", value: "10" },
},
{ databaseType: "duckdb" },
),
).toBe("from r:range(3) select total:r.range + 10");
});
it("ignores Doris VARIANT field type separators", () => {
const sql = `
create table \`events\` (

View File

@ -176,7 +176,7 @@ function findSqlParameterOccurrences(sql: string, options?: SqlParameterOptions)
}
if (ch === ":" && supportsNamedParameters && isSyntaxEnabled("named")) {
const name = readParameterName(sql, i + 1);
if (name && sql[i - 1] !== ":" && sql[i + 1] !== "=" && !complexTypeFieldSeparators.has(i) && !duckDbStructFieldSeparators.has(i) && !triggerPseudoRecordFieldStarts.has(i)) {
if (name && sql[i - 1] !== ":" && sql[i + 1] !== "=" && !complexTypeFieldSeparators.has(i) && !duckDbStructFieldSeparators.has(i) && !isDuckDbCompactPrefixAliasSeparator(sql, i, options?.databaseType) && !triggerPseudoRecordFieldStarts.has(i)) {
occurrences.push({
key: name,
name,
@ -230,6 +230,12 @@ function findSqlParameterOccurrences(sql: string, options?: SqlParameterOptions)
return occurrences;
}
function isDuckDbCompactPrefixAliasSeparator(sql: string, index: number, databaseType?: DatabaseType): boolean {
if (databaseType !== "duckdb") return false;
const previous = sql[index - 1] ?? "";
return PARAMETER_NAME_CHAR_RE.test(previous) || previous === '"';
}
function isOracleDatabaseLinkMarker(sql: string, index: number, databaseType: DatabaseType | undefined): boolean {
if (databaseType !== "oracle" || index === 0) return false;
const previous = sql[index - 1];