token.go 5.0 KB

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