parser.go 52 KB

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