token.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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. TRUE
  93. FALSE
  94. CREATE
  95. DROP
  96. EXPLAIN
  97. DESCRIBE
  98. SHOW
  99. STREAM
  100. TABLE
  101. STREAMS
  102. TABLES
  103. WITH
  104. XBIGINT
  105. XFLOAT
  106. XSTRING
  107. XBYTEA
  108. XDATETIME
  109. XBOOLEAN
  110. XARRAY
  111. XSTRUCT
  112. DATASOURCE
  113. KEY
  114. FORMAT
  115. CONF_KEY
  116. TYPE
  117. STRICT_VALIDATION
  118. TIMESTAMP
  119. TIMESTAMP_FORMAT
  120. RETAIN_SIZE
  121. SHARED
  122. SCHEMAID
  123. KIND
  124. DD
  125. HH
  126. MI
  127. SS
  128. MS
  129. )
  130. var Tokens = []string{
  131. ILLEGAL: "ILLEGAL",
  132. EOF: "EOF",
  133. AS: "AS",
  134. WS: "WS",
  135. IDENT: "IDENT",
  136. INTEGER: "INTEGER",
  137. NUMBER: "NUMBER",
  138. STRING: "STRING",
  139. ADD: "+",
  140. SUB: "-",
  141. MUL: "*",
  142. DIV: "/",
  143. MOD: "%",
  144. BITWISE_AND: "&",
  145. BITWISE_OR: "|",
  146. BITWISE_XOR: "^",
  147. EQ: "=",
  148. NEQ: "!=",
  149. LT: "<",
  150. LTE: "<=",
  151. GT: ">",
  152. GTE: ">=",
  153. SUBSET: "[]",
  154. ARROW: "->",
  155. IN: "IN",
  156. ASTERISK: "*",
  157. COMMA: ",",
  158. LPAREN: "(",
  159. RPAREN: ")",
  160. LBRACKET: "[",
  161. RBRACKET: "]",
  162. HASH: "#",
  163. DOT: ".",
  164. SEMICOLON: ";",
  165. COLON: ":",
  166. COLSEP: "\007",
  167. SELECT: "SELECT",
  168. FROM: "FROM",
  169. JOIN: "JOIN",
  170. LEFT: "LEFT",
  171. INNER: "INNER",
  172. ON: "ON",
  173. WHERE: "WHERE",
  174. GROUP: "GROUP",
  175. ORDER: "ORDER",
  176. HAVING: "HAVING",
  177. BY: "BY",
  178. ASC: "ASC",
  179. DESC: "DESC",
  180. FILTER: "FILTER",
  181. CASE: "CASE",
  182. WHEN: "WHEN",
  183. THEN: "THEN",
  184. ELSE: "ELSE",
  185. END: "END",
  186. CREATE: "CREATE",
  187. DROP: "RROP",
  188. EXPLAIN: "EXPLAIN",
  189. DESCRIBE: "DESCRIBE",
  190. SHOW: "SHOW",
  191. STREAM: "STREAM",
  192. TABLE: "TABLE",
  193. STREAMS: "STREAMS",
  194. TABLES: "TABLES",
  195. WITH: "WITH",
  196. XBIGINT: "BIGINT",
  197. XFLOAT: "FLOAT",
  198. XSTRING: "STRING",
  199. XBYTEA: "BYTEA",
  200. XDATETIME: "DATETIME",
  201. XBOOLEAN: "BOOLEAN",
  202. XARRAY: "ARRAY",
  203. XSTRUCT: "STRUCT",
  204. DATASOURCE: "DATASOURCE",
  205. KEY: "KEY",
  206. FORMAT: "FORMAT",
  207. CONF_KEY: "CONF_KEY",
  208. TYPE: "TYPE",
  209. STRICT_VALIDATION: "STRICT_VALIDATION",
  210. TIMESTAMP: "TIMESTAMP",
  211. TIMESTAMP_FORMAT: "TIMESTAMP_FORMAT",
  212. RETAIN_SIZE: "RETAIN_SIZE",
  213. SHARED: "SHARED",
  214. AND: "AND",
  215. OR: "OR",
  216. TRUE: "TRUE",
  217. FALSE: "FALSE",
  218. NOTIN: "NOT IN",
  219. BETWEEN: "BETWEEN",
  220. NOTBETWEEN: "NOT BETWEEN",
  221. LIKE: "LIKE",
  222. NOTLIKE: "NOT LIKE",
  223. DD: "DD",
  224. HH: "HH",
  225. MI: "MI",
  226. SS: "SS",
  227. MS: "MS",
  228. }
  229. var COLUMN_SEPARATOR = Tokens[COLSEP]
  230. func (tok Token) String() string {
  231. if tok >= 0 && tok < Token(len(Tokens)) {
  232. return Tokens[tok]
  233. }
  234. return ""
  235. }
  236. func (tok Token) IsOperator() bool {
  237. return (tok > operatorBeg && tok < operatorEnd) || tok == ASTERISK || tok == LBRACKET
  238. }
  239. func (tok Token) IsTimeLiteral() bool { return tok >= DD && tok <= MS }
  240. func (tok Token) AllowedSourceToken() bool {
  241. return tok == IDENT || tok == DIV || tok == HASH || tok == ADD
  242. }
  243. //Allowed special field name token
  244. func (tok Token) AllowedSFNToken() bool { return tok == DOT }
  245. func (tok Token) Precedence() int {
  246. switch tok {
  247. case OR:
  248. return 1
  249. case AND:
  250. return 2
  251. case EQ, NEQ, LT, LTE, GT, GTE, IN, NOTIN, BETWEEN, NOTBETWEEN, LIKE, NOTLIKE:
  252. return 3
  253. case ADD, SUB, BITWISE_OR, BITWISE_XOR:
  254. return 4
  255. case MUL, DIV, MOD, BITWISE_AND, SUBSET, ARROW:
  256. return 5
  257. }
  258. return 0
  259. }
  260. type DataType int
  261. const (
  262. UNKNOWN DataType = iota
  263. BIGINT
  264. FLOAT
  265. STRINGS
  266. BYTEA
  267. DATETIME
  268. BOOLEAN
  269. ARRAY
  270. STRUCT
  271. )
  272. var dataTypes = []string{
  273. BIGINT: "bigint",
  274. FLOAT: "float",
  275. STRINGS: "string",
  276. BYTEA: "bytea",
  277. DATETIME: "datetime",
  278. BOOLEAN: "boolean",
  279. ARRAY: "array",
  280. STRUCT: "struct",
  281. }
  282. func (d DataType) IsSimpleType() bool {
  283. return d >= BIGINT && d <= BOOLEAN
  284. }
  285. func (d DataType) String() string {
  286. if d >= 0 && d < DataType(len(dataTypes)) {
  287. return dataTypes[d]
  288. }
  289. return ""
  290. }
  291. func GetDataType(tok Token) DataType {
  292. switch tok {
  293. case XBIGINT:
  294. return BIGINT
  295. case XFLOAT:
  296. return FLOAT
  297. case XSTRING:
  298. return STRINGS
  299. case XBYTEA:
  300. return BYTEA
  301. case XDATETIME:
  302. return DATETIME
  303. case XBOOLEAN:
  304. return BOOLEAN
  305. case XARRAY:
  306. return ARRAY
  307. case XSTRUCT:
  308. return STRUCT
  309. }
  310. return UNKNOWN
  311. }