parser.go 67 KB

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