Skip to content

Commit aaa9117

Browse files
committed
remove unnecessary statements and include ipv4 operators
1 parent 2bdbc39 commit aaa9117

File tree

10 files changed

+114
-160
lines changed

10 files changed

+114
-160
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ jobs:
1717
node-version: 20
1818
cache: yarn
1919

20+
- run: corepack enable
21+
2022
- run: yarn
2123

2224
- run: yarn typecheck

src/autocomplete/token-classification.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ export const SKIP_TOKENS = new Set([
102102
"RegexMatch",
103103
"RegexNotMatch",
104104
"RegexNotEquals",
105+
// IPv4 containment operators
106+
"IPv4ContainedBy",
107+
"IPv4ContainedByOrEqual",
108+
"IPv4Contains",
109+
"IPv4ContainsOrEqual",
105110
// Bitwise operators
106111
"BitAnd",
107112
"BitXor",

src/parser/ast.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -588,12 +588,7 @@ export interface ShowStatement extends AstNode {
588588
| "serviceAccounts"
589589
| "permissions"
590590
| "serverVersion"
591-
| "serverVersionNum"
592591
| "parameters"
593-
| "timeZone"
594-
| "transaction"
595-
| "transactionIsolationLevel"
596-
| "defaultTransactionReadOnly"
597592
table?: QualifiedName
598593
name?: QualifiedName
599594
}

src/parser/cst-types.d.ts

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ export type SimpleSelectCstChildren = {
106106
pivotBody?: PivotBodyCstNode[];
107107
RParen?: IToken[];
108108
orderByClause?: OrderByClauseCstNode[];
109-
windowDefinitionClause?: WindowDefinitionClauseCstNode[];
110109
limitClause?: LimitClauseCstNode[];
111110
};
112111

@@ -1318,14 +1317,6 @@ export type ShowStatementCstChildren = {
13181317
Table?: IToken[];
13191318
View?: (IToken)[];
13201319
Materialized?: IToken[];
1321-
Time?: IToken[];
1322-
Zone?: IToken[];
1323-
Transaction?: (IToken)[];
1324-
Isolation?: IToken[];
1325-
Level?: IToken[];
1326-
Default?: IToken[];
1327-
Identifier?: IToken[];
1328-
Only?: IToken[];
13291320
User?: IToken[];
13301321
Users?: IToken[];
13311322
Groups?: IToken[];
@@ -1879,10 +1870,23 @@ export interface ConcatExpressionCstNode extends CstNode {
18791870
}
18801871

18811872
export type ConcatExpressionCstChildren = {
1882-
additiveExpression: (AdditiveExpressionCstNode)[];
1873+
ipv4ContainmentExpression: (Ipv4ContainmentExpressionCstNode)[];
18831874
Concat?: IToken[];
18841875
};
18851876

1877+
export interface Ipv4ContainmentExpressionCstNode extends CstNode {
1878+
name: "ipv4ContainmentExpression";
1879+
children: Ipv4ContainmentExpressionCstChildren;
1880+
}
1881+
1882+
export type Ipv4ContainmentExpressionCstChildren = {
1883+
additiveExpression: (AdditiveExpressionCstNode)[];
1884+
IPv4ContainedBy?: IToken[];
1885+
IPv4ContainedByOrEqual?: IToken[];
1886+
IPv4Contains?: IToken[];
1887+
IPv4ContainsOrEqual?: IToken[];
1888+
};
1889+
18861890
export interface AdditiveExpressionCstNode extends CstNode {
18871891
name: "additiveExpression";
18881892
children: AdditiveExpressionCstChildren;
@@ -2172,22 +2176,6 @@ export type WindowFrameBoundCstChildren = {
21722176
expression?: ExpressionCstNode[];
21732177
};
21742178

2175-
export interface WindowDefinitionClauseCstNode extends CstNode {
2176-
name: "windowDefinitionClause";
2177-
children: WindowDefinitionClauseCstChildren;
2178-
}
2179-
2180-
export type WindowDefinitionClauseCstChildren = {
2181-
Window: IToken[];
2182-
identifier: IdentifierCstNode[];
2183-
As: IToken[];
2184-
LParen: IToken[];
2185-
windowPartitionByClause?: WindowPartitionByClauseCstNode[];
2186-
orderByClause?: OrderByClauseCstNode[];
2187-
windowFrameClause?: WindowFrameClauseCstNode[];
2188-
RParen: IToken[];
2189-
};
2190-
21912179
export interface LiteralCstNode extends CstNode {
21922180
name: "literal";
21932181
children: LiteralCstChildren;
@@ -2412,6 +2400,7 @@ export interface ICstNodeVisitor<IN, OUT> extends ICstVisitor<IN, OUT> {
24122400
bitXorExpression(children: BitXorExpressionCstChildren, param?: IN): OUT;
24132401
bitAndExpression(children: BitAndExpressionCstChildren, param?: IN): OUT;
24142402
concatExpression(children: ConcatExpressionCstChildren, param?: IN): OUT;
2403+
ipv4ContainmentExpression(children: Ipv4ContainmentExpressionCstChildren, param?: IN): OUT;
24152404
additiveExpression(children: AdditiveExpressionCstChildren, param?: IN): OUT;
24162405
multiplicativeExpression(children: MultiplicativeExpressionCstChildren, param?: IN): OUT;
24172406
unaryExpression(children: UnaryExpressionCstChildren, param?: IN): OUT;
@@ -2431,7 +2420,6 @@ export interface ICstNodeVisitor<IN, OUT> extends ICstVisitor<IN, OUT> {
24312420
windowPartitionByClause(children: WindowPartitionByClauseCstChildren, param?: IN): OUT;
24322421
windowFrameClause(children: WindowFrameClauseCstChildren, param?: IN): OUT;
24332422
windowFrameBound(children: WindowFrameBoundCstChildren, param?: IN): OUT;
2434-
windowDefinitionClause(children: WindowDefinitionClauseCstChildren, param?: IN): OUT;
24352423
literal(children: LiteralCstChildren, param?: IN): OUT;
24362424
booleanLiteral(children: BooleanLiteralCstChildren, param?: IN): OUT;
24372425
stringOrIdentifier(children: StringOrIdentifierCstChildren, param?: IN): OUT;

src/parser/lexer.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,18 +575,48 @@ export const RBracket = createToken({ name: "RBracket", pattern: /\]/ })
575575
export const Colon = createToken({ name: "Colon", pattern: /:/ })
576576
export const ColonEquals = createToken({ name: "ColonEquals", pattern: /:=/ })
577577

578+
// IPv4 Containment Operators (longest first to avoid conflicts)
579+
export const IPv4ContainedByOrEqual = createToken({
580+
name: "IPv4ContainedByOrEqual",
581+
pattern: /<<=/,
582+
})
583+
export const IPv4ContainedBy = createToken({
584+
name: "IPv4ContainedBy",
585+
pattern: /<</,
586+
longer_alt: IPv4ContainedByOrEqual,
587+
})
588+
export const IPv4ContainsOrEqual = createToken({
589+
name: "IPv4ContainsOrEqual",
590+
pattern: />>=/,
591+
})
592+
export const IPv4Contains = createToken({
593+
name: "IPv4Contains",
594+
pattern: />>/,
595+
longer_alt: IPv4ContainsOrEqual,
596+
})
597+
578598
// Comparison Operators (order matters - longer first)
579599
export const NotEquals = createToken({ name: "NotEquals", pattern: /!=|<>/ })
580600
export const LessThanOrEqual = createToken({
581601
name: "LessThanOrEqual",
582602
pattern: /<=/,
603+
longer_alt: IPv4ContainedByOrEqual,
583604
})
584605
export const GreaterThanOrEqual = createToken({
585606
name: "GreaterThanOrEqual",
586607
pattern: />=/,
608+
longer_alt: IPv4ContainsOrEqual,
609+
})
610+
export const LessThan = createToken({
611+
name: "LessThan",
612+
pattern: /</,
613+
longer_alt: IPv4ContainedBy,
614+
})
615+
export const GreaterThan = createToken({
616+
name: "GreaterThan",
617+
pattern: />/,
618+
longer_alt: IPv4Contains,
587619
})
588-
export const LessThan = createToken({ name: "LessThan", pattern: /</ })
589-
export const GreaterThan = createToken({ name: "GreaterThan", pattern: />/ })
590620
export const Equals = createToken({ name: "Equals", pattern: /=/ })
591621

592622
// Arithmetic Operators
@@ -731,6 +761,10 @@ export const allTokens: TokenType[] = [
731761
// Multi-char operators (before single-char)
732762
DoubleColon,
733763
ColonEquals,
764+
IPv4ContainedByOrEqual,
765+
IPv4ContainedBy,
766+
IPv4ContainsOrEqual,
767+
IPv4Contains,
734768
NotEquals,
735769
LessThanOrEqual,
736770
GreaterThanOrEqual,

src/parser/parser.ts

Lines changed: 23 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ import {
219219
RegexNotEquals,
220220
Concat,
221221
DoubleColon,
222+
IPv4ContainedBy,
223+
IPv4ContainedByOrEqual,
224+
IPv4Contains,
225+
IPv4ContainsOrEqual,
222226
Plus,
223227
Minus,
224228
Divide,
@@ -251,19 +255,15 @@ import {
251255
TimestampNs,
252256
// Other keywords commonly used as identifiers
253257
Index,
254-
Isolation,
255258
Column,
256259
Type,
257-
Level,
258260
Offset,
259-
Only,
260261
First,
261262
Volume,
262263
Start,
263264
Current,
264265
Row,
265266
User,
266-
Default,
267267
View,
268268
Tolerance,
269269
Materialized,
@@ -559,7 +559,6 @@ class QuestDBParser extends CstParser {
559559
this.CONSUME(RParen)
560560
})
561561
this.OPTION6(() => this.SUBRULE(this.orderByClause))
562-
this.OPTION8(() => this.SUBRULE(this.windowDefinitionClause))
563562
this.OPTION7(() => this.SUBRULE(this.limitClause))
564563
})
565564
})
@@ -2516,29 +2515,6 @@ class QuestDBParser extends CstParser {
25162515
])
25172516
},
25182517
},
2519-
{
2520-
ALT: () => {
2521-
this.CONSUME(Time)
2522-
this.CONSUME(Zone)
2523-
},
2524-
},
2525-
{
2526-
ALT: () => {
2527-
this.CONSUME(Transaction)
2528-
this.OPTION5(() => {
2529-
this.CONSUME(Isolation)
2530-
this.CONSUME(Level)
2531-
})
2532-
},
2533-
},
2534-
{
2535-
ALT: () => {
2536-
this.CONSUME(Default)
2537-
this.CONSUME1(Transaction)
2538-
this.CONSUME(Identifier) // READ
2539-
this.CONSUME(Only)
2540-
},
2541-
},
25422518
{
25432519
ALT: () => {
25442520
this.CONSUME(User)
@@ -3308,13 +3284,30 @@ class QuestDBParser extends CstParser {
33083284

33093285
// Precedence 7: || (string concatenation)
33103286
private concatExpression = this.RULE("concatExpression", () => {
3311-
this.SUBRULE(this.additiveExpression)
3287+
this.SUBRULE(this.ipv4ContainmentExpression)
33123288
this.MANY(() => {
33133289
this.CONSUME(Concat)
3314-
this.SUBRULE1(this.additiveExpression)
3290+
this.SUBRULE1(this.ipv4ContainmentExpression)
33153291
})
33163292
})
33173293

3294+
// Precedence 6: <<, <<=, >>, >>= (IPv4 containment)
3295+
private ipv4ContainmentExpression = this.RULE(
3296+
"ipv4ContainmentExpression",
3297+
() => {
3298+
this.SUBRULE(this.additiveExpression)
3299+
this.OPTION(() => {
3300+
this.OR([
3301+
{ ALT: () => this.CONSUME(IPv4ContainedByOrEqual) },
3302+
{ ALT: () => this.CONSUME(IPv4ContainedBy) },
3303+
{ ALT: () => this.CONSUME(IPv4ContainsOrEqual) },
3304+
{ ALT: () => this.CONSUME(IPv4Contains) },
3305+
])
3306+
this.SUBRULE1(this.additiveExpression)
3307+
})
3308+
},
3309+
)
3310+
33183311
// Precedence 5: +, -
33193312
private additiveExpression = this.RULE("additiveExpression", () => {
33203313
this.SUBRULE(this.multiplicativeExpression)
@@ -3794,18 +3787,6 @@ class QuestDBParser extends CstParser {
37943787
])
37953788
})
37963789

3797-
// Named WINDOW clause: WINDOW w AS (PARTITION BY ...)
3798-
private windowDefinitionClause = this.RULE("windowDefinitionClause", () => {
3799-
this.CONSUME(Window)
3800-
this.SUBRULE(this.identifier)
3801-
this.CONSUME(As)
3802-
this.CONSUME(LParen)
3803-
this.OPTION(() => this.SUBRULE(this.windowPartitionByClause))
3804-
this.OPTION1(() => this.SUBRULE(this.orderByClause))
3805-
this.OPTION2(() => this.SUBRULE(this.windowFrameClause))
3806-
this.CONSUME(RParen)
3807-
})
3808-
38093790
// ==========================================================================
38103791
// Basic Elements
38113792
// ==========================================================================

src/parser/toSql.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -874,18 +874,8 @@ function showToSql(stmt: AST.ShowStatement): string {
874874
return `SHOW CREATE MATERIALIZED VIEW ${qualifiedNameToSql(stmt.table!)}`
875875
case "serverVersion":
876876
return "SHOW SERVER_VERSION"
877-
case "serverVersionNum":
878-
return "SHOW SERVER_VERSION_NUM"
879877
case "parameters":
880878
return "SHOW PARAMETERS"
881-
case "timeZone":
882-
return "SHOW TIME ZONE"
883-
case "transaction":
884-
return "SHOW TRANSACTION"
885-
case "transactionIsolationLevel":
886-
return "SHOW TRANSACTION ISOLATION LEVEL"
887-
case "defaultTransactionReadOnly":
888-
return "SHOW DEFAULT TRANSACTION READ ONLY"
889879
case "user":
890880
return stmt.name
891881
? `SHOW USER ${qualifiedNameToSql(stmt.name)}`

0 commit comments

Comments
 (0)