Skip to content

Commit d4cd05a

Browse files
committed
Fix unclosed bracket doubling last char and set operation SQL generation
- raHighlight.ts: Check that code[newI-1] is actually a bracket char before rendering it as a closing bracket. Previously, unclosed brackets like PI[name, city would render the last content char twice (cityy). - relationalAlgebra.ts: Add asSelect() helper to wrap bare table names in SELECT * FROM for UNION/INTERSECT/EXCEPT operations. Previously Person-Teacher generated "Person EXCEPT Teacher" which SQLite rejected. https://claude.ai/code/session_01TJyw8nESra9cc5RpVUpmt6
1 parent e77e6ab commit d4cd05a

2 files changed

Lines changed: 15 additions & 6 deletions

File tree

src/raHighlight.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,12 @@ function renderSubscript(code: string, i: number, result: string[]): number {
217217
const [newI, content] = extractBracketContent(code, i);
218218
if (content !== null) {
219219
result.push(`<span style="${S.sub}">${highlightSubContent(content, subWrap)}</span>`);
220-
// Render closing bracket
221-
if (newI > i + 1) {
220+
// Render closing bracket (only if bracket was actually closed)
221+
if (newI > i + 1 && newI <= code.length) {
222222
const closeBracket = code[newI - 1];
223-
result.push(`<span style="${S.bracket}">${esc(closeBracket)}</span>`);
223+
if (closeBracket === "]" || closeBracket === "}") {
224+
result.push(`<span style="${S.bracket}">${esc(closeBracket)}</span>`);
225+
}
224226
}
225227
return newI;
226228
}

src/relationalAlgebra.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,13 @@ function resolveColumns(sql: string, db: DatabaseHandle): string[] {
10571057
throw new RAError(msg);
10581058
}
10591059
}
1060+
/** Ensure a node produces a full SELECT statement (needed for UNION/INTERSECT/EXCEPT) */
1061+
function asSelect(node: RANode, db?: DatabaseHandle): string {
1062+
const sql = nodeToSQL(node, db);
1063+
// Bare table names need wrapping; anything starting with SELECT is already a query
1064+
return sql.trimStart().toUpperCase().startsWith("SELECT") ? sql : `SELECT * FROM ${sql}`;
1065+
}
1066+
10601067
function nodeToSQL(node: RANode, db?: DatabaseHandle): string {
10611068
switch (node.type) {
10621069
case "table":
@@ -1152,13 +1159,13 @@ function nodeToSQL(node: RANode, db?: DatabaseHandle): string {
11521159
}
11531160

11541161
case "union":
1155-
return `${nodeToSQL(node.left, db)} UNION ${nodeToSQL(node.right, db)}`;
1162+
return `${asSelect(node.left, db)} UNION ${asSelect(node.right, db)}`;
11561163

11571164
case "intersect":
1158-
return `${nodeToSQL(node.left, db)} INTERSECT ${nodeToSQL(node.right, db)}`;
1165+
return `${asSelect(node.left, db)} INTERSECT ${asSelect(node.right, db)}`;
11591166

11601167
case "difference":
1161-
return `${nodeToSQL(node.left, db)} EXCEPT ${nodeToSQL(node.right, db)}`;
1168+
return `${asSelect(node.left, db)} EXCEPT ${asSelect(node.right, db)}`;
11621169

11631170
case "division": {
11641171
const lAlias = `_ra${subqueryCounter++}`;

0 commit comments

Comments
 (0)