lexical.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. package xsql
  2. import (
  3. "bufio"
  4. "bytes"
  5. "io"
  6. "strconv"
  7. "strings"
  8. )
  9. type Token int
  10. const (
  11. // Special tokens
  12. ILLEGAL Token = iota
  13. EOF
  14. WS
  15. COMMENT
  16. AS
  17. // Literals
  18. IDENT // main
  19. INTEGER // 12345
  20. NUMBER //12345.67
  21. STRING // "abc"
  22. BADSTRING // "abc
  23. operatorBeg
  24. // ADD and the following are InfluxQL Operators
  25. ADD // +
  26. SUB // -
  27. MUL // *
  28. DIV // /
  29. MOD // %
  30. BITWISE_AND // &
  31. BITWISE_OR // |
  32. BITWISE_XOR // ^
  33. AND // AND
  34. OR // OR
  35. EQ // =
  36. NEQ // !=
  37. LT // <
  38. LTE // <=
  39. GT // >
  40. GTE // >=
  41. SUBSET //[
  42. ARROW //->
  43. operatorEnd
  44. // Misc characters
  45. ASTERISK // *
  46. COMMA // ,
  47. LPAREN // (
  48. RPAREN // )
  49. LBRACKET //[
  50. RBRACKET //]
  51. HASH // #
  52. DOT // .
  53. COLON //:
  54. SEMICOLON //;
  55. // Keywords
  56. SELECT
  57. FROM
  58. JOIN
  59. INNER
  60. LEFT
  61. RIGHT
  62. FULL
  63. CROSS
  64. ON
  65. WHERE
  66. GROUP
  67. ORDER
  68. HAVING
  69. BY
  70. ASC
  71. DESC
  72. TRUE
  73. FALSE
  74. CREATE
  75. DROP
  76. EXPLAIN
  77. DESCRIBE
  78. SHOW
  79. STREAM
  80. STREAMS
  81. WITH
  82. XBIGINT
  83. XFLOAT
  84. XSTRING
  85. XDATETIME
  86. XBOOLEAN
  87. XARRAY
  88. XSTRUCT
  89. DATASOURCE
  90. KEY
  91. FORMAT
  92. CONF_KEY
  93. TYPE
  94. STRICT_VALIDATION
  95. TIMESTAMP
  96. TIMESTAMP_FORMAT
  97. DD
  98. HH
  99. MI
  100. SS
  101. MS
  102. )
  103. var tokens = []string{
  104. ILLEGAL: "ILLEGAL",
  105. EOF: "EOF",
  106. AS: "AS",
  107. WS: "WS",
  108. IDENT: "IDENT",
  109. INTEGER: "INTEGER",
  110. NUMBER: "NUMBER",
  111. STRING: "STRING",
  112. ADD: "+",
  113. SUB: "-",
  114. MUL: "*",
  115. DIV: "/",
  116. MOD: "%",
  117. BITWISE_AND: "&",
  118. BITWISE_OR: "|",
  119. BITWISE_XOR: "^",
  120. EQ: "=",
  121. NEQ: "!=",
  122. LT: "<",
  123. LTE: "<=",
  124. GT: ">",
  125. GTE: ">=",
  126. SUBSET: "[]",
  127. ARROW: "->",
  128. ASTERISK: "*",
  129. COMMA: ",",
  130. LPAREN: "(",
  131. RPAREN: ")",
  132. LBRACKET: "[",
  133. RBRACKET: "]",
  134. HASH: "#",
  135. DOT: ".",
  136. SEMICOLON: ";",
  137. COLON: ":",
  138. SELECT: "SELECT",
  139. FROM: "FROM",
  140. JOIN: "JOIN",
  141. LEFT: "LEFT",
  142. INNER: "INNER",
  143. ON: "ON",
  144. WHERE: "WHERE",
  145. GROUP: "GROUP",
  146. ORDER: "ORDER",
  147. HAVING: "HAVING",
  148. BY: "BY",
  149. ASC: "ASC",
  150. DESC: "DESC",
  151. CREATE: "CREATE",
  152. DROP: "RROP",
  153. EXPLAIN: "EXPLAIN",
  154. DESCRIBE: "DESCRIBE",
  155. SHOW: "SHOW",
  156. STREAM: "STREAM",
  157. STREAMS: "STREAMS",
  158. WITH: "WITH",
  159. XBIGINT: "BIGINT",
  160. XFLOAT: "FLOAT",
  161. XSTRING: "STRING",
  162. XDATETIME: "DATETIME",
  163. XBOOLEAN: "BOOLEAN",
  164. XARRAY: "ARRAY",
  165. XSTRUCT: "STRUCT",
  166. DATASOURCE: "DATASOURCE",
  167. KEY: "KEY",
  168. FORMAT: "FORMAT",
  169. CONF_KEY: "CONF_KEY",
  170. TYPE: "TYPE",
  171. STRICT_VALIDATION: "STRICT_VALIDATION",
  172. TIMESTAMP: "TIMESTAMP",
  173. TIMESTAMP_FORMAT: "TIMESTAMP_FORMAT",
  174. AND: "AND",
  175. OR: "OR",
  176. TRUE: "TRUE",
  177. FALSE: "FALSE",
  178. DD: "DD",
  179. HH: "HH",
  180. MI: "MI",
  181. SS: "SS",
  182. MS: "MS",
  183. }
  184. func (tok Token) String() string {
  185. if tok >= 0 && tok < Token(len(tokens)) {
  186. return tokens[tok]
  187. }
  188. return ""
  189. }
  190. type Scanner struct {
  191. r *bufio.Reader
  192. }
  193. func NewScanner(r io.Reader) *Scanner {
  194. return &Scanner{r: bufio.NewReader(r)}
  195. }
  196. func (s *Scanner) Scan() (tok Token, lit string) {
  197. ch := s.read()
  198. if isWhiteSpace(ch) {
  199. //s.unread()
  200. return s.ScanWhiteSpace()
  201. } else if isLetter(ch) {
  202. s.unread()
  203. return s.ScanIdent()
  204. } else if isQuotation(ch) {
  205. s.unread()
  206. return s.ScanString()
  207. } else if isDigit(ch) {
  208. s.unread()
  209. return s.ScanNumber(false, false)
  210. } else if isBackquote(ch) {
  211. return s.ScanBackquoteIdent()
  212. }
  213. switch ch {
  214. case eof:
  215. return EOF, tokens[EOF]
  216. case '=':
  217. return EQ, tokens[EQ]
  218. case '!':
  219. _, _ = s.ScanWhiteSpace()
  220. if r := s.read(); r == '=' {
  221. return NEQ, tokens[NEQ]
  222. } else {
  223. s.unread()
  224. }
  225. return EQ, tokens[EQ]
  226. case '<':
  227. _, _ = s.ScanWhiteSpace()
  228. if r := s.read(); r == '=' {
  229. return LTE, tokens[LTE]
  230. } else {
  231. s.unread()
  232. }
  233. return LT, tokens[LT]
  234. case '>':
  235. _, _ = s.ScanWhiteSpace()
  236. if r := s.read(); r == '=' {
  237. return GTE, tokens[GTE]
  238. } else {
  239. s.unread()
  240. }
  241. return GT, tokens[GT]
  242. case '+':
  243. return ADD, tokens[ADD]
  244. case '-':
  245. _, _ = s.ScanWhiteSpace()
  246. if r := s.read(); r == '-' {
  247. s.skipUntilNewline()
  248. return COMMENT, ""
  249. } else if r == '>' {
  250. return ARROW, tokens[ARROW]
  251. } else if isDigit(r) {
  252. s.unread()
  253. return s.ScanNumber(false, true)
  254. } else if r == '.' {
  255. _, _ = s.ScanWhiteSpace()
  256. if r1 := s.read(); isDigit(r1) {
  257. s.unread()
  258. return s.ScanNumber(true, true)
  259. } else {
  260. s.unread()
  261. }
  262. s.unread()
  263. } else {
  264. s.unread()
  265. }
  266. return SUB, tokens[SUB]
  267. case '/':
  268. _, _ = s.ScanWhiteSpace()
  269. if r := s.read(); r == '*' {
  270. if err := s.skipUntilEndComment(); err != nil {
  271. return ILLEGAL, ""
  272. }
  273. return COMMENT, ""
  274. } else {
  275. s.unread()
  276. }
  277. return DIV, tokens[DIV]
  278. case '.':
  279. if r := s.read(); isDigit(r) {
  280. s.unread()
  281. return s.ScanNumber(true, false)
  282. }
  283. s.unread()
  284. return DOT, tokens[DOT]
  285. case '%':
  286. return MOD, tokens[MOD]
  287. case '&':
  288. return BITWISE_AND, tokens[BITWISE_AND]
  289. case '|':
  290. return BITWISE_OR, tokens[BITWISE_OR]
  291. case '^':
  292. return BITWISE_XOR, tokens[BITWISE_XOR]
  293. case '*':
  294. return ASTERISK, tokens[ASTERISK]
  295. case ',':
  296. return COMMA, tokens[COMMA]
  297. case '(':
  298. return LPAREN, tokens[LPAREN]
  299. case ')':
  300. return RPAREN, tokens[RPAREN]
  301. case '[':
  302. return LBRACKET, tokens[LBRACKET]
  303. case ']':
  304. return RBRACKET, tokens[RBRACKET]
  305. case ':':
  306. return COLON, tokens[COLON]
  307. case '#':
  308. return HASH, tokens[HASH]
  309. case ';':
  310. return SEMICOLON, tokens[SEMICOLON]
  311. }
  312. return ILLEGAL, ""
  313. }
  314. func (s *Scanner) ScanIdent() (tok Token, lit string) {
  315. var buf bytes.Buffer
  316. buf.WriteRune(s.read())
  317. for {
  318. if ch := s.read(); ch == eof {
  319. break
  320. } else if !isLetter(ch) && !isDigit(ch) && ch != '_' {
  321. s.unread()
  322. break
  323. } else {
  324. buf.WriteRune(ch)
  325. }
  326. }
  327. switch lit = strings.ToUpper(buf.String()); lit {
  328. case "SELECT":
  329. return SELECT, lit
  330. case "AS":
  331. return AS, lit
  332. case "FROM":
  333. return FROM, lit
  334. case "WHERE":
  335. return WHERE, lit
  336. case "AND":
  337. return AND, lit
  338. case "OR":
  339. return OR, lit
  340. case "GROUP":
  341. return GROUP, lit
  342. case "HAVING":
  343. return HAVING, lit
  344. case "ORDER":
  345. return ORDER, lit
  346. case "BY":
  347. return BY, lit
  348. case "DESC":
  349. return DESC, lit
  350. case "ASC":
  351. return ASC, lit
  352. case "INNER":
  353. return INNER, lit
  354. case "LEFT":
  355. return LEFT, lit
  356. case "RIGHT":
  357. return RIGHT, lit
  358. case "FULL":
  359. return FULL, lit
  360. case "CROSS":
  361. return CROSS, lit
  362. case "JOIN":
  363. return JOIN, lit
  364. case "ON":
  365. return ON, lit
  366. case "CREATE":
  367. return CREATE, lit
  368. case "DROP":
  369. return DROP, lit
  370. case "EXPLAIN":
  371. return EXPLAIN, lit
  372. case "DESCRIBE":
  373. return DESCRIBE, lit
  374. case "SHOW":
  375. return SHOW, lit
  376. case "STREAM":
  377. return STREAM, lit
  378. case "STREAMS":
  379. return STREAMS, lit
  380. case "WITH":
  381. return WITH, lit
  382. case "BIGINT":
  383. return XBIGINT, lit
  384. case "FLOAT":
  385. return XFLOAT, lit
  386. case "DATETIME":
  387. return XDATETIME, lit
  388. case "STRING":
  389. return XSTRING, lit
  390. case "BOOLEAN":
  391. return XBOOLEAN, lit
  392. case "ARRAY":
  393. return XARRAY, lit
  394. case "STRUCT":
  395. return XSTRUCT, lit
  396. case "DATASOURCE":
  397. return DATASOURCE, lit
  398. case "KEY":
  399. return KEY, lit
  400. case "FORMAT":
  401. return FORMAT, lit
  402. case "CONF_KEY":
  403. return CONF_KEY, lit
  404. case "TYPE":
  405. return TYPE, lit
  406. case "TRUE":
  407. return TRUE, lit
  408. case "FALSE":
  409. return FALSE, lit
  410. case "STRICT_VALIDATION":
  411. return STRICT_VALIDATION, lit
  412. case "TIMESTAMP":
  413. return TIMESTAMP, lit
  414. case "TIMESTAMP_FORMAT":
  415. return TIMESTAMP_FORMAT, lit
  416. case "DD":
  417. return DD, lit
  418. case "HH":
  419. return HH, lit
  420. case "MI":
  421. return MI, lit
  422. case "SS":
  423. return SS, lit
  424. case "MS":
  425. return MS, lit
  426. }
  427. return IDENT, buf.String()
  428. }
  429. func (s *Scanner) ScanString() (tok Token, lit string) {
  430. var buf bytes.Buffer
  431. ch := s.read()
  432. buf.WriteRune(ch)
  433. escape := false
  434. for {
  435. ch = s.read()
  436. if ch == '"' && !escape {
  437. buf.WriteRune(ch)
  438. break
  439. } else if ch == eof {
  440. return BADSTRING, buf.String()
  441. } else if ch == '\\' && !escape {
  442. escape = true
  443. buf.WriteRune(ch)
  444. } else {
  445. escape = false
  446. buf.WriteRune(ch)
  447. }
  448. }
  449. r, _ := strconv.Unquote(buf.String())
  450. return STRING, r
  451. }
  452. func (s *Scanner) ScanDigit() (tok Token, lit string) {
  453. var buf bytes.Buffer
  454. ch := s.read()
  455. buf.WriteRune(ch)
  456. for {
  457. if ch := s.read(); isDigit(ch) {
  458. buf.WriteRune(ch)
  459. } else {
  460. s.unread()
  461. break
  462. }
  463. }
  464. return INTEGER, buf.String()
  465. }
  466. func (s *Scanner) ScanNumber(startWithDot bool, isNeg bool) (tok Token, lit string) {
  467. var buf bytes.Buffer
  468. if isNeg {
  469. buf.WriteRune('-')
  470. }
  471. if startWithDot {
  472. buf.WriteRune('.')
  473. }
  474. ch := s.read()
  475. buf.WriteRune(ch)
  476. isNum := false
  477. for {
  478. if ch := s.read(); isDigit(ch) {
  479. buf.WriteRune(ch)
  480. } else if ch == '.' {
  481. isNum = true
  482. buf.WriteRune(ch)
  483. } else {
  484. s.unread()
  485. break
  486. }
  487. }
  488. if isNum || startWithDot {
  489. return NUMBER, buf.String()
  490. } else {
  491. return INTEGER, buf.String()
  492. }
  493. }
  494. func (s *Scanner) ScanBackquoteIdent() (tok Token, lit string) {
  495. var buf bytes.Buffer
  496. for {
  497. ch := s.read()
  498. if isBackquote(ch) || ch == eof {
  499. break
  500. } else {
  501. buf.WriteRune(ch)
  502. }
  503. }
  504. return IDENT, buf.String()
  505. }
  506. func (s *Scanner) skipUntilNewline() {
  507. for {
  508. if ch := s.read(); ch == '\n' || ch == eof {
  509. return
  510. }
  511. }
  512. }
  513. func (s *Scanner) skipUntilEndComment() error {
  514. for {
  515. if ch1 := s.read(); ch1 == '*' {
  516. // We might be at the end.
  517. star:
  518. ch2 := s.read()
  519. if ch2 == '/' {
  520. return nil
  521. } else if ch2 == '*' {
  522. // We are back in the state machine since we see a star.
  523. goto star
  524. } else if ch2 == eof {
  525. return io.EOF
  526. }
  527. } else if ch1 == eof {
  528. return io.EOF
  529. }
  530. }
  531. }
  532. func (s *Scanner) ScanWhiteSpace() (tok Token, lit string) {
  533. var buf bytes.Buffer
  534. for {
  535. if ch := s.read(); ch == eof {
  536. break
  537. } else if !isWhiteSpace(ch) {
  538. s.unread()
  539. break
  540. } else {
  541. buf.WriteRune(ch)
  542. }
  543. }
  544. return WS, buf.String()
  545. }
  546. func (s *Scanner) read() rune {
  547. ch, _, err := s.r.ReadRune()
  548. if err != nil {
  549. return eof
  550. }
  551. return ch
  552. }
  553. func (s *Scanner) unread() {
  554. _ = s.r.UnreadRune()
  555. }
  556. var eof = rune(0)
  557. func isWhiteSpace(r rune) bool {
  558. return (r == ' ') || (r == '\t') || (r == '\r') || (r == '\n')
  559. }
  560. func isLetter(ch rune) bool { return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') }
  561. func isDigit(ch rune) bool { return ch >= '0' && ch <= '9' }
  562. func isQuotation(ch rune) bool { return ch == '"' }
  563. func isBackquote(ch rune) bool { return ch == '`' }
  564. func (tok Token) isOperator() bool {
  565. return (tok > operatorBeg && tok < operatorEnd) || tok == ASTERISK || tok == LBRACKET
  566. }
  567. func (tok Token) isTimeLiteral() bool { return tok >= DD && tok <= MS }
  568. func (tok Token) allowedSourceToken() bool {
  569. return tok == IDENT || tok == DIV || tok == HASH || tok == ADD
  570. }
  571. //Allowed special field name token
  572. func (tok Token) allowedSFNToken() bool { return tok == DOT }
  573. func (tok Token) Precedence() int {
  574. switch tok {
  575. case OR:
  576. return 1
  577. case AND:
  578. return 2
  579. case EQ, NEQ, LT, LTE, GT, GTE:
  580. return 3
  581. case ADD, SUB, BITWISE_OR, BITWISE_XOR:
  582. return 4
  583. case MUL, DIV, MOD, BITWISE_AND, SUBSET, ARROW:
  584. return 5
  585. }
  586. return 0
  587. }
  588. type DataType int
  589. const (
  590. UNKNOWN DataType = iota
  591. BIGINT
  592. FLOAT
  593. STRINGS
  594. DATETIME
  595. BOOLEAN
  596. ARRAY
  597. STRUCT
  598. )
  599. var dataTypes = []string{
  600. BIGINT: "bigint",
  601. FLOAT: "float",
  602. STRINGS: "string",
  603. DATETIME: "datetime",
  604. BOOLEAN: "boolean",
  605. ARRAY: "array",
  606. STRUCT: "struct",
  607. }
  608. func (d DataType) isSimpleType() bool {
  609. return d >= BIGINT && d <= BOOLEAN
  610. }
  611. func (d DataType) String() string {
  612. if d >= 0 && d < DataType(len(dataTypes)) {
  613. return dataTypes[d]
  614. }
  615. return ""
  616. }
  617. func getDataType(tok Token) DataType {
  618. switch tok {
  619. case XBIGINT:
  620. return BIGINT
  621. case XFLOAT:
  622. return FLOAT
  623. case XSTRING:
  624. return STRINGS
  625. case XDATETIME:
  626. return DATETIME
  627. case XBOOLEAN:
  628. return BOOLEAN
  629. case XARRAY:
  630. return ARRAY
  631. case XSTRUCT:
  632. return STRUCT
  633. }
  634. return UNKNOWN
  635. }