token.go 5.9 KB

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