parser.go 81 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358
  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(true)
  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(true)
  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. for _, table := range tables {
  485. if table.Function == nil {
  486. continue
  487. }
  488. if len(tables) > 1 || table.Join != nil {
  489. return nil, pgerror.Unsupported("a table function in FROM must be the only table reference; joins around a table function are not supported")
  490. }
  491. }
  492. return tables, nil
  493. }
  494. func (p *Parser) parseTableRef(allowFunction bool) (*TableRef, error) {
  495. ref := &TableRef{}
  496. // Check for subquery (SELECT ...)
  497. if p.curTokenIs(lexer.TokenLParen) {
  498. p.nextToken()
  499. if p.curTokenIs(lexer.TokenSELECT) {
  500. subquery, err := p.parseSelect()
  501. if err != nil {
  502. return nil, err
  503. }
  504. ref.Subquery = subquery
  505. if !p.curTokenIs(lexer.TokenRParen) {
  506. return nil, p.curError("expected ) after subquery")
  507. }
  508. p.nextToken()
  509. // Subquery must have an alias
  510. if p.curTokenIs(lexer.TokenAS) {
  511. p.nextToken()
  512. }
  513. if !p.curTokenIs(lexer.TokenIdent) {
  514. return nil, p.curError("subquery in FROM must have an alias")
  515. }
  516. ref.Alias = p.curToken.Literal
  517. p.nextToken()
  518. return ref, nil
  519. }
  520. // Parenthesized table expression: (table1 JOIN table2) or (table1, table2)
  521. innerRefs, err := p.parseTableRefs()
  522. if err != nil {
  523. return nil, err
  524. }
  525. if !p.curTokenIs(lexer.TokenRParen) {
  526. return nil, p.curError("expected ) after table expression")
  527. }
  528. p.nextToken()
  529. // Flatten: use first ref as base, attach remaining as joins
  530. if len(innerRefs) == 0 {
  531. return nil, p.curError("empty table expression")
  532. }
  533. base := &innerRefs[0]
  534. for i := 1; i < len(innerRefs); i++ {
  535. cur := base
  536. for cur.Join != nil && cur.Join.Table != nil {
  537. cur = cur.Join.Table
  538. }
  539. extra := innerRefs[i]
  540. if cur.Join == nil {
  541. cur.Join = &JoinClause{Type: JoinCross, Table: &extra}
  542. } else {
  543. cur.Join.Table = &extra
  544. }
  545. }
  546. return base, nil
  547. }
  548. if !p.curTokenIs(lexer.TokenIdent) {
  549. return nil, p.curError("expected table name")
  550. }
  551. ref.Name = p.curToken.Literal
  552. p.nextToken()
  553. // Table function in FROM. unnest(array) and the jsonb set-returning
  554. // functions are the only recognized forms; other function names in FROM are
  555. // reported as an unsupported table function.
  556. if allowFunction && p.curTokenIs(lexer.TokenLParen) {
  557. if !isTableFunctionName(ref.Name) {
  558. return nil, pgerror.Unsupported("table function %s() is not supported; FROM accepts unnest(array), jsonb_each(jsonb), jsonb_each_text(jsonb), jsonb_array_elements(jsonb), jsonb_array_elements_text(jsonb), and jsonb_object_keys(jsonb)", ref.Name)
  559. }
  560. call, err := p.parseFunctionCall(ref.Name)
  561. if err != nil {
  562. return nil, err
  563. }
  564. fn, ok := call.(*FunctionCall)
  565. if !ok {
  566. return nil, p.curError("invalid table function")
  567. }
  568. ref.Function = fn
  569. if p.curTokenIs(lexer.TokenAS) {
  570. p.nextToken()
  571. }
  572. if p.curTokenIs(lexer.TokenIdent) && !p.isClauseKeyword() {
  573. ref.Alias = p.curToken.Literal
  574. p.nextToken()
  575. }
  576. return ref, nil
  577. }
  578. // Check for schema.table
  579. if p.curTokenIs(lexer.TokenDot) {
  580. p.nextToken()
  581. if !p.curTokenIs(lexer.TokenIdent) {
  582. return nil, p.curError("expected table name after dot")
  583. }
  584. ref.Schema = ref.Name
  585. ref.Name = p.curToken.Literal
  586. p.nextToken()
  587. }
  588. // Check for alias
  589. if p.curTokenIs(lexer.TokenAS) {
  590. p.nextToken()
  591. if !p.curTokenIs(lexer.TokenIdent) {
  592. return nil, p.curError("expected identifier after AS")
  593. }
  594. ref.Alias = p.curToken.Literal
  595. p.nextToken()
  596. } else if p.curTokenIs(lexer.TokenIdent) && !p.isClauseKeyword() && !p.isLockingClauseStart() {
  597. ref.Alias = p.curToken.Literal
  598. p.nextToken()
  599. }
  600. return ref, nil
  601. }
  602. func (p *Parser) isJoinKeyword() bool {
  603. switch p.curToken.Type {
  604. case lexer.TokenJOIN, lexer.TokenINNER, lexer.TokenLEFT,
  605. lexer.TokenRIGHT, lexer.TokenFULL, lexer.TokenCROSS,
  606. lexer.TokenNATURAL:
  607. return true
  608. }
  609. return false
  610. }
  611. func (p *Parser) isClauseKeyword() bool {
  612. switch p.curToken.Type {
  613. case lexer.TokenWHERE, lexer.TokenGROUP, lexer.TokenHAVING,
  614. lexer.TokenORDER, lexer.TokenLIMIT, lexer.TokenOFFSET,
  615. lexer.TokenUNION, lexer.TokenINTERSECT, lexer.TokenEXCEPT,
  616. lexer.TokenON, lexer.TokenUSING:
  617. return true
  618. }
  619. return false
  620. }
  621. // isLockingClauseStart reports whether the current identifier starts a
  622. // PostgreSQL row-locking clause. FOR is not a reserved keyword in this lexer,
  623. // so without this guard "FROM t FOR UPDATE" would treat FOR as a table alias.
  624. func (p *Parser) isLockingClauseStart() bool {
  625. return p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "FOR")
  626. }
  627. // rejectLockingClause rejects SELECT ... FOR UPDATE/SHARE and its NOWAIT / SKIP
  628. // LOCKED variants. The engine has no row locks; claiming support by parsing the
  629. // clause would silently provide weaker isolation than PostgreSQL.
  630. func (p *Parser) rejectLockingClause() error {
  631. if !p.isLockingClauseStart() {
  632. return nil
  633. }
  634. locking := p.peekTokenIs(lexer.TokenUPDATE) ||
  635. (p.peekTokenIs(lexer.TokenIdent) &&
  636. (strings.EqualFold(p.peekToken.Literal, "SHARE") ||
  637. strings.EqualFold(p.peekToken.Literal, "NO") ||
  638. strings.EqualFold(p.peekToken.Literal, "KEY")))
  639. if !locking {
  640. return nil
  641. }
  642. return pgerror.Unsupported(
  643. "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",
  644. )
  645. }
  646. func (p *Parser) parseJoin() (*JoinClause, error) {
  647. join := &JoinClause{Type: JoinInner}
  648. // Determine join type
  649. switch p.curToken.Type {
  650. case lexer.TokenINNER:
  651. join.Type = JoinInner
  652. p.nextToken()
  653. case lexer.TokenLEFT:
  654. join.Type = JoinLeft
  655. p.nextToken()
  656. if p.curTokenIs(lexer.TokenOUTER) {
  657. p.nextToken()
  658. }
  659. case lexer.TokenRIGHT:
  660. join.Type = JoinRight
  661. p.nextToken()
  662. if p.curTokenIs(lexer.TokenOUTER) {
  663. p.nextToken()
  664. }
  665. case lexer.TokenFULL:
  666. join.Type = JoinFull
  667. p.nextToken()
  668. if p.curTokenIs(lexer.TokenOUTER) {
  669. p.nextToken()
  670. }
  671. case lexer.TokenCROSS:
  672. join.Type = JoinCross
  673. p.nextToken()
  674. case lexer.TokenNATURAL:
  675. p.nextToken()
  676. // Could be NATURAL LEFT/RIGHT/INNER JOIN
  677. if p.curTokenIs(lexer.TokenLEFT) {
  678. join.Type = JoinLeft
  679. p.nextToken()
  680. } else if p.curTokenIs(lexer.TokenRIGHT) {
  681. join.Type = JoinRight
  682. p.nextToken()
  683. }
  684. }
  685. // Expect JOIN keyword
  686. if p.curTokenIs(lexer.TokenJOIN) {
  687. p.nextToken()
  688. } else if p.curToken.Type != lexer.TokenIdent {
  689. return nil, p.curError("expected JOIN")
  690. }
  691. // Parse table reference
  692. table, err := p.parseTableRef(true)
  693. if err != nil {
  694. return nil, err
  695. }
  696. join.Table = table
  697. // Parse ON or USING clause
  698. if p.curTokenIs(lexer.TokenON) {
  699. p.nextToken()
  700. cond, err := p.parseExpr()
  701. if err != nil {
  702. return nil, err
  703. }
  704. join.Condition = cond
  705. } else if p.curTokenIs(lexer.TokenUSING) {
  706. p.nextToken()
  707. if !p.curTokenIs(lexer.TokenLParen) {
  708. return nil, p.curError("expected (")
  709. }
  710. p.nextToken()
  711. cols, err := p.parseIdentList()
  712. if err != nil {
  713. return nil, err
  714. }
  715. join.Using = cols
  716. if !p.curTokenIs(lexer.TokenRParen) {
  717. return nil, p.curError("expected )")
  718. }
  719. p.nextToken()
  720. }
  721. return join, nil
  722. }
  723. func (p *Parser) parseOrderBy() ([]OrderByItem, error) {
  724. var items []OrderByItem
  725. for {
  726. item := OrderByItem{}
  727. expr, err := p.parseExpr()
  728. if err != nil {
  729. return nil, err
  730. }
  731. item.Expr = expr
  732. if p.curTokenIs(lexer.TokenDESC) {
  733. item.Desc = true
  734. p.nextToken()
  735. } else if p.curTokenIs(lexer.TokenASC) {
  736. p.nextToken()
  737. }
  738. // Optional NULLS FIRST / NULLS LAST.
  739. if p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "NULLS") {
  740. p.nextToken()
  741. if !p.curTokenIs(lexer.TokenIdent) {
  742. return nil, p.curError("expected FIRST or LAST after NULLS")
  743. }
  744. switch {
  745. case strings.EqualFold(p.curToken.Literal, "FIRST"):
  746. item.NullsOrder = NullsFirst
  747. case strings.EqualFold(p.curToken.Literal, "LAST"):
  748. item.NullsOrder = NullsLast
  749. default:
  750. return nil, p.curError("expected FIRST or LAST after NULLS")
  751. }
  752. p.nextToken()
  753. }
  754. items = append(items, item)
  755. if !p.curTokenIs(lexer.TokenComma) {
  756. break
  757. }
  758. p.nextToken()
  759. }
  760. return items, nil
  761. }
  762. // parseInsert parses an INSERT statement.
  763. func (p *Parser) parseInsert() (*InsertStmt, error) {
  764. stmt := &InsertStmt{}
  765. p.nextToken() // consume INSERT
  766. // Check for OR conflict clause
  767. if p.curTokenIs(lexer.TokenOR) {
  768. p.nextToken()
  769. switch p.curToken.Type {
  770. case lexer.TokenREPLACE:
  771. stmt.OnConflict = ConflictReplace
  772. case lexer.TokenIGNORE:
  773. stmt.OnConflict = ConflictIgnore
  774. case lexer.TokenFAIL:
  775. stmt.OnConflict = ConflictFail
  776. case lexer.TokenABORT:
  777. stmt.OnConflict = ConflictAbort
  778. case lexer.TokenROLLBACK:
  779. stmt.OnConflict = ConflictRollback
  780. default:
  781. return nil, p.curError("expected REPLACE, IGNORE, FAIL, ABORT, or ROLLBACK after OR")
  782. }
  783. p.nextToken()
  784. }
  785. if !p.curTokenIs(lexer.TokenINTO) {
  786. return nil, p.curError("expected INTO")
  787. }
  788. p.nextToken()
  789. // Parse table name
  790. table, err := p.parseTableRef(false)
  791. if err != nil {
  792. return nil, err
  793. }
  794. stmt.Table = table
  795. // Parse optional column list
  796. if p.curTokenIs(lexer.TokenLParen) {
  797. p.nextToken()
  798. cols, err := p.parseIdentList()
  799. if err != nil {
  800. return nil, err
  801. }
  802. stmt.Columns = cols
  803. if !p.curTokenIs(lexer.TokenRParen) {
  804. return nil, p.curError("expected )")
  805. }
  806. p.nextToken()
  807. }
  808. // Parse VALUES, SELECT, or SQLite's INSERT ... WITH ... SELECT form.
  809. if p.curTokenIs(lexer.TokenVALUES) {
  810. p.nextToken()
  811. values, err := p.parseValuesList()
  812. if err != nil {
  813. return nil, err
  814. }
  815. stmt.Values = values
  816. } else if p.curTokenIs(lexer.TokenDEFAULT) {
  817. // INSERT ... DEFAULT VALUES supplies no values; one row is built from
  818. // the schema defaults.
  819. p.nextToken()
  820. if !p.curTokenIs(lexer.TokenVALUES) {
  821. return nil, p.curError("expected VALUES after DEFAULT")
  822. }
  823. p.nextToken()
  824. stmt.DefaultValues = true
  825. stmt.Values = [][]Expr{{}}
  826. } else if p.curTokenIs(lexer.TokenSELECT) {
  827. sel, err := p.parseSelect()
  828. if err != nil {
  829. return nil, err
  830. }
  831. stmt.Select = sel
  832. } else if p.isWithStart() {
  833. withStmt, err := p.parseWithStatement()
  834. if err != nil {
  835. return nil, err
  836. }
  837. sel, ok := withStmt.(*SelectStmt)
  838. if !ok {
  839. return nil, p.curError("expected SELECT after WITH")
  840. }
  841. stmt.Select = sel
  842. } else {
  843. return nil, p.curError("expected VALUES, SELECT, WITH, or DEFAULT VALUES")
  844. }
  845. if p.curTokenIs(lexer.TokenON) {
  846. p.nextToken()
  847. if !p.curTokenIs(lexer.TokenCONFLICT) {
  848. return nil, p.curError("expected CONFLICT after ON")
  849. }
  850. p.nextToken()
  851. if p.curTokenIs(lexer.TokenLParen) {
  852. p.nextToken()
  853. target, err := p.parseIdentList()
  854. if err != nil {
  855. return nil, err
  856. }
  857. stmt.ConflictTarget = target
  858. if !p.curTokenIs(lexer.TokenRParen) {
  859. return nil, p.curError("expected )")
  860. }
  861. p.nextToken()
  862. }
  863. if !p.curTokenIs(lexer.TokenDO) {
  864. return nil, p.curError("expected DO after ON CONFLICT")
  865. }
  866. p.nextToken()
  867. if p.curTokenIs(lexer.TokenNOTHING) {
  868. stmt.ConflictDoNothing = true
  869. p.nextToken()
  870. } else if p.curTokenIs(lexer.TokenUPDATE) {
  871. p.nextToken()
  872. if !p.curTokenIs(lexer.TokenSET) {
  873. return nil, p.curError("expected SET after DO UPDATE")
  874. }
  875. p.nextToken()
  876. for {
  877. if !p.curTokenIs(lexer.TokenIdent) {
  878. return nil, p.curError("expected column name")
  879. }
  880. column := p.curToken.Literal
  881. p.nextToken()
  882. if !p.curTokenIs(lexer.TokenEq) {
  883. return nil, p.curError("expected =")
  884. }
  885. p.nextToken()
  886. value, err := p.parseExpr()
  887. if err != nil {
  888. return nil, err
  889. }
  890. stmt.ConflictUpdate = append(stmt.ConflictUpdate, Assignment{Column: column, Value: value})
  891. if !p.curTokenIs(lexer.TokenComma) {
  892. break
  893. }
  894. p.nextToken()
  895. }
  896. } else {
  897. return nil, p.curError("expected NOTHING or UPDATE after DO")
  898. }
  899. }
  900. if p.curTokenIs(lexer.TokenRETURNING) {
  901. returning, err := p.parseReturningClause()
  902. if err != nil {
  903. return nil, err
  904. }
  905. stmt.Returning = returning
  906. }
  907. return stmt, nil
  908. }
  909. func (p *Parser) parseValuesList() ([][]Expr, error) {
  910. var rows [][]Expr
  911. for {
  912. if !p.curTokenIs(lexer.TokenLParen) {
  913. return nil, p.curError("expected (")
  914. }
  915. p.nextToken()
  916. row, err := p.parseExprList()
  917. if err != nil {
  918. return nil, err
  919. }
  920. rows = append(rows, row)
  921. if !p.curTokenIs(lexer.TokenRParen) {
  922. return nil, p.curError("expected )")
  923. }
  924. p.nextToken()
  925. if !p.curTokenIs(lexer.TokenComma) {
  926. break
  927. }
  928. p.nextToken()
  929. }
  930. return rows, nil
  931. }
  932. // parseUpdate parses an UPDATE statement.
  933. func (p *Parser) parseUpdate() (*UpdateStmt, error) {
  934. stmt := &UpdateStmt{}
  935. p.nextToken() // consume UPDATE
  936. // Parse table name
  937. table, err := p.parseTableRef(false)
  938. if err != nil {
  939. return nil, err
  940. }
  941. stmt.Table = table
  942. // Expect SET
  943. if !p.curTokenIs(lexer.TokenSET) {
  944. return nil, p.curError("expected SET")
  945. }
  946. p.nextToken()
  947. // Parse assignments
  948. for {
  949. if !p.curTokenIs(lexer.TokenIdent) {
  950. return nil, p.curError("expected column name")
  951. }
  952. col := p.curToken.Literal
  953. p.nextToken()
  954. if !p.curTokenIs(lexer.TokenEq) {
  955. return nil, p.curError("expected =")
  956. }
  957. p.nextToken()
  958. val, err := p.parseExpr()
  959. if err != nil {
  960. return nil, err
  961. }
  962. stmt.Set = append(stmt.Set, Assignment{Column: col, Value: val})
  963. if !p.curTokenIs(lexer.TokenComma) {
  964. break
  965. }
  966. p.nextToken()
  967. }
  968. // Parse optional FROM clause (SQLite UPDATE ... FROM).
  969. if p.curTokenIs(lexer.TokenFROM) {
  970. p.nextToken()
  971. from, err := p.parseTableRefs()
  972. if err != nil {
  973. return nil, err
  974. }
  975. stmt.From = from
  976. }
  977. // Parse optional WHERE
  978. if p.curTokenIs(lexer.TokenWHERE) {
  979. p.nextToken()
  980. where, err := p.parseExpr()
  981. if err != nil {
  982. return nil, err
  983. }
  984. stmt.Where = where
  985. }
  986. if p.curTokenIs(lexer.TokenRETURNING) {
  987. returning, err := p.parseReturningClause()
  988. if err != nil {
  989. return nil, err
  990. }
  991. stmt.Returning = returning
  992. }
  993. return stmt, nil
  994. }
  995. // parseDelete parses a DELETE statement.
  996. func (p *Parser) parseDelete() (*DeleteStmt, error) {
  997. stmt := &DeleteStmt{}
  998. p.nextToken() // consume DELETE
  999. if !p.curTokenIs(lexer.TokenFROM) {
  1000. return nil, p.curError("expected FROM")
  1001. }
  1002. p.nextToken()
  1003. // Parse table name
  1004. table, err := p.parseTableRef(false)
  1005. if err != nil {
  1006. return nil, err
  1007. }
  1008. stmt.Table = table
  1009. // Parse optional WHERE
  1010. if p.curTokenIs(lexer.TokenWHERE) {
  1011. p.nextToken()
  1012. where, err := p.parseExpr()
  1013. if err != nil {
  1014. return nil, err
  1015. }
  1016. stmt.Where = where
  1017. }
  1018. if p.curTokenIs(lexer.TokenRETURNING) {
  1019. returning, err := p.parseReturningClause()
  1020. if err != nil {
  1021. return nil, err
  1022. }
  1023. stmt.Returning = returning
  1024. }
  1025. return stmt, nil
  1026. }
  1027. // parseReturningClause parses the projection after a RETURNING keyword. The
  1028. // caller must leave curToken on the RETURNING identifier.
  1029. func (p *Parser) parseReturningClause() ([]SelectColumn, error) {
  1030. p.nextToken() // consume RETURNING
  1031. cols, err := p.parseSelectColumns()
  1032. if err != nil {
  1033. return nil, err
  1034. }
  1035. if len(cols) == 0 {
  1036. return nil, p.curError("RETURNING requires at least one expression")
  1037. }
  1038. return cols, nil
  1039. }
  1040. // parseCreate parses CREATE statements.
  1041. func (p *Parser) parseCreate() (Statement, error) {
  1042. p.nextToken() // consume CREATE
  1043. switch p.curToken.Type {
  1044. case lexer.TokenTABLE:
  1045. return p.parseCreateTable()
  1046. case lexer.TokenINDEX:
  1047. return p.parseCreateIndex(false)
  1048. case lexer.TokenUNIQUE:
  1049. p.nextToken() // consume UNIQUE
  1050. if !p.curTokenIs(lexer.TokenINDEX) {
  1051. return nil, p.curError("expected INDEX after UNIQUE")
  1052. }
  1053. return p.parseCreateIndex(true)
  1054. case lexer.TokenVIEW:
  1055. return p.parseCreateView()
  1056. default:
  1057. return nil, p.curError("expected TABLE or INDEX after CREATE")
  1058. }
  1059. }
  1060. func (p *Parser) parseCreateTable() (*CreateTableStmt, error) {
  1061. stmt := &CreateTableStmt{}
  1062. p.nextToken() // consume TABLE
  1063. // Check for IF NOT EXISTS
  1064. if p.curTokenIs(lexer.TokenIF) {
  1065. p.nextToken()
  1066. if !p.curTokenIs(lexer.TokenNOT) {
  1067. return nil, p.curError("expected NOT")
  1068. }
  1069. p.nextToken()
  1070. if !p.curTokenIs(lexer.TokenEXISTS) {
  1071. return nil, p.curError("expected EXISTS")
  1072. }
  1073. stmt.IfNotExists = true
  1074. p.nextToken()
  1075. }
  1076. // Parse table name
  1077. table, err := p.parseTableRef(false)
  1078. if err != nil {
  1079. return nil, err
  1080. }
  1081. stmt.Table = table
  1082. // Expect (
  1083. if !p.curTokenIs(lexer.TokenLParen) {
  1084. return nil, p.curError("expected (")
  1085. }
  1086. p.nextToken()
  1087. // Parse column definitions and constraints
  1088. for {
  1089. if p.curTokenIs(lexer.TokenRParen) {
  1090. break
  1091. }
  1092. // Check for table constraint
  1093. if p.isTableConstraintStart() {
  1094. constraint, err := p.parseTableConstraint()
  1095. if err != nil {
  1096. return nil, err
  1097. }
  1098. stmt.Constraints = append(stmt.Constraints, *constraint)
  1099. } else {
  1100. // Column definition
  1101. col, err := p.parseColumnDef()
  1102. if err != nil {
  1103. return nil, err
  1104. }
  1105. stmt.Columns = append(stmt.Columns, *col)
  1106. }
  1107. if !p.curTokenIs(lexer.TokenComma) {
  1108. break
  1109. }
  1110. p.nextToken()
  1111. }
  1112. if !p.curTokenIs(lexer.TokenRParen) {
  1113. return nil, p.curError("expected )")
  1114. }
  1115. p.nextToken()
  1116. return stmt, nil
  1117. }
  1118. func (p *Parser) isTableConstraintStart() bool {
  1119. switch p.curToken.Type {
  1120. case lexer.TokenPRIMARY, lexer.TokenFOREIGN, lexer.TokenUNIQUE,
  1121. lexer.TokenCHECK, lexer.TokenCONSTRAINT:
  1122. return true
  1123. }
  1124. return false
  1125. }
  1126. func (p *Parser) parseColumnDef() (*ColumnDef, error) {
  1127. col := &ColumnDef{}
  1128. if !p.curIsName() {
  1129. return nil, p.curError("expected column name")
  1130. }
  1131. col.Name = p.curToken.Literal
  1132. p.nextToken()
  1133. // Parse data type
  1134. dataType, err := p.parseDataType()
  1135. if err != nil {
  1136. return nil, err
  1137. }
  1138. col.Type = *dataType
  1139. // Parse column constraints
  1140. for {
  1141. if consumed, err := p.tryParseGeneratedColumn(col); err != nil {
  1142. return nil, err
  1143. } else if consumed {
  1144. continue
  1145. }
  1146. constraint, ok, err := p.parseColumnConstraint()
  1147. if err != nil {
  1148. return nil, err
  1149. }
  1150. if !ok {
  1151. break
  1152. }
  1153. if constraint != nil {
  1154. col.Constraints = append(col.Constraints, *constraint)
  1155. }
  1156. }
  1157. return col, nil
  1158. }
  1159. // tryParseGeneratedColumn parses a GENERATED ALWAYS AS (expr) [STORED|VIRTUAL]
  1160. // clause, or the shorthand AS (expr) [STORED|VIRTUAL]. It reports whether a
  1161. // clause was consumed. Generated columns cannot be written by the user.
  1162. func (p *Parser) tryParseGeneratedColumn(col *ColumnDef) (bool, error) {
  1163. started := false
  1164. if p.curIdentIs("GENERATED") {
  1165. started = true
  1166. p.nextToken()
  1167. if !p.curIdentIs("ALWAYS") {
  1168. return false, p.curError("expected ALWAYS after GENERATED")
  1169. }
  1170. p.nextToken()
  1171. }
  1172. if !p.curTokenIs(lexer.TokenAS) {
  1173. if started {
  1174. return false, p.curError("expected AS in generated column definition")
  1175. }
  1176. return false, nil
  1177. }
  1178. p.nextToken() // consume AS
  1179. if !p.curTokenIs(lexer.TokenLParen) {
  1180. return false, p.curError("expected ( after AS")
  1181. }
  1182. p.nextToken()
  1183. expr, err := p.parseExpr()
  1184. if err != nil {
  1185. return false, err
  1186. }
  1187. if !p.curTokenIs(lexer.TokenRParen) {
  1188. return false, p.curError("expected ) after generated expression")
  1189. }
  1190. p.nextToken()
  1191. col.GeneratedExpr = expr
  1192. if p.curIdentIs("STORED") {
  1193. col.GeneratedStored = true
  1194. p.nextToken()
  1195. } else if p.curIdentIs("VIRTUAL") {
  1196. col.GeneratedStored = false
  1197. p.nextToken()
  1198. }
  1199. return true, nil
  1200. }
  1201. // identTypeAliases maps non-reserved type names (lexed as plain identifiers)
  1202. // to their canonical data type name. These are stored with SQLite text
  1203. // affinity and never gain native PostgreSQL semantics.
  1204. var identTypeAliases = map[string]string{
  1205. "UUID": "UUID",
  1206. }
  1207. func (p *Parser) parseDataType() (*DataType, error) {
  1208. dt := &DataType{}
  1209. if p.curTokenIs(lexer.TokenIdent) {
  1210. // A few well-known type names (e.g. UUID) are not reserved keywords and
  1211. // lex as identifiers. Recognize them as type aliases so they can be used
  1212. // in column definitions.
  1213. name, ok := identTypeAliases[strings.ToUpper(p.curToken.Literal)]
  1214. if !ok {
  1215. return nil, p.curError("expected data type")
  1216. }
  1217. dt.Name = name
  1218. p.nextToken()
  1219. } else {
  1220. if !p.isDataTypeKeyword() {
  1221. return nil, p.curError("expected data type")
  1222. }
  1223. dt.Name = strings.ToUpper(p.curToken.Literal)
  1224. p.nextToken()
  1225. }
  1226. // DOUBLE PRECISION is the PostgreSQL spelling of the DOUBLE type. PRECISION
  1227. // is not a reserved word, so consume it as a trailing type qualifier.
  1228. if dt.Name == "DOUBLE" && p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "PRECISION") {
  1229. p.nextToken()
  1230. }
  1231. // Check for precision/scale
  1232. if p.curTokenIs(lexer.TokenLParen) {
  1233. p.nextToken()
  1234. if !p.curTokenIs(lexer.TokenNumber) {
  1235. return nil, p.curError("expected number for precision")
  1236. }
  1237. // Parse precision (simplified - just store in Precision)
  1238. dt.Precision = parseInt(p.curToken.Literal)
  1239. p.nextToken()
  1240. if p.curTokenIs(lexer.TokenComma) {
  1241. p.nextToken()
  1242. if !p.curTokenIs(lexer.TokenNumber) {
  1243. return nil, p.curError("expected number for scale")
  1244. }
  1245. dt.Scale = parseInt(p.curToken.Literal)
  1246. p.nextToken()
  1247. }
  1248. if !p.curTokenIs(lexer.TokenRParen) {
  1249. return nil, p.curError("expected )")
  1250. }
  1251. p.nextToken()
  1252. }
  1253. // A single trailing [] declares a one-dimensional array. Only element types
  1254. // the engine can encode are accepted.
  1255. if p.curTokenIs(lexer.TokenLBracket) {
  1256. if !p.peekTokenIs(lexer.TokenRBracket) {
  1257. return nil, p.curError("expected ] after [ in array type")
  1258. }
  1259. p.nextToken() // [
  1260. p.nextToken() // ]
  1261. if p.curTokenIs(lexer.TokenLBracket) {
  1262. return nil, pgerror.Unsupported("multidimensional arrays are not supported; declare a single trailing []")
  1263. }
  1264. if !isSupportedArrayElementType(dt.Name) {
  1265. return nil, pgerror.Unsupported("arrays of %s are not supported; supported element types are TEXT, VARCHAR, INTEGER, BIGINT, SMALLINT, BOOLEAN, REAL, DOUBLE PRECISION, and NUMERIC", dt.Name)
  1266. }
  1267. dt.Array = true
  1268. }
  1269. return dt, nil
  1270. }
  1271. // isTableFunctionName reports whether name is a set-returning function the
  1272. // executor can materialize as the single FROM item.
  1273. func isTableFunctionName(name string) bool {
  1274. switch strings.ToLower(name) {
  1275. case "unnest", "jsonb_each", "jsonb_each_text", "jsonb_array_elements",
  1276. "jsonb_array_elements_text", "jsonb_object_keys":
  1277. return true
  1278. default:
  1279. return false
  1280. }
  1281. }
  1282. // isSupportedArrayElementType reports whether an element type name can be
  1283. // encoded as an array element. The list mirrors the element types the executor
  1284. // canonicalizes and the pgserver advertises array OIDs for.
  1285. func isSupportedArrayElementType(name string) bool {
  1286. switch strings.ToUpper(name) {
  1287. case "TEXT", "VARCHAR", "CHAR", "CHARACTER", "CLOB", "NCHAR", "NVARCHAR",
  1288. "INTEGER", "INT", "TINYINT", "SMALLINT", "MEDIUMINT", "BIGINT",
  1289. "BOOLEAN", "BOOL",
  1290. "REAL", "FLOAT", "DOUBLE", "NUMERIC", "DECIMAL":
  1291. return true
  1292. default:
  1293. return false
  1294. }
  1295. }
  1296. func (p *Parser) isDataTypeKeyword() bool {
  1297. switch p.curToken.Type {
  1298. case lexer.TokenINTEGER, lexer.TokenINT, lexer.TokenTINYINT, lexer.TokenSMALLINT, lexer.TokenMEDIUMINT, lexer.TokenBIGINT,
  1299. lexer.TokenREAL, lexer.TokenFLOAT, lexer.TokenDOUBLE,
  1300. lexer.TokenNUMERIC, lexer.TokenDECIMAL,
  1301. lexer.TokenTEXT, lexer.TokenVARCHAR, lexer.TokenCHAR, lexer.TokenCHARACTER, lexer.TokenCLOB, lexer.TokenNCHAR, lexer.TokenNVARCHAR,
  1302. lexer.TokenBLOB, lexer.TokenBOOLEAN,
  1303. lexer.TokenDATE, lexer.TokenTIME, lexer.TokenTIMESTAMP, lexer.TokenDATETIME, lexer.TokenJSON, lexer.TokenJSONB:
  1304. return true
  1305. }
  1306. return false
  1307. }
  1308. func (p *Parser) parseColumnConstraint() (*ColumnConstraint, bool, error) {
  1309. constraint := &ColumnConstraint{}
  1310. // A column-level constraint can be named: `col TYPE CONSTRAINT name CHECK
  1311. // (...)` is the same constraint as the unnamed form.
  1312. named := false
  1313. if p.curTokenIs(lexer.TokenCONSTRAINT) {
  1314. p.nextToken()
  1315. if !p.curTokenIs(lexer.TokenIdent) {
  1316. return nil, false, p.curError("expected constraint name")
  1317. }
  1318. constraint.Name = p.curToken.Literal
  1319. named = true
  1320. p.nextToken()
  1321. }
  1322. switch p.curToken.Type {
  1323. case lexer.TokenPRIMARY:
  1324. p.nextToken()
  1325. if !p.curTokenIs(lexer.TokenKEY) {
  1326. return nil, false, p.curError("expected KEY after PRIMARY")
  1327. }
  1328. constraint.Type = ConstraintPrimaryKey
  1329. p.nextToken()
  1330. if action, ok, err := p.parseOnConflictAction(); err != nil {
  1331. return nil, false, err
  1332. } else if ok {
  1333. constraint.OnConflict = action
  1334. constraint.HasOnConflict = true
  1335. }
  1336. case lexer.TokenNOT:
  1337. p.nextToken()
  1338. if !p.curTokenIs(lexer.TokenNULL) {
  1339. return nil, false, p.curError("expected NULL after NOT")
  1340. }
  1341. constraint.Type = ConstraintNotNull
  1342. p.nextToken()
  1343. case lexer.TokenUNIQUE:
  1344. constraint.Type = ConstraintUnique
  1345. p.nextToken()
  1346. if action, ok, err := p.parseOnConflictAction(); err != nil {
  1347. return nil, false, err
  1348. } else if ok {
  1349. constraint.OnConflict = action
  1350. constraint.HasOnConflict = true
  1351. }
  1352. case lexer.TokenDEFAULT:
  1353. p.nextToken()
  1354. // parseUnaryExpr accepts a signed numeric literal (-1, +5) and falls
  1355. // through to primary expressions, including parenthesized expressions.
  1356. // It stops before NOT/NULL, so a following NOT NULL constraint is left
  1357. // for the enclosing constraint loop.
  1358. expr, err := p.parseUnaryExpr()
  1359. if err != nil {
  1360. return nil, false, err
  1361. }
  1362. constraint.Type = ConstraintDefault
  1363. constraint.Default = expr
  1364. case lexer.TokenREFERENCES:
  1365. p.nextToken()
  1366. if !p.curTokenIs(lexer.TokenIdent) {
  1367. return nil, false, p.curError("expected table name after REFERENCES")
  1368. }
  1369. constraint.Type = ConstraintForeignKey
  1370. constraint.RefTable = p.curToken.Literal
  1371. p.nextToken()
  1372. if p.curTokenIs(lexer.TokenLParen) {
  1373. refCols, err := p.parseParenIdentList()
  1374. if err != nil {
  1375. return nil, false, err
  1376. }
  1377. constraint.RefColumns = refCols
  1378. }
  1379. if err := p.parseForeignKeyClauses(&constraint.OnDelete, &constraint.OnUpdate, &constraint.Deferrable); err != nil {
  1380. return nil, false, err
  1381. }
  1382. case lexer.TokenAUTOINCREMENT:
  1383. constraint.Type = ConstraintAutoIncrement
  1384. p.nextToken()
  1385. case lexer.TokenCHECK:
  1386. p.nextToken()
  1387. if !p.curTokenIs(lexer.TokenLParen) {
  1388. return nil, false, p.curError("expected ( after CHECK")
  1389. }
  1390. p.nextToken()
  1391. check, err := p.parseExpr()
  1392. if err != nil {
  1393. return nil, false, err
  1394. }
  1395. if !p.curTokenIs(lexer.TokenRParen) {
  1396. return nil, false, p.curError("expected ) after CHECK expression")
  1397. }
  1398. p.nextToken()
  1399. constraint.Type = ConstraintCheck
  1400. constraint.Check = check
  1401. case lexer.TokenNULL:
  1402. // Explicit NULL is a no-op: columns are nullable by default, so an
  1403. // explicit NULL declaration carries no constraint. Consume it so
  1404. // "col TYPE NULL" parses without inventing a fake nullable constraint.
  1405. // NOT NULL is applied whenever it appears, regardless of ordering.
  1406. if named {
  1407. return nil, false, p.curError("expected constraint type after constraint name")
  1408. }
  1409. p.nextToken()
  1410. return nil, true, nil
  1411. default:
  1412. if named {
  1413. return nil, false, p.curError("expected constraint type after constraint name")
  1414. }
  1415. return nil, false, nil
  1416. }
  1417. return constraint, true, nil
  1418. }
  1419. // parseOnConflictAction parses an optional constraint clause of the form
  1420. // ON CONFLICT IGNORE|REPLACE|FAIL|ABORT|ROLLBACK. It reports ok=false and leaves
  1421. // the cursor unchanged when no ON CONFLICT follows.
  1422. func (p *Parser) parseOnConflictAction() (ConflictAction, bool, error) {
  1423. if !p.curTokenIs(lexer.TokenON) {
  1424. return ConflictAbort, false, nil
  1425. }
  1426. p.nextToken()
  1427. if !p.curTokenIs(lexer.TokenCONFLICT) {
  1428. return ConflictAbort, false, p.curError("expected CONFLICT after ON")
  1429. }
  1430. p.nextToken()
  1431. switch p.curToken.Type {
  1432. case lexer.TokenREPLACE:
  1433. p.nextToken()
  1434. return ConflictReplace, true, nil
  1435. case lexer.TokenIGNORE:
  1436. p.nextToken()
  1437. return ConflictIgnore, true, nil
  1438. case lexer.TokenFAIL:
  1439. p.nextToken()
  1440. return ConflictFail, true, nil
  1441. case lexer.TokenABORT:
  1442. p.nextToken()
  1443. return ConflictAbort, true, nil
  1444. case lexer.TokenROLLBACK:
  1445. p.nextToken()
  1446. return ConflictRollback, true, nil
  1447. default:
  1448. return ConflictAbort, false, p.curError("expected REPLACE, IGNORE, FAIL, ABORT, or ROLLBACK after ON CONFLICT")
  1449. }
  1450. }
  1451. // parseForeignKeyClauses parses the optional ON DELETE/ON UPDATE referential
  1452. // actions and the optional DEFERRABLE clause that follow a REFERENCES target.
  1453. // Every action is parsed and persisted; the storage layer executes the
  1454. // cascading forms, and a DEFERRABLE clause is recorded so the DDL layer can
  1455. // reject it instead of silently weakening the constraint.
  1456. func (p *Parser) parseForeignKeyClauses(onDelete, onUpdate *ReferentialAction, deferrable *bool) error {
  1457. for p.curTokenIs(lexer.TokenON) {
  1458. p.nextToken()
  1459. var target *ReferentialAction
  1460. switch {
  1461. case p.curTokenIs(lexer.TokenDELETE):
  1462. target = onDelete
  1463. case p.curTokenIs(lexer.TokenUPDATE):
  1464. target = onUpdate
  1465. default:
  1466. return p.curError("expected DELETE or UPDATE after ON")
  1467. }
  1468. p.nextToken()
  1469. action, err := p.parseReferentialAction()
  1470. if err != nil {
  1471. return err
  1472. }
  1473. *target = action
  1474. }
  1475. if p.curTokenIs(lexer.TokenNOT) && p.peekToken.Type == lexer.TokenIdent && strings.EqualFold(p.peekToken.Literal, "DEFERRABLE") {
  1476. // NOT DEFERRABLE is the default; consume it so it parses. A following
  1477. // NOT NULL belongs to the column constraint list, so only consume NOT
  1478. // when DEFERRABLE actually follows.
  1479. p.nextToken()
  1480. p.nextToken()
  1481. return nil
  1482. }
  1483. if p.curIdentIs("DEFERRABLE") {
  1484. *deferrable = true
  1485. p.nextToken()
  1486. if p.curIdentIs("INITIALLY") {
  1487. p.nextToken()
  1488. switch {
  1489. case p.curIdentIs("DEFERRED"):
  1490. p.nextToken()
  1491. case p.curIdentIs("IMMEDIATE"):
  1492. p.nextToken()
  1493. default:
  1494. return p.curError("expected DEFERRED or IMMEDIATE after INITIALLY")
  1495. }
  1496. }
  1497. }
  1498. return nil
  1499. }
  1500. // parseReferentialAction parses one foreign-key action.
  1501. func (p *Parser) parseReferentialAction() (ReferentialAction, error) {
  1502. switch {
  1503. case p.curIdentIs("CASCADE"):
  1504. p.nextToken()
  1505. return RefActionCascade, nil
  1506. case p.curIdentIs("RESTRICT"):
  1507. p.nextToken()
  1508. return RefActionRestrict, nil
  1509. case p.curIdentIs("NO"):
  1510. p.nextToken()
  1511. if !p.curIdentIs("ACTION") {
  1512. return RefActionUnspecified, p.curError("expected ACTION after NO")
  1513. }
  1514. p.nextToken()
  1515. return RefActionNoAction, nil
  1516. case p.curTokenIs(lexer.TokenSET):
  1517. p.nextToken()
  1518. switch {
  1519. case p.curTokenIs(lexer.TokenNULL):
  1520. p.nextToken()
  1521. return RefActionSetNull, nil
  1522. case p.curTokenIs(lexer.TokenDEFAULT):
  1523. p.nextToken()
  1524. return RefActionSetDefault, nil
  1525. default:
  1526. return RefActionUnspecified, p.curError("expected NULL or DEFAULT after SET")
  1527. }
  1528. default:
  1529. return RefActionUnspecified, p.curError("expected CASCADE, RESTRICT, NO ACTION, SET NULL, or SET DEFAULT")
  1530. }
  1531. }
  1532. func (p *Parser) parseTableConstraint() (*TableConstraint, error) {
  1533. constraint := &TableConstraint{}
  1534. // Check for CONSTRAINT name
  1535. if p.curTokenIs(lexer.TokenCONSTRAINT) {
  1536. p.nextToken()
  1537. if !p.curTokenIs(lexer.TokenIdent) {
  1538. return nil, p.curError("expected constraint name")
  1539. }
  1540. constraint.Name = p.curToken.Literal
  1541. p.nextToken()
  1542. }
  1543. switch p.curToken.Type {
  1544. case lexer.TokenPRIMARY:
  1545. p.nextToken()
  1546. if !p.curTokenIs(lexer.TokenKEY) {
  1547. return nil, p.curError("expected KEY after PRIMARY")
  1548. }
  1549. p.nextToken()
  1550. constraint.Type = ConstraintPrimaryKey
  1551. cols, err := p.parseParenIdentList()
  1552. if err != nil {
  1553. return nil, err
  1554. }
  1555. constraint.Columns = cols
  1556. if action, ok, err := p.parseOnConflictAction(); err != nil {
  1557. return nil, err
  1558. } else if ok {
  1559. constraint.OnConflict = action
  1560. constraint.HasOnConflict = true
  1561. }
  1562. case lexer.TokenUNIQUE:
  1563. p.nextToken()
  1564. constraint.Type = ConstraintUnique
  1565. cols, err := p.parseParenIdentList()
  1566. if err != nil {
  1567. return nil, err
  1568. }
  1569. constraint.Columns = cols
  1570. if action, ok, err := p.parseOnConflictAction(); err != nil {
  1571. return nil, err
  1572. } else if ok {
  1573. constraint.OnConflict = action
  1574. constraint.HasOnConflict = true
  1575. }
  1576. case lexer.TokenFOREIGN:
  1577. p.nextToken()
  1578. if !p.curTokenIs(lexer.TokenKEY) {
  1579. return nil, p.curError("expected KEY after FOREIGN")
  1580. }
  1581. p.nextToken()
  1582. constraint.Type = ConstraintForeignKey
  1583. cols, err := p.parseParenIdentList()
  1584. if err != nil {
  1585. return nil, err
  1586. }
  1587. constraint.Columns = cols
  1588. if !p.curTokenIs(lexer.TokenREFERENCES) {
  1589. return nil, p.curError("expected REFERENCES")
  1590. }
  1591. p.nextToken()
  1592. if !p.curTokenIs(lexer.TokenIdent) {
  1593. return nil, p.curError("expected table name")
  1594. }
  1595. constraint.RefTable = p.curToken.Literal
  1596. p.nextToken()
  1597. refCols, err := p.parseParenIdentList()
  1598. if err != nil {
  1599. return nil, err
  1600. }
  1601. constraint.RefColumns = refCols
  1602. if err := p.parseForeignKeyClauses(&constraint.OnDelete, &constraint.OnUpdate, &constraint.Deferrable); err != nil {
  1603. return nil, err
  1604. }
  1605. case lexer.TokenCHECK:
  1606. p.nextToken()
  1607. constraint.Type = ConstraintCheck
  1608. if !p.curTokenIs(lexer.TokenLParen) {
  1609. return nil, p.curError("expected (")
  1610. }
  1611. p.nextToken()
  1612. check, err := p.parseExpr()
  1613. if err != nil {
  1614. return nil, err
  1615. }
  1616. constraint.Check = check
  1617. if !p.curTokenIs(lexer.TokenRParen) {
  1618. return nil, p.curError("expected )")
  1619. }
  1620. p.nextToken()
  1621. default:
  1622. return nil, p.curError("expected constraint type")
  1623. }
  1624. return constraint, nil
  1625. }
  1626. func (p *Parser) parseParenIdentList() ([]string, error) {
  1627. if !p.curTokenIs(lexer.TokenLParen) {
  1628. return nil, p.curError("expected (")
  1629. }
  1630. p.nextToken()
  1631. cols, err := p.parseIdentList()
  1632. if err != nil {
  1633. return nil, err
  1634. }
  1635. if !p.curTokenIs(lexer.TokenRParen) {
  1636. return nil, p.curError("expected )")
  1637. }
  1638. p.nextToken()
  1639. return cols, nil
  1640. }
  1641. // parseCreateIndex parses CREATE INDEX statements.
  1642. func (p *Parser) parseCreateIndex(unique bool) (*CreateIndexStmt, error) {
  1643. stmt := &CreateIndexStmt{Unique: unique}
  1644. p.nextToken() // consume INDEX
  1645. // Check for IF NOT EXISTS
  1646. if p.curTokenIs(lexer.TokenIF) {
  1647. p.nextToken()
  1648. if !p.curTokenIs(lexer.TokenNOT) {
  1649. return nil, p.curError("expected NOT")
  1650. }
  1651. p.nextToken()
  1652. if !p.curTokenIs(lexer.TokenEXISTS) {
  1653. return nil, p.curError("expected EXISTS")
  1654. }
  1655. stmt.IfNotExists = true
  1656. p.nextToken()
  1657. }
  1658. // Parse index name
  1659. if !p.curTokenIs(lexer.TokenIdent) {
  1660. return nil, p.curError("expected index name")
  1661. }
  1662. stmt.Name = p.curToken.Literal
  1663. p.nextToken()
  1664. // Expect ON
  1665. if !p.curTokenIs(lexer.TokenON) {
  1666. return nil, p.curError("expected ON")
  1667. }
  1668. p.nextToken()
  1669. // Parse table name
  1670. if !p.curTokenIs(lexer.TokenIdent) {
  1671. return nil, p.curError("expected table name")
  1672. }
  1673. stmt.Table = p.curToken.Literal
  1674. p.nextToken()
  1675. // PostgreSQL index methods. The engine only implements an ordered btree
  1676. // index, so a request for GIN (the jsonb index method) or any other method is
  1677. // rejected instead of silently creating a btree index with different
  1678. // performance and constraint behavior.
  1679. if p.curTokenIs(lexer.TokenUSING) {
  1680. p.nextToken()
  1681. if !p.curTokenIs(lexer.TokenIdent) {
  1682. return nil, p.curError("expected index method after USING")
  1683. }
  1684. method := strings.ToUpper(p.curToken.Literal)
  1685. p.nextToken()
  1686. if method != "BTREE" {
  1687. return nil, pgerror.Unsupported("index method %s is not supported; only BTREE indexes are implemented", method)
  1688. }
  1689. }
  1690. // Expect (
  1691. if !p.curTokenIs(lexer.TokenLParen) {
  1692. return nil, p.curError("expected (")
  1693. }
  1694. p.nextToken()
  1695. // Parse column list. Each element is either a bare column name or an
  1696. // arbitrary deterministic expression (e.g. lower(email)).
  1697. for {
  1698. if p.curTokenIs(lexer.TokenRParen) {
  1699. break
  1700. }
  1701. expr, err := p.parseExpr()
  1702. if err != nil {
  1703. return nil, err
  1704. }
  1705. col := IndexColumn{}
  1706. if ref, ok := expr.(*ColumnRef); ok && ref.Table == "" {
  1707. col.Name = ref.Column
  1708. } else {
  1709. col.Expr = expr
  1710. col.Name = FormatExpr(expr)
  1711. }
  1712. // Check for ASC/DESC
  1713. if p.curTokenIs(lexer.TokenASC) {
  1714. p.nextToken()
  1715. } else if p.curTokenIs(lexer.TokenDESC) {
  1716. col.Desc = true
  1717. p.nextToken()
  1718. }
  1719. stmt.Columns = append(stmt.Columns, col)
  1720. if p.curTokenIs(lexer.TokenComma) {
  1721. p.nextToken()
  1722. } else {
  1723. break
  1724. }
  1725. }
  1726. if !p.curTokenIs(lexer.TokenRParen) {
  1727. return nil, p.curError("expected )")
  1728. }
  1729. p.nextToken()
  1730. return stmt, nil
  1731. }
  1732. // parseDrop parses DROP statements.
  1733. func (p *Parser) parseDrop() (Statement, error) {
  1734. p.nextToken() // consume DROP
  1735. switch p.curToken.Type {
  1736. case lexer.TokenTABLE:
  1737. return p.parseDropTable()
  1738. case lexer.TokenINDEX:
  1739. return p.parseDropIndex()
  1740. case lexer.TokenVIEW:
  1741. return p.parseDropView()
  1742. default:
  1743. return nil, p.curError("expected TABLE or INDEX after DROP")
  1744. }
  1745. }
  1746. func (p *Parser) parseDropTable() (*DropTableStmt, error) {
  1747. stmt := &DropTableStmt{}
  1748. p.nextToken() // consume TABLE
  1749. // Check for IF EXISTS
  1750. if p.curTokenIs(lexer.TokenIF) {
  1751. p.nextToken()
  1752. if !p.curTokenIs(lexer.TokenEXISTS) {
  1753. return nil, p.curError("expected EXISTS")
  1754. }
  1755. stmt.IfExists = true
  1756. p.nextToken()
  1757. }
  1758. // Parse table names
  1759. for {
  1760. table, err := p.parseTableRef(false)
  1761. if err != nil {
  1762. return nil, err
  1763. }
  1764. stmt.Tables = append(stmt.Tables, table)
  1765. if !p.curTokenIs(lexer.TokenComma) {
  1766. break
  1767. }
  1768. p.nextToken()
  1769. }
  1770. return stmt, nil
  1771. }
  1772. func (p *Parser) parseDropIndex() (*DropIndexStmt, error) {
  1773. stmt := &DropIndexStmt{}
  1774. p.nextToken() // consume INDEX
  1775. // Check for IF EXISTS
  1776. if p.curTokenIs(lexer.TokenIF) {
  1777. p.nextToken()
  1778. if !p.curTokenIs(lexer.TokenEXISTS) {
  1779. return nil, p.curError("expected EXISTS")
  1780. }
  1781. stmt.IfExists = true
  1782. p.nextToken()
  1783. }
  1784. // Parse index name
  1785. if !p.curTokenIs(lexer.TokenIdent) {
  1786. return nil, p.curError("expected index name")
  1787. }
  1788. stmt.Name = p.curToken.Literal
  1789. p.nextToken()
  1790. return stmt, nil
  1791. }
  1792. func (p *Parser) parseCreateView() (*CreateViewStmt, error) {
  1793. stmt := &CreateViewStmt{}
  1794. p.nextToken() // consume VIEW
  1795. if p.curTokenIs(lexer.TokenIF) {
  1796. p.nextToken()
  1797. if !p.curTokenIs(lexer.TokenNOT) {
  1798. return nil, p.curError("expected NOT")
  1799. }
  1800. p.nextToken()
  1801. if !p.curTokenIs(lexer.TokenEXISTS) {
  1802. return nil, p.curError("expected EXISTS")
  1803. }
  1804. stmt.IfNotExists = true
  1805. p.nextToken()
  1806. }
  1807. // Parse view name directly — do NOT use parseTableRef here because it
  1808. // greedily interprets the AS keyword as an alias, consuming "AS SELECT".
  1809. if !p.curTokenIs(lexer.TokenIdent) {
  1810. return nil, p.curError("expected view name")
  1811. }
  1812. stmt.View = &TableRef{Name: p.curToken.Literal}
  1813. p.nextToken()
  1814. if !p.curTokenIs(lexer.TokenAS) {
  1815. return nil, p.curError("expected AS after view name")
  1816. }
  1817. p.nextToken() // consume AS
  1818. sel, err := p.parseSelect()
  1819. if err != nil {
  1820. return nil, err
  1821. }
  1822. stmt.Select = sel
  1823. return stmt, nil
  1824. }
  1825. func (p *Parser) parseDropView() (*DropViewStmt, error) {
  1826. stmt := &DropViewStmt{}
  1827. p.nextToken() // consume VIEW
  1828. if p.curTokenIs(lexer.TokenIF) {
  1829. p.nextToken()
  1830. if !p.curTokenIs(lexer.TokenEXISTS) {
  1831. return nil, p.curError("expected EXISTS")
  1832. }
  1833. stmt.IfExists = true
  1834. p.nextToken()
  1835. }
  1836. for {
  1837. view, err := p.parseTableRef(false)
  1838. if err != nil {
  1839. return nil, err
  1840. }
  1841. stmt.Views = append(stmt.Views, view)
  1842. if !p.curTokenIs(lexer.TokenComma) {
  1843. break
  1844. }
  1845. p.nextToken()
  1846. }
  1847. return stmt, nil
  1848. }
  1849. // parseAlter parses an ALTER statement.
  1850. func (p *Parser) parseAlter() (Statement, error) {
  1851. p.nextToken() // consume ALTER
  1852. if p.curTokenIs(lexer.TokenTABLE) {
  1853. return p.parseAlterTable()
  1854. }
  1855. return nil, p.curError("expected TABLE after ALTER")
  1856. }
  1857. // parseAlterTable parses an ALTER TABLE statement.
  1858. func (p *Parser) parseAlterTable() (*AlterTableStmt, error) {
  1859. stmt := &AlterTableStmt{}
  1860. p.nextToken() // consume TABLE
  1861. // Parse table name
  1862. if !p.curTokenIs(lexer.TokenIdent) {
  1863. return nil, p.curError("expected table name")
  1864. }
  1865. stmt.Table = p.curToken.Literal
  1866. p.nextToken()
  1867. // Parse action
  1868. switch p.curToken.Type {
  1869. case lexer.TokenADD:
  1870. return p.parseAlterTableAdd(stmt)
  1871. case lexer.TokenDROP:
  1872. return p.parseAlterTableDrop(stmt)
  1873. case lexer.TokenRENAME:
  1874. return p.parseAlterTableRename(stmt)
  1875. default:
  1876. return nil, p.curError("expected ADD, DROP, or RENAME")
  1877. }
  1878. }
  1879. // parseAlterTableAdd parses ALTER TABLE ADD COLUMN.
  1880. func (p *Parser) parseAlterTableAdd(stmt *AlterTableStmt) (*AlterTableStmt, error) {
  1881. p.nextToken() // consume ADD
  1882. // COLUMN keyword is optional
  1883. if p.curTokenIs(lexer.TokenCOLUMN) {
  1884. p.nextToken()
  1885. }
  1886. ifNotExists := false
  1887. if p.curTokenIs(lexer.TokenIF) {
  1888. ifNotExists = true
  1889. p.nextToken()
  1890. if !p.curTokenIs(lexer.TokenNOT) {
  1891. return nil, p.curError("expected NOT after IF")
  1892. }
  1893. p.nextToken()
  1894. if !p.curTokenIs(lexer.TokenEXISTS) {
  1895. return nil, p.curError("expected EXISTS after IF NOT")
  1896. }
  1897. p.nextToken()
  1898. }
  1899. // Parse column definition
  1900. col, err := p.parseColumnDef()
  1901. if err != nil {
  1902. return nil, err
  1903. }
  1904. stmt.Action = &AddColumnAction{Column: col, IfNotExists: ifNotExists}
  1905. return stmt, nil
  1906. }
  1907. // parseAlterTableDrop parses ALTER TABLE DROP COLUMN.
  1908. func (p *Parser) parseAlterTableDrop(stmt *AlterTableStmt) (*AlterTableStmt, error) {
  1909. p.nextToken() // consume DROP
  1910. // COLUMN keyword is optional in some databases but required in SQLite
  1911. if p.curTokenIs(lexer.TokenCOLUMN) {
  1912. p.nextToken()
  1913. }
  1914. // Parse column name
  1915. if !p.curIsName() {
  1916. return nil, p.curError("expected column name")
  1917. }
  1918. stmt.Action = &DropColumnAction{Column: p.curToken.Literal}
  1919. p.nextToken()
  1920. return stmt, nil
  1921. }
  1922. // parseAlterTableRename parses ALTER TABLE RENAME.
  1923. func (p *Parser) parseAlterTableRename(stmt *AlterTableStmt) (*AlterTableStmt, error) {
  1924. p.nextToken() // consume RENAME
  1925. // Check for RENAME TO (table rename) or RENAME COLUMN (column rename)
  1926. if p.curTokenIs(lexer.TokenTO) {
  1927. // RENAME TO newname
  1928. p.nextToken()
  1929. if !p.curTokenIs(lexer.TokenIdent) {
  1930. return nil, p.curError("expected new table name")
  1931. }
  1932. stmt.Action = &RenameTableAction{NewName: p.curToken.Literal}
  1933. p.nextToken()
  1934. } else if p.curTokenIs(lexer.TokenCOLUMN) {
  1935. // RENAME COLUMN oldname TO newname
  1936. p.nextToken()
  1937. if !p.curTokenIs(lexer.TokenIdent) {
  1938. return nil, p.curError("expected old column name")
  1939. }
  1940. oldName := p.curToken.Literal
  1941. p.nextToken()
  1942. if !p.curTokenIs(lexer.TokenTO) {
  1943. return nil, p.curError("expected TO")
  1944. }
  1945. p.nextToken()
  1946. if !p.curTokenIs(lexer.TokenIdent) {
  1947. return nil, p.curError("expected new column name")
  1948. }
  1949. newName := p.curToken.Literal
  1950. p.nextToken()
  1951. stmt.Action = &RenameColumnAction{OldName: oldName, NewName: newName}
  1952. } else {
  1953. return nil, p.curError("expected TO or COLUMN after RENAME")
  1954. }
  1955. return stmt, nil
  1956. }
  1957. // parsePragma parses a PRAGMA statement.
  1958. // Formats: PRAGMA name; PRAGMA name(arg); PRAGMA name = value;
  1959. func (p *Parser) parsePragma() (*PragmaStmt, error) {
  1960. stmt := &PragmaStmt{}
  1961. p.nextToken() // consume PRAGMA
  1962. // Parse pragma name
  1963. if !p.curTokenIs(lexer.TokenIdent) {
  1964. return nil, p.curError("expected pragma name")
  1965. }
  1966. stmt.Name = strings.ToLower(p.curToken.Literal)
  1967. p.nextToken()
  1968. // Check for argument in parentheses: PRAGMA table_info(tablename)
  1969. if p.curTokenIs(lexer.TokenLParen) {
  1970. p.nextToken()
  1971. if p.curTokenIs(lexer.TokenIdent) || p.curTokenIs(lexer.TokenString) {
  1972. stmt.Arg = p.curToken.Literal
  1973. p.nextToken()
  1974. }
  1975. if !p.curTokenIs(lexer.TokenRParen) {
  1976. return nil, p.curError("expected )")
  1977. }
  1978. p.nextToken()
  1979. }
  1980. // Check for value assignment: PRAGMA name = value
  1981. if p.curTokenIs(lexer.TokenEq) {
  1982. p.nextToken()
  1983. // ON is a keyword token, so it cannot start an expression. Accept it here
  1984. // as the value for boolean pragmas such as PRAGMA foreign_keys = ON.
  1985. if p.curTokenIs(lexer.TokenON) {
  1986. stmt.Value = &ColumnRef{Column: "on"}
  1987. p.nextToken()
  1988. return stmt, nil
  1989. }
  1990. val, err := p.parseExpr()
  1991. if err != nil {
  1992. return nil, err
  1993. }
  1994. stmt.Value = val
  1995. }
  1996. return stmt, nil
  1997. }
  1998. // parseAnalyze parses ANALYZE [schema.]table. PizzaSQL does not maintain
  1999. // optimizer statistics, so the statement is accepted and ignored at execution.
  2000. func (p *Parser) parseAnalyze() (*AnalyzeStmt, error) {
  2001. stmt := &AnalyzeStmt{}
  2002. p.nextToken() // consume ANALYZE
  2003. if p.curTokenIs(lexer.TokenIdent) {
  2004. stmt.Name = p.curToken.Literal
  2005. p.nextToken()
  2006. if p.curTokenIs(lexer.TokenDot) {
  2007. p.nextToken()
  2008. if !p.curTokenIs(lexer.TokenIdent) {
  2009. return nil, p.curError("expected table name after .")
  2010. }
  2011. stmt.Name = p.curToken.Literal
  2012. p.nextToken()
  2013. }
  2014. }
  2015. return stmt, nil
  2016. }
  2017. // parseExplain parses an EXPLAIN statement.
  2018. func (p *Parser) parseExplain() (*ExplainStmt, error) {
  2019. stmt := &ExplainStmt{}
  2020. p.nextToken() // consume EXPLAIN
  2021. // Check for QUERY PLAN. PLAN is not a reserved lexer keyword so it can be a
  2022. // column name; recognize it contextually here.
  2023. if p.curTokenIs(lexer.TokenQUERY) {
  2024. p.nextToken()
  2025. if !p.curIdentIs("PLAN") {
  2026. return nil, p.curError("expected PLAN after QUERY")
  2027. }
  2028. stmt.QueryPlan = true
  2029. p.nextToken()
  2030. }
  2031. // Parse the statement being explained
  2032. innerStmt, err := p.parseStatement()
  2033. if err != nil {
  2034. return nil, err
  2035. }
  2036. stmt.Statement = innerStmt
  2037. return stmt, nil
  2038. }
  2039. // Transaction statement parsing
  2040. // parseChannelName consumes a channel identifier. PostgreSQL channel names are
  2041. // identifiers (quoted or unquoted) and are limited to 63 bytes, matching
  2042. // NAMEDATALEN - 1.
  2043. func (p *Parser) parseChannelName() (string, error) {
  2044. if !p.curTokenIs(lexer.TokenIdent) {
  2045. return "", p.curError("expected channel name")
  2046. }
  2047. channel := p.curToken.Literal
  2048. if channel == "" {
  2049. return "", p.curError("channel name cannot be empty")
  2050. }
  2051. if len(channel) > 63 {
  2052. return "", p.curError("channel name is longer than 63 bytes")
  2053. }
  2054. p.nextToken()
  2055. return channel, nil
  2056. }
  2057. func (p *Parser) parseListen() (*ListenStmt, error) {
  2058. p.nextToken() // consume LISTEN
  2059. channel, err := p.parseChannelName()
  2060. if err != nil {
  2061. return nil, err
  2062. }
  2063. return &ListenStmt{Channel: channel}, nil
  2064. }
  2065. func (p *Parser) parseUnlisten() (*UnlistenStmt, error) {
  2066. p.nextToken() // consume UNLISTEN
  2067. if p.curTokenIs(lexer.TokenStar) {
  2068. p.nextToken()
  2069. return &UnlistenStmt{All: true}, nil
  2070. }
  2071. channel, err := p.parseChannelName()
  2072. if err != nil {
  2073. return nil, err
  2074. }
  2075. return &UnlistenStmt{Channel: channel}, nil
  2076. }
  2077. func (p *Parser) parseNotify() (*NotifyStmt, error) {
  2078. p.nextToken() // consume NOTIFY
  2079. channel, err := p.parseChannelName()
  2080. if err != nil {
  2081. return nil, err
  2082. }
  2083. stmt := &NotifyStmt{Channel: channel}
  2084. if p.curTokenIs(lexer.TokenComma) {
  2085. p.nextToken()
  2086. if !p.curTokenIs(lexer.TokenString) {
  2087. return nil, p.curError("expected notification payload string")
  2088. }
  2089. if len(p.curToken.Literal) > 8000 {
  2090. return nil, p.curError("notification payload is longer than 8000 bytes")
  2091. }
  2092. stmt.Payload = p.curToken.Literal
  2093. p.nextToken()
  2094. }
  2095. return stmt, nil
  2096. }
  2097. func (p *Parser) parseBegin() (*BeginStmt, error) {
  2098. stmt := &BeginStmt{}
  2099. p.nextToken() // consume BEGIN
  2100. // Optional TRANSACTION keyword
  2101. if p.curTokenIs(lexer.TokenTRANSACTION) {
  2102. p.nextToken()
  2103. }
  2104. return stmt, nil
  2105. }
  2106. func (p *Parser) parseCommit() (*CommitStmt, error) {
  2107. p.nextToken() // consume COMMIT
  2108. // Optional TRANSACTION keyword
  2109. if p.curTokenIs(lexer.TokenTRANSACTION) {
  2110. p.nextToken()
  2111. }
  2112. return &CommitStmt{}, nil
  2113. }
  2114. func (p *Parser) parseRollback() (*RollbackStmt, error) {
  2115. stmt := &RollbackStmt{}
  2116. p.nextToken() // consume ROLLBACK
  2117. // Check for ROLLBACK TO [SAVEPOINT] name
  2118. if p.curTokenIs(lexer.TokenTO) {
  2119. p.nextToken()
  2120. // Optional SAVEPOINT keyword
  2121. if p.curTokenIs(lexer.TokenSAVEPOINT) {
  2122. p.nextToken()
  2123. }
  2124. if !p.curTokenIs(lexer.TokenIdent) {
  2125. return nil, p.curError("expected savepoint name")
  2126. }
  2127. stmt.Savepoint = p.curToken.Literal
  2128. p.nextToken()
  2129. } else if p.curTokenIs(lexer.TokenTRANSACTION) {
  2130. // Optional TRANSACTION keyword
  2131. p.nextToken()
  2132. }
  2133. return stmt, nil
  2134. }
  2135. func (p *Parser) parseSavepoint() (*SavepointStmt, error) {
  2136. p.nextToken() // consume SAVEPOINT
  2137. if !p.curTokenIs(lexer.TokenIdent) {
  2138. return nil, p.curError("expected savepoint name")
  2139. }
  2140. stmt := &SavepointStmt{Name: p.curToken.Literal}
  2141. p.nextToken()
  2142. return stmt, nil
  2143. }
  2144. func (p *Parser) parseRelease() (*ReleaseStmt, error) {
  2145. p.nextToken() // consume RELEASE
  2146. // Optional SAVEPOINT keyword
  2147. if p.curTokenIs(lexer.TokenSAVEPOINT) {
  2148. p.nextToken()
  2149. }
  2150. if !p.curTokenIs(lexer.TokenIdent) {
  2151. return nil, p.curError("expected savepoint name")
  2152. }
  2153. stmt := &ReleaseStmt{Name: p.curToken.Literal}
  2154. p.nextToken()
  2155. return stmt, nil
  2156. }
  2157. // parseAttach parses an ATTACH DATABASE statement.
  2158. // Syntax: ATTACH [DATABASE] 'filepath' AS alias
  2159. func (p *Parser) parseAttach() (*AttachStmt, error) {
  2160. stmt := &AttachStmt{}
  2161. p.nextToken() // consume ATTACH
  2162. // Optional DATABASE keyword
  2163. if p.curTokenIs(lexer.TokenDATABASE) {
  2164. p.nextToken()
  2165. }
  2166. // Parse file path (string literal)
  2167. if !p.curTokenIs(lexer.TokenString) {
  2168. return nil, p.curError("expected database file path (string)")
  2169. }
  2170. stmt.FilePath = p.curToken.Literal
  2171. p.nextToken()
  2172. // Expect AS keyword
  2173. if !p.curTokenIs(lexer.TokenAS) {
  2174. return nil, p.curError("expected AS")
  2175. }
  2176. p.nextToken()
  2177. // Parse database alias
  2178. if !p.curTokenIs(lexer.TokenIdent) {
  2179. return nil, p.curError("expected database alias")
  2180. }
  2181. stmt.Alias = p.curToken.Literal
  2182. p.nextToken()
  2183. return stmt, nil
  2184. }
  2185. // parseDetach parses a DETACH DATABASE statement.
  2186. // Syntax: DETACH [DATABASE] alias
  2187. func (p *Parser) parseDetach() (*DetachStmt, error) {
  2188. stmt := &DetachStmt{}
  2189. p.nextToken() // consume DETACH
  2190. // Optional DATABASE keyword
  2191. if p.curTokenIs(lexer.TokenDATABASE) {
  2192. p.nextToken()
  2193. }
  2194. // Parse database alias
  2195. if !p.curTokenIs(lexer.TokenIdent) {
  2196. return nil, p.curError("expected database alias")
  2197. }
  2198. stmt.Alias = p.curToken.Literal
  2199. p.nextToken()
  2200. return stmt, nil
  2201. }
  2202. // Expression parsing with operator precedence
  2203. func (p *Parser) parseExpr() (Expr, error) {
  2204. return p.parseOrExpr()
  2205. }
  2206. func (p *Parser) parseOrExpr() (Expr, error) {
  2207. left, err := p.parseAndExpr()
  2208. if err != nil {
  2209. return nil, err
  2210. }
  2211. for p.curTokenIs(lexer.TokenOR) {
  2212. op := p.curToken.Type
  2213. p.nextToken()
  2214. right, err := p.parseAndExpr()
  2215. if err != nil {
  2216. return nil, err
  2217. }
  2218. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2219. }
  2220. return left, nil
  2221. }
  2222. func (p *Parser) parseAndExpr() (Expr, error) {
  2223. left, err := p.parseNotExpr()
  2224. if err != nil {
  2225. return nil, err
  2226. }
  2227. for p.curTokenIs(lexer.TokenAND) {
  2228. op := p.curToken.Type
  2229. p.nextToken()
  2230. right, err := p.parseNotExpr()
  2231. if err != nil {
  2232. return nil, err
  2233. }
  2234. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2235. }
  2236. return left, nil
  2237. }
  2238. func (p *Parser) parseNotExpr() (Expr, error) {
  2239. if p.curTokenIs(lexer.TokenNOT) {
  2240. p.nextToken()
  2241. operand, err := p.parseNotExpr()
  2242. if err != nil {
  2243. return nil, err
  2244. }
  2245. return &UnaryExpr{Op: lexer.TokenNOT, Operand: operand}, nil
  2246. }
  2247. return p.parseComparisonExpr()
  2248. }
  2249. func (p *Parser) parseComparisonExpr() (Expr, error) {
  2250. left, err := p.parseBitwiseExpr()
  2251. if err != nil {
  2252. return nil, err
  2253. }
  2254. // Handle IS NULL / IS NOT NULL and IS [NOT] DISTINCT FROM.
  2255. if p.curTokenIs(lexer.TokenIS) {
  2256. p.nextToken()
  2257. not := false
  2258. if p.curTokenIs(lexer.TokenNOT) {
  2259. not = true
  2260. p.nextToken()
  2261. }
  2262. if p.curTokenIs(lexer.TokenDISTINCT) {
  2263. p.nextToken()
  2264. if !p.curTokenIs(lexer.TokenFROM) {
  2265. return nil, p.curError("expected FROM after IS [NOT] DISTINCT")
  2266. }
  2267. p.nextToken()
  2268. right, err := p.parseBitwiseExpr()
  2269. if err != nil {
  2270. return nil, err
  2271. }
  2272. return &IsDistinctExpr{Left: left, Right: right, Not: not}, nil
  2273. }
  2274. if !p.curTokenIs(lexer.TokenNULL) {
  2275. return nil, p.curError("expected NULL or DISTINCT FROM after IS")
  2276. }
  2277. p.nextToken()
  2278. return &IsNullExpr{Left: left, Not: not}, nil
  2279. }
  2280. // Handle IN / NOT IN
  2281. not := false
  2282. if p.curTokenIs(lexer.TokenNOT) {
  2283. not = true
  2284. p.nextToken()
  2285. }
  2286. if p.curTokenIs(lexer.TokenIN) {
  2287. p.nextToken()
  2288. return p.parseInExpr(left, not)
  2289. }
  2290. // Handle BETWEEN
  2291. if p.curTokenIs(lexer.TokenBETWEEN) {
  2292. p.nextToken()
  2293. return p.parseBetweenExpr(left, not)
  2294. }
  2295. // Handle LIKE
  2296. if p.curTokenIs(lexer.TokenLIKE) {
  2297. p.nextToken()
  2298. return p.parseLikeExpr(left, not)
  2299. }
  2300. // If we consumed NOT but didn't find IN/BETWEEN/LIKE, it's an error
  2301. if not {
  2302. return nil, p.curError("expected IN, BETWEEN, or LIKE after NOT")
  2303. }
  2304. // JSONB containment and existence operators share the comparison layer:
  2305. // they bind looser than + and || and tighter than NOT/AND/OR.
  2306. if isJSONBPredicateOp(p.curToken.Type) {
  2307. op := p.curToken.Type
  2308. p.nextToken()
  2309. right, err := p.parseBitwiseExpr()
  2310. if err != nil {
  2311. return nil, err
  2312. }
  2313. return &BinaryExpr{Left: left, Op: op, Right: right}, nil
  2314. }
  2315. if p.curTokenIs(lexer.TokenAtQuestion) || p.curTokenIs(lexer.TokenAtAt) {
  2316. return nil, pgerror.Unsupported("jsonpath operators @? and @@ are not supported")
  2317. }
  2318. // Handle comparison operators, including the quantified forms
  2319. // `expr op ANY(array)` and `expr op ALL(array)`.
  2320. if isComparisonOp(p.curToken.Type) {
  2321. op := p.curToken.Type
  2322. p.nextToken()
  2323. if p.curTokenIs(lexer.TokenALL) && p.peekTokenIs(lexer.TokenLParen) {
  2324. p.nextToken() // ALL
  2325. array, err := p.parseQuantifierArray()
  2326. if err != nil {
  2327. return nil, err
  2328. }
  2329. return &AnyAllExpr{Left: left, Op: op, All: true, Array: array}, nil
  2330. }
  2331. if p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "ANY") && p.peekTokenIs(lexer.TokenLParen) {
  2332. p.nextToken() // ANY
  2333. array, err := p.parseQuantifierArray()
  2334. if err != nil {
  2335. return nil, err
  2336. }
  2337. return &AnyAllExpr{Left: left, Op: op, Array: array}, nil
  2338. }
  2339. right, err := p.parseBitwiseExpr()
  2340. if err != nil {
  2341. return nil, err
  2342. }
  2343. return &BinaryExpr{Left: left, Op: op, Right: right}, nil
  2344. }
  2345. return left, nil
  2346. }
  2347. // parseQuantifierArray parses the parenthesized operand of ANY(...) or
  2348. // ALL(...). Arrays are the only supported operand; a subquery would need a
  2349. // materialized set the executor does not build for this form.
  2350. func (p *Parser) parseQuantifierArray() (Expr, error) {
  2351. if !p.curTokenIs(lexer.TokenLParen) {
  2352. return nil, p.curError("expected ( after ANY or ALL")
  2353. }
  2354. p.nextToken()
  2355. if p.curTokenIs(lexer.TokenSELECT) {
  2356. return nil, pgerror.Unsupported("ANY/ALL over a subquery is not supported; pass an array value instead")
  2357. }
  2358. array, err := p.parseExpr()
  2359. if err != nil {
  2360. return nil, err
  2361. }
  2362. if !p.curTokenIs(lexer.TokenRParen) {
  2363. return nil, p.curError("expected ) after ANY/ALL operand")
  2364. }
  2365. p.nextToken()
  2366. return array, nil
  2367. }
  2368. // parseArrayConstructor parses ARRAY[...] with the current token on ARRAY.
  2369. // Nested constructors and nested array literals are rejected: PizzaSQL has no
  2370. // multidimensional arrays.
  2371. func (p *Parser) parseArrayConstructor() (Expr, error) {
  2372. p.nextToken() // ARRAY
  2373. if !p.curTokenIs(lexer.TokenLBracket) {
  2374. return nil, p.curError("expected [ after ARRAY")
  2375. }
  2376. p.nextToken()
  2377. expr := &ArrayExpr{}
  2378. if p.curTokenIs(lexer.TokenRBracket) {
  2379. p.nextToken()
  2380. return expr, nil
  2381. }
  2382. for {
  2383. // A bracketed identifier here is ARRAY[[...]] (or ARRAY[[col]]): the
  2384. // lexer reads the inner brackets as SQLite quoting, so report the
  2385. // nested-array shape explicitly instead of resolving a bogus column.
  2386. if p.curTokenIs(lexer.TokenIdent) && p.curToken.Bracketed {
  2387. return nil, pgerror.Unsupported("multidimensional arrays are not supported; ARRAY[...] elements must be scalars")
  2388. }
  2389. element, err := p.parseExpr()
  2390. if err != nil {
  2391. return nil, err
  2392. }
  2393. if _, nested := element.(*ArrayExpr); nested {
  2394. return nil, pgerror.Unsupported("multidimensional arrays are not supported; ARRAY[...] elements must be scalars")
  2395. }
  2396. expr.Elements = append(expr.Elements, element)
  2397. if p.curTokenIs(lexer.TokenComma) {
  2398. p.nextToken()
  2399. continue
  2400. }
  2401. if !p.curTokenIs(lexer.TokenRBracket) {
  2402. return nil, p.curError("expected ] after ARRAY elements")
  2403. }
  2404. p.nextToken()
  2405. return expr, nil
  2406. }
  2407. }
  2408. func isComparisonOp(t lexer.TokenType) bool {
  2409. switch t {
  2410. case lexer.TokenEq, lexer.TokenNeq, lexer.TokenLt,
  2411. lexer.TokenLte, lexer.TokenGt, lexer.TokenGte:
  2412. return true
  2413. }
  2414. return false
  2415. }
  2416. // isJSONBPredicateOp reports whether t is a jsonb containment or key-existence
  2417. // operator. They parse at comparison precedence as a single binary predicate.
  2418. func isJSONBPredicateOp(t lexer.TokenType) bool {
  2419. switch t {
  2420. case lexer.TokenAtArrow, lexer.TokenLtAt,
  2421. lexer.TokenQuestion, lexer.TokenQuestionPipe, lexer.TokenQuestionAmp:
  2422. return true
  2423. }
  2424. return false
  2425. }
  2426. // parseBitwiseExpr parses the SQLite bitwise layer: << >> & | bind more tightly
  2427. // than comparisons but more loosely than + and -.
  2428. func (p *Parser) parseBitwiseExpr() (Expr, error) {
  2429. left, err := p.parseAddExpr()
  2430. if err != nil {
  2431. return nil, err
  2432. }
  2433. for {
  2434. switch p.curToken.Type {
  2435. case lexer.TokenShiftLeft, lexer.TokenShiftRight, lexer.TokenBitAnd, lexer.TokenBitOr:
  2436. op := p.curToken.Type
  2437. p.nextToken()
  2438. right, err := p.parseAddExpr()
  2439. if err != nil {
  2440. return nil, err
  2441. }
  2442. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2443. default:
  2444. return left, nil
  2445. }
  2446. }
  2447. }
  2448. func (p *Parser) parseInExpr(left Expr, not bool) (Expr, error) {
  2449. expr := &InExpr{Left: left, Not: not}
  2450. if !p.curTokenIs(lexer.TokenLParen) {
  2451. return nil, p.curError("expected (")
  2452. }
  2453. p.nextToken()
  2454. // Check for subquery
  2455. if p.curTokenIs(lexer.TokenSELECT) {
  2456. sel, err := p.parseSelect()
  2457. if err != nil {
  2458. return nil, err
  2459. }
  2460. expr.Subquery = sel
  2461. } else if !p.curTokenIs(lexer.TokenRParen) {
  2462. // Value list (empty list is allowed — always false)
  2463. values, err := p.parseExprList()
  2464. if err != nil {
  2465. return nil, err
  2466. }
  2467. expr.Values = values
  2468. }
  2469. if !p.curTokenIs(lexer.TokenRParen) {
  2470. return nil, p.curError("expected )")
  2471. }
  2472. p.nextToken()
  2473. return expr, nil
  2474. }
  2475. func (p *Parser) parseBetweenExpr(left Expr, not bool) (Expr, error) {
  2476. low, err := p.parseBitwiseExpr()
  2477. if err != nil {
  2478. return nil, err
  2479. }
  2480. if !p.curTokenIs(lexer.TokenAND) {
  2481. return nil, p.curError("expected AND in BETWEEN")
  2482. }
  2483. p.nextToken()
  2484. high, err := p.parseBitwiseExpr()
  2485. if err != nil {
  2486. return nil, err
  2487. }
  2488. return &BetweenExpr{Left: left, Not: not, Low: low, High: high}, nil
  2489. }
  2490. func (p *Parser) parseLikeExpr(left Expr, not bool) (Expr, error) {
  2491. pattern, err := p.parseBitwiseExpr()
  2492. if err != nil {
  2493. return nil, err
  2494. }
  2495. expr := &LikeExpr{Left: left, Not: not, Pattern: pattern}
  2496. // Check for ESCAPE
  2497. if p.curTokenIs(lexer.TokenESCAPE) {
  2498. p.nextToken()
  2499. esc, err := p.parseBitwiseExpr()
  2500. if err != nil {
  2501. return nil, err
  2502. }
  2503. expr.Escape = esc
  2504. }
  2505. return expr, nil
  2506. }
  2507. func (p *Parser) parseAddExpr() (Expr, error) {
  2508. left, err := p.parseMulExpr()
  2509. if err != nil {
  2510. return nil, err
  2511. }
  2512. for p.curTokenIs(lexer.TokenPlus) || p.curTokenIs(lexer.TokenMinus) || p.curTokenIs(lexer.TokenConcat) {
  2513. op := p.curToken.Type
  2514. p.nextToken()
  2515. right, err := p.parseMulExpr()
  2516. if err != nil {
  2517. return nil, err
  2518. }
  2519. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2520. }
  2521. return left, nil
  2522. }
  2523. func (p *Parser) parseMulExpr() (Expr, error) {
  2524. left, err := p.parseJSONExpr()
  2525. if err != nil {
  2526. return nil, err
  2527. }
  2528. for p.curTokenIs(lexer.TokenStar) || p.curTokenIs(lexer.TokenSlash) || p.curTokenIs(lexer.TokenPercent) {
  2529. op := p.curToken.Type
  2530. p.nextToken()
  2531. right, err := p.parseJSONExpr()
  2532. if err != nil {
  2533. return nil, err
  2534. }
  2535. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2536. }
  2537. return left, nil
  2538. }
  2539. // parseJSONExpr parses the JSON extraction and path operators ->, ->>, #>,
  2540. // #>>, and #-.
  2541. //
  2542. // Precedence: they bind tighter than multiplicative, additive/concatenation,
  2543. // bitwise, and comparison operators, and looser than unary -, +, and ~. So
  2544. // "a -> 'x' || 'y'" concatenates the extracted value, "a -> 'x' = 1" compares
  2545. // it, and "-a -> 'x'" negates a before extraction. They are left-associative,
  2546. // so "a -> 'x' -> 0" extracts 'x' and then indexes the result at 0.
  2547. func (p *Parser) parseJSONExpr() (Expr, error) {
  2548. left, err := p.parseUnaryExpr()
  2549. if err != nil {
  2550. return nil, err
  2551. }
  2552. for {
  2553. switch p.curToken.Type {
  2554. case lexer.TokenArrow, lexer.TokenArrowText,
  2555. lexer.TokenHashArrow, lexer.TokenHashArrowText, lexer.TokenHashMinus:
  2556. op := p.curToken.Type
  2557. p.nextToken()
  2558. right, err := p.parseUnaryExpr()
  2559. if err != nil {
  2560. return nil, err
  2561. }
  2562. left = &BinaryExpr{Left: left, Op: op, Right: right}
  2563. default:
  2564. return left, nil
  2565. }
  2566. }
  2567. }
  2568. func (p *Parser) parseUnaryExpr() (Expr, error) {
  2569. if p.curTokenIs(lexer.TokenMinus) || p.curTokenIs(lexer.TokenPlus) || p.curTokenIs(lexer.TokenBitNot) {
  2570. op := p.curToken.Type
  2571. p.nextToken()
  2572. operand, err := p.parseUnaryExpr()
  2573. if err != nil {
  2574. return nil, err
  2575. }
  2576. return &UnaryExpr{Op: op, Operand: operand}, nil
  2577. }
  2578. return p.parsePrimaryExpr()
  2579. }
  2580. // parsePrimaryExpr parses a primary expression and applies the postfix
  2581. // operators that bind tighter than any prefix operator: array element
  2582. // subscripts (arr[idx]) and PostgreSQL-style casts (expr::type).
  2583. func (p *Parser) parsePrimaryExpr() (Expr, error) {
  2584. expr, err := p.parsePrimaryExprBase()
  2585. if err != nil {
  2586. return nil, err
  2587. }
  2588. for {
  2589. switch {
  2590. case p.curTokenIs(lexer.TokenLBracket):
  2591. p.nextToken()
  2592. index, indexErr := p.parseExpr()
  2593. if indexErr != nil {
  2594. return nil, indexErr
  2595. }
  2596. if !p.curTokenIs(lexer.TokenRBracket) {
  2597. return nil, p.curError("expected ] after array subscript")
  2598. }
  2599. p.nextToken()
  2600. expr = &SubscriptExpr{Expr: expr, Index: index}
  2601. case p.curTokenIs(lexer.TokenColonColon):
  2602. p.nextToken()
  2603. dataType, typeErr := p.parseDataType()
  2604. if typeErr != nil {
  2605. return nil, typeErr
  2606. }
  2607. expr = &CastExpr{Expr: expr, Type: *dataType}
  2608. default:
  2609. return expr, nil
  2610. }
  2611. }
  2612. }
  2613. func (p *Parser) parsePrimaryExprBase() (Expr, error) {
  2614. switch p.curToken.Type {
  2615. case lexer.TokenALL:
  2616. if p.peekTokenIs(lexer.TokenLParen) {
  2617. return nil, pgerror.Unsupported("ALL(...) is a quantified predicate and must follow a comparison operator, as in expr <> ALL(array)")
  2618. }
  2619. return nil, p.curError("unexpected token in expression: " + p.curToken.Type.String())
  2620. case lexer.TokenNumber:
  2621. expr := &LiteralExpr{Type: lexer.TokenNumber, Value: p.curToken.Literal}
  2622. p.nextToken()
  2623. return expr, nil
  2624. case lexer.TokenString:
  2625. expr := &LiteralExpr{Type: lexer.TokenString, Value: p.curToken.Literal}
  2626. p.nextToken()
  2627. return expr, nil
  2628. case lexer.TokenBlob:
  2629. expr := &LiteralExpr{Type: lexer.TokenBlob, Value: p.curToken.Literal}
  2630. p.nextToken()
  2631. return expr, nil
  2632. case lexer.TokenNULL:
  2633. expr := &LiteralExpr{Type: lexer.TokenNULL, Value: "NULL"}
  2634. p.nextToken()
  2635. return expr, nil
  2636. case lexer.TokenTRUE:
  2637. expr := &LiteralExpr{Type: lexer.TokenTRUE, Value: "TRUE"}
  2638. p.nextToken()
  2639. return expr, nil
  2640. case lexer.TokenFALSE:
  2641. expr := &LiteralExpr{Type: lexer.TokenFALSE, Value: "FALSE"}
  2642. p.nextToken()
  2643. return expr, nil
  2644. case lexer.TokenLParen:
  2645. p.nextToken()
  2646. // Check for subquery
  2647. if p.curTokenIs(lexer.TokenSELECT) {
  2648. sel, err := p.parseSelect()
  2649. if err != nil {
  2650. return nil, err
  2651. }
  2652. if !p.curTokenIs(lexer.TokenRParen) {
  2653. return nil, p.curError("expected )")
  2654. }
  2655. p.nextToken()
  2656. return &SubqueryExpr{Query: sel}, nil
  2657. }
  2658. // Regular parenthesized expression
  2659. expr, err := p.parseExpr()
  2660. if err != nil {
  2661. return nil, err
  2662. }
  2663. if !p.curTokenIs(lexer.TokenRParen) {
  2664. return nil, p.curError("expected )")
  2665. }
  2666. p.nextToken()
  2667. return &ParenExpr{Expr: expr}, nil
  2668. case lexer.TokenCASE:
  2669. return p.parseCaseExpr()
  2670. case lexer.TokenCAST:
  2671. return p.parseCastExpr()
  2672. case lexer.TokenEXISTS:
  2673. return p.parseExistsExpr()
  2674. case lexer.TokenCOALESCE, lexer.TokenNULLIF, lexer.TokenIF, lexer.TokenREPLACE, lexer.TokenGLOB:
  2675. // These keywords can be used as function names
  2676. return p.parseKeywordFunction()
  2677. case lexer.TokenJSON, lexer.TokenJSONB:
  2678. // json(expr) / jsonb(expr) are JSON1 constructor functions. They lex as
  2679. // data-type keywords but are also callable.
  2680. return p.parseIdentOrFunction()
  2681. case lexer.TokenDATE, lexer.TokenTIME, lexer.TokenTIMESTAMP, lexer.TokenDATETIME:
  2682. // Date/time functions (date(), time(), datetime(), ...) lex as data-type
  2683. // keywords but are callable.
  2684. return p.parseIdentOrFunction()
  2685. case lexer.TokenKEY:
  2686. // KEY is a lexer keyword (PRIMARY KEY) that SQLite also permits as a
  2687. // column name, e.g. store.key.
  2688. return p.parseIdentOrFunction()
  2689. case lexer.TokenIdent:
  2690. if strings.EqualFold(p.curToken.Literal, "ARRAY") && p.peekTokenIs(lexer.TokenLBracket) {
  2691. return p.parseArrayConstructor()
  2692. }
  2693. return p.parseIdentOrFunction()
  2694. case lexer.TokenStar:
  2695. // For COUNT(*)
  2696. expr := &LiteralExpr{Type: lexer.TokenStar, Value: "*"}
  2697. p.nextToken()
  2698. return expr, nil
  2699. default:
  2700. return nil, p.curError("unexpected token in expression: " + p.curToken.Type.String())
  2701. }
  2702. }
  2703. func (p *Parser) parseIdentOrFunction() (Expr, error) {
  2704. name := p.curToken.Literal
  2705. p.nextToken()
  2706. // Check for function call
  2707. if p.curTokenIs(lexer.TokenLParen) {
  2708. if strings.EqualFold(name, "ANY") {
  2709. return nil, pgerror.Unsupported("ANY(...) is a quantified predicate and must follow a comparison operator, as in expr = ANY(array)")
  2710. }
  2711. return p.parseFunctionCall(name)
  2712. }
  2713. // Check for table.column. KEY is a lexer keyword but SQLite also permits it
  2714. // as a column name, and jsonb_each's first output column is named key.
  2715. if p.curTokenIs(lexer.TokenDot) {
  2716. p.nextToken()
  2717. if !p.curTokenIs(lexer.TokenIdent) && !p.curTokenIs(lexer.TokenStar) && !p.curTokenIs(lexer.TokenKEY) {
  2718. return nil, p.curError("expected column name after dot")
  2719. }
  2720. col := p.curToken.Literal
  2721. p.nextToken()
  2722. return &ColumnRef{Table: name, Column: col}, nil
  2723. }
  2724. return &ColumnRef{Column: name}, nil
  2725. }
  2726. func (p *Parser) parseKeywordFunction() (Expr, error) {
  2727. // Handle keywords that can be used as function names (COALESCE, NULLIF, IF, REPLACE, GLOB)
  2728. name := strings.ToUpper(p.curToken.Literal)
  2729. p.nextToken()
  2730. if !p.curTokenIs(lexer.TokenLParen) {
  2731. return nil, p.curError("expected ( after " + name)
  2732. }
  2733. return p.parseFunctionCall(name)
  2734. }
  2735. func (p *Parser) parseFunctionCall(name string) (Expr, error) {
  2736. fn := &FunctionCall{Name: strings.ToUpper(name)}
  2737. p.nextToken() // consume (
  2738. // Check for DISTINCT or ALL
  2739. if p.curTokenIs(lexer.TokenDISTINCT) {
  2740. fn.Distinct = true
  2741. p.nextToken()
  2742. } else if p.curTokenIs(lexer.TokenALL) {
  2743. // ALL is the default behavior, just skip it
  2744. p.nextToken()
  2745. }
  2746. // Check for * (COUNT(*))
  2747. if p.curTokenIs(lexer.TokenStar) {
  2748. fn.Star = true
  2749. p.nextToken()
  2750. } else if !p.curTokenIs(lexer.TokenRParen) {
  2751. // Parse arguments
  2752. args, err := p.parseExprList()
  2753. if err != nil {
  2754. return nil, err
  2755. }
  2756. fn.Args = args
  2757. }
  2758. if !p.curTokenIs(lexer.TokenRParen) {
  2759. return nil, p.curError("expected )")
  2760. }
  2761. p.nextToken()
  2762. // Window function: func(...) OVER (PARTITION BY ... ORDER BY ...).
  2763. if p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "OVER") {
  2764. return p.parseWindowSpec(fn)
  2765. }
  2766. return fn, nil
  2767. }
  2768. // parseWindowSpec parses the OVER (...) clause of a window function. Only
  2769. // PARTITION BY and ORDER BY are supported; frame clauses are not.
  2770. func (p *Parser) parseWindowSpec(fn *FunctionCall) (Expr, error) {
  2771. p.nextToken() // consume OVER
  2772. if !p.curTokenIs(lexer.TokenLParen) {
  2773. return nil, p.curError("expected ( after OVER")
  2774. }
  2775. p.nextToken()
  2776. window := &WindowExpr{Func: fn}
  2777. if p.curTokenIs(lexer.TokenIdent) && strings.EqualFold(p.curToken.Literal, "PARTITION") {
  2778. p.nextToken()
  2779. if !p.curTokenIs(lexer.TokenBY) {
  2780. return nil, p.curError("expected BY after PARTITION")
  2781. }
  2782. p.nextToken()
  2783. exprs, err := p.parseExprList()
  2784. if err != nil {
  2785. return nil, err
  2786. }
  2787. window.PartitionBy = exprs
  2788. }
  2789. if p.curTokenIs(lexer.TokenORDER) {
  2790. p.nextToken()
  2791. if !p.curTokenIs(lexer.TokenBY) {
  2792. return nil, p.curError("expected BY after ORDER")
  2793. }
  2794. p.nextToken()
  2795. orderBy, err := p.parseOrderBy()
  2796. if err != nil {
  2797. return nil, err
  2798. }
  2799. window.OrderBy = orderBy
  2800. }
  2801. if !p.curTokenIs(lexer.TokenRParen) {
  2802. return nil, p.curError("expected ) after window specification")
  2803. }
  2804. p.nextToken()
  2805. return window, nil
  2806. }
  2807. func (p *Parser) parseCaseExpr() (Expr, error) {
  2808. expr := &CaseExpr{}
  2809. p.nextToken() // consume CASE
  2810. // Check for simple CASE (CASE operand WHEN ...)
  2811. if !p.curTokenIs(lexer.TokenWHEN) {
  2812. operand, err := p.parseExpr()
  2813. if err != nil {
  2814. return nil, err
  2815. }
  2816. expr.Operand = operand
  2817. }
  2818. // Parse WHEN clauses
  2819. for p.curTokenIs(lexer.TokenWHEN) {
  2820. p.nextToken()
  2821. cond, err := p.parseExpr()
  2822. if err != nil {
  2823. return nil, err
  2824. }
  2825. if !p.curTokenIs(lexer.TokenTHEN) {
  2826. return nil, p.curError("expected THEN")
  2827. }
  2828. p.nextToken()
  2829. result, err := p.parseExpr()
  2830. if err != nil {
  2831. return nil, err
  2832. }
  2833. expr.Whens = append(expr.Whens, WhenClause{Condition: cond, Result: result})
  2834. }
  2835. // Parse optional ELSE
  2836. if p.curTokenIs(lexer.TokenELSE) {
  2837. p.nextToken()
  2838. elseExpr, err := p.parseExpr()
  2839. if err != nil {
  2840. return nil, err
  2841. }
  2842. expr.Else = elseExpr
  2843. }
  2844. // Expect END
  2845. if !p.curTokenIs(lexer.TokenEND) {
  2846. return nil, p.curError("expected END")
  2847. }
  2848. p.nextToken()
  2849. return expr, nil
  2850. }
  2851. func (p *Parser) parseCastExpr() (Expr, error) {
  2852. p.nextToken() // consume CAST
  2853. if !p.curTokenIs(lexer.TokenLParen) {
  2854. return nil, p.curError("expected (")
  2855. }
  2856. p.nextToken()
  2857. expr, err := p.parseExpr()
  2858. if err != nil {
  2859. return nil, err
  2860. }
  2861. if !p.curTokenIs(lexer.TokenAS) {
  2862. return nil, p.curError("expected AS")
  2863. }
  2864. p.nextToken()
  2865. dataType, err := p.parseDataType()
  2866. if err != nil {
  2867. return nil, err
  2868. }
  2869. if !p.curTokenIs(lexer.TokenRParen) {
  2870. return nil, p.curError("expected )")
  2871. }
  2872. p.nextToken()
  2873. return &CastExpr{Expr: expr, Type: *dataType}, nil
  2874. }
  2875. func (p *Parser) parseExistsExpr() (Expr, error) {
  2876. p.nextToken() // consume EXISTS
  2877. if !p.curTokenIs(lexer.TokenLParen) {
  2878. return nil, p.curError("expected (")
  2879. }
  2880. p.nextToken()
  2881. if !p.curTokenIs(lexer.TokenSELECT) {
  2882. return nil, p.curError("expected SELECT in EXISTS")
  2883. }
  2884. sel, err := p.parseSelect()
  2885. if err != nil {
  2886. return nil, err
  2887. }
  2888. if !p.curTokenIs(lexer.TokenRParen) {
  2889. return nil, p.curError("expected )")
  2890. }
  2891. p.nextToken()
  2892. return &ExistsExpr{Subquery: sel}, nil
  2893. }
  2894. func (p *Parser) parseExprList() ([]Expr, error) {
  2895. var exprs []Expr
  2896. for {
  2897. expr, err := p.parseExpr()
  2898. if err != nil {
  2899. return nil, err
  2900. }
  2901. exprs = append(exprs, expr)
  2902. if !p.curTokenIs(lexer.TokenComma) {
  2903. break
  2904. }
  2905. p.nextToken()
  2906. }
  2907. return exprs, nil
  2908. }
  2909. func (p *Parser) parseIdentList() ([]string, error) {
  2910. var idents []string
  2911. for {
  2912. if !p.curIsName() {
  2913. return nil, p.curError("expected identifier")
  2914. }
  2915. idents = append(idents, p.curToken.Literal)
  2916. p.nextToken()
  2917. if !p.curTokenIs(lexer.TokenComma) {
  2918. break
  2919. }
  2920. p.nextToken()
  2921. }
  2922. return idents, nil
  2923. }
  2924. // curIsName reports whether the current token can serve as a name (column or
  2925. // table identifier). A few lexer keywords, notably KEY, are commonly used as
  2926. // column names in the GoatCounter schema and SQLite allows them.
  2927. func (p *Parser) curIsName() bool {
  2928. if p.curTokenIs(lexer.TokenIdent) {
  2929. return true
  2930. }
  2931. switch p.curToken.Type {
  2932. case lexer.TokenKEY:
  2933. return true
  2934. }
  2935. return false
  2936. }
  2937. // Helper functions
  2938. func parseInt(s string) int {
  2939. var n int
  2940. for _, c := range s {
  2941. n = n*10 + int(c-'0')
  2942. }
  2943. return n
  2944. }