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 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/*
 * 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

#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) \
38
((tk)->type == TK_NK_INTEGER || (tk)->type == TK_NK_FLOAT || (tk)->type == TK_NK_HEX || (tk)->type == TK_NK_BIN)
H
Haojun Liao 已提交
39 40 41 42 43 44 45

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

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

/**
 * 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
69
 * @return  token type, if it is not a number, TK_NK_ILLEGAL will return
H
Haojun Liao 已提交
70 71 72
 */
static FORCE_INLINE int32_t tGetNumericStringType(const SToken* pToken) {
  const char* z = pToken->z;
73
  int32_t type = TK_NK_ILLEGAL;
H
Haojun Liao 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

  uint32_t i = 0;
  for(; i < pToken->n; ++i) {
    switch (z[i]) {
      case '+':
      case '-': {
        break;
      }

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

        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++;
          }
        }

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

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

          goto _end;
        } else if (next == 'x') {  //hex number
117
          type = TK_NK_HEX;
H
Haojun Liao 已提交
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
          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': {
133
        type = TK_NK_INTEGER;
H
Haojun Liao 已提交
134 135 136 137 138 139 140 141 142 143 144 145
        for (; isdigit(z[i]); i++) {
        }

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

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

          seg++;
146
          type = TK_NK_FLOAT;
H
Haojun Liao 已提交
147 148 149
        }

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

        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++;
          }

160
          type = TK_NK_FLOAT;
H
Haojun Liao 已提交
161 162 163 164 165
        }

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

  _end:
171
  return (i < pToken->n)? TK_NK_ILLEGAL:type;
H
Haojun Liao 已提交
172 173 174 175 176 177 178 179 180 181 182 183 184
}

void taosCleanupKeywordsTable();

SToken tscReplaceStrToken(char **str, SToken *token, const char* newToken);

SToken taosTokenDup(SToken* pToken, char* buf, int32_t len);

#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_TTOKEN_H