parser.go 54 KB

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