token.go 5.5 KB

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