parser.go 56 KB

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