lexical.go 12 KB

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