2
0

parser.go 73 KB

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