parser.go 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883
  1. package parser
  2. import (
  3. "strings"
  4. "github.com/danfragoso/pizzasql-next/pkg/lexer"
  5. "github.com/danfragoso/pizzasql-next/pkg/pgerror"
  6. )
  7. // Parser parses SQL statements into an AST.
  8. type Parser struct {
  9. lexer *lexer.Lexer
  10. curToken lexer.Token
  11. peekToken lexer.Token
  12. errors []*ParseError
  13. }
  14. // New creates a new Parser.
  15. func New(l *lexer.Lexer) *Parser {
  16. p := &Parser{lexer: l}
  17. // Read two tokens to initialize curToken and peekToken
  18. p.nextToken()
  19. p.nextToken()
  20. return p
  21. }
  22. // Parse parses a SQL statement.
  23. func (p *Parser) Parse() (Statement, error) {
  24. stmt, err := p.parseStatement()
  25. if err != nil {
  26. return nil, err
  27. }
  28. // Consume optional semicolon
  29. if p.curTokenIs(lexer.TokenSemicolon) {
  30. p.nextToken()
  31. }
  32. if !p.curTokenIs(lexer.TokenEOF) {
  33. return nil, p.curError("unexpected trailing token: " + p.curToken.Type.String())
  34. }
  35. return stmt, nil
  36. }
  37. // ParseExpr parses a standalone SQL expression, used for persisted generated
  38. // column and expression-index definitions. It rejects trailing tokens so a
  39. // malformed stored expression surfaces immediately.
  40. func ParseExpr(input string) (Expr, error) {
  41. p := New(lexer.New(input))
  42. expr, err := p.parseExpr()
  43. if err != nil {
  44. return nil, err
  45. }
  46. if !p.curTokenIs(lexer.TokenEOF) {
  47. return nil, p.curError("unexpected trailing token: " + p.curToken.Type.String())
  48. }
  49. return expr, nil
  50. }
  51. // ParseMultiple parses multiple SQL statements.
  52. func (p *Parser) ParseMultiple() ([]Statement, error) {
  53. var stmts []Statement
  54. for !p.curTokenIs(lexer.TokenEOF) {
  55. stmt, err := p.parseStatement()
  56. if err != nil {
  57. return nil, err
  58. }
  59. stmts = append(stmts, stmt)
  60. // Consume optional semicolon
  61. if p.curTokenIs(lexer.TokenSemicolon) {
  62. p.nextToken()
  63. }
  64. }
  65. return stmts, nil
  66. }
  67. func (p *Parser) nextToken() {
  68. p.curToken = p.peekToken
  69. p.peekToken = p.lexer.NextToken()
  70. // Skip comments
  71. for p.peekToken.Type == lexer.TokenComment {
  72. p.peekToken = p.lexer.NextToken()
  73. }
  74. }
  75. func (p *Parser) curTokenIs(t lexer.TokenType) bool {
  76. return p.curToken.Type == t
  77. }
  78. func (p *Parser) peekTokenIs(t lexer.TokenType) bool {
  79. return p.peekToken.Type == t
  80. }
  81. func (p *Parser) expectPeek(t lexer.TokenType) error {
  82. if p.peekTokenIs(t) {
  83. p.nextToken()
  84. return nil
  85. }
  86. return p.peekError(t)
  87. }
  88. // curIdentIs reports whether the current token is an identifier spelling word
  89. // case-insensitively. It lets context-sensitive keywords (GENERATED, ALWAYS,
  90. // STORED, VIRTUAL) be recognized only in the positions where they are
  91. // meaningful, so they remain usable as ordinary identifiers elsewhere.
  92. func (p *Parser) curIdentIs(word string) bool {
  93. return p.curToken.Type == lexer.TokenIdent && strings.EqualFold(p.curToken.Literal, word)
  94. }
  95. func (p *Parser) peekError(t lexer.TokenType) error {
  96. return newError(
  97. "expected "+t.String()+", got "+p.peekToken.Type.String(),
  98. p.peekToken.Line,
  99. p.peekToken.Column,
  100. p.peekToken.Literal,
  101. )
  102. }
  103. func (p *Parser) curError(msg string) error {
  104. return newError(
  105. msg,
  106. p.curToken.Line,
  107. p.curToken.Column,
  108. p.curToken.Literal,
  109. )
  110. }
  111. func (p *Parser) parseStatement() (Statement, error) {
  112. if p.isWithStart() {
  113. return p.parseWithStatement()
  114. }
  115. switch p.curToken.Type {
  116. case lexer.TokenSELECT:
  117. return p.parseSelect()
  118. case lexer.TokenINSERT:
  119. return p.parseInsert()
  120. case lexer.TokenUPDATE:
  121. return p.parseUpdate()
  122. case lexer.TokenDELETE:
  123. return p.parseDelete()
  124. case lexer.TokenCREATE:
  125. return p.parseCreate()
  126. case lexer.TokenDROP:
  127. return p.parseDrop()
  128. case lexer.TokenALTER:
  129. return p.parseAlter()
  130. case lexer.TokenATTACH:
  131. return p.parseAttach()
  132. case lexer.TokenDETACH:
  133. return p.parseDetach()
  134. case lexer.TokenPRAGMA:
  135. return p.parsePragma()
  136. case lexer.TokenANALYZE:
  137. return p.parseAnalyze()
  138. case lexer.TokenEXPLAIN:
  139. return p.parseExplain()
  140. case lexer.TokenBEGIN:
  141. return p.parseBegin()
  142. case lexer.TokenCOMMIT:
  143. return p.parseCommit()
  144. case lexer.TokenROLLBACK:
  145. return p.parseRollback()
  146. case lexer.TokenSAVEPOINT:
  147. return p.parseSavepoint()
  148. case lexer.TokenRELEASE:
  149. return p.parseRelease()
  150. default:
  151. return nil, p.curError("unexpected token: " + p.curToken.Type.String())
  152. }
  153. }
  154. // parseSingleSelectTerm parses one SELECT body (SELECT … FROM … WHERE … GROUP BY … HAVING …)
  155. // but stops before any set operator, ORDER BY, LIMIT, or OFFSET.
  156. // Callers that want the full chain (including set ops) use parseSelect instead.
  157. func (p *Parser) parseSingleSelectTerm() (*SelectStmt, error) {
  158. stmt := &SelectStmt{}
  159. p.nextToken() // consume SELECT
  160. // Check for DISTINCT / ALL
  161. if p.curTokenIs(lexer.TokenDISTINCT) {
  162. stmt.Distinct = true
  163. p.nextToken()
  164. } else if p.curTokenIs(lexer.TokenALL) {
  165. p.nextToken()
  166. }
  167. cols, err := p.parseSelectColumns()
  168. if err != nil {
  169. return nil, err
  170. }
  171. stmt.Columns = cols
  172. if p.curTokenIs(lexer.TokenFROM) {
  173. p.nextToken()
  174. tables, err := p.parseTableRefs()
  175. if err != nil {
  176. return nil, err
  177. }
  178. stmt.From = tables
  179. }
  180. if p.curTokenIs(lexer.TokenWHERE) {
  181. p.nextToken()
  182. where, err := p.parseExpr()
  183. if err != nil {
  184. return nil, err
  185. }
  186. stmt.Where = where
  187. }
  188. if p.curTokenIs(lexer.TokenGROUP) {
  189. if err := p.expectPeek(lexer.TokenBY); err != nil {
  190. return nil, err
  191. }
  192. p.nextToken()
  193. groupBy, err := p.parseExprList()
  194. if err != nil {
  195. return nil, err
  196. }
  197. stmt.GroupBy = groupBy
  198. }
  199. if p.curTokenIs(lexer.TokenHAVING) {
  200. p.nextToken()
  201. having, err := p.parseExpr()
  202. if err != nil {
  203. return nil, err
  204. }
  205. stmt.Having = having
  206. }
  207. return stmt, nil
  208. }
  209. // parseSelect parses a SELECT statement, including any trailing set operations
  210. // (UNION / INTERSECT / EXCEPT) and an optional ORDER BY / LIMIT / OFFSET.
  211. func (p *Parser) parseSelect() (*SelectStmt, error) {
  212. stmt, err := p.parseSingleSelectTerm()
  213. if err != nil {
  214. return nil, err
  215. }
  216. // Handle set operations: UNION [ALL], INTERSECT, EXCEPT
  217. if p.curTokenIs(lexer.TokenUNION) || p.curTokenIs(lexer.TokenINTERSECT) || p.curTokenIs(lexer.TokenEXCEPT) {
  218. compound, err := p.parseCompoundChain(stmt)
  219. if err != nil {
  220. return nil, err
  221. }
  222. return &SelectStmt{Compound: compound}, nil
  223. }
  224. // Parse ORDER BY clause
  225. if p.curTokenIs(lexer.TokenORDER) {
  226. if err := p.expectPeek(lexer.TokenBY); err != nil {
  227. return nil, err
  228. }
  229. p.nextToken()
  230. orderBy, err := p.parseOrderBy()
  231. if err != nil {
  232. return nil, err
  233. }
  234. stmt.OrderBy = orderBy
  235. }
  236. // Parse LIMIT clause
  237. if p.curTokenIs(lexer.TokenLIMIT) {
  238. p.nextToken()
  239. limit, err := p.parseExpr()
  240. if err != nil {
  241. return nil, err
  242. }
  243. stmt.Limit = limit
  244. }
  245. // Parse OFFSET clause
  246. if p.curTokenIs(lexer.TokenOFFSET) {
  247. p.nextToken()
  248. offset, err := p.parseExpr()
  249. if err != nil {
  250. return nil, err
  251. }
  252. stmt.Offset = offset
  253. }
  254. return stmt, nil
  255. }
  256. // setOpPrec returns the precedence of a set operator token.
  257. // INTERSECT binds more tightly than UNION/EXCEPT per SQL standard.
  258. func setOpPrec(t lexer.TokenType) int {
  259. if t == lexer.TokenINTERSECT {
  260. return 2
  261. }
  262. return 1
  263. }
  264. // parseCompoundChain collects all set-op legs and builds a left-associative tree
  265. // respecting INTERSECT > UNION/EXCEPT precedence.
  266. //
  267. // The algorithm is the standard precedence-climbing / Pratt approach:
  268. //
  269. // parseMin(minPrec):
  270. // left = first already-parsed SELECT (passed in as `first`)
  271. // while curOp.prec >= minPrec:
  272. // op = curOp; consume op
  273. // right = parseSingleSelect()
  274. // while nextOp.prec > op.prec: // right-bind tighter ops
  275. // right = parseMin(op.prec+1) using right as seed
  276. // left = Compound(left, op, right)
  277. // return left
  278. func (p *Parser) parseCompoundChain(first *SelectStmt) (*CompoundSelect, error) {
  279. type leg struct {
  280. op SetOpType
  281. query *SelectStmt
  282. }
  283. // Consume a set-op token and return its SetOpType + precedence.
  284. consumeOp := func() (SetOpType, int, error) {
  285. switch p.curToken.Type {
  286. case lexer.TokenUNION:
  287. p.nextToken()
  288. if p.curTokenIs(lexer.TokenALL) {
  289. p.nextToken()
  290. return SetOpUnionAll, 1, nil
  291. }
  292. return SetOpUnion, 1, nil
  293. case lexer.TokenINTERSECT:
  294. p.nextToken()
  295. return SetOpIntersect, 2, nil
  296. case lexer.TokenEXCEPT:
  297. p.nextToken()
  298. return SetOpExcept, 1, nil
  299. }
  300. return 0, 0, p.curError("expected UNION, INTERSECT, or EXCEPT")
  301. }
  302. isSetOp := func() bool {
  303. return p.curTokenIs(lexer.TokenUNION) ||
  304. p.curTokenIs(lexer.TokenINTERSECT) ||
  305. p.curTokenIs(lexer.TokenEXCEPT)
  306. }
  307. // parseSingleSelect parses the next SELECT term (no set-ops claimed).
  308. parseSingleSelect := func() (*SelectStmt, error) {
  309. if !p.curTokenIs(lexer.TokenSELECT) {
  310. return nil, p.curError("expected SELECT after set operator")
  311. }
  312. return p.parseSingleSelectTerm()
  313. }
  314. // Precedence-climbing: build left-to-right tree, INTERSECT binds tighter.
  315. var climb func(left *SelectStmt, minPrec int) (*CompoundSelect, error)
  316. climb = func(left *SelectStmt, minPrec int) (*CompoundSelect, error) {
  317. for isSetOp() && setOpPrec(p.curToken.Type) >= minPrec {
  318. op, prec, err := consumeOp()
  319. if err != nil {
  320. return nil, err
  321. }
  322. right, err := parseSingleSelect()
  323. if err != nil {
  324. return nil, err
  325. }
  326. // If the right node itself resolved to a compound (via recursive parseSelect),
  327. // unwrap and re-climb properly.
  328. if right.Compound != nil {
  329. // right was a sub-chain; treat it as already climbed.
  330. } else {
  331. // Absorb any higher-precedence ops on the right.
  332. for isSetOp() && setOpPrec(p.curToken.Type) > prec {
  333. sub, err := climb(right, prec+1)
  334. if err != nil {
  335. return nil, err
  336. }
  337. right = &SelectStmt{Compound: sub}
  338. break
  339. }
  340. }
  341. node := &CompoundSelect{Left: left, Op: op, Right: right}
  342. left = &SelectStmt{Compound: node}
  343. }
  344. if left.Compound != nil {
  345. return left.Compound, nil
  346. }
  347. return nil, p.curError("internal: no compound built")
  348. }
  349. compound, err := climb(first, 1)
  350. if err != nil {
  351. return nil, err
  352. }
  353. // Parse trailing ORDER BY / LIMIT / OFFSET that apply to the whole compound.
  354. if p.curTokenIs(lexer.TokenORDER) {
  355. if err := p.expectPeek(lexer.TokenBY); err != nil {
  356. return nil, err
  357. }
  358. p.nextToken()
  359. orderBy, err := p.parseOrderBy()
  360. if err != nil {
  361. return nil, err
  362. }
  363. compound.OrderBy = orderBy
  364. }
  365. if p.curTokenIs(lexer.TokenLIMIT) {
  366. p.nextToken()
  367. limit, err := p.parseExpr()
  368. if err != nil {
  369. return nil, err
  370. }
  371. compound.Limit = limit
  372. }
  373. if p.curTokenIs(lexer.TokenOFFSET) {
  374. p.nextToken()
  375. offset, err := p.parseExpr()
  376. if err != nil {
  377. return nil, err
  378. }
  379. compound.Offset = offset
  380. }
  381. return compound, nil
  382. }
  383. func (p *Parser) parseSelectColumns() ([]SelectColumn, error) {
  384. var cols []SelectColumn
  385. for {
  386. col := SelectColumn{}
  387. if p.curTokenIs(lexer.TokenStar) {
  388. col.Star = true
  389. p.nextToken()
  390. } else {
  391. expr, err := p.parseExpr()
  392. if err != nil {
  393. return nil, err
  394. }
  395. // Qualified wildcard (table.*): the expression grammar parses this as
  396. // ColumnRef{Table: table, Column: "*"}. Lift it into a scoped wildcard
  397. // projection instead of a column reference literally named "*".
  398. if ref, ok := expr.(*ColumnRef); ok && ref.Table != "" && ref.Column == "*" {
  399. col.TableStar = ref.Table
  400. } else {
  401. col.Expr = expr
  402. // Check for AS alias
  403. if p.curTokenIs(lexer.TokenAS) {
  404. p.nextToken()
  405. if !p.curTokenIs(lexer.TokenIdent) {
  406. return nil, p.curError("expected identifier after AS")
  407. }
  408. col.Alias = p.curToken.Literal
  409. p.nextToken()
  410. } else if p.curTokenIs(lexer.TokenIdent) {
  411. // Alias without AS
  412. col.Alias = p.curToken.Literal
  413. p.nextToken()
  414. }
  415. }
  416. }
  417. cols = append(cols, col)
  418. if !p.curTokenIs(lexer.TokenComma) {
  419. break
  420. }
  421. p.nextToken() // consume comma
  422. }
  423. return cols, nil
  424. }
  425. func (p *Parser) parseTableRefs() ([]TableRef, error) {
  426. var tables []TableRef
  427. table, err := p.parseTableRef()
  428. if err != nil {
  429. return nil, err
  430. }
  431. tables = append(tables, *table)
  432. // Parse JOINs or comma-separated tables
  433. for {
  434. if p.curTokenIs(lexer.TokenComma) {
  435. p.nextToken()
  436. table, err := p.parseTableRef()
  437. if err != nil {
  438. return nil, err
  439. }
  440. tables = append(tables, *table)
  441. } else if p.isJoinKeyword() {
  442. join, err := p.parseJoin()
  443. if err != nil {
  444. return nil, err
  445. }
  446. // Find the last Join in the chain and attach new join there
  447. lastTable := &tables[len(tables)-1]
  448. if lastTable.Join == nil {
  449. lastTable.Join = join
  450. } else {
  451. // Find the end of the join chain
  452. current := lastTable.Join
  453. for current.Table != nil && current.Table.Join != nil {
  454. current = current.Table.Join
  455. }
  456. // Attach to the end of the chain
  457. if current.Table != nil {
  458. current.Table.Join = join
  459. }
  460. }
  461. } else {
  462. break
  463. }
  464. }
  465. return tables, nil
  466. }
  467. func (p *Parser) parseTableRef() (*TableRef, error) {
  468. ref := &TableRef{}
  469. // Check for subquery (SELECT ...)
  470. if p.curTokenIs(lexer.TokenLParen) {
  471. p.nextToken()
  472. if p.curTokenIs(lexer.TokenSELECT) {
  473. subquery, err := p.parseSelect()
  474. if err != nil {
  475. return nil, err
  476. }
  477. ref.Subquery = subquery
  478. if !p.curTokenIs(lexer.TokenRParen) {
  479. return nil, p.curError("expected ) after subquery")
  480. }
  481. p.nextToken()
  482. // Subquery must have an alias
  483. if p.curTokenIs(lexer.TokenAS) {
  484. p.nextToken()
  485. }
  486. if !p.curTokenIs(lexer.TokenIdent) {
  487. return nil, p.curError("subquery in FROM must have an alias")
  488. }
  489. ref.Alias = p.curToken.Literal
  490. p.nextToken()
  491. return ref, nil
  492. }
  493. // Parenthesized table expression: (table1 JOIN table2) or (table1, table2)
  494. innerRefs, err := p.parseTableRefs()
  495. if err != nil {
  496. return nil, err
  497. }
  498. if !p.curTokenIs(lexer.TokenRParen) {
  499. return nil, p.curError("expected ) after table expression")
  500. }
  501. p.nextToken()
  502. // Flatten: use first ref as base, attach remaining as joins
  503. if len(innerRefs) == 0 {
  504. return nil, p.curError("empty table expression")
  505. }
  506. base := &innerRefs[0]
  507. for i := 1; i < len(innerRefs); i++ {
  508. cur := base
  509. for cur.Join != nil && cur.Join.Table != nil {
  510. cur = cur.Join.Table
  511. }
  512. extra := innerRefs[i]
  513. if cur.Join == nil {
  514. cur.Join = &JoinClause{Type: JoinCross, Table: &extra}
  515. } else {
  516. cur.Join.Table = &extra
  517. }
  518. }
  519. return base, nil
  520. }
  521. if !p.curTokenIs(lexer.TokenIdent) {
  522. return nil, p.curError("expected table name")
  523. }
  524. ref.Name = p.curToken.Literal
  525. p.nextToken()
  526. // Check for schema.table
  527. if p.curTokenIs(lexer.TokenDot) {
  528. p.nextToken()
  529. if !p.curTokenIs(lexer.TokenIdent) {
  530. return nil, p.curError("expected table name after dot")
  531. }
  532. ref.Schema = ref.Name
  533. ref.Name = p.curToken.Literal
  534. p.nextToken()
  535. }
  536. // Check for alias
  537. if p.curTokenIs(lexer.TokenAS) {
  538. p.nextToken()
  539. if !p.curTokenIs(lexer.TokenIdent) {
  540. return nil, p.curError("expected identifier after AS")
  541. }
  542. ref.Alias = p.curToken.Literal
  543. p.nextToken()
  544. } else if p.curTokenIs(lexer.TokenIdent) && !p.isClauseKeyword() {
  545. ref.Alias = p.curToken.Literal
  546. p.nextToken()
  547. }
  548. return ref, nil
  549. }
  550. func (p *Parser) isJoinKeyword() bool {
  551. switch p.curToken.Type {
  552. case lexer.TokenJOIN, lexer.TokenINNER, lexer.TokenLEFT,
  553. lexer.TokenRIGHT, lexer.TokenFULL, lexer.TokenCROSS,
  554. lexer.TokenNATURAL:
  555. return true
  556. }
  557. return false
  558. }
  559. func (p *Parser) isClauseKeyword() bool {
  560. switch p.curToken.Type {
  561. case lexer.TokenWHERE, lexer.TokenGROUP, lexer.TokenHAVING,
  562. lexer.TokenORDER, lexer.TokenLIMIT, lexer.TokenOFFSET,
  563. lexer.TokenUNION, lexer.TokenINTERSECT, lexer.TokenEXCEPT,
  564. lexer.TokenON, lexer.TokenUSING:
  565. return true
  566. }
  567. return false
  568. }
  569. func (p *Parser) parseJoin() (*JoinClause, error) {
  570. join := &JoinClause{Type: JoinInner}
  571. // Determine join type
  572. switch p.curToken.Type {
  573. case lexer.TokenINNER:
  574. join.Type = JoinInner
  575. p.nextToken()
  576. case lexer.TokenLEFT:
  577. join.Type = JoinLeft
  578. p.nextToken()
  579. if p.curTokenIs(lexer.TokenOUTER) {
  580. p.nextToken()
  581. }
  582. case lexer.TokenRIGHT:
  583. join.Type = JoinRight
  584. p.nextToken()
  585. if p.curTokenIs(lexer.TokenOUTER) {
  586. p.nextToken()
  587. }
  588. case lexer.TokenFULL:
  589. join.Type = JoinFull
  590. p.nextToken()
  591. if p.curTokenIs(lexer.TokenOUTER) {
  592. p.nextToken()
  593. }
  594. case lexer.TokenCROSS:
  595. join.Type = JoinCross
  596. p.nextToken()
  597. case lexer.TokenNATURAL:
  598. p.nextToken()
  599. // Could be NATURAL LEFT/RIGHT/INNER JOIN
  600. if p.curTokenIs(lexer.TokenLEFT) {
  601. join.Type = JoinLeft
  602. p.nextToken()
  603. } else if p.curTokenIs(lexer.TokenRIGHT) {
  604. join.Type = JoinRight
  605. p.nextToken()
  606. }
  607. }
  608. // Expect JOIN keyword
  609. if p.curTokenIs(lexer.TokenJOIN) {
  610. p.nextToken()
  611. } else if p.curToken.Type != lexer.TokenIdent {
  612. return nil, p.curError("expected JOIN")
  613. }
  614. // Parse table reference
  615. table, err := p.parseTableRef()
  616. if err != nil {
  617. return nil, err
  618. }
  619. join.Table = table
  620. // Parse ON or USING clause
  621. if p.curTokenIs(lexer.TokenON) {
  622. p.nextToken()
  623. cond, err := p.parseExpr()
  624. if err != nil {
  625. return nil, err
  626. }
  627. join.Condition = cond
  628. } else if p.curTokenIs(lexer.TokenUSING) {
  629. p.nextToken()
  630. if !p.curTokenIs(lexer.TokenLParen) {
  631. return nil, p.curError("expected (")
  632. }
  633. p.nextToken()
  634. cols, err := p.parseIdentList()
  635. if err != nil {
  636. return nil, err
  637. }
  638. join.Using = cols
  639. if !p.curTokenIs(lexer.TokenRParen) {
  640. return nil, p.curError("expected )")
  641. }
  642. p.nextToken()
  643. }
  644. return join, nil
  645. }
  646. func (p *Parser) parseOrderBy() ([]OrderByItem, error) {
  647. var items []OrderByItem
  648. for {
  649. item := OrderByItem{}
  650. expr, err := p.parseExpr()
  651. if err != nil {
  652. return nil, err
  653. }
  654. item.Expr = expr
  655. if p.curTokenIs(lexer.TokenDESC) {
  656. item.Desc = true
  657. p.nextToken()
  658. } else if p.curTokenIs(lexer.TokenASC) {
  659. p.nextToken()
  660. }
  661. // Optional NULLS FIRST / NULLS LAST.
  662. if p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "NULLS") {
  663. p.nextToken()
  664. if !p.curTokenIs(lexer.TokenIdent) {
  665. return nil, p.curError("expected FIRST or LAST after NULLS")
  666. }
  667. switch {
  668. case strings.EqualFold(p.curToken.Literal, "FIRST"):
  669. item.NullsOrder = NullsFirst
  670. case strings.EqualFold(p.curToken.Literal, "LAST"):
  671. item.NullsOrder = NullsLast
  672. default:
  673. return nil, p.curError("expected FIRST or LAST after NULLS")
  674. }
  675. p.nextToken()
  676. }
  677. items = append(items, item)
  678. if !p.curTokenIs(lexer.TokenComma) {
  679. break
  680. }
  681. p.nextToken()
  682. }
  683. return items, nil
  684. }
  685. // parseInsert parses an INSERT statement.
  686. func (p *Parser) parseInsert() (*InsertStmt, error) {
  687. stmt := &InsertStmt{}
  688. p.nextToken() // consume INSERT
  689. // Check for OR conflict clause
  690. if p.curTokenIs(lexer.TokenOR) {
  691. p.nextToken()
  692. switch p.curToken.Type {
  693. case lexer.TokenREPLACE:
  694. stmt.OnConflict = ConflictReplace
  695. case lexer.TokenIGNORE:
  696. stmt.OnConflict = ConflictIgnore
  697. case lexer.TokenFAIL:
  698. stmt.OnConflict = ConflictFail
  699. case lexer.TokenABORT:
  700. stmt.OnConflict = ConflictAbort
  701. case lexer.TokenROLLBACK:
  702. stmt.OnConflict = ConflictRollback
  703. default:
  704. return nil, p.curError("expected REPLACE, IGNORE, FAIL, ABORT, or ROLLBACK after OR")
  705. }
  706. p.nextToken()
  707. }
  708. if !p.curTokenIs(lexer.TokenINTO) {
  709. return nil, p.curError("expected INTO")
  710. }
  711. p.nextToken()
  712. // Parse table name
  713. table, err := p.parseTableRef()
  714. if err != nil {
  715. return nil, err
  716. }
  717. stmt.Table = table
  718. // Parse optional column list
  719. if p.curTokenIs(lexer.TokenLParen) {
  720. p.nextToken()
  721. cols, err := p.parseIdentList()
  722. if err != nil {
  723. return nil, err
  724. }
  725. stmt.Columns = cols
  726. if !p.curTokenIs(lexer.TokenRParen) {
  727. return nil, p.curError("expected )")
  728. }
  729. p.nextToken()
  730. }
  731. // Parse VALUES, SELECT, or SQLite's INSERT ... WITH ... SELECT form.
  732. if p.curTokenIs(lexer.TokenVALUES) {
  733. p.nextToken()
  734. values, err := p.parseValuesList()
  735. if err != nil {
  736. return nil, err
  737. }
  738. stmt.Values = values
  739. } else if p.curTokenIs(lexer.TokenSELECT) {
  740. sel, err := p.parseSelect()
  741. if err != nil {
  742. return nil, err
  743. }
  744. stmt.Select = sel
  745. } else if p.isWithStart() {
  746. withStmt, err := p.parseWithStatement()
  747. if err != nil {
  748. return nil, err
  749. }
  750. sel, ok := withStmt.(*SelectStmt)
  751. if !ok {
  752. return nil, p.curError("expected SELECT after WITH")
  753. }
  754. stmt.Select = sel
  755. } else {
  756. return nil, p.curError("expected VALUES, SELECT, or WITH")
  757. }
  758. if p.curTokenIs(lexer.TokenON) {
  759. p.nextToken()
  760. if !p.curTokenIs(lexer.TokenCONFLICT) {
  761. return nil, p.curError("expected CONFLICT after ON")
  762. }
  763. p.nextToken()
  764. if p.curTokenIs(lexer.TokenLParen) {
  765. p.nextToken()
  766. target, err := p.parseIdentList()
  767. if err != nil {
  768. return nil, err
  769. }
  770. stmt.ConflictTarget = target
  771. if !p.curTokenIs(lexer.TokenRParen) {
  772. return nil, p.curError("expected )")
  773. }
  774. p.nextToken()
  775. }
  776. if !p.curTokenIs(lexer.TokenDO) {
  777. return nil, p.curError("expected DO after ON CONFLICT")
  778. }
  779. p.nextToken()
  780. if p.curTokenIs(lexer.TokenNOTHING) {
  781. stmt.ConflictDoNothing = true
  782. p.nextToken()
  783. } else if p.curTokenIs(lexer.TokenUPDATE) {
  784. p.nextToken()
  785. if !p.curTokenIs(lexer.TokenSET) {
  786. return nil, p.curError("expected SET after DO UPDATE")
  787. }
  788. p.nextToken()
  789. for {
  790. if !p.curTokenIs(lexer.TokenIdent) {
  791. return nil, p.curError("expected column name")
  792. }
  793. column := p.curToken.Literal
  794. p.nextToken()
  795. if !p.curTokenIs(lexer.TokenEq) {
  796. return nil, p.curError("expected =")
  797. }
  798. p.nextToken()
  799. value, err := p.parseExpr()
  800. if err != nil {
  801. return nil, err
  802. }
  803. stmt.ConflictUpdate = append(stmt.ConflictUpdate, Assignment{Column: column, Value: value})
  804. if !p.curTokenIs(lexer.TokenComma) {
  805. break
  806. }
  807. p.nextToken()
  808. }
  809. } else {
  810. return nil, p.curError("expected NOTHING or UPDATE after DO")
  811. }
  812. }
  813. if p.curTokenIs(lexer.TokenRETURNING) {
  814. returning, err := p.parseReturningClause()
  815. if err != nil {
  816. return nil, err
  817. }
  818. stmt.Returning = returning
  819. }
  820. return stmt, nil
  821. }
  822. func (p *Parser) parseValuesList() ([][]Expr, error) {
  823. var rows [][]Expr
  824. for {
  825. if !p.curTokenIs(lexer.TokenLParen) {
  826. return nil, p.curError("expected (")
  827. }
  828. p.nextToken()
  829. row, err := p.parseExprList()
  830. if err != nil {
  831. return nil, err
  832. }
  833. rows = append(rows, row)
  834. if !p.curTokenIs(lexer.TokenRParen) {
  835. return nil, p.curError("expected )")
  836. }
  837. p.nextToken()
  838. if !p.curTokenIs(lexer.TokenComma) {
  839. break
  840. }
  841. p.nextToken()
  842. }
  843. return rows, nil
  844. }
  845. // parseUpdate parses an UPDATE statement.
  846. func (p *Parser) parseUpdate() (*UpdateStmt, error) {
  847. stmt := &UpdateStmt{}
  848. p.nextToken() // consume UPDATE
  849. // Parse table name
  850. table, err := p.parseTableRef()
  851. if err != nil {
  852. return nil, err
  853. }
  854. stmt.Table = table
  855. // Expect SET
  856. if !p.curTokenIs(lexer.TokenSET) {
  857. return nil, p.curError("expected SET")
  858. }
  859. p.nextToken()
  860. // Parse assignments
  861. for {
  862. if !p.curTokenIs(lexer.TokenIdent) {
  863. return nil, p.curError("expected column name")
  864. }
  865. col := p.curToken.Literal
  866. p.nextToken()
  867. if !p.curTokenIs(lexer.TokenEq) {
  868. return nil, p.curError("expected =")
  869. }
  870. p.nextToken()
  871. val, err := p.parseExpr()
  872. if err != nil {
  873. return nil, err
  874. }
  875. stmt.Set = append(stmt.Set, Assignment{Column: col, Value: val})
  876. if !p.curTokenIs(lexer.TokenComma) {
  877. break
  878. }
  879. p.nextToken()
  880. }
  881. // Parse optional FROM clause (SQLite UPDATE ... FROM).
  882. if p.curTokenIs(lexer.TokenFROM) {
  883. p.nextToken()
  884. from, err := p.parseTableRefs()
  885. if err != nil {
  886. return nil, err
  887. }
  888. stmt.From = from
  889. }
  890. // Parse optional WHERE
  891. if p.curTokenIs(lexer.TokenWHERE) {
  892. p.nextToken()
  893. where, err := p.parseExpr()
  894. if err != nil {
  895. return nil, err
  896. }
  897. stmt.Where = where
  898. }
  899. if p.curTokenIs(lexer.TokenRETURNING) {
  900. returning, err := p.parseReturningClause()
  901. if err != nil {
  902. return nil, err
  903. }
  904. stmt.Returning = returning
  905. }
  906. return stmt, nil
  907. }
  908. // parseDelete parses a DELETE statement.
  909. func (p *Parser) parseDelete() (*DeleteStmt, error) {
  910. stmt := &DeleteStmt{}
  911. p.nextToken() // consume DELETE
  912. if !p.curTokenIs(lexer.TokenFROM) {
  913. return nil, p.curError("expected FROM")
  914. }
  915. p.nextToken()
  916. // Parse table name
  917. table, err := p.parseTableRef()
  918. if err != nil {
  919. return nil, err
  920. }
  921. stmt.Table = table
  922. // Parse optional WHERE
  923. if p.curTokenIs(lexer.TokenWHERE) {
  924. p.nextToken()
  925. where, err := p.parseExpr()
  926. if err != nil {
  927. return nil, err
  928. }
  929. stmt.Where = where
  930. }
  931. if p.curTokenIs(lexer.TokenRETURNING) {
  932. returning, err := p.parseReturningClause()
  933. if err != nil {
  934. return nil, err
  935. }
  936. stmt.Returning = returning
  937. }
  938. return stmt, nil
  939. }
  940. // parseReturningClause parses the projection after a RETURNING keyword. The
  941. // caller must leave curToken on the RETURNING identifier.
  942. func (p *Parser) parseReturningClause() ([]SelectColumn, error) {
  943. p.nextToken() // consume RETURNING
  944. cols, err := p.parseSelectColumns()
  945. if err != nil {
  946. return nil, err
  947. }
  948. if len(cols) == 0 {
  949. return nil, p.curError("RETURNING requires at least one expression")
  950. }
  951. return cols, nil
  952. }
  953. // parseCreate parses CREATE statements.
  954. func (p *Parser) parseCreate() (Statement, error) {
  955. p.nextToken() // consume CREATE
  956. switch p.curToken.Type {
  957. case lexer.TokenTABLE:
  958. return p.parseCreateTable()
  959. case lexer.TokenINDEX:
  960. return p.parseCreateIndex(false)
  961. case lexer.TokenUNIQUE:
  962. p.nextToken() // consume UNIQUE
  963. if !p.curTokenIs(lexer.TokenINDEX) {
  964. return nil, p.curError("expected INDEX after UNIQUE")
  965. }
  966. return p.parseCreateIndex(true)
  967. case lexer.TokenVIEW:
  968. return p.parseCreateView()
  969. default:
  970. return nil, p.curError("expected TABLE or INDEX after CREATE")
  971. }
  972. }
  973. func (p *Parser) parseCreateTable() (*CreateTableStmt, error) {
  974. stmt := &CreateTableStmt{}
  975. p.nextToken() // consume TABLE
  976. // Check for IF NOT EXISTS
  977. if p.curTokenIs(lexer.TokenIF) {
  978. p.nextToken()
  979. if !p.curTokenIs(lexer.TokenNOT) {
  980. return nil, p.curError("expected NOT")
  981. }
  982. p.nextToken()
  983. if !p.curTokenIs(lexer.TokenEXISTS) {
  984. return nil, p.curError("expected EXISTS")
  985. }
  986. stmt.IfNotExists = true
  987. p.nextToken()
  988. }
  989. // Parse table name
  990. table, err := p.parseTableRef()
  991. if err != nil {
  992. return nil, err
  993. }
  994. stmt.Table = table
  995. // Expect (
  996. if !p.curTokenIs(lexer.TokenLParen) {
  997. return nil, p.curError("expected (")
  998. }
  999. p.nextToken()
  1000. // Parse column definitions and constraints
  1001. for {
  1002. if p.curTokenIs(lexer.TokenRParen) {
  1003. break
  1004. }
  1005. // Check for table constraint
  1006. if p.isTableConstraintStart() {
  1007. constraint, err := p.parseTableConstraint()
  1008. if err != nil {
  1009. return nil, err
  1010. }
  1011. stmt.Constraints = append(stmt.Constraints, *constraint)
  1012. } else {
  1013. // Column definition
  1014. col, err := p.parseColumnDef()
  1015. if err != nil {
  1016. return nil, err
  1017. }
  1018. stmt.Columns = append(stmt.Columns, *col)
  1019. }
  1020. if !p.curTokenIs(lexer.TokenComma) {
  1021. break
  1022. }
  1023. p.nextToken()
  1024. }
  1025. if !p.curTokenIs(lexer.TokenRParen) {
  1026. return nil, p.curError("expected )")
  1027. }
  1028. p.nextToken()
  1029. return stmt, nil
  1030. }
  1031. func (p *Parser) isTableConstraintStart() bool {
  1032. switch p.curToken.Type {
  1033. case lexer.TokenPRIMARY, lexer.TokenFOREIGN, lexer.TokenUNIQUE,
  1034. lexer.TokenCHECK, lexer.TokenCONSTRAINT:
  1035. return true
  1036. }
  1037. return false
  1038. }
  1039. func (p *Parser) parseColumnDef() (*ColumnDef, error) {
  1040. col := &ColumnDef{}
  1041. if !p.curIsName() {
  1042. return nil, p.curError("expected column name")
  1043. }
  1044. col.Name = p.curToken.Literal
  1045. p.nextToken()
  1046. // Parse data type
  1047. dataType, err := p.parseDataType()
  1048. if err != nil {
  1049. return nil, err
  1050. }
  1051. col.Type = *dataType
  1052. // Parse column constraints
  1053. for {
  1054. if consumed, err := p.tryParseGeneratedColumn(col); err != nil {
  1055. return nil, err
  1056. } else if consumed {
  1057. continue
  1058. }
  1059. constraint, ok, err := p.parseColumnConstraint()
  1060. if err != nil {
  1061. return nil, err
  1062. }
  1063. if !ok {
  1064. break
  1065. }
  1066. if constraint != nil {
  1067. col.Constraints = append(col.Constraints, *constraint)
  1068. }
  1069. }
  1070. return col, nil
  1071. }
  1072. // tryParseGeneratedColumn parses a GENERATED ALWAYS AS (expr) [STORED|VIRTUAL]
  1073. // clause, or the shorthand AS (expr) [STORED|VIRTUAL]. It reports whether a
  1074. // clause was consumed. Generated columns cannot be written by the user.
  1075. func (p *Parser) tryParseGeneratedColumn(col *ColumnDef) (bool, error) {
  1076. started := false
  1077. if p.curIdentIs("GENERATED") {
  1078. started = true
  1079. p.nextToken()
  1080. if !p.curIdentIs("ALWAYS") {
  1081. return false, p.curError("expected ALWAYS after GENERATED")
  1082. }
  1083. p.nextToken()
  1084. }
  1085. if !p.curTokenIs(lexer.TokenAS) {
  1086. if started {
  1087. return false, p.curError("expected AS in generated column definition")
  1088. }
  1089. return false, nil
  1090. }
  1091. p.nextToken() // consume AS
  1092. if !p.curTokenIs(lexer.TokenLParen) {
  1093. return false, p.curError("expected ( after AS")
  1094. }
  1095. p.nextToken()
  1096. expr, err := p.parseExpr()
  1097. if err != nil {
  1098. return false, err
  1099. }
  1100. if !p.curTokenIs(lexer.TokenRParen) {
  1101. return false, p.curError("expected ) after generated expression")
  1102. }
  1103. p.nextToken()
  1104. col.GeneratedExpr = expr
  1105. if p.curIdentIs("STORED") {
  1106. col.GeneratedStored = true
  1107. p.nextToken()
  1108. } else if p.curIdentIs("VIRTUAL") {
  1109. col.GeneratedStored = false
  1110. p.nextToken()
  1111. }
  1112. return true, nil
  1113. }
  1114. // identTypeAliases maps non-reserved type names (lexed as plain identifiers)
  1115. // to their canonical data type name. These are stored with SQLite text
  1116. // affinity and never gain native PostgreSQL semantics.
  1117. var identTypeAliases = map[string]string{
  1118. "UUID": "UUID",
  1119. }
  1120. func (p *Parser) parseDataType() (*DataType, error) {
  1121. dt := &DataType{}
  1122. if p.curTokenIs(lexer.TokenIdent) {
  1123. // A few well-known type names (e.g. UUID) are not reserved keywords and
  1124. // lex as identifiers. Recognize them as type aliases so they can be used
  1125. // in column definitions.
  1126. name, ok := identTypeAliases[strings.ToUpper(p.curToken.Literal)]
  1127. if !ok {
  1128. return nil, p.curError("expected data type")
  1129. }
  1130. dt.Name = name
  1131. p.nextToken()
  1132. } else {
  1133. if !p.isDataTypeKeyword() {
  1134. return nil, p.curError("expected data type")
  1135. }
  1136. dt.Name = strings.ToUpper(p.curToken.Literal)
  1137. p.nextToken()
  1138. }
  1139. // Check for precision/scale
  1140. if p.curTokenIs(lexer.TokenLParen) {
  1141. p.nextToken()
  1142. if !p.curTokenIs(lexer.TokenNumber) {
  1143. return nil, p.curError("expected number for precision")
  1144. }
  1145. // Parse precision (simplified - just store in Precision)
  1146. dt.Precision = parseInt(p.curToken.Literal)
  1147. p.nextToken()
  1148. if p.curTokenIs(lexer.TokenComma) {
  1149. p.nextToken()
  1150. if !p.curTokenIs(lexer.TokenNumber) {
  1151. return nil, p.curError("expected number for scale")
  1152. }
  1153. dt.Scale = parseInt(p.curToken.Literal)
  1154. p.nextToken()
  1155. }
  1156. if !p.curTokenIs(lexer.TokenRParen) {
  1157. return nil, p.curError("expected )")
  1158. }
  1159. p.nextToken()
  1160. }
  1161. return dt, nil
  1162. }
  1163. func (p *Parser) isDataTypeKeyword() bool {
  1164. switch p.curToken.Type {
  1165. case lexer.TokenINTEGER, lexer.TokenINT, lexer.TokenTINYINT, lexer.TokenSMALLINT, lexer.TokenMEDIUMINT, lexer.TokenBIGINT,
  1166. lexer.TokenREAL, lexer.TokenFLOAT, lexer.TokenDOUBLE,
  1167. lexer.TokenNUMERIC, lexer.TokenDECIMAL,
  1168. lexer.TokenTEXT, lexer.TokenVARCHAR, lexer.TokenCHAR, lexer.TokenCHARACTER, lexer.TokenCLOB, lexer.TokenNCHAR, lexer.TokenNVARCHAR,
  1169. lexer.TokenBLOB, lexer.TokenBOOLEAN,
  1170. lexer.TokenDATE, lexer.TokenTIME, lexer.TokenTIMESTAMP, lexer.TokenDATETIME, lexer.TokenJSON, lexer.TokenJSONB:
  1171. return true
  1172. }
  1173. return false
  1174. }
  1175. func (p *Parser) parseColumnConstraint() (*ColumnConstraint, bool, error) {
  1176. constraint := &ColumnConstraint{}
  1177. switch p.curToken.Type {
  1178. case lexer.TokenPRIMARY:
  1179. p.nextToken()
  1180. if !p.curTokenIs(lexer.TokenKEY) {
  1181. return nil, false, p.curError("expected KEY after PRIMARY")
  1182. }
  1183. constraint.Type = ConstraintPrimaryKey
  1184. p.nextToken()
  1185. if action, ok, err := p.parseOnConflictAction(); err != nil {
  1186. return nil, false, err
  1187. } else if ok {
  1188. constraint.OnConflict = action
  1189. constraint.HasOnConflict = true
  1190. }
  1191. case lexer.TokenNOT:
  1192. p.nextToken()
  1193. if !p.curTokenIs(lexer.TokenNULL) {
  1194. return nil, false, p.curError("expected NULL after NOT")
  1195. }
  1196. constraint.Type = ConstraintNotNull
  1197. p.nextToken()
  1198. case lexer.TokenUNIQUE:
  1199. constraint.Type = ConstraintUnique
  1200. p.nextToken()
  1201. if action, ok, err := p.parseOnConflictAction(); err != nil {
  1202. return nil, false, err
  1203. } else if ok {
  1204. constraint.OnConflict = action
  1205. constraint.HasOnConflict = true
  1206. }
  1207. case lexer.TokenDEFAULT:
  1208. p.nextToken()
  1209. // parseUnaryExpr accepts a signed numeric literal (-1, +5) and falls
  1210. // through to primary expressions, including parenthesized expressions.
  1211. // It stops before NOT/NULL, so a following NOT NULL constraint is left
  1212. // for the enclosing constraint loop.
  1213. expr, err := p.parseUnaryExpr()
  1214. if err != nil {
  1215. return nil, false, err
  1216. }
  1217. constraint.Type = ConstraintDefault
  1218. constraint.Default = expr
  1219. case lexer.TokenREFERENCES:
  1220. p.nextToken()
  1221. if !p.curTokenIs(lexer.TokenIdent) {
  1222. return nil, false, p.curError("expected table name after REFERENCES")
  1223. }
  1224. constraint.Type = ConstraintForeignKey
  1225. constraint.RefTable = p.curToken.Literal
  1226. p.nextToken()
  1227. if p.curTokenIs(lexer.TokenLParen) {
  1228. p.nextToken()
  1229. if !p.curTokenIs(lexer.TokenIdent) {
  1230. return nil, false, p.curError("expected column name")
  1231. }
  1232. constraint.RefColumn = p.curToken.Literal
  1233. p.nextToken()
  1234. if !p.curTokenIs(lexer.TokenRParen) {
  1235. return nil, false, p.curError("expected )")
  1236. }
  1237. p.nextToken()
  1238. }
  1239. case lexer.TokenAUTOINCREMENT:
  1240. constraint.Type = ConstraintAutoIncrement
  1241. p.nextToken()
  1242. case lexer.TokenCHECK:
  1243. p.nextToken()
  1244. if !p.curTokenIs(lexer.TokenLParen) {
  1245. return nil, false, p.curError("expected ( after CHECK")
  1246. }
  1247. p.nextToken()
  1248. check, err := p.parseExpr()
  1249. if err != nil {
  1250. return nil, false, err
  1251. }
  1252. if !p.curTokenIs(lexer.TokenRParen) {
  1253. return nil, false, p.curError("expected ) after CHECK expression")
  1254. }
  1255. p.nextToken()
  1256. constraint.Type = ConstraintCheck
  1257. constraint.Check = check
  1258. case lexer.TokenNULL:
  1259. // Explicit NULL is a no-op: columns are nullable by default, so an
  1260. // explicit NULL declaration carries no constraint. Consume it so
  1261. // "col TYPE NULL" parses without inventing a fake nullable constraint.
  1262. // NOT NULL is applied whenever it appears, regardless of ordering.
  1263. p.nextToken()
  1264. return nil, true, nil
  1265. default:
  1266. return nil, false, nil
  1267. }
  1268. return constraint, true, nil
  1269. }
  1270. // parseOnConflictAction parses an optional constraint clause of the form
  1271. // ON CONFLICT IGNORE|REPLACE|FAIL|ABORT|ROLLBACK. It reports ok=false and leaves
  1272. // the cursor unchanged when no ON CONFLICT follows.
  1273. func (p *Parser) parseOnConflictAction() (ConflictAction, bool, error) {
  1274. if !p.curTokenIs(lexer.TokenON) {
  1275. return ConflictAbort, false, nil
  1276. }
  1277. p.nextToken()
  1278. if !p.curTokenIs(lexer.TokenCONFLICT) {
  1279. return ConflictAbort, false, p.curError("expected CONFLICT after ON")
  1280. }
  1281. p.nextToken()
  1282. switch p.curToken.Type {
  1283. case lexer.TokenREPLACE:
  1284. p.nextToken()
  1285. return ConflictReplace, true, nil
  1286. case lexer.TokenIGNORE:
  1287. p.nextToken()
  1288. return ConflictIgnore, true, nil
  1289. case lexer.TokenFAIL:
  1290. p.nextToken()
  1291. return ConflictFail, true, nil
  1292. case lexer.TokenABORT:
  1293. p.nextToken()
  1294. return ConflictAbort, true, nil
  1295. case lexer.TokenROLLBACK:
  1296. p.nextToken()
  1297. return ConflictRollback, true, nil
  1298. default:
  1299. return ConflictAbort, false, p.curError("expected REPLACE, IGNORE, FAIL, ABORT, or ROLLBACK after ON CONFLICT")
  1300. }
  1301. }
  1302. // consumeReferentialAction consumes one foreign-key referential action
  1303. // (CASCADE, RESTRICT, SET NULL, SET DEFAULT, NO ACTION). It is a no-op for the
  1304. // engine, which does not enforce foreign keys.
  1305. func (p *Parser) consumeReferentialAction() {
  1306. if p.curTokenIs(lexer.TokenSET) {
  1307. p.nextToken() // NULL or DEFAULT
  1308. p.nextToken()
  1309. return
  1310. }
  1311. if p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "NO") {
  1312. p.nextToken()
  1313. if p.curTokenIs(lexer.TokenIdent) {
  1314. p.nextToken() // ACTION
  1315. }
  1316. return
  1317. }
  1318. p.nextToken() // CASCADE, RESTRICT, ...
  1319. }
  1320. func (p *Parser) parseTableConstraint() (*TableConstraint, error) {
  1321. constraint := &TableConstraint{}
  1322. // Check for CONSTRAINT name
  1323. if p.curTokenIs(lexer.TokenCONSTRAINT) {
  1324. p.nextToken()
  1325. if !p.curTokenIs(lexer.TokenIdent) {
  1326. return nil, p.curError("expected constraint name")
  1327. }
  1328. constraint.Name = p.curToken.Literal
  1329. p.nextToken()
  1330. }
  1331. switch p.curToken.Type {
  1332. case lexer.TokenPRIMARY:
  1333. p.nextToken()
  1334. if !p.curTokenIs(lexer.TokenKEY) {
  1335. return nil, p.curError("expected KEY after PRIMARY")
  1336. }
  1337. p.nextToken()
  1338. constraint.Type = ConstraintPrimaryKey
  1339. cols, err := p.parseParenIdentList()
  1340. if err != nil {
  1341. return nil, err
  1342. }
  1343. constraint.Columns = cols
  1344. if action, ok, err := p.parseOnConflictAction(); err != nil {
  1345. return nil, err
  1346. } else if ok {
  1347. constraint.OnConflict = action
  1348. constraint.HasOnConflict = true
  1349. }
  1350. case lexer.TokenUNIQUE:
  1351. p.nextToken()
  1352. constraint.Type = ConstraintUnique
  1353. cols, err := p.parseParenIdentList()
  1354. if err != nil {
  1355. return nil, err
  1356. }
  1357. constraint.Columns = cols
  1358. if action, ok, err := p.parseOnConflictAction(); err != nil {
  1359. return nil, err
  1360. } else if ok {
  1361. constraint.OnConflict = action
  1362. constraint.HasOnConflict = true
  1363. }
  1364. case lexer.TokenFOREIGN:
  1365. p.nextToken()
  1366. if !p.curTokenIs(lexer.TokenKEY) {
  1367. return nil, p.curError("expected KEY after FOREIGN")
  1368. }
  1369. p.nextToken()
  1370. constraint.Type = ConstraintForeignKey
  1371. cols, err := p.parseParenIdentList()
  1372. if err != nil {
  1373. return nil, err
  1374. }
  1375. constraint.Columns = cols
  1376. if !p.curTokenIs(lexer.TokenREFERENCES) {
  1377. return nil, p.curError("expected REFERENCES")
  1378. }
  1379. p.nextToken()
  1380. if !p.curTokenIs(lexer.TokenIdent) {
  1381. return nil, p.curError("expected table name")
  1382. }
  1383. constraint.RefTable = p.curToken.Literal
  1384. p.nextToken()
  1385. refCols, err := p.parseParenIdentList()
  1386. if err != nil {
  1387. return nil, err
  1388. }
  1389. constraint.RefColumns = refCols
  1390. // Consume and ignore referential actions (ON DELETE/UPDATE ...). The
  1391. // engine does not enforce foreign keys, but the clause must parse.
  1392. for p.curTokenIs(lexer.TokenON) {
  1393. p.nextToken()
  1394. if !p.curTokenIs(lexer.TokenDELETE) && !p.curTokenIs(lexer.TokenUPDATE) {
  1395. return nil, p.curError("expected DELETE or UPDATE after ON")
  1396. }
  1397. p.nextToken()
  1398. p.consumeReferentialAction()
  1399. }
  1400. case lexer.TokenCHECK:
  1401. p.nextToken()
  1402. constraint.Type = ConstraintCheck
  1403. if !p.curTokenIs(lexer.TokenLParen) {
  1404. return nil, p.curError("expected (")
  1405. }
  1406. p.nextToken()
  1407. check, err := p.parseExpr()
  1408. if err != nil {
  1409. return nil, err
  1410. }
  1411. constraint.Check = check
  1412. if !p.curTokenIs(lexer.TokenRParen) {
  1413. return nil, p.curError("expected )")
  1414. }
  1415. p.nextToken()
  1416. default:
  1417. return nil, p.curError("expected constraint type")
  1418. }
  1419. return constraint, nil
  1420. }
  1421. func (p *Parser) parseParenIdentList() ([]string, error) {
  1422. if !p.curTokenIs(lexer.TokenLParen) {
  1423. return nil, p.curError("expected (")
  1424. }
  1425. p.nextToken()
  1426. cols, err := p.parseIdentList()
  1427. if err != nil {
  1428. return nil, err
  1429. }
  1430. if !p.curTokenIs(lexer.TokenRParen) {
  1431. return nil, p.curError("expected )")
  1432. }
  1433. p.nextToken()
  1434. return cols, nil
  1435. }
  1436. // parseCreateIndex parses CREATE INDEX statements.
  1437. func (p *Parser) parseCreateIndex(unique bool) (*CreateIndexStmt, error) {
  1438. stmt := &CreateIndexStmt{Unique: unique}
  1439. p.nextToken() // consume INDEX
  1440. // Check for IF NOT EXISTS
  1441. if p.curTokenIs(lexer.TokenIF) {
  1442. p.nextToken()
  1443. if !p.curTokenIs(lexer.TokenNOT) {
  1444. return nil, p.curError("expected NOT")
  1445. }
  1446. p.nextToken()
  1447. if !p.curTokenIs(lexer.TokenEXISTS) {
  1448. return nil, p.curError("expected EXISTS")
  1449. }
  1450. stmt.IfNotExists = true
  1451. p.nextToken()
  1452. }
  1453. // Parse index name
  1454. if !p.curTokenIs(lexer.TokenIdent) {
  1455. return nil, p.curError("expected index name")
  1456. }
  1457. stmt.Name = p.curToken.Literal
  1458. p.nextToken()
  1459. // Expect ON
  1460. if !p.curTokenIs(lexer.TokenON) {
  1461. return nil, p.curError("expected ON")
  1462. }
  1463. p.nextToken()
  1464. // Parse table name
  1465. if !p.curTokenIs(lexer.TokenIdent) {
  1466. return nil, p.curError("expected table name")
  1467. }
  1468. stmt.Table = p.curToken.Literal
  1469. p.nextToken()
  1470. // Expect (
  1471. if !p.curTokenIs(lexer.TokenLParen) {
  1472. return nil, p.curError("expected (")
  1473. }
  1474. p.nextToken()
  1475. // Parse column list. Each element is either a bare column name or an
  1476. // arbitrary deterministic expression (e.g. lower(email)).
  1477. for {
  1478. if p.curTokenIs(lexer.TokenRParen) {
  1479. break
  1480. }
  1481. expr, err := p.parseExpr()
  1482. if err != nil {
  1483. return nil, err
  1484. }
  1485. col := IndexColumn{}
  1486. if ref, ok := expr.(*ColumnRef); ok && ref.Table == "" {
  1487. col.Name = ref.Column
  1488. } else {
  1489. col.Expr = expr
  1490. col.Name = FormatExpr(expr)
  1491. }
  1492. // Check for ASC/DESC
  1493. if p.curTokenIs(lexer.TokenASC) {
  1494. p.nextToken()
  1495. } else if p.curTokenIs(lexer.TokenDESC) {
  1496. col.Desc = true
  1497. p.nextToken()
  1498. }
  1499. stmt.Columns = append(stmt.Columns, col)
  1500. if p.curTokenIs(lexer.TokenComma) {
  1501. p.nextToken()
  1502. } else {
  1503. break
  1504. }
  1505. }
  1506. if !p.curTokenIs(lexer.TokenRParen) {
  1507. return nil, p.curError("expected )")
  1508. }
  1509. p.nextToken()
  1510. return stmt, nil
  1511. }
  1512. // parseDrop parses DROP statements.
  1513. func (p *Parser) parseDrop() (Statement, error) {
  1514. p.nextToken() // consume DROP
  1515. switch p.curToken.Type {
  1516. case lexer.TokenTABLE:
  1517. return p.parseDropTable()
  1518. case lexer.TokenINDEX:
  1519. return p.parseDropIndex()
  1520. case lexer.TokenVIEW:
  1521. return p.parseDropView()
  1522. default:
  1523. return nil, p.curError("expected TABLE or INDEX after DROP")
  1524. }
  1525. }
  1526. func (p *Parser) parseDropTable() (*DropTableStmt, error) {
  1527. stmt := &DropTableStmt{}
  1528. p.nextToken() // consume TABLE
  1529. // Check for IF EXISTS
  1530. if p.curTokenIs(lexer.TokenIF) {
  1531. p.nextToken()
  1532. if !p.curTokenIs(lexer.TokenEXISTS) {
  1533. return nil, p.curError("expected EXISTS")
  1534. }
  1535. stmt.IfExists = true
  1536. p.nextToken()
  1537. }
  1538. // Parse table names
  1539. for {
  1540. table, err := p.parseTableRef()
  1541. if err != nil {
  1542. return nil, err
  1543. }
  1544. stmt.Tables = append(stmt.Tables, table)
  1545. if !p.curTokenIs(lexer.TokenComma) {
  1546. break
  1547. }
  1548. p.nextToken()
  1549. }
  1550. return stmt, nil
  1551. }
  1552. func (p *Parser) parseDropIndex() (*DropIndexStmt, error) {
  1553. stmt := &DropIndexStmt{}
  1554. p.nextToken() // consume INDEX
  1555. // Check for IF EXISTS
  1556. if p.curTokenIs(lexer.TokenIF) {
  1557. p.nextToken()
  1558. if !p.curTokenIs(lexer.TokenEXISTS) {
  1559. return nil, p.curError("expected EXISTS")
  1560. }
  1561. stmt.IfExists = true
  1562. p.nextToken()
  1563. }
  1564. // Parse index name
  1565. if !p.curTokenIs(lexer.TokenIdent) {
  1566. return nil, p.curError("expected index name")
  1567. }
  1568. stmt.Name = p.curToken.Literal
  1569. p.nextToken()
  1570. return stmt, nil
  1571. }
  1572. func (p *Parser) parseCreateView() (*CreateViewStmt, error) {
  1573. stmt := &CreateViewStmt{}
  1574. p.nextToken() // consume VIEW
  1575. if p.curTokenIs(lexer.TokenIF) {
  1576. p.nextToken()
  1577. if !p.curTokenIs(lexer.TokenNOT) {
  1578. return nil, p.curError("expected NOT")
  1579. }
  1580. p.nextToken()
  1581. if !p.curTokenIs(lexer.TokenEXISTS) {
  1582. return nil, p.curError("expected EXISTS")
  1583. }
  1584. stmt.IfNotExists = true
  1585. p.nextToken()
  1586. }
  1587. // Parse view name directly — do NOT use parseTableRef here because it
  1588. // greedily interprets the AS keyword as an alias, consuming "AS SELECT".
  1589. if !p.curTokenIs(lexer.TokenIdent) {
  1590. return nil, p.curError("expected view name")
  1591. }
  1592. stmt.View = &TableRef{Name: p.curToken.Literal}
  1593. p.nextToken()
  1594. if !p.curTokenIs(lexer.TokenAS) {
  1595. return nil, p.curError("expected AS after view name")
  1596. }
  1597. p.nextToken() // consume AS
  1598. sel, err := p.parseSelect()
  1599. if err != nil {
  1600. return nil, err
  1601. }
  1602. stmt.Select = sel
  1603. return stmt, nil
  1604. }
  1605. func (p *Parser) parseDropView() (*DropViewStmt, error) {
  1606. stmt := &DropViewStmt{}
  1607. p.nextToken() // consume VIEW
  1608. if p.curTokenIs(lexer.TokenIF) {
  1609. p.nextToken()
  1610. if !p.curTokenIs(lexer.TokenEXISTS) {
  1611. return nil, p.curError("expected EXISTS")
  1612. }
  1613. stmt.IfExists = true
  1614. p.nextToken()
  1615. }
  1616. for {
  1617. view, err := p.parseTableRef()
  1618. if err != nil {
  1619. return nil, err
  1620. }
  1621. stmt.Views = append(stmt.Views, view)
  1622. if !p.curTokenIs(lexer.TokenComma) {
  1623. break
  1624. }
  1625. p.nextToken()
  1626. }
  1627. return stmt, nil
  1628. }
  1629. // parseAlter parses an ALTER statement.
  1630. func (p *Parser) parseAlter() (Statement, error) {
  1631. p.nextToken() // consume ALTER
  1632. if p.curTokenIs(lexer.TokenTABLE) {
  1633. return p.parseAlterTable()
  1634. }
  1635. return nil, p.curError("expected TABLE after ALTER")
  1636. }
  1637. // parseAlterTable parses an ALTER TABLE statement.
  1638. func (p *Parser) parseAlterTable() (*AlterTableStmt, error) {
  1639. stmt := &AlterTableStmt{}
  1640. p.nextToken() // consume TABLE
  1641. // Parse table name
  1642. if !p.curTokenIs(lexer.TokenIdent) {
  1643. return nil, p.curError("expected table name")
  1644. }
  1645. stmt.Table = p.curToken.Literal
  1646. p.nextToken()
  1647. // Parse action
  1648. switch p.curToken.Type {
  1649. case lexer.TokenADD:
  1650. return p.parseAlterTableAdd(stmt)
  1651. case lexer.TokenDROP:
  1652. return p.parseAlterTableDrop(stmt)
  1653. case lexer.TokenRENAME:
  1654. return p.parseAlterTableRename(stmt)
  1655. default:
  1656. return nil, p.curError("expected ADD, DROP, or RENAME")
  1657. }
  1658. }
  1659. // parseAlterTableAdd parses ALTER TABLE ADD COLUMN.
  1660. func (p *Parser) parseAlterTableAdd(stmt *AlterTableStmt) (*AlterTableStmt, error) {
  1661. p.nextToken() // consume ADD
  1662. // COLUMN keyword is optional
  1663. if p.curTokenIs(lexer.TokenCOLUMN) {
  1664. p.nextToken()
  1665. }
  1666. ifNotExists := false
  1667. if p.curTokenIs(lexer.TokenIF) {
  1668. ifNotExists = true
  1669. p.nextToken()
  1670. if !p.curTokenIs(lexer.TokenNOT) {
  1671. return nil, p.curError("expected NOT after IF")
  1672. }
  1673. p.nextToken()
  1674. if !p.curTokenIs(lexer.TokenEXISTS) {
  1675. return nil, p.curError("expected EXISTS after IF NOT")
  1676. }
  1677. p.nextToken()
  1678. }
  1679. // Parse column definition
  1680. col, err := p.parseColumnDef()
  1681. if err != nil {
  1682. return nil, err
  1683. }
  1684. stmt.Action = &AddColumnAction{Column: col, IfNotExists: ifNotExists}
  1685. return stmt, nil
  1686. }
  1687. // parseAlterTableDrop parses ALTER TABLE DROP COLUMN.
  1688. func (p *Parser) parseAlterTableDrop(stmt *AlterTableStmt) (*AlterTableStmt, error) {
  1689. p.nextToken() // consume DROP
  1690. // COLUMN keyword is optional in some databases but required in SQLite
  1691. if p.curTokenIs(lexer.TokenCOLUMN) {
  1692. p.nextToken()
  1693. }
  1694. // Parse column name
  1695. if !p.curIsName() {
  1696. return nil, p.curError("expected column name")
  1697. }
  1698. stmt.Action = &DropColumnAction{Column: p.curToken.Literal}
  1699. p.nextToken()
  1700. return stmt, nil
  1701. }
  1702. // parseAlterTableRename parses ALTER TABLE RENAME.
  1703. func (p *Parser) parseAlterTableRename(stmt *AlterTableStmt) (*AlterTableStmt, error) {
  1704. p.nextToken() // consume RENAME
  1705. // Check for RENAME TO (table rename) or RENAME COLUMN (column rename)
  1706. if p.curTokenIs(lexer.TokenTO) {
  1707. // RENAME TO newname
  1708. p.nextToken()
  1709. if !p.curTokenIs(lexer.TokenIdent) {
  1710. return nil, p.curError("expected new table name")
  1711. }
  1712. stmt.Action = &RenameTableAction{NewName: p.curToken.Literal}
  1713. p.nextToken()
  1714. } else if p.curTokenIs(lexer.TokenCOLUMN) {
  1715. // RENAME COLUMN oldname TO newname
  1716. p.nextToken()
  1717. if !p.curTokenIs(lexer.TokenIdent) {
  1718. return nil, p.curError("expected old column name")
  1719. }
  1720. oldName := p.curToken.Literal
  1721. p.nextToken()
  1722. if !p.curTokenIs(lexer.TokenTO) {
  1723. return nil, p.curError("expected TO")
  1724. }
  1725. p.nextToken()
  1726. if !p.curTokenIs(lexer.TokenIdent) {
  1727. return nil, p.curError("expected new column name")
  1728. }
  1729. newName := p.curToken.Literal
  1730. p.nextToken()
  1731. stmt.Action = &RenameColumnAction{OldName: oldName, NewName: newName}
  1732. } else {
  1733. return nil, p.curError("expected TO or COLUMN after RENAME")
  1734. }
  1735. return stmt, nil
  1736. }
  1737. // parsePragma parses a PRAGMA statement.
  1738. // Formats: PRAGMA name; PRAGMA name(arg); PRAGMA name = value;
  1739. func (p *Parser) parsePragma() (*PragmaStmt, error) {
  1740. stmt := &PragmaStmt{}
  1741. p.nextToken() // consume PRAGMA
  1742. // Parse pragma name
  1743. if !p.curTokenIs(lexer.TokenIdent) {
  1744. return nil, p.curError("expected pragma name")
  1745. }
  1746. stmt.Name = strings.ToLower(p.curToken.Literal)
  1747. p.nextToken()
  1748. // Check for argument in parentheses: PRAGMA table_info(tablename)
  1749. if p.curTokenIs(lexer.TokenLParen) {
  1750. p.nextToken()
  1751. if p.curTokenIs(lexer.TokenIdent) || p.curTokenIs(lexer.TokenString) {
  1752. stmt.Arg = p.curToken.Literal
  1753. p.nextToken()
  1754. }
  1755. if !p.curTokenIs(lexer.TokenRParen) {
  1756. return nil, p.curError("expected )")
  1757. }
  1758. p.nextToken()
  1759. }
  1760. // Check for value assignment: PRAGMA name = value
  1761. if p.curTokenIs(lexer.TokenEq) {
  1762. p.nextToken()
  1763. val, err := p.parseExpr()
  1764. if err != nil {
  1765. return nil, err
  1766. }
  1767. stmt.Value = val
  1768. }
  1769. return stmt, nil
  1770. }
  1771. // parseAnalyze parses ANALYZE [schema.]table. PizzaSQL does not maintain
  1772. // optimizer statistics, so the statement is accepted and ignored at execution.
  1773. func (p *Parser) parseAnalyze() (*AnalyzeStmt, error) {
  1774. stmt := &AnalyzeStmt{}
  1775. p.nextToken() // consume ANALYZE
  1776. if p.curTokenIs(lexer.TokenIdent) {
  1777. stmt.Name = p.curToken.Literal
  1778. p.nextToken()
  1779. if p.curTokenIs(lexer.TokenDot) {
  1780. p.nextToken()
  1781. if !p.curTokenIs(lexer.TokenIdent) {
  1782. return nil, p.curError("expected table name after .")
  1783. }
  1784. stmt.Name = p.curToken.Literal
  1785. p.nextToken()
  1786. }
  1787. }
  1788. return stmt, nil
  1789. }
  1790. // parseExplain parses an EXPLAIN statement.
  1791. func (p *Parser) parseExplain() (*ExplainStmt, error) {
  1792. stmt := &ExplainStmt{}
  1793. p.nextToken() // consume EXPLAIN
  1794. // Check for QUERY PLAN. PLAN is not a reserved lexer keyword so it can be a
  1795. // column name; recognize it contextually here.
  1796. if p.curTokenIs(lexer.TokenQUERY) {
  1797. p.nextToken()
  1798. if !p.curIdentIs("PLAN") {
  1799. return nil, p.curError("expected PLAN after QUERY")
  1800. }
  1801. stmt.QueryPlan = true
  1802. p.nextToken()
  1803. }
  1804. // Parse the statement being explained
  1805. innerStmt, err := p.parseStatement()
  1806. if err != nil {
  1807. return nil, err
  1808. }
  1809. stmt.Statement = innerStmt
  1810. return stmt, nil
  1811. }
  1812. // Transaction statement parsing
  1813. func (p *Parser) parseBegin() (*BeginStmt, error) {
  1814. stmt := &BeginStmt{}
  1815. p.nextToken() // consume BEGIN
  1816. // Optional TRANSACTION keyword
  1817. if p.curTokenIs(lexer.TokenTRANSACTION) {
  1818. p.nextToken()
  1819. }
  1820. return stmt, nil
  1821. }
  1822. func (p *Parser) parseCommit() (*CommitStmt, error) {
  1823. p.nextToken() // consume COMMIT
  1824. // Optional TRANSACTION keyword
  1825. if p.curTokenIs(lexer.TokenTRANSACTION) {
  1826. p.nextToken()
  1827. }
  1828. return &CommitStmt{}, nil
  1829. }
  1830. func (p *Parser) parseRollback() (*RollbackStmt, error) {
  1831. stmt := &RollbackStmt{}
  1832. p.nextToken() // consume ROLLBACK
  1833. // Check for ROLLBACK TO [SAVEPOINT] name
  1834. if p.curTokenIs(lexer.TokenTO) {
  1835. p.nextToken()
  1836. // Optional SAVEPOINT keyword
  1837. if p.curTokenIs(lexer.TokenSAVEPOINT) {
  1838. p.nextToken()
  1839. }
  1840. if !p.curTokenIs(lexer.TokenIdent) {
  1841. return nil, p.curError("expected savepoint name")
  1842. }
  1843. stmt.Savepoint = p.curToken.Literal
  1844. p.nextToken()
  1845. } else if p.curTokenIs(lexer.TokenTRANSACTION) {
  1846. // Optional TRANSACTION keyword
  1847. p.nextToken()
  1848. }
  1849. return stmt, nil
  1850. }
  1851. func (p *Parser) parseSavepoint() (*SavepointStmt, error) {
  1852. p.nextToken() // consume SAVEPOINT
  1853. if !p.curTokenIs(lexer.TokenIdent) {
  1854. return nil, p.curError("expected savepoint name")
  1855. }
  1856. stmt := &SavepointStmt{Name: p.curToken.Literal}
  1857. p.nextToken()
  1858. return stmt, nil
  1859. }
  1860. func (p *Parser) parseRelease() (*ReleaseStmt, error) {
  1861. p.nextToken() // consume RELEASE
  1862. // Optional SAVEPOINT keyword
  1863. if p.curTokenIs(lexer.TokenSAVEPOINT) {
  1864. p.nextToken()
  1865. }
  1866. if !p.curTokenIs(lexer.TokenIdent) {
  1867. return nil, p.curError("expected savepoint name")
  1868. }
  1869. stmt := &ReleaseStmt{Name: p.curToken.Literal}
  1870. p.nextToken()
  1871. return stmt, nil
  1872. }
  1873. // parseAttach parses an ATTACH DATABASE statement.
  1874. // Syntax: ATTACH [DATABASE] 'filepath' AS alias
  1875. func (p *Parser) parseAttach() (*AttachStmt, error) {
  1876. stmt := &AttachStmt{}
  1877. p.nextToken() // consume ATTACH
  1878. // Optional DATABASE keyword
  1879. if p.curTokenIs(lexer.TokenDATABASE) {
  1880. p.nextToken()
  1881. }
  1882. // Parse file path (string literal)
  1883. if !p.curTokenIs(lexer.TokenString) {
  1884. return nil, p.curError("expected database file path (string)")
  1885. }
  1886. stmt.FilePath = p.curToken.Literal
  1887. p.nextToken()
  1888. // Expect AS keyword
  1889. if !p.curTokenIs(lexer.TokenAS) {
  1890. return nil, p.curError("expected AS")
  1891. }
  1892. p.nextToken()
  1893. // Parse database alias
  1894. if !p.curTokenIs(lexer.TokenIdent) {
  1895. return nil, p.curError("expected database alias")
  1896. }
  1897. stmt.Alias = p.curToken.Literal
  1898. p.nextToken()
  1899. return stmt, nil
  1900. }
  1901. // parseDetach parses a DETACH DATABASE statement.
  1902. // Syntax: DETACH [DATABASE] alias
  1903. func (p *Parser) parseDetach() (*DetachStmt, error) {
  1904. stmt := &DetachStmt{}
  1905. p.nextToken() // consume DETACH
  1906. // Optional DATABASE keyword
  1907. if p.curTokenIs(lexer.TokenDATABASE) {
  1908. p.nextToken()
  1909. }
  1910. // Parse database alias
  1911. if !p.curTokenIs(lexer.TokenIdent) {
  1912. return nil, p.curError("expected database alias")
  1913. }
  1914. stmt.Alias = p.curToken.Literal
  1915. p.nextToken()
  1916. return stmt, nil
  1917. }
  1918. // Expression parsing with operator precedence
  1919. func (p *Parser) parseExpr() (Expr, error) {
  1920. return p.parseOrExpr()
  1921. }
  1922. func (p *Parser) parseOrExpr() (Expr, error) {
  1923. left, err := p.parseAndExpr()
  1924. if err != nil {
  1925. return nil, err
  1926. }
  1927. for p.curTokenIs(lexer.TokenOR) {
  1928. op := p.curToken.Type
  1929. p.nextToken()
  1930. right, err := p.parseAndExpr()
  1931. if err != nil {
  1932. return nil, err
  1933. }
  1934. left = &BinaryExpr{Left: left, Op: op, Right: right}
  1935. }
  1936. return left, nil
  1937. }
  1938. func (p *Parser) parseAndExpr() (Expr, error) {
  1939. left, err := p.parseNotExpr()
  1940. if err != nil {
  1941. return nil, err
  1942. }
  1943. for p.curTokenIs(lexer.TokenAND) {
  1944. op := p.curToken.Type
  1945. p.nextToken()
  1946. right, err := p.parseNotExpr()
  1947. if err != nil {
  1948. return nil, err
  1949. }
  1950. left = &BinaryExpr{Left: left, Op: op, Right: right}
  1951. }
  1952. return left, nil
  1953. }
  1954. func (p *Parser) parseNotExpr() (Expr, error) {
  1955. if p.curTokenIs(lexer.TokenNOT) {
  1956. p.nextToken()
  1957. operand, err := p.parseNotExpr()
  1958. if err != nil {
  1959. return nil, err
  1960. }
  1961. return &UnaryExpr{Op: lexer.TokenNOT, Operand: operand}, nil
  1962. }
  1963. return p.parseComparisonExpr()
  1964. }
  1965. func (p *Parser) parseComparisonExpr() (Expr, error) {
  1966. left, err := p.parseBitwiseExpr()
  1967. if err != nil {
  1968. return nil, err
  1969. }
  1970. // Handle IS NULL / IS NOT NULL and IS [NOT] DISTINCT FROM.
  1971. if p.curTokenIs(lexer.TokenIS) {
  1972. p.nextToken()
  1973. not := false
  1974. if p.curTokenIs(lexer.TokenNOT) {
  1975. not = true
  1976. p.nextToken()
  1977. }
  1978. if p.curTokenIs(lexer.TokenDISTINCT) {
  1979. p.nextToken()
  1980. if !p.curTokenIs(lexer.TokenFROM) {
  1981. return nil, p.curError("expected FROM after IS [NOT] DISTINCT")
  1982. }
  1983. p.nextToken()
  1984. right, err := p.parseBitwiseExpr()
  1985. if err != nil {
  1986. return nil, err
  1987. }
  1988. return &IsDistinctExpr{Left: left, Right: right, Not: not}, nil
  1989. }
  1990. if !p.curTokenIs(lexer.TokenNULL) {
  1991. return nil, p.curError("expected NULL or DISTINCT FROM after IS")
  1992. }
  1993. p.nextToken()
  1994. return &IsNullExpr{Left: left, Not: not}, nil
  1995. }
  1996. // Handle IN / NOT IN
  1997. not := false
  1998. if p.curTokenIs(lexer.TokenNOT) {
  1999. not = true
  2000. p.nextToken()
  2001. }
  2002. if p.curTokenIs(lexer.TokenIN) {
  2003. p.nextToken()
  2004. return p.parseInExpr(left, not)
  2005. }
  2006. // Handle BETWEEN
  2007. if p.curTokenIs(lexer.TokenBETWEEN) {
  2008. p.nextToken()
  2009. return p.parseBetweenExpr(left, not)
  2010. }
  2011. // Handle LIKE
  2012. if p.curTokenIs(lexer.TokenLIKE) {
  2013. p.nextToken()
  2014. return p.parseLikeExpr(left, not)
  2015. }
  2016. // If we consumed NOT but didn't find IN/BETWEEN/LIKE, it's an error
  2017. if not {
  2018. return nil, p.curError("expected IN, BETWEEN, or LIKE after NOT")
  2019. }
  2020. // Handle comparison operators
  2021. if isComparisonOp(p.curToken.Type) {
  2022. op := p.curToken.Type
  2023. p.nextToken()
  2024. right, err := p.parseBitwiseExpr()
  2025. if err != nil {
  2026. return nil, err
  2027. }
  2028. return &BinaryExpr{Left: left, Op: op, Right: right}, nil
  2029. }
  2030. return left, nil
  2031. }
  2032. func isComparisonOp(t lexer.TokenType) bool {
  2033. switch t {
  2034. case lexer.TokenEq, lexer.TokenNeq, lexer.TokenLt,
  2035. lexer.TokenLte, lexer.TokenGt, lexer.TokenGte:
  2036. return true
  2037. }
  2038. return false
  2039. }
  2040. // parseBitwiseExpr parses the SQLite bitwise layer: << >> & | bind more tightly
  2041. // than comparisons but more loosely than + and -.
  2042. func (p *Parser) parseBitwiseExpr() (Expr, error) {
  2043. left, err := p.parseAddExpr()
  2044. if err != nil {
  2045. return nil, err
  2046. }
  2047. for {
  2048. switch p.curToken.Type {
  2049. case lexer.TokenShiftLeft, lexer.TokenShiftRight, lexer.TokenBitAnd, lexer.TokenBitOr:
  2050. op := p.curToken.Type
  2051. p.nextToken()
  2052. right, err := p.parseAddExpr()
  2053. if err != nil {
  2054. return nil, err
  2055. }
  2056. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2057. default:
  2058. return left, nil
  2059. }
  2060. }
  2061. }
  2062. func (p *Parser) parseInExpr(left Expr, not bool) (Expr, error) {
  2063. expr := &InExpr{Left: left, Not: not}
  2064. if !p.curTokenIs(lexer.TokenLParen) {
  2065. return nil, p.curError("expected (")
  2066. }
  2067. p.nextToken()
  2068. // Check for subquery
  2069. if p.curTokenIs(lexer.TokenSELECT) {
  2070. sel, err := p.parseSelect()
  2071. if err != nil {
  2072. return nil, err
  2073. }
  2074. expr.Subquery = sel
  2075. } else if !p.curTokenIs(lexer.TokenRParen) {
  2076. // Value list (empty list is allowed — always false)
  2077. values, err := p.parseExprList()
  2078. if err != nil {
  2079. return nil, err
  2080. }
  2081. expr.Values = values
  2082. }
  2083. if !p.curTokenIs(lexer.TokenRParen) {
  2084. return nil, p.curError("expected )")
  2085. }
  2086. p.nextToken()
  2087. return expr, nil
  2088. }
  2089. func (p *Parser) parseBetweenExpr(left Expr, not bool) (Expr, error) {
  2090. low, err := p.parseBitwiseExpr()
  2091. if err != nil {
  2092. return nil, err
  2093. }
  2094. if !p.curTokenIs(lexer.TokenAND) {
  2095. return nil, p.curError("expected AND in BETWEEN")
  2096. }
  2097. p.nextToken()
  2098. high, err := p.parseBitwiseExpr()
  2099. if err != nil {
  2100. return nil, err
  2101. }
  2102. return &BetweenExpr{Left: left, Not: not, Low: low, High: high}, nil
  2103. }
  2104. func (p *Parser) parseLikeExpr(left Expr, not bool) (Expr, error) {
  2105. pattern, err := p.parseBitwiseExpr()
  2106. if err != nil {
  2107. return nil, err
  2108. }
  2109. expr := &LikeExpr{Left: left, Not: not, Pattern: pattern}
  2110. // Check for ESCAPE
  2111. if p.curTokenIs(lexer.TokenESCAPE) {
  2112. p.nextToken()
  2113. esc, err := p.parseBitwiseExpr()
  2114. if err != nil {
  2115. return nil, err
  2116. }
  2117. expr.Escape = esc
  2118. }
  2119. return expr, nil
  2120. }
  2121. func (p *Parser) parseAddExpr() (Expr, error) {
  2122. left, err := p.parseMulExpr()
  2123. if err != nil {
  2124. return nil, err
  2125. }
  2126. for p.curTokenIs(lexer.TokenPlus) || p.curTokenIs(lexer.TokenMinus) || p.curTokenIs(lexer.TokenConcat) {
  2127. op := p.curToken.Type
  2128. p.nextToken()
  2129. right, err := p.parseMulExpr()
  2130. if err != nil {
  2131. return nil, err
  2132. }
  2133. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2134. }
  2135. return left, nil
  2136. }
  2137. func (p *Parser) parseMulExpr() (Expr, error) {
  2138. left, err := p.parseUnaryExpr()
  2139. if err != nil {
  2140. return nil, err
  2141. }
  2142. for p.curTokenIs(lexer.TokenStar) || p.curTokenIs(lexer.TokenSlash) || p.curTokenIs(lexer.TokenPercent) {
  2143. op := p.curToken.Type
  2144. p.nextToken()
  2145. right, err := p.parseUnaryExpr()
  2146. if err != nil {
  2147. return nil, err
  2148. }
  2149. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2150. }
  2151. return left, nil
  2152. }
  2153. func (p *Parser) parseUnaryExpr() (Expr, error) {
  2154. if p.curTokenIs(lexer.TokenMinus) || p.curTokenIs(lexer.TokenPlus) || p.curTokenIs(lexer.TokenBitNot) {
  2155. op := p.curToken.Type
  2156. p.nextToken()
  2157. operand, err := p.parseUnaryExpr()
  2158. if err != nil {
  2159. return nil, err
  2160. }
  2161. return &UnaryExpr{Op: op, Operand: operand}, nil
  2162. }
  2163. return p.parsePrimaryExpr()
  2164. }
  2165. func (p *Parser) parsePrimaryExpr() (Expr, error) {
  2166. switch p.curToken.Type {
  2167. case lexer.TokenALL:
  2168. if p.peekTokenIs(lexer.TokenLParen) {
  2169. return nil, pgerror.Unsupported("array parameters and ANY/ALL predicates are not supported (PizzaSQL has no array type); expand the list into IN (...) with individual parameters")
  2170. }
  2171. return nil, p.curError("unexpected token in expression: " + p.curToken.Type.String())
  2172. case lexer.TokenNumber:
  2173. expr := &LiteralExpr{Type: lexer.TokenNumber, Value: p.curToken.Literal}
  2174. p.nextToken()
  2175. return expr, nil
  2176. case lexer.TokenString:
  2177. expr := &LiteralExpr{Type: lexer.TokenString, Value: p.curToken.Literal}
  2178. p.nextToken()
  2179. return expr, nil
  2180. case lexer.TokenBlob:
  2181. expr := &LiteralExpr{Type: lexer.TokenBlob, Value: p.curToken.Literal}
  2182. p.nextToken()
  2183. return expr, nil
  2184. case lexer.TokenNULL:
  2185. expr := &LiteralExpr{Type: lexer.TokenNULL, Value: "NULL"}
  2186. p.nextToken()
  2187. return expr, nil
  2188. case lexer.TokenTRUE:
  2189. expr := &LiteralExpr{Type: lexer.TokenTRUE, Value: "TRUE"}
  2190. p.nextToken()
  2191. return expr, nil
  2192. case lexer.TokenFALSE:
  2193. expr := &LiteralExpr{Type: lexer.TokenFALSE, Value: "FALSE"}
  2194. p.nextToken()
  2195. return expr, nil
  2196. case lexer.TokenLParen:
  2197. p.nextToken()
  2198. // Check for subquery
  2199. if p.curTokenIs(lexer.TokenSELECT) {
  2200. sel, err := p.parseSelect()
  2201. if err != nil {
  2202. return nil, err
  2203. }
  2204. if !p.curTokenIs(lexer.TokenRParen) {
  2205. return nil, p.curError("expected )")
  2206. }
  2207. p.nextToken()
  2208. return &SubqueryExpr{Query: sel}, nil
  2209. }
  2210. // Regular parenthesized expression
  2211. expr, err := p.parseExpr()
  2212. if err != nil {
  2213. return nil, err
  2214. }
  2215. if !p.curTokenIs(lexer.TokenRParen) {
  2216. return nil, p.curError("expected )")
  2217. }
  2218. p.nextToken()
  2219. return &ParenExpr{Expr: expr}, nil
  2220. case lexer.TokenCASE:
  2221. return p.parseCaseExpr()
  2222. case lexer.TokenCAST:
  2223. return p.parseCastExpr()
  2224. case lexer.TokenEXISTS:
  2225. return p.parseExistsExpr()
  2226. case lexer.TokenCOALESCE, lexer.TokenNULLIF, lexer.TokenIF, lexer.TokenREPLACE, lexer.TokenGLOB:
  2227. // These keywords can be used as function names
  2228. return p.parseKeywordFunction()
  2229. case lexer.TokenJSON, lexer.TokenJSONB:
  2230. // json(expr) / jsonb(expr) are JSON1 constructor functions. They lex as
  2231. // data-type keywords but are also callable.
  2232. return p.parseIdentOrFunction()
  2233. case lexer.TokenDATE, lexer.TokenTIME, lexer.TokenTIMESTAMP, lexer.TokenDATETIME:
  2234. // Date/time functions (date(), time(), datetime(), ...) lex as data-type
  2235. // keywords but are callable.
  2236. return p.parseIdentOrFunction()
  2237. case lexer.TokenKEY:
  2238. // KEY is a lexer keyword (PRIMARY KEY) that SQLite also permits as a
  2239. // column name, e.g. store.key.
  2240. return p.parseIdentOrFunction()
  2241. case lexer.TokenIdent:
  2242. return p.parseIdentOrFunction()
  2243. case lexer.TokenStar:
  2244. // For COUNT(*)
  2245. expr := &LiteralExpr{Type: lexer.TokenStar, Value: "*"}
  2246. p.nextToken()
  2247. return expr, nil
  2248. default:
  2249. return nil, p.curError("unexpected token in expression: " + p.curToken.Type.String())
  2250. }
  2251. }
  2252. func (p *Parser) parseIdentOrFunction() (Expr, error) {
  2253. name := p.curToken.Literal
  2254. p.nextToken()
  2255. // Check for function call
  2256. if p.curTokenIs(lexer.TokenLParen) {
  2257. if strings.EqualFold(name, "ANY") {
  2258. return nil, pgerror.Unsupported("array parameters and ANY/ALL predicates are not supported (PizzaSQL has no array type); expand the list into IN (...) with individual parameters")
  2259. }
  2260. return p.parseFunctionCall(name)
  2261. }
  2262. // Check for table.column
  2263. if p.curTokenIs(lexer.TokenDot) {
  2264. p.nextToken()
  2265. if !p.curTokenIs(lexer.TokenIdent) && !p.curTokenIs(lexer.TokenStar) {
  2266. return nil, p.curError("expected column name after dot")
  2267. }
  2268. col := p.curToken.Literal
  2269. p.nextToken()
  2270. return &ColumnRef{Table: name, Column: col}, nil
  2271. }
  2272. return &ColumnRef{Column: name}, nil
  2273. }
  2274. func (p *Parser) parseKeywordFunction() (Expr, error) {
  2275. // Handle keywords that can be used as function names (COALESCE, NULLIF, IF, REPLACE, GLOB)
  2276. name := strings.ToUpper(p.curToken.Literal)
  2277. p.nextToken()
  2278. if !p.curTokenIs(lexer.TokenLParen) {
  2279. return nil, p.curError("expected ( after " + name)
  2280. }
  2281. return p.parseFunctionCall(name)
  2282. }
  2283. func (p *Parser) parseFunctionCall(name string) (Expr, error) {
  2284. fn := &FunctionCall{Name: strings.ToUpper(name)}
  2285. p.nextToken() // consume (
  2286. // Check for DISTINCT or ALL
  2287. if p.curTokenIs(lexer.TokenDISTINCT) {
  2288. fn.Distinct = true
  2289. p.nextToken()
  2290. } else if p.curTokenIs(lexer.TokenALL) {
  2291. // ALL is the default behavior, just skip it
  2292. p.nextToken()
  2293. }
  2294. // Check for * (COUNT(*))
  2295. if p.curTokenIs(lexer.TokenStar) {
  2296. fn.Star = true
  2297. p.nextToken()
  2298. } else if !p.curTokenIs(lexer.TokenRParen) {
  2299. // Parse arguments
  2300. args, err := p.parseExprList()
  2301. if err != nil {
  2302. return nil, err
  2303. }
  2304. fn.Args = args
  2305. }
  2306. if !p.curTokenIs(lexer.TokenRParen) {
  2307. return nil, p.curError("expected )")
  2308. }
  2309. p.nextToken()
  2310. // Window function: func(...) OVER (PARTITION BY ... ORDER BY ...).
  2311. if p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "OVER") {
  2312. return p.parseWindowSpec(fn)
  2313. }
  2314. return fn, nil
  2315. }
  2316. // parseWindowSpec parses the OVER (...) clause of a window function. Only
  2317. // PARTITION BY and ORDER BY are supported; frame clauses are not.
  2318. func (p *Parser) parseWindowSpec(fn *FunctionCall) (Expr, error) {
  2319. p.nextToken() // consume OVER
  2320. if !p.curTokenIs(lexer.TokenLParen) {
  2321. return nil, p.curError("expected ( after OVER")
  2322. }
  2323. p.nextToken()
  2324. window := &WindowExpr{Func: fn}
  2325. if p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "PARTITION") {
  2326. p.nextToken()
  2327. if !p.curTokenIs(lexer.TokenBY) {
  2328. return nil, p.curError("expected BY after PARTITION")
  2329. }
  2330. p.nextToken()
  2331. exprs, err := p.parseExprList()
  2332. if err != nil {
  2333. return nil, err
  2334. }
  2335. window.PartitionBy = exprs
  2336. }
  2337. if p.curTokenIs(lexer.TokenORDER) {
  2338. p.nextToken()
  2339. if !p.curTokenIs(lexer.TokenBY) {
  2340. return nil, p.curError("expected BY after ORDER")
  2341. }
  2342. p.nextToken()
  2343. orderBy, err := p.parseOrderBy()
  2344. if err != nil {
  2345. return nil, err
  2346. }
  2347. window.OrderBy = orderBy
  2348. }
  2349. if !p.curTokenIs(lexer.TokenRParen) {
  2350. return nil, p.curError("expected ) after window specification")
  2351. }
  2352. p.nextToken()
  2353. return window, nil
  2354. }
  2355. func (p *Parser) parseCaseExpr() (Expr, error) {
  2356. expr := &CaseExpr{}
  2357. p.nextToken() // consume CASE
  2358. // Check for simple CASE (CASE operand WHEN ...)
  2359. if !p.curTokenIs(lexer.TokenWHEN) {
  2360. operand, err := p.parseExpr()
  2361. if err != nil {
  2362. return nil, err
  2363. }
  2364. expr.Operand = operand
  2365. }
  2366. // Parse WHEN clauses
  2367. for p.curTokenIs(lexer.TokenWHEN) {
  2368. p.nextToken()
  2369. cond, err := p.parseExpr()
  2370. if err != nil {
  2371. return nil, err
  2372. }
  2373. if !p.curTokenIs(lexer.TokenTHEN) {
  2374. return nil, p.curError("expected THEN")
  2375. }
  2376. p.nextToken()
  2377. result, err := p.parseExpr()
  2378. if err != nil {
  2379. return nil, err
  2380. }
  2381. expr.Whens = append(expr.Whens, WhenClause{Condition: cond, Result: result})
  2382. }
  2383. // Parse optional ELSE
  2384. if p.curTokenIs(lexer.TokenELSE) {
  2385. p.nextToken()
  2386. elseExpr, err := p.parseExpr()
  2387. if err != nil {
  2388. return nil, err
  2389. }
  2390. expr.Else = elseExpr
  2391. }
  2392. // Expect END
  2393. if !p.curTokenIs(lexer.TokenEND) {
  2394. return nil, p.curError("expected END")
  2395. }
  2396. p.nextToken()
  2397. return expr, nil
  2398. }
  2399. func (p *Parser) parseCastExpr() (Expr, error) {
  2400. p.nextToken() // consume CAST
  2401. if !p.curTokenIs(lexer.TokenLParen) {
  2402. return nil, p.curError("expected (")
  2403. }
  2404. p.nextToken()
  2405. expr, err := p.parseExpr()
  2406. if err != nil {
  2407. return nil, err
  2408. }
  2409. if !p.curTokenIs(lexer.TokenAS) {
  2410. return nil, p.curError("expected AS")
  2411. }
  2412. p.nextToken()
  2413. dataType, err := p.parseDataType()
  2414. if err != nil {
  2415. return nil, err
  2416. }
  2417. if !p.curTokenIs(lexer.TokenRParen) {
  2418. return nil, p.curError("expected )")
  2419. }
  2420. p.nextToken()
  2421. return &CastExpr{Expr: expr, Type: *dataType}, nil
  2422. }
  2423. func (p *Parser) parseExistsExpr() (Expr, error) {
  2424. p.nextToken() // consume EXISTS
  2425. if !p.curTokenIs(lexer.TokenLParen) {
  2426. return nil, p.curError("expected (")
  2427. }
  2428. p.nextToken()
  2429. if !p.curTokenIs(lexer.TokenSELECT) {
  2430. return nil, p.curError("expected SELECT in EXISTS")
  2431. }
  2432. sel, err := p.parseSelect()
  2433. if err != nil {
  2434. return nil, err
  2435. }
  2436. if !p.curTokenIs(lexer.TokenRParen) {
  2437. return nil, p.curError("expected )")
  2438. }
  2439. p.nextToken()
  2440. return &ExistsExpr{Subquery: sel}, nil
  2441. }
  2442. func (p *Parser) parseExprList() ([]Expr, error) {
  2443. var exprs []Expr
  2444. for {
  2445. expr, err := p.parseExpr()
  2446. if err != nil {
  2447. return nil, err
  2448. }
  2449. exprs = append(exprs, expr)
  2450. if !p.curTokenIs(lexer.TokenComma) {
  2451. break
  2452. }
  2453. p.nextToken()
  2454. }
  2455. return exprs, nil
  2456. }
  2457. func (p *Parser) parseIdentList() ([]string, error) {
  2458. var idents []string
  2459. for {
  2460. if !p.curIsName() {
  2461. return nil, p.curError("expected identifier")
  2462. }
  2463. idents = append(idents, p.curToken.Literal)
  2464. p.nextToken()
  2465. if !p.curTokenIs(lexer.TokenComma) {
  2466. break
  2467. }
  2468. p.nextToken()
  2469. }
  2470. return idents, nil
  2471. }
  2472. // curIsName reports whether the current token can serve as a name (column or
  2473. // table identifier). A few lexer keywords, notably KEY, are commonly used as
  2474. // column names in the GoatCounter schema and SQLite allows them.
  2475. func (p *Parser) curIsName() bool {
  2476. if p.curTokenIs(lexer.TokenIdent) {
  2477. return true
  2478. }
  2479. switch p.curToken.Type {
  2480. case lexer.TokenKEY:
  2481. return true
  2482. }
  2483. return false
  2484. }
  2485. // Helper functions
  2486. func parseInt(s string) int {
  2487. var n int
  2488. for _, c := range s {
  2489. n = n*10 + int(c-'0')
  2490. }
  2491. return n
  2492. }