token.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. // Copyright 2021-2023 EMQ Technologies Co., Ltd.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package ast
  15. import "strings"
  16. type Token int
  17. const (
  18. // Special Tokens
  19. ILLEGAL Token = iota
  20. EOF
  21. WS
  22. COMMENT
  23. AS
  24. // Literals
  25. IDENT // main
  26. INTEGER // 12345
  27. NUMBER // 12345.67
  28. STRING // "abc"
  29. SINGLEQUOTE // 'abc'
  30. BADSTRING // "abc
  31. operatorBeg
  32. // ADD and the following are InfluxQL Operators
  33. ADD // +
  34. SUB // -
  35. MUL // *
  36. DIV // /
  37. MOD // %
  38. BITWISE_AND // &
  39. BITWISE_OR // |
  40. BITWISE_XOR // ^
  41. AND // AND
  42. OR // OR
  43. EQ // =
  44. NEQ // !=
  45. LT // <
  46. LTE // <=
  47. GT // >
  48. GTE // >=
  49. SUBSET //[
  50. ARROW //->
  51. IN // IN
  52. NOT // NOT
  53. NOTIN // NOT
  54. BETWEEN
  55. NOTBETWEEN
  56. LIKE
  57. NOTLIKE
  58. REPLACE
  59. EXCEPT
  60. operatorEnd
  61. // Misc characters
  62. ASTERISK // *
  63. COMMA // ,
  64. LPAREN // (
  65. RPAREN // )
  66. LBRACKET //[
  67. RBRACKET //]
  68. HASH // #
  69. DOT // .
  70. COLON //:
  71. SEMICOLON //;
  72. COLSEP //\007
  73. // Keywords
  74. SELECT
  75. FROM
  76. JOIN
  77. INNER
  78. LEFT
  79. RIGHT
  80. FULL
  81. CROSS
  82. ON
  83. WHERE
  84. GROUP
  85. ORDER
  86. HAVING
  87. BY
  88. ASC
  89. DESC
  90. FILTER
  91. CASE
  92. WHEN
  93. THEN
  94. ELSE
  95. END
  96. OVER
  97. PARTITION
  98. TRUE
  99. FALSE
  100. DD
  101. HH
  102. MI
  103. SS
  104. MS
  105. )
  106. var Tokens = []string{
  107. ILLEGAL: "ILLEGAL",
  108. EOF: "EOF",
  109. AS: "AS",
  110. WS: "WS",
  111. IDENT: "IDENT",
  112. INTEGER: "INTEGER",
  113. NUMBER: "NUMBER",
  114. STRING: "STRING",
  115. SINGLEQUOTE: "SINGLEQUOTE",
  116. ADD: "+",
  117. SUB: "-",
  118. MUL: "*",
  119. DIV: "/",
  120. MOD: "%",
  121. BITWISE_AND: "&",
  122. BITWISE_OR: "|",
  123. BITWISE_XOR: "^",
  124. EQ: "=",
  125. NEQ: "!=",
  126. LT: "<",
  127. LTE: "<=",
  128. GT: ">",
  129. GTE: ">=",
  130. SUBSET: "[]",
  131. ARROW: "->",
  132. IN: "IN",
  133. ASTERISK: "*",
  134. COMMA: ",",
  135. LPAREN: "(",
  136. RPAREN: ")",
  137. LBRACKET: "[",
  138. RBRACKET: "]",
  139. HASH: "#",
  140. DOT: ".",
  141. SEMICOLON: ";",
  142. COLON: ":",
  143. COLSEP: "\007",
  144. SELECT: "SELECT",
  145. FROM: "FROM",
  146. JOIN: "JOIN",
  147. LEFT: "LEFT",
  148. INNER: "INNER",
  149. ON: "ON",
  150. WHERE: "WHERE",
  151. GROUP: "GROUP",
  152. ORDER: "ORDER",
  153. HAVING: "HAVING",
  154. BY: "BY",
  155. ASC: "ASC",
  156. DESC: "DESC",
  157. FILTER: "FILTER",
  158. CASE: "CASE",
  159. WHEN: "WHEN",
  160. THEN: "THEN",
  161. ELSE: "ELSE",
  162. END: "END",
  163. OVER: "OVER",
  164. PARTITION: "PARTITION",
  165. AND: "AND",
  166. OR: "OR",
  167. TRUE: "TRUE",
  168. FALSE: "FALSE",
  169. NOTIN: "NOT IN",
  170. BETWEEN: "BETWEEN",
  171. NOTBETWEEN: "NOT BETWEEN",
  172. LIKE: "LIKE",
  173. NOTLIKE: "NOT LIKE",
  174. REPLACE: "REPLACE",
  175. EXCEPT: "EXCEPT",
  176. DD: "DD",
  177. HH: "HH",
  178. MI: "MI",
  179. SS: "SS",
  180. MS: "MS",
  181. }
  182. const (
  183. SELECT_LIT = "SELECT"
  184. CREATE = "CREATE"
  185. DROP = "DROP"
  186. EXPLAIN = "EXPLAIN"
  187. DESCRIBE = "DESCRIBE"
  188. SHOW = "SHOW"
  189. STREAM = "STREAM"
  190. TABLE = "TABLE"
  191. STREAMS = "STREAMS"
  192. TABLES = "TABLES"
  193. WITH = "WITH"
  194. DATASOURCE = "DATASOURCE"
  195. KEY = "KEY"
  196. FORMAT = "FORMAT"
  197. CONF_KEY = "CONF_KEY"
  198. TYPE = "TYPE"
  199. STRICT_VALIDATION = "STRICT_VALIDATION"
  200. TIMESTAMP = "TIMESTAMP"
  201. TIMESTAMP_FORMAT = "TIMESTAMP_FORMAT"
  202. RETAIN_SIZE = "RETAIN_SIZE"
  203. SHARED = "SHARED"
  204. SCHEMAID = "SCHEMAID"
  205. KIND = "KIND"
  206. DELIMITER = "DELIMITER"
  207. XBIGINT = "BIGINT"
  208. XFLOAT = "FLOAT"
  209. XSTRING = "STRING"
  210. XBYTEA = "BYTEA"
  211. XDATETIME = "DATETIME"
  212. XBOOLEAN = "BOOLEAN"
  213. XARRAY = "ARRAY"
  214. XSTRUCT = "STRUCT"
  215. )
  216. var StreamTokens = map[string]struct{}{
  217. DATASOURCE: {},
  218. KEY: {},
  219. FORMAT: {},
  220. CONF_KEY: {},
  221. TYPE: {},
  222. STRICT_VALIDATION: {},
  223. TIMESTAMP: {},
  224. TIMESTAMP_FORMAT: {},
  225. RETAIN_SIZE: {},
  226. SHARED: {},
  227. SCHEMAID: {},
  228. KIND: {},
  229. DELIMITER: {},
  230. }
  231. var StreamDataTypes = map[string]DataType{
  232. XBIGINT: BIGINT,
  233. XFLOAT: FLOAT,
  234. XSTRING: STRINGS,
  235. XBYTEA: BYTEA,
  236. XDATETIME: DATETIME,
  237. XBOOLEAN: BOOLEAN,
  238. XARRAY: ARRAY,
  239. XSTRUCT: STRUCT,
  240. }
  241. func IsStreamOptionKeyword(_ Token, lit string) bool {
  242. // token is always IDENT
  243. _, ok := StreamTokens[lit]
  244. return ok
  245. }
  246. var COLUMN_SEPARATOR = Tokens[COLSEP]
  247. func (tok Token) String() string {
  248. if tok >= 0 && tok < Token(len(Tokens)) {
  249. return Tokens[tok]
  250. }
  251. return ""
  252. }
  253. func (tok Token) IsOperator() bool {
  254. return (tok > operatorBeg && tok < operatorEnd) || tok == ASTERISK || tok == LBRACKET || tok == DOT
  255. }
  256. func (tok Token) IsTimeLiteral() bool { return tok >= DD && tok <= MS }
  257. func (tok Token) AllowedSourceToken() bool {
  258. return tok == IDENT || tok == DIV || tok == HASH || tok == ADD
  259. }
  260. // Allowed special field name token
  261. func (tok Token) AllowedSFNToken() bool { return tok == DOT }
  262. func (tok Token) Precedence() int {
  263. switch tok {
  264. case OR:
  265. return 1
  266. case AND:
  267. return 2
  268. case EQ, NEQ, LT, LTE, GT, GTE, IN, NOTIN, BETWEEN, NOTBETWEEN, LIKE, NOTLIKE:
  269. return 3
  270. case ADD, SUB, BITWISE_OR, BITWISE_XOR:
  271. return 4
  272. case MUL, DIV, MOD, BITWISE_AND, SUBSET, ARROW, DOT:
  273. return 5
  274. }
  275. return 0
  276. }
  277. type DataType int
  278. const (
  279. UNKNOWN DataType = iota
  280. BIGINT
  281. FLOAT
  282. STRINGS
  283. BYTEA
  284. DATETIME
  285. BOOLEAN
  286. ARRAY
  287. STRUCT
  288. )
  289. var dataTypes = []string{
  290. BIGINT: "bigint",
  291. FLOAT: "float",
  292. STRINGS: "string",
  293. BYTEA: "bytea",
  294. DATETIME: "datetime",
  295. BOOLEAN: "boolean",
  296. ARRAY: "array",
  297. STRUCT: "struct",
  298. }
  299. func (d DataType) IsSimpleType() bool {
  300. return d >= BIGINT && d <= BOOLEAN
  301. }
  302. func (d DataType) String() string {
  303. if d >= 0 && d < DataType(len(dataTypes)) {
  304. return dataTypes[d]
  305. }
  306. return ""
  307. }
  308. func GetDataType(lit string) DataType {
  309. lit = strings.ToUpper(lit)
  310. if dt, ok := StreamDataTypes[lit]; ok {
  311. return dt
  312. }
  313. return UNKNOWN
  314. }