parser.go 49 KB

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