parser.go 86 KB

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