token.go 5.2 KB

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