Skip to content

Commit ce0b624

Browse files
committed
sqlparser: Add explicit nodes for aliases
1 parent e8810cb commit ce0b624

23 files changed

Lines changed: 152 additions & 112 deletions

drift_dev/lib/src/analysis/resolver/queries/explicit_alias_transformer.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class ExplicitAliasTransformer extends Transformer<bool> {
7575
final name = '_c${_aliasCounter++}';
7676
_renamed[expr] = name;
7777
return super.visitExpressionResultColumn(
78-
ExpressionResultColumn(expression: expr, as: name),
78+
ExpressionResultColumn(expression: expr, as: AliasClause(name)),
7979
arg,
8080
);
8181
} else {
@@ -152,7 +152,7 @@ class ExplicitAliasTransformer extends Transformer<bool> {
152152
@override
153153
AstNode? visitTableReference(TableReference e, bool arg) {
154154
if (_renamedResultSets[e.availableResultSet] case final newName?) {
155-
e.as = newName;
155+
e.as = AliasClause(newName);
156156
}
157157

158158
return super.visitTableReference(e, arg);
@@ -161,7 +161,7 @@ class ExplicitAliasTransformer extends Transformer<bool> {
161161
@override
162162
AstNode? visitTableValuedFunction(TableValuedFunction e, bool arg) {
163163
if (_renamedResultSets[e.availableResultSet] case final newName?) {
164-
e.as = newName;
164+
e.as = AliasClause(newName);
165165
}
166166

167167
return super.visitTableValuedFunction(e, arg);
@@ -170,7 +170,7 @@ class ExplicitAliasTransformer extends Transformer<bool> {
170170
@override
171171
AstNode? visitSelectStatementAsSource(SelectStatementAsSource e, bool arg) {
172172
if (_renamedResultSets[e.availableResultSet] case final newName?) {
173-
e.as = newName;
173+
e.as = AliasClause(newName);
174174
}
175175

176176
return super.visitSelectStatementAsSource(e, arg);

drift_dev/lib/src/analysis/resolver/queries/nested_queries.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class _AnalyzerState {
132132
entityName: variable.reference.entityName,
133133
columnName: variable.reference.columnName,
134134
),
135-
as: variable.helperColumn,
135+
as: AliasClause(variable.helperColumn),
136136
),
137137
);
138138
}

drift_dev/lib/src/analysis/resolver/queries/query_analyzer.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ class QueryAnalyzer {
482482

483483
return NestedResultTable(
484484
from: column,
485-
name: column.as ?? column.tableName,
485+
name: column.as?.name ?? column.tableName,
486486
innerResultSet: driftResultSet,
487487
nameForGeneratedRowClass: resultClassName,
488488
isNullable: isNullable,
@@ -512,8 +512,8 @@ class QueryAnalyzer {
512512
column.queryName = name;
513513

514514
var resultClassName = ReCase(queryContext.queryName).pascalCase;
515-
if (column.as != null) {
516-
resultClassName += ReCase(column.as!).pascalCase;
515+
if (column.as case final alias?) {
516+
resultClassName += ReCase(alias.name).pascalCase;
517517
} else {
518518
resultClassName += 'NestedQuery$queryIndex';
519519
}

drift_dev/lib/src/analysis/results/query.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -918,8 +918,8 @@ final class NestedResultQuery extends NestedResult {
918918
}
919919

920920
String filedName() {
921-
if (from.as != null) {
922-
return from.as!;
921+
if (from.as case final alias?) {
922+
return alias.name;
923923
}
924924

925925
return ReCase(query.name).camelCase;

sqlparser/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- In drift files, allow reading imports and statement metadata from comments.
66
- Make `Queryable` and `TableOrSubquery` sealed classes, remove `Queryable.when`.
77
- Expose tokens making up `Reference`s and `TableReference`s.
8+
- Turn `AS` clauses into an explicit AST node with better spans.
89

910
## 0.43.1
1011

sqlparser/lib/src/analysis/steps/column_resolver.dart

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class ColumnResolver extends RecursiveVisitor<ColumnResolverContext, void> {
5151

5252
if (e.target case final UpdateTarget onUpdate) {
5353
onUpdate.scope = SingleTableReferenceScope(scope, e.onTable.tableName,
54-
ResultSetAvailableInStatement(e.onTable, table, e.onTable.as));
54+
ResultSetAvailableInStatement(e.onTable, table, e.onTable.as?.name));
5555
}
5656

5757
visitChildren(e, arg);
@@ -164,7 +164,7 @@ class ColumnResolver extends RecursiveVisitor<ColumnResolverContext, void> {
164164
e.foreignTable.tableName,
165165
resolved != null
166166
? ResultSetAvailableInStatement(
167-
e.foreignTable, resolved, e.foreignTable.as)
167+
e.foreignTable, resolved, e.foreignTable.as?.name)
168168
: null,
169169
);
170170
e.scope = scope;
@@ -303,7 +303,7 @@ class ColumnResolver extends RecursiveVisitor<ColumnResolverContext, void> {
303303
source,
304304
resultSet,
305305
switch (source) {
306-
Renamable(as: final alias) => alias,
306+
Renamable(as: final alias?) => alias.name,
307307
_ => null,
308308
});
309309

@@ -318,13 +318,13 @@ class ColumnResolver extends RecursiveVisitor<ColumnResolverContext, void> {
318318
case final TableReference table:
319319
final resolved = _resolveTableReference(table, state);
320320
markAvailableResultSet(
321-
table, resolved ?? table, table.as ?? table.tableName);
321+
table, resolved ?? table, table.as?.name ?? table.tableName);
322322

323323
if (resolved != null) {
324324
addColumns(table.resultSet!.resolvedColumns!);
325325
}
326326
case final SelectStatementAsSource select:
327-
markAvailableResultSet(select, select.statement, select.as);
327+
markAvailableResultSet(select, select.statement, select.as?.name);
328328

329329
// Inside subqueries, references don't take the name of the referenced
330330
// column.
@@ -356,13 +356,14 @@ class ColumnResolver extends RecursiveVisitor<ColumnResolverContext, void> {
356356
if (resolved == null) {
357357
final table = scope.resolveResultSetToAdd(function.name);
358358
if (table is Table && table.isVirtual) {
359-
resolved =
360-
function.as != null ? TableAlias(table, function.as!) : table;
359+
resolved = function.as != null
360+
? TableAlias(table, function.as!.name)
361+
: table;
361362
}
362363
}
363364

364365
markAvailableResultSet(
365-
function, resolved ?? function, function.as ?? function.name);
366+
function, resolved ?? function, function.as?.name ?? function.name);
366367

367368
if (resolved == null) {
368369
context.reportError(AnalysisError(
@@ -445,7 +446,7 @@ class ColumnResolver extends RecursiveVisitor<ColumnResolverContext, void> {
445446
Column column;
446447

447448
if (expression is Reference) {
448-
var fixedName = resultColumn.as;
449+
var fixedName = resultColumn.as?.name;
449450
if (!state.referencesUseNameOfReferencedColumn) {
450451
fixedName = _nameOfResultColumn(resultColumn);
451452
}
@@ -561,7 +562,7 @@ class ColumnResolver extends RecursiveVisitor<ColumnResolverContext, void> {
561562
}
562563

563564
String? _nameOfResultColumn(ExpressionResultColumn c) {
564-
if (c.as != null) return c.as;
565+
if (c.as case final alias?) return alias.name;
565566

566567
if (c.expression is Reference) {
567568
return (c.expression as Reference).columnName;
@@ -596,7 +597,7 @@ class ColumnResolver extends RecursiveVisitor<ColumnResolverContext, void> {
596597

597598
if (resolvedInSchema != null) {
598599
return r.resolved = createdName != null
599-
? TableAlias(resolvedInSchema, createdName)
600+
? TableAlias(resolvedInSchema, createdName.name)
600601
: resolvedInSchema;
601602
} else {
602603
Iterable<String>? available;

sqlparser/lib/src/ast/common/queryables.dart

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,22 @@ class TableReference extends TableOrSubquery
2828
Token? tableNameToken;
2929

3030
@override
31-
String? as;
31+
AliasClause? as;
3232

3333
TableReference(this.tableName, {this.as, this.schemaName});
3434

3535
@override
36-
Iterable<AstNode> get childNodes => const [];
36+
Iterable<AstNode> get childNodes => [if (as case final alias?) alias];
3737

3838
@override
3939
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
4040
return visitor.visitTableReference(this, arg);
4141
}
4242

4343
@override
44-
void transformChildren<A>(Transformer<A> transformer, A arg) {}
44+
void transformChildren<A>(Transformer<A> transformer, A arg) {
45+
as = transformer.transformNullableChild(as, this, arg);
46+
}
4547

4648
@override
4749
ResultSet? get resultSet {
@@ -56,7 +58,7 @@ class TableReference extends TableOrSubquery
5658
/// different from nested select expressions, which can only return one value.
5759
class SelectStatementAsSource extends TableOrSubquery implements Renamable {
5860
@override
59-
String? as;
61+
AliasClause? as;
6062
BaseSelectStatement statement;
6163

6264
SelectStatementAsSource({required this.statement, this.as});
@@ -67,11 +69,13 @@ class SelectStatementAsSource extends TableOrSubquery implements Renamable {
6769
}
6870

6971
@override
70-
Iterable<AstNode> get childNodes => [statement];
72+
Iterable<AstNode> get childNodes =>
73+
[statement, if (as case final alias?) alias];
7174

7275
@override
7376
void transformChildren<A>(Transformer<A> transformer, A arg) {
7477
statement = transformer.transformChild(statement, this, arg);
78+
as = transformer.transformNullableChild(as, this, arg);
7579
}
7680
}
7781

@@ -212,7 +216,7 @@ class TableValuedFunction extends Queryable
212216
Token? nameToken;
213217

214218
@override
215-
String? as;
219+
AliasClause? as;
216220

217221
@override
218222
FunctionParameters parameters;
@@ -228,11 +232,13 @@ class TableValuedFunction extends Queryable
228232
}
229233

230234
@override
231-
Iterable<AstNode> get childNodes => [parameters];
235+
Iterable<AstNode> get childNodes =>
236+
[parameters, if (as case final alias?) alias];
232237

233238
@override
234239
void transformChildren<A>(Transformer<A> transformer, A arg) {
235240
parameters = transformer.transformChild(parameters, this, arg);
241+
as = transformer.transformNullableChild(as, this, arg);
236242
}
237243

238244
@override
Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
11
part of '../ast.dart';
22

33
abstract class Renamable {
4-
String? get as;
4+
AliasClause? get as;
5+
}
6+
7+
/// An alias clause (e.g. `AS foo`) in SQL.
8+
final class AliasClause extends AstNode {
9+
/// The `AS` token of this clause.
10+
Token? as;
11+
12+
/// The name this entity has been renamed to.
13+
String name;
14+
15+
IdentifierToken? nameToken;
16+
17+
AliasClause(this.name);
18+
19+
@override
20+
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {
21+
return visitor.visitAliasClause(this, arg);
22+
}
23+
24+
@override
25+
Iterable<AstNode> get childNodes => const Iterable.empty();
26+
27+
@override
28+
void transformChildren<A>(Transformer<A> transformer, A arg) {}
529
}

sqlparser/lib/src/ast/drift/nested_query_column.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import '../ast.dart' show ResultColumn, Renamable, SelectStatement;
1+
import '../ast.dart' show ResultColumn, Renamable, SelectStatement, AliasClause;
22
import '../node.dart';
33
import '../visitor.dart';
44
import 'drift_file.dart';
@@ -20,18 +20,19 @@ class _NestedColumnNameMetadata {
2020
class NestedQueryColumn extends ResultColumn
2121
implements DriftSpecificNode, Renamable {
2222
@override
23-
final String? as;
23+
AliasClause? as;
2424

2525
SelectStatement select;
2626

2727
NestedQueryColumn({required this.select, this.as});
2828

2929
@override
30-
Iterable<AstNode> get childNodes => [select];
30+
Iterable<AstNode> get childNodes => [select, if (as case final alias?) alias];
3131

3232
@override
3333
void transformChildren<A>(Transformer<A> transformer, A arg) {
3434
select = transformer.transformChild(select, this, arg);
35+
as = transformer.transformNullableChild(as, this, arg);
3536
}
3637

3738
@override

sqlparser/lib/src/ast/drift/nested_star_result_column.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import '../../analysis/analysis.dart';
2-
import '../ast.dart' show StarResultColumn, ResultColumn, Renamable;
2+
import '../ast.dart'
3+
show StarResultColumn, ResultColumn, Renamable, AliasClause;
34
import '../node.dart';
45
import '../visitor.dart';
56
import 'drift_file.dart';
@@ -15,15 +16,19 @@ class NestedStarResultColumn extends ResultColumn
1516
ResultSet? resultSet;
1617

1718
@override
18-
final String? as;
19+
AliasClause? as;
1920

2021
NestedStarResultColumn({required this.tableName, this.as});
2122

2223
@override
23-
Iterable<AstNode> get childNodes => const [];
24+
Iterable<AstNode> get childNodes => [
25+
if (as case final alias?) alias,
26+
];
2427

2528
@override
26-
void transformChildren<A>(Transformer<A> transformer, A arg) {}
29+
void transformChildren<A>(Transformer<A> transformer, A arg) {
30+
as = transformer.transformNullableChild(as, this, arg);
31+
}
2732

2833
@override
2934
R accept<A, R>(AstVisitor<A, R> visitor, A arg) {

0 commit comments

Comments
 (0)