parToken.h 4.0 KB
Newer Older
H
Haojun Liao 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef TDENGINE_TTOKEN_H
#define TDENGINE_TTOKEN_H

#ifdef __cplusplus
extern "C" {
#endif

X
Xiaoyu Wang 已提交
23 24
#include "os.h"

H
Haojun Liao 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#include "ttokendef.h"

// used to denote the minimum unite in sql parsing
typedef struct SToken {
  uint32_t n;
  uint32_t type;
  char    *z;
} SToken;

/**
 * check if it is a number or not
 * @param pToken
 * @return
 */
#define isNumber(tk) \
X
Xiaoyu Wang 已提交
40
  ((tk)->type == TK_NK_INTEGER || (tk)->type == TK_NK_FLOAT || (tk)->type == TK_NK_HEX || (tk)->type == TK_NK_BIN)
H
Haojun Liao 已提交
41 42 43 44 45 46 47

/**
 * tokenizer for sql string
 * @param z
 * @param tokenType
 * @return
 */
48
uint32_t tGetToken(const char *z, uint32_t *tokenType);
H
Haojun Liao 已提交
49 50 51 52 53 54 55 56 57

/**
 * enhanced tokenizer for sql string.
 *
 * @param str
 * @param i
 * @param isPrevOptr
 * @return
 */
58
SToken tStrGetToken(const char *str, int32_t *i, bool isPrevOptr);
H
Haojun Liao 已提交
59 60 61 62 63 64 65 66 67 68 69 70

/**
 * check if it is a keyword or not
 * @param z
 * @param len
 * @return
 */
bool taosIsKeyWordToken(const char *z, int32_t len);

/**
 * check if it is a token or not
 * @param   pToken
71
 * @return  token type, if it is not a number, TK_NK_ILLEGAL will return
H
Haojun Liao 已提交
72
 */
X
Xiaoyu Wang 已提交
73 74 75
static FORCE_INLINE int32_t tGetNumericStringType(const SToken *pToken) {
  const char *z = pToken->z;
  int32_t     type = TK_NK_ILLEGAL;
H
Haojun Liao 已提交
76 77

  uint32_t i = 0;
X
Xiaoyu Wang 已提交
78
  for (; i < pToken->n; ++i) {
H
Haojun Liao 已提交
79 80 81 82 83 84 85 86 87 88 89 90
    switch (z[i]) {
      case '+':
      case '-': {
        break;
      }

      case '.': {
        /*
         * handle the the float number with out integer part
         * .123
         * .123e4
         */
X
Xiaoyu Wang 已提交
91
        if (!isdigit(z[i + 1])) {
92
          return TK_NK_ILLEGAL;
H
Haojun Liao 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105
        }

        for (i += 2; isdigit(z[i]); i++) {
        }

        if ((z[i] == 'e' || z[i] == 'E') &&
            (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) {
          i += 2;
          while (isdigit(z[i])) {
            i++;
          }
        }

106
        type = TK_NK_FLOAT;
H
Haojun Liao 已提交
107 108 109 110 111
        goto _end;
      }

      case '0': {
        char next = z[i + 1];
X
Xiaoyu Wang 已提交
112
        if (next == 'b') {  // bin number
113
          type = TK_NK_BIN;
H
Haojun Liao 已提交
114 115 116 117
          for (i += 2; (z[i] == '0' || z[i] == '1'); ++i) {
          }

          goto _end;
X
Xiaoyu Wang 已提交
118
        } else if (next == 'x') {  // hex number
119
          type = TK_NK_HEX;
H
Haojun Liao 已提交
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
          for (i += 2; isdigit(z[i]) || (z[i] >= 'a' && z[i] <= 'f') || (z[i] >= 'A' && z[i] <= 'F'); ++i) {
          }

          goto _end;
        }
      }
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9': {
135
        type = TK_NK_INTEGER;
H
Haojun Liao 已提交
136 137 138 139 140 141 142 143 144 145 146 147
        for (; isdigit(z[i]); i++) {
        }

        int32_t seg = 0;
        while (z[i] == '.' && isdigit(z[i + 1])) {
          i += 2;

          while (isdigit(z[i])) {
            i++;
          }

          seg++;
148
          type = TK_NK_FLOAT;
H
Haojun Liao 已提交
149 150 151
        }

        if (seg > 1) {
152
          return TK_NK_ILLEGAL;
H
Haojun Liao 已提交
153 154 155 156 157 158 159 160 161
        }

        if ((z[i] == 'e' || z[i] == 'E') &&
            (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) {
          i += 2;
          while (isdigit(z[i])) {
            i++;
          }

162
          type = TK_NK_FLOAT;
H
Haojun Liao 已提交
163 164 165 166 167
        }

        goto _end;
      }
      default:
168
        return TK_NK_ILLEGAL;
H
Haojun Liao 已提交
169 170 171
    }
  }

X
Xiaoyu Wang 已提交
172 173
_end:
  return (i < pToken->n) ? TK_NK_ILLEGAL : type;
H
Haojun Liao 已提交
174 175 176 177
}

void taosCleanupKeywordsTable();

X
Xiaoyu Wang 已提交
178
SToken tscReplaceStrToken(char **str, SToken *token, const char *newToken);
H
Haojun Liao 已提交
179

X
Xiaoyu Wang 已提交
180
SToken taosTokenDup(SToken *pToken, char *buf, int32_t len);
H
Haojun Liao 已提交
181 182 183 184 185 186

#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_TTOKEN_H