token.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. package lexer
  2. import "fmt"
  3. type TokenType int
  4. const (
  5. // Special tokens
  6. TokenEOF TokenType = iota
  7. TokenError
  8. TokenComment
  9. // Literals
  10. TokenIdent // identifiers
  11. TokenNumber // integers and floats
  12. TokenString // 'string literals'
  13. TokenBlob // X'hex' blob literals
  14. // Operators
  15. TokenPlus // +
  16. TokenMinus // -
  17. TokenStar // *
  18. TokenSlash // /
  19. TokenPercent // %
  20. TokenConcat // ||
  21. TokenArrow // ->
  22. TokenArrowText // ->>
  23. TokenEq // =
  24. TokenNeq // <> or !=
  25. TokenLt // <
  26. TokenLte // <=
  27. TokenGt // >
  28. TokenGte // >=
  29. TokenBitAnd // &
  30. TokenBitOr // |
  31. TokenBitNot // ~
  32. TokenShiftLeft // <<
  33. TokenShiftRight // >>
  34. // JSONB operators. They are PostgreSQL operators, not SQLite ones, and the
  35. // parser restricts them to jsonb operands.
  36. TokenHashArrow // #>
  37. TokenHashArrowText // #>>
  38. TokenHashMinus // #-
  39. TokenAtArrow // @>
  40. TokenAtAt // @@
  41. TokenAtQuestion // @?
  42. TokenLtAt // <@
  43. TokenQuestion // ?
  44. TokenQuestionPipe // ?|
  45. TokenQuestionAmp // ?&
  46. // Punctuation
  47. TokenLParen // (
  48. TokenRParen // )
  49. TokenComma // ,
  50. TokenSemicolon // ;
  51. TokenDot // .
  52. // SQL Keywords - DML
  53. TokenSELECT
  54. TokenFROM
  55. TokenWHERE
  56. TokenAND
  57. TokenOR
  58. TokenNOT
  59. TokenAS
  60. TokenDISTINCT
  61. TokenALL
  62. TokenRETURNING
  63. TokenINSERT
  64. TokenINTO
  65. TokenVALUES
  66. TokenUPDATE
  67. TokenSET
  68. TokenDELETE
  69. // SQL Keywords - DDL
  70. TokenCREATE
  71. TokenDROP
  72. TokenALTER
  73. TokenTABLE
  74. TokenINDEX
  75. TokenVIEW
  76. TokenDATABASE
  77. TokenSCHEMA
  78. TokenADD
  79. TokenCOLUMN
  80. TokenRENAME
  81. TokenTO
  82. // SQL Keywords - Constraints
  83. TokenPRIMARY
  84. TokenKEY
  85. TokenFOREIGN
  86. TokenREFERENCES
  87. TokenUNIQUE
  88. TokenCHECK
  89. TokenCONSTRAINT
  90. TokenDEFAULT
  91. TokenAUTOINCREMENT
  92. // SQL Keywords - Clauses
  93. TokenORDER
  94. TokenBY
  95. TokenASC
  96. TokenDESC
  97. TokenLIMIT
  98. TokenOFFSET
  99. TokenGROUP
  100. TokenHAVING
  101. // SQL Keywords - Joins
  102. TokenJOIN
  103. TokenINNER
  104. TokenLEFT
  105. TokenRIGHT
  106. TokenFULL
  107. TokenOUTER
  108. TokenCROSS
  109. TokenNATURAL
  110. TokenON
  111. TokenUSING
  112. // SQL Keywords - Set operations
  113. TokenUNION
  114. TokenINTERSECT
  115. TokenEXCEPT
  116. // SQL Keywords - Predicates
  117. TokenIN
  118. TokenBETWEEN
  119. TokenLIKE
  120. TokenGLOB
  121. TokenESCAPE
  122. TokenIS
  123. TokenNULL
  124. TokenEXISTS
  125. // SQL Keywords - CASE
  126. TokenCASE
  127. TokenWHEN
  128. TokenTHEN
  129. TokenELSE
  130. TokenEND
  131. // SQL Keywords - Other
  132. TokenCAST
  133. TokenCOALESCE
  134. TokenNULLIF
  135. TokenIF
  136. // Boolean literals
  137. TokenTRUE
  138. TokenFALSE
  139. // Data types
  140. TokenINTEGER
  141. TokenINT
  142. TokenTINYINT
  143. TokenSMALLINT
  144. TokenMEDIUMINT
  145. TokenBIGINT
  146. TokenREAL
  147. TokenFLOAT
  148. TokenDOUBLE
  149. TokenNUMERIC
  150. TokenDECIMAL
  151. TokenTEXT
  152. TokenVARCHAR
  153. TokenCHAR
  154. TokenCHARACTER
  155. TokenCLOB
  156. TokenNCHAR
  157. TokenNVARCHAR
  158. TokenBLOB
  159. TokenBOOLEAN
  160. TokenDATE
  161. TokenTIME
  162. TokenTIMESTAMP
  163. TokenDATETIME
  164. TokenJSON
  165. TokenJSONB
  166. // Transaction keywords
  167. TokenBEGIN
  168. TokenCOMMIT
  169. TokenROLLBACK
  170. TokenTRANSACTION
  171. TokenSAVEPOINT
  172. TokenRELEASE
  173. // SQLite specific
  174. TokenPRAGMA
  175. TokenEXPLAIN
  176. TokenQUERY
  177. TokenPLAN
  178. TokenATTACH
  179. TokenDETACH
  180. TokenVACUUM
  181. TokenANALYZE
  182. TokenREINDEX
  183. // Conflict resolution
  184. TokenREPLACE
  185. TokenIGNORE
  186. TokenFAIL
  187. TokenABORT
  188. TokenCONFLICT
  189. TokenDO
  190. TokenNOTHING
  191. // PostgreSQL-style syntax
  192. TokenColonColon // ::
  193. TokenLBracket // [ (only when it subscripts an expression)
  194. TokenRBracket // ]
  195. )
  196. var keywords = map[string]TokenType{
  197. // DML
  198. "SELECT": TokenSELECT,
  199. "FROM": TokenFROM,
  200. "WHERE": TokenWHERE,
  201. "AND": TokenAND,
  202. "OR": TokenOR,
  203. "NOT": TokenNOT,
  204. "AS": TokenAS,
  205. "DISTINCT": TokenDISTINCT,
  206. "ALL": TokenALL,
  207. // RETURNING is a keyword so it is not mistaken for a table/column alias in
  208. // INSERT ... SELECT ... RETURNING.
  209. "RETURNING": TokenRETURNING,
  210. "INSERT": TokenINSERT,
  211. "INTO": TokenINTO,
  212. "VALUES": TokenVALUES,
  213. "UPDATE": TokenUPDATE,
  214. "SET": TokenSET,
  215. "DELETE": TokenDELETE,
  216. // DDL
  217. "CREATE": TokenCREATE,
  218. "DROP": TokenDROP,
  219. "ALTER": TokenALTER,
  220. "TABLE": TokenTABLE,
  221. "INDEX": TokenINDEX,
  222. "VIEW": TokenVIEW,
  223. "DATABASE": TokenDATABASE,
  224. "SCHEMA": TokenSCHEMA,
  225. "ADD": TokenADD,
  226. "COLUMN": TokenCOLUMN,
  227. "RENAME": TokenRENAME,
  228. "TO": TokenTO,
  229. // Constraints
  230. "PRIMARY": TokenPRIMARY,
  231. "KEY": TokenKEY,
  232. "FOREIGN": TokenFOREIGN,
  233. "REFERENCES": TokenREFERENCES,
  234. "UNIQUE": TokenUNIQUE,
  235. "CHECK": TokenCHECK,
  236. "CONSTRAINT": TokenCONSTRAINT,
  237. "DEFAULT": TokenDEFAULT,
  238. "AUTOINCREMENT": TokenAUTOINCREMENT,
  239. // Clauses
  240. "ORDER": TokenORDER,
  241. "BY": TokenBY,
  242. "ASC": TokenASC,
  243. "DESC": TokenDESC,
  244. "LIMIT": TokenLIMIT,
  245. "OFFSET": TokenOFFSET,
  246. "GROUP": TokenGROUP,
  247. "HAVING": TokenHAVING,
  248. // Joins
  249. "JOIN": TokenJOIN,
  250. "INNER": TokenINNER,
  251. "LEFT": TokenLEFT,
  252. "RIGHT": TokenRIGHT,
  253. "FULL": TokenFULL,
  254. "OUTER": TokenOUTER,
  255. "CROSS": TokenCROSS,
  256. "NATURAL": TokenNATURAL,
  257. "ON": TokenON,
  258. "USING": TokenUSING,
  259. // Set operations
  260. "UNION": TokenUNION,
  261. "INTERSECT": TokenINTERSECT,
  262. "EXCEPT": TokenEXCEPT,
  263. // Predicates
  264. "IN": TokenIN,
  265. "BETWEEN": TokenBETWEEN,
  266. "LIKE": TokenLIKE,
  267. "GLOB": TokenGLOB,
  268. "ESCAPE": TokenESCAPE,
  269. "IS": TokenIS,
  270. "NULL": TokenNULL,
  271. "EXISTS": TokenEXISTS,
  272. // CASE
  273. "CASE": TokenCASE,
  274. "WHEN": TokenWHEN,
  275. "THEN": TokenTHEN,
  276. "ELSE": TokenELSE,
  277. "END": TokenEND,
  278. // Other
  279. "CAST": TokenCAST,
  280. "COALESCE": TokenCOALESCE,
  281. "NULLIF": TokenNULLIF,
  282. "IF": TokenIF,
  283. // Boolean
  284. "TRUE": TokenTRUE,
  285. "FALSE": TokenFALSE,
  286. // Data types
  287. "INTEGER": TokenINTEGER,
  288. "INT": TokenINT,
  289. "TINYINT": TokenTINYINT,
  290. "SMALLINT": TokenSMALLINT,
  291. "MEDIUMINT": TokenMEDIUMINT,
  292. "BIGINT": TokenBIGINT,
  293. "REAL": TokenREAL,
  294. "FLOAT": TokenFLOAT,
  295. "DOUBLE": TokenDOUBLE,
  296. "NUMERIC": TokenNUMERIC,
  297. "DECIMAL": TokenDECIMAL,
  298. "TEXT": TokenTEXT,
  299. "VARCHAR": TokenVARCHAR,
  300. "CHAR": TokenCHAR,
  301. "CHARACTER": TokenCHARACTER,
  302. "CLOB": TokenCLOB,
  303. "NCHAR": TokenNCHAR,
  304. "NVARCHAR": TokenNVARCHAR,
  305. "BLOB": TokenBLOB,
  306. "BOOLEAN": TokenBOOLEAN,
  307. "DATE": TokenDATE,
  308. "TIME": TokenTIME,
  309. "TIMESTAMP": TokenTIMESTAMP,
  310. "DATETIME": TokenDATETIME,
  311. "JSON": TokenJSON,
  312. "JSONB": TokenJSONB,
  313. // Transactions
  314. "BEGIN": TokenBEGIN,
  315. "COMMIT": TokenCOMMIT,
  316. "ROLLBACK": TokenROLLBACK,
  317. "TRANSACTION": TokenTRANSACTION,
  318. "SAVEPOINT": TokenSAVEPOINT,
  319. "RELEASE": TokenRELEASE,
  320. // SQLite specific
  321. "PRAGMA": TokenPRAGMA,
  322. "EXPLAIN": TokenEXPLAIN,
  323. "QUERY": TokenQUERY,
  324. "ATTACH": TokenATTACH,
  325. "DETACH": TokenDETACH,
  326. "VACUUM": TokenVACUUM,
  327. "ANALYZE": TokenANALYZE,
  328. "REINDEX": TokenREINDEX,
  329. // Conflict resolution
  330. "REPLACE": TokenREPLACE,
  331. "IGNORE": TokenIGNORE,
  332. "FAIL": TokenFAIL,
  333. "ABORT": TokenABORT,
  334. "CONFLICT": TokenCONFLICT,
  335. "DO": TokenDO,
  336. "NOTHING": TokenNOTHING,
  337. }
  338. // LookupKeyword returns the token type for an identifier.
  339. // If the identifier is a keyword, returns the keyword token type.
  340. // Otherwise, returns TokenIdent.
  341. func LookupKeyword(ident string) TokenType {
  342. if tok, ok := keywords[ident]; ok {
  343. return tok
  344. }
  345. return TokenIdent
  346. }
  347. // Token represents a lexical token.
  348. type Token struct {
  349. Type TokenType
  350. Literal string
  351. Line int
  352. Column int
  353. // Bracketed is set on an identifier that came from SQLite's [bracket]
  354. // quoting, which lets the parser tell an identifier apart from a nested
  355. // array literal in ARRAY[...] context.
  356. Bracketed bool
  357. }
  358. func (t Token) String() string {
  359. return fmt.Sprintf("Token{Type: %v, Literal: %q, Line: %d, Col: %d}",
  360. t.Type, t.Literal, t.Line, t.Column)
  361. }
  362. // IsKeyword returns true if the token is a SQL keyword.
  363. func (t Token) IsKeyword() bool {
  364. return t.Type >= TokenSELECT
  365. }
  366. // IsOperator returns true if the token is an operator.
  367. func (t Token) IsOperator() bool {
  368. return t.Type >= TokenPlus && t.Type <= TokenGte
  369. }
  370. var tokenNames = map[TokenType]string{
  371. TokenEOF: "EOF",
  372. TokenError: "ERROR",
  373. TokenComment: "COMMENT",
  374. TokenIdent: "IDENT",
  375. TokenNumber: "NUMBER",
  376. TokenString: "STRING",
  377. TokenBlob: "BLOB",
  378. TokenPlus: "+",
  379. TokenMinus: "-",
  380. TokenStar: "*",
  381. TokenSlash: "/",
  382. TokenPercent: "%",
  383. TokenConcat: "||",
  384. TokenArrow: "->",
  385. TokenArrowText: "->>",
  386. TokenEq: "=",
  387. TokenNeq: "<>",
  388. TokenLt: "<",
  389. TokenLte: "<=",
  390. TokenGt: ">",
  391. TokenGte: ">=",
  392. TokenBitAnd: "&",
  393. TokenBitOr: "|",
  394. TokenBitNot: "~",
  395. TokenShiftLeft: "<<",
  396. TokenShiftRight: ">>",
  397. TokenHashArrow: "#>",
  398. TokenHashArrowText: "#>>",
  399. TokenHashMinus: "#-",
  400. TokenAtArrow: "@>",
  401. TokenAtAt: "@@",
  402. TokenAtQuestion: "@?",
  403. TokenLtAt: "<@",
  404. TokenQuestion: "?",
  405. TokenQuestionPipe: "?|",
  406. TokenQuestionAmp: "?&",
  407. TokenLParen: "(",
  408. TokenRParen: ")",
  409. TokenComma: ",",
  410. TokenSemicolon: ";",
  411. TokenDot: ".",
  412. TokenColonColon: "::",
  413. TokenLBracket: "[",
  414. TokenRBracket: "]",
  415. }
  416. func (t TokenType) String() string {
  417. if name, ok := tokenNames[t]; ok {
  418. return name
  419. }
  420. // For keywords, look up in reverse
  421. for kw, tok := range keywords {
  422. if tok == t {
  423. return kw
  424. }
  425. }
  426. return fmt.Sprintf("TOKEN(%d)", t)
  427. }