parser.go 79 KB

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