token.go 6.0 KB

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