parser.go 65 KB

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