Skip to content

Commit 6ea14e3

Browse files
committed
fix(select query parser): support !inner
1 parent d44856d commit 6ea14e3

File tree

1 file changed

+59
-18
lines changed

1 file changed

+59
-18
lines changed

src/select-query-parser.ts

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,13 @@ type ParseIdentifier<Input extends string> = ReadLetters<Input>
118118
* - `field`
119119
* - `field(nodes)`
120120
* - `field!hint(nodes)`
121+
* - `field!inner(nodes)`
122+
* - `field!hint!inner(nodes)`
121123
* - `renamed_field:field`
122124
* - `renamed_field:field(nodes)`
123125
* - `renamed_field:field!hint(nodes)`
126+
* - `renamed_field:field!inner(nodes)`
127+
* - `renamed_field:field!hint!inner(nodes)`
124128
*
125129
* TODO: casting operators `::text`, JSON operators `->`, `->>`.
126130
*/
@@ -130,14 +134,63 @@ type ParseNode<Input extends string> = Input extends ''
130134
Input extends `*${infer Remainder}`
131135
? [{ star: true }, EatWhitespace<Remainder>]
132136
: ParseIdentifier<Input> extends [infer Name, `${infer Remainder}`]
133-
? EatWhitespace<Remainder> extends `:${infer Remainder}`
137+
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
138+
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [infer _Fields, `${infer Remainder}`]
139+
? // `field!inner(nodes)`
140+
[{ name: Name; foreignTable: true }, EatWhitespace<Remainder>]
141+
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
142+
? ParseEmbeddedResource<EatWhitespace<Remainder>>
143+
: ParserError<'Expected embedded resource after `!inner`'>
144+
: EatWhitespace<Remainder> extends `!${infer Remainder}`
145+
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer _Hint, `${infer Remainder}`]
146+
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
147+
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
148+
infer _Fields,
149+
`${infer Remainder}`
150+
]
151+
? // `field!hint!inner(nodes)`
152+
[{ name: Name; foreignTable: true }, EatWhitespace<Remainder>]
153+
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
154+
? ParseEmbeddedResource<EatWhitespace<Remainder>>
155+
: ParserError<'Expected embedded resource after `!inner`'>
156+
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
157+
infer _Fields,
158+
`${infer Remainder}`
159+
]
160+
? // `field!hint(nodes)`
161+
[{ name: Name; foreignTable: true }, EatWhitespace<Remainder>]
162+
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
163+
? ParseEmbeddedResource<EatWhitespace<Remainder>>
164+
: ParserError<'Expected embedded resource after `!hint`'>
165+
: ParserError<'Expected identifier after `!`'>
166+
: EatWhitespace<Remainder> extends `:${infer Remainder}`
134167
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer OriginalName, `${infer Remainder}`]
135-
? EatWhitespace<Remainder> extends `!${infer Remainder}`
168+
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
169+
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
170+
infer _Fields,
171+
`${infer Remainder}`
172+
]
173+
? // `renamed_field:field!inner(nodes)`
174+
[{ name: Name; foreignTable: true }, EatWhitespace<Remainder>]
175+
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
176+
? ParseEmbeddedResource<EatWhitespace<Remainder>>
177+
: ParserError<'Expected embedded resource after `!inner`'>
178+
: EatWhitespace<Remainder> extends `!${infer Remainder}`
136179
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer _Hint, `${infer Remainder}`]
137-
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
138-
infer _Fields,
139-
`${infer Remainder}`
140-
]
180+
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
181+
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
182+
infer _Fields,
183+
`${infer Remainder}`
184+
]
185+
? // `renamed_field:field!hint!inner(nodes)`
186+
[{ name: Name; foreignTable: true }, EatWhitespace<Remainder>]
187+
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
188+
? ParseEmbeddedResource<EatWhitespace<Remainder>>
189+
: ParserError<'Expected embedded resource after `!inner`'>
190+
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
191+
infer _Fields,
192+
`${infer Remainder}`
193+
]
141194
? // `renamed_field:field!hint(nodes)`
142195
[
143196
{
@@ -161,18 +214,6 @@ type ParseNode<Input extends string> = Input extends ''
161214
: // `renamed_field:field`
162215
[{ name: Name; original: OriginalName }, EatWhitespace<Remainder>]
163216
: ParseIdentifier<EatWhitespace<Remainder>>
164-
: EatWhitespace<Remainder> extends `!${infer Remainder}`
165-
? ParseIdentifier<EatWhitespace<Remainder>> extends [infer _Hint, `${infer Remainder}`]
166-
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [
167-
infer _Fields,
168-
`${infer Remainder}`
169-
]
170-
? // `field!hint(nodes)`
171-
[{ name: Name; foreignTable: true }, EatWhitespace<Remainder>]
172-
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends ParserError<string>
173-
? ParseEmbeddedResource<EatWhitespace<Remainder>>
174-
: ParserError<'Expected embedded resource after `!hint`'>
175-
: ParserError<'Expected identifier after `!`'>
176217
: ParseEmbeddedResource<EatWhitespace<Remainder>> extends [infer _Fields, `${infer Remainder}`]
177218
? // `field(nodes)`
178219
[{ name: Name; foreignTable: true }, EatWhitespace<Remainder>]

0 commit comments

Comments
 (0)