token.go 4.4 KB

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