qParserImpl.c 24.6 KB
Newer Older
H
hzcheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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/>.
 */

S
slguan 已提交
16
#include "os.h"
17
#include "qSqlparser.h"
H
Haojun Liao 已提交
18
#include "queryLog.h"
H
[td-32]  
hjxilinx 已提交
19
#include "taosdef.h"
H
hjxilinx 已提交
20
#include "taosmsg.h"
H
Haojun Liao 已提交
21
#include "tcmdtype.h"
S
slguan 已提交
22
#include "tglobal.h"
H
hzcheng 已提交
23
#include "tstoken.h"
H
Haojun Liao 已提交
24
#include "tstrbuild.h"
25
#include "ttokendef.h"
H
hzcheng 已提交
26 27
#include "tutil.h"

28
SSqlInfo qSQLParse(const char *pStr) {
H
hzcheng 已提交
29
  void *pParser = ParseAlloc(malloc);
30 31 32

  SSqlInfo sqlInfo = {0};
  sqlInfo.valid = true;
H
hzcheng 已提交
33 34 35

  int32_t i = 0;
  while (1) {
H
Haojun Liao 已提交
36
    SStrToken t0 = {0};
H
hzcheng 已提交
37 38

    if (pStr[i] == 0) {
39
      Parse(pParser, 0, t0, &sqlInfo);
H
hzcheng 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52
      goto abort_parse;
    }

    t0.n = tSQLGetToken((char *)&pStr[i], &t0.type);
    t0.z = (char *)(pStr + i);
    i += t0.n;

    switch (t0.type) {
      case TK_SPACE:
      case TK_COMMENT: {
        break;
      }
      case TK_SEMI: {
53
        Parse(pParser, 0, t0, &sqlInfo);
H
hzcheng 已提交
54 55
        goto abort_parse;
      }
H
hjxilinx 已提交
56 57
      
      case TK_QUESTION:
H
hzcheng 已提交
58
      case TK_ILLEGAL: {
59 60
        snprintf(sqlInfo.pzErrMsg, tListLen(sqlInfo.pzErrMsg), "unrecognized token: \"%s\"", t0.z);
        sqlInfo.valid = false;
H
hzcheng 已提交
61 62 63
        goto abort_parse;
      }
      default:
64 65
        Parse(pParser, t0.type, t0, &sqlInfo);
        if (sqlInfo.valid == false) {
H
hzcheng 已提交
66 67 68 69 70 71 72
          goto abort_parse;
        }
    }
  }

abort_parse:
  ParseFree(pParser, free);
73
  return sqlInfo;
H
hzcheng 已提交
74 75
}

H
Haojun Liao 已提交
76
tSQLExprList *tSQLExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken *pToken) {
H
hzcheng 已提交
77 78 79 80
  if (pList == NULL) {
    pList = calloc(1, sizeof(tSQLExprList));
  }

81
  if (pList->nAlloc <= pList->nExpr) {
H
hzcheng 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
    pList->nAlloc = (pList->nAlloc << 1) + 4;
    pList->a = realloc(pList->a, pList->nAlloc * sizeof(pList->a[0]));
    if (pList->a == 0) {
      pList->nExpr = pList->nAlloc = 0;
      return pList;
    }
  }
  assert(pList->a != 0);

  if (pNode || pToken) {
    struct tSQLExprItem *pItem = &pList->a[pList->nExpr++];
    memset(pItem, 0, sizeof(*pItem));
    pItem->pNode = pNode;
    if (pToken) {  // set the as clause
      pItem->aliasName = malloc(pToken->n + 1);
      strncpy(pItem->aliasName, pToken->z, pToken->n);
      pItem->aliasName[pToken->n] = 0;

      strdequote(pItem->aliasName);
    }
  }
  return pList;
}

void tSQLExprListDestroy(tSQLExprList *pList) {
  if (pList == NULL) return;

  for (int32_t i = 0; i < pList->nExpr; ++i) {
    if (pList->a[i].aliasName != NULL) {
      free(pList->a[i].aliasName);
    }
    tSQLExprDestroy(pList->a[i].pNode);
  }

  free(pList->a);
  free(pList);
}

H
Haojun Liao 已提交
120 121 122 123 124 125
tSQLExpr *tSQLExprIdValueCreate(SStrToken *pToken, int32_t optrType) {
  tSQLExpr *pSQLExpr = calloc(1, sizeof(tSQLExpr));

  if (pToken != NULL) {
    pSQLExpr->token = *pToken;
  }
H
hzcheng 已提交
126 127

  if (optrType == TK_INTEGER || optrType == TK_STRING || optrType == TK_FLOAT || optrType == TK_BOOL) {
H
Haojun Liao 已提交
128
    toTSDBType(pToken->type);
H
hzcheng 已提交
129

H
Haojun Liao 已提交
130 131
    tVariantCreate(&pSQLExpr->val, pToken);
    pSQLExpr->nSQLOptr = optrType;
H
hzcheng 已提交
132 133
  } else if (optrType == TK_NOW) {
    // default use microsecond
H
Haojun Liao 已提交
134 135 136
    pSQLExpr->val.i64Key = taosGetTimestamp(TSDB_TIME_PRECISION_MICRO);
    pSQLExpr->val.nType = TSDB_DATA_TYPE_BIGINT;
    pSQLExpr->nSQLOptr = TK_TIMESTAMP;  // TK_TIMESTAMP used to denote the time value is in microsecond
H
hzcheng 已提交
137
  } else if (optrType == TK_VARIABLE) {
H
Haojun Liao 已提交
138
    int32_t ret = getTimestampInUsFromStr(pToken->z, pToken->n, &pSQLExpr->val.i64Key);
H
hzcheng 已提交
139 140
    UNUSED(ret);

H
Haojun Liao 已提交
141 142
    pSQLExpr->val.nType = TSDB_DATA_TYPE_BIGINT;
    pSQLExpr->nSQLOptr = TK_TIMESTAMP;
S
slguan 已提交
143 144
  } else {  // it must be the column name (tk_id) if it is not the number
    assert(optrType == TK_ID || optrType == TK_ALL);
H
Haojun Liao 已提交
145 146
    if (pToken != NULL) {
      pSQLExpr->colInfo = *pToken;
H
hzcheng 已提交
147 148
    }

H
Haojun Liao 已提交
149
    pSQLExpr->nSQLOptr = optrType;
H
hzcheng 已提交
150
  }
H
Haojun Liao 已提交
151
  return pSQLExpr;
H
hzcheng 已提交
152 153 154 155 156 157
}

/*
 * pList is the parameters for function with id(optType)
 * function name is denoted by pFunctionToken
 */
H
Haojun Liao 已提交
158
tSQLExpr *tSQLExprCreateFunction(tSQLExprList *pList, SStrToken *pFuncToken, SStrToken *endToken, int32_t optType) {
H
hzcheng 已提交
159 160 161 162 163 164
  if (pFuncToken == NULL) return NULL;

  tSQLExpr *pExpr = calloc(1, sizeof(tSQLExpr));
  pExpr->nSQLOptr = optType;
  pExpr->pParam = pList;

S
TD-1057  
Shengliang Guan 已提交
165
  int32_t len = (int32_t)((endToken->z + endToken->n) - pFuncToken->z);
H
hzcheng 已提交
166 167 168 169
  pExpr->operand.z = pFuncToken->z;

  pExpr->operand.n = len;  // raw field name
  pExpr->operand.type = pFuncToken->type;
H
Haojun Liao 已提交
170 171

  pExpr->token = pExpr->operand;
H
hzcheng 已提交
172 173 174 175 176 177 178 179 180 181
  return pExpr;
}

/*
 * create binary expression in this procedure
 * if the expr is arithmetic, calculate the result and set it to tSQLExpr Object
 */
tSQLExpr *tSQLExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
  tSQLExpr *pExpr = calloc(1, sizeof(tSQLExpr));

182 183 184
  if (pRight != NULL && pLeft != NULL) {
    char* endPos = pRight->token.z + pRight->token.n;
    pExpr->token.z = pLeft->token.z;
185
    pExpr->token.n = (uint32_t)(endPos - pExpr->token.z);
186 187
    pExpr->token.type = pLeft->token.type;
  }
H
Haojun Liao 已提交
188 189

  if (optrType == TK_PLUS || optrType == TK_MINUS || optrType == TK_STAR || optrType == TK_DIVIDE || optrType == TK_REM) {
H
hzcheng 已提交
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
    /*
     * if a token is noted as the TK_TIMESTAMP, the time precision is microsecond
     * Otherwise, the time precision is adaptive, determined by the time precision from databases.
     */
    if ((pLeft->nSQLOptr == TK_INTEGER && pRight->nSQLOptr == TK_INTEGER) ||
        (pLeft->nSQLOptr == TK_TIMESTAMP && pRight->nSQLOptr == TK_TIMESTAMP)) {
      pExpr->val.nType = TSDB_DATA_TYPE_BIGINT;
      pExpr->nSQLOptr = pLeft->nSQLOptr;

      switch (optrType) {
        case TK_PLUS: {
          pExpr->val.i64Key = pLeft->val.i64Key + pRight->val.i64Key;
          break;
        }
        case TK_MINUS: {
          pExpr->val.i64Key = pLeft->val.i64Key - pRight->val.i64Key;
          break;
        }
        case TK_STAR: {
          pExpr->val.i64Key = pLeft->val.i64Key * pRight->val.i64Key;
          break;
        }
        case TK_DIVIDE: {
          pExpr->nSQLOptr = TK_FLOAT;
          pExpr->val.nType = TSDB_DATA_TYPE_DOUBLE;
          pExpr->val.dKey = (double)pLeft->val.i64Key / pRight->val.i64Key;
          break;
        }
        case TK_REM: {
          pExpr->val.i64Key = pLeft->val.i64Key % pRight->val.i64Key;
          break;
        }
      }

      tSQLExprDestroy(pLeft);
      tSQLExprDestroy(pRight);

    } else if ((pLeft->val.nType == TSDB_DATA_TYPE_DOUBLE && pRight->val.nType == TSDB_DATA_TYPE_BIGINT) ||
               (pRight->val.nType == TSDB_DATA_TYPE_DOUBLE && pLeft->val.nType == TSDB_DATA_TYPE_BIGINT)) {
      pExpr->val.nType = TSDB_DATA_TYPE_DOUBLE;
      pExpr->nSQLOptr = TK_FLOAT;

      double left = pLeft->val.nType == TSDB_DATA_TYPE_DOUBLE ? pLeft->val.dKey : pLeft->val.i64Key;
      double right = pRight->val.nType == TSDB_DATA_TYPE_DOUBLE ? pRight->val.dKey : pRight->val.i64Key;

      switch (optrType) {
        case TK_PLUS: {
          pExpr->val.dKey = left + right;
          break;
        }
        case TK_MINUS: {
          pExpr->val.dKey = left - right;
          break;
        }
        case TK_STAR: {
          pExpr->val.dKey = left * right;
          break;
        }
        case TK_DIVIDE: {
          pExpr->val.dKey = left / right;
          break;
        }
        case TK_REM: {
          pExpr->val.dKey = left - ((int64_t)(left / right)) * right;
          break;
        }
      }

      tSQLExprDestroy(pLeft);
      tSQLExprDestroy(pRight);

    } else {
      pExpr->nSQLOptr = optrType;
      pExpr->pLeft = pLeft;
      pExpr->pRight = pRight;
    }
  } else if (optrType == TK_IN) {
    pExpr->nSQLOptr = optrType;
    pExpr->pLeft = pLeft;

    tSQLExpr *pRSub = calloc(1, sizeof(tSQLExpr));
    pRSub->nSQLOptr = TK_SET;  // TODO refactor .....
    pRSub->pParam = (tSQLExprList *)pRight;

    pExpr->pRight = pRSub;
  } else {
    pExpr->nSQLOptr = optrType;
    pExpr->pLeft = pLeft;
    pExpr->pRight = pRight;
  }

  return pExpr;
}

S
slguan 已提交
284 285 286 287
void tSQLExprNodeDestroy(tSQLExpr *pExpr) {
  if (pExpr == NULL) {
    return;
  }
H
hzcheng 已提交
288 289 290 291 292 293 294 295 296 297

  if (pExpr->nSQLOptr == TK_STRING) {
    tVariantDestroy(&pExpr->val);
  }

  tSQLExprListDestroy(pExpr->pParam);

  free(pExpr);
}

S
slguan 已提交
298 299 300 301 302 303 304 305 306 307 308
void tSQLExprDestroy(tSQLExpr *pExpr) {
  if (pExpr == NULL) {
    return;
  }

  tSQLExprDestroy(pExpr->pLeft);
  tSQLExprDestroy(pExpr->pRight);

  tSQLExprNodeDestroy(pExpr);
}

H
hzcheng 已提交
309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
static void *tVariantListExpand(tVariantList *pList) {
  if (pList->nAlloc <= pList->nExpr) {  //
    int32_t newSize = (pList->nAlloc << 1) + 4;

    void *ptr = realloc(pList->a, newSize * sizeof(pList->a[0]));
    if (ptr == 0) {
      return NULL;
    }

    pList->nAlloc = newSize;
    pList->a = ptr;
  }

  assert(pList->a != 0);
  return pList;
}

tVariantList *tVariantListAppend(tVariantList *pList, tVariant *pVar, uint8_t sortOrder) {
  if (pList == NULL) {
    pList = calloc(1, sizeof(tVariantList));
  }

  if (tVariantListExpand(pList) == NULL) {
    return pList;
  }

  if (pVar) {
    tVariantListItem *pItem = &pList->a[pList->nExpr++];
    /*
     * Here we do not employ the assign function, since we need the pz attribute of structure
     * , which is the point to char string, to free it!
     *
     * Otherwise, the original pointer may be lost, which causes memory leak.
     */
    memcpy(pItem, pVar, sizeof(tVariant));
    pItem->sortOrder = sortOrder;
  }
  return pList;
}

tVariantList *tVariantListInsert(tVariantList *pList, tVariant *pVar, uint8_t sortOrder, int32_t index) {
  if (pList == NULL || index >= pList->nExpr) {
    return tVariantListAppend(NULL, pVar, sortOrder);
  }

  if (tVariantListExpand(pList) == NULL) {
    return pList;
  }

  if (pVar) {
    memmove(&pList->a[index + 1], &pList->a[index], sizeof(tVariantListItem) * (pList->nExpr - index));

    tVariantListItem *pItem = &pList->a[index];
    /*
     * Here we do not employ the assign function, since we need the pz attribute of structure
     * , which is the point to char string, to free it!
     *
     * Otherwise, the original pointer may be lost, which causes memory leak.
     */
    memcpy(pItem, pVar, sizeof(tVariant));
    pItem->sortOrder = sortOrder;

    pList->nExpr++;
  }

  return pList;
}

void tVariantListDestroy(tVariantList *pList) {
  if (pList == NULL) return;

  for (int32_t i = 0; i < pList->nExpr; ++i) {
    tVariantDestroy(&pList->a[i].pVar);
  }

  free(pList->a);
  free(pList);
}

H
Haojun Liao 已提交
388
tVariantList *tVariantListAppendToken(tVariantList *pList, SStrToken *pToken, uint8_t sortOrder) {
389 390 391 392 393 394 395 396
  if (pList == NULL) {
    pList = calloc(1, sizeof(tVariantList));
  }

  if (tVariantListExpand(pList) == NULL) {
    return pList;
  }

H
Haojun Liao 已提交
397
  if (pToken) {
398
    tVariant t = {0};
H
Haojun Liao 已提交
399
    tVariantCreate(&t, pToken);
400 401 402 403 404 405 406 407

    tVariantListItem *pItem = &pList->a[pList->nExpr++];
    memcpy(pItem, &t, sizeof(tVariant));
    pItem->sortOrder = sortOrder;
  }
  return pList;
}

H
hzcheng 已提交
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
tFieldList *tFieldListAppend(tFieldList *pList, TAOS_FIELD *pField) {
  if (pList == NULL) pList = calloc(1, sizeof(tFieldList));

  if (pList->nAlloc <= pList->nField) {  //
    pList->nAlloc = (pList->nAlloc << 1) + 4;
    pList->p = realloc(pList->p, pList->nAlloc * sizeof(pList->p[0]));
    if (pList->p == 0) {
      pList->nField = pList->nAlloc = 0;
      return pList;
    }
  }
  assert(pList->p != 0);

  if (pField) {
    struct TAOS_FIELD *pItem = (struct TAOS_FIELD *)&pList->p[pList->nField++];
    memcpy(pItem, pField, sizeof(TAOS_FIELD));
  }
  return pList;
}

void tFieldListDestroy(tFieldList *pList) {
  if (pList == NULL) return;

  free(pList->p);
  free(pList);
}

H
Haojun Liao 已提交
435
void setDBName(SStrToken *pCpxName, SStrToken *pDB) {
H
hzcheng 已提交
436 437 438 439 440
  pCpxName->type = pDB->type;
  pCpxName->z = pDB->z;
  pCpxName->n = pDB->n;
}

S
slguan 已提交
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478
int32_t getTimestampInUsFromStrImpl(int64_t val, char unit, int64_t *result) {
  *result = val;

  switch (unit) {
    case 's':
      (*result) *= MILLISECOND_PER_SECOND;
      break;
    case 'm':
      (*result) *= MILLISECOND_PER_MINUTE;
      break;
    case 'h':
      (*result) *= MILLISECOND_PER_HOUR;
      break;
    case 'd':
      (*result) *= MILLISECOND_PER_DAY;
      break;
    case 'w':
      (*result) *= MILLISECOND_PER_WEEK;
      break;
    case 'n':
      (*result) *= MILLISECOND_PER_MONTH;
      break;
    case 'y':
      (*result) *= MILLISECOND_PER_YEAR;
      break;
    case 'a':
      break;
    default: {
      ;
      return -1;
    }
  }

  /* get the value in microsecond */
  (*result) *= 1000L;
  return 0;
}

H
Haojun Liao 已提交
479
void tSQLSetColumnInfo(TAOS_FIELD *pField, SStrToken *pName, TAOS_FIELD *pType) {
H
hzcheng 已提交
480
  int32_t maxLen = sizeof(pField->name) / sizeof(pField->name[0]);
H
hjxilinx 已提交
481 482
  
  // truncate the column name
S
TD-1057  
Shengliang Guan 已提交
483
  if ((int32_t)pName->n >= maxLen) {
H
hzcheng 已提交
484 485 486 487 488 489 490 491 492 493
    pName->n = maxLen - 1;
  }

  strncpy(pField->name, pName->z, pName->n);
  pField->name[pName->n] = 0;

  pField->type = pType->type;
  pField->bytes = pType->bytes;
}

H
Haojun Liao 已提交
494
void tSQLSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
H
hzcheng 已提交
495 496
  pField->type = -1;

H
hjxilinx 已提交
497 498 499
  int32_t LENGTH_SIZE_OF_STR = 2;  // in case of nchar and binary, there two bytes to keep the length of binary|nchar.
  
  for (int8_t i = 0; i < tListLen(tDataTypeDesc); ++i) {
H
hzcheng 已提交
500 501 502 503 504 505 506 507 508 509 510
    if ((strncasecmp(type->z, tDataTypeDesc[i].aName, tDataTypeDesc[i].nameLen) == 0) &&
        (type->n == tDataTypeDesc[i].nameLen)) {
      pField->type = i;
      pField->bytes = tDataTypeDesc[i].nSize;

      if (i == TSDB_DATA_TYPE_NCHAR) {
        /*
         * for nchar, the TOKENTYPE is the number of character, so the length is the
         * number of bytes in UCS-4 format, which is 4 times larger than the
         * number of characters
         */
dengyihao's avatar
dengyihao 已提交
511 512 513 514 515
        if (type->type == 0) {
          pField->bytes = 0;
        } else {
          pField->bytes = -(int32_t)type->type * TSDB_NCHAR_SIZE + LENGTH_SIZE_OF_STR;
        }
H
hzcheng 已提交
516 517
      } else if (i == TSDB_DATA_TYPE_BINARY) {
        /* for binary, the TOKENTYPE is the length of binary */
dengyihao's avatar
dengyihao 已提交
518 519 520 521 522
        if (type->type == 0) {
          pField->bytes = 0;
        } else {
          pField->bytes = -(int32_t) type->type + LENGTH_SIZE_OF_STR;
        } 
H
hzcheng 已提交
523 524 525 526 527 528 529 530 531
      }
      break;
    }
  }
}

/*
 * extract the select info out of sql string
 */
H
Haojun Liao 已提交
532 533 534
SQuerySQL *tSetQuerySQLElems(SStrToken *pSelectToken, tSQLExprList *pSelection, tVariantList *pFrom, tSQLExpr *pWhere,
                             tVariantList *pGroupby, tVariantList *pSortOrder, SStrToken *pInterval,
                             SStrToken *pSliding, tVariantList *pFill, SLimitVal *pLimit, SLimitVal *pGLimit) {
H
hjxilinx 已提交
535
  assert(pSelection != NULL);
H
hzcheng 已提交
536 537 538

  SQuerySQL *pQuery = calloc(1, sizeof(SQuerySQL));
  pQuery->selectToken = *pSelectToken;
S
TD-1057  
Shengliang Guan 已提交
539
  pQuery->selectToken.n = (uint32_t)strlen(pQuery->selectToken.z);  // all later sql string are belonged to the stream sql
H
hzcheng 已提交
540 541

  pQuery->pSelection = pSelection;
S
slguan 已提交
542
  pQuery->from = pFrom;
H
hzcheng 已提交
543 544 545 546
  pQuery->pGroupby = pGroupby;
  pQuery->pSortOrder = pSortOrder;
  pQuery->pWhere = pWhere;

H
hjxilinx 已提交
547 548 549
  if (pLimit != NULL) {
    pQuery->limit = *pLimit;
  }
H
hjxilinx 已提交
550

H
hjxilinx 已提交
551 552 553
  if (pGLimit != NULL) {
    pQuery->slimit = *pGLimit;
  }
H
hzcheng 已提交
554

H
hjxilinx 已提交
555 556 557
  if (pInterval != NULL) {
    pQuery->interval = *pInterval;
  }
H
hjxilinx 已提交
558

H
hjxilinx 已提交
559 560 561
  if (pSliding != NULL) {
    pQuery->sliding = *pSliding;
  }
H
hjxilinx 已提交
562

H
hzcheng 已提交
563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586
  pQuery->fillType = pFill;
  return pQuery;
}

tSQLExprListList *tSQLListListAppend(tSQLExprListList *pList, tSQLExprList *pExprList) {
  if (pList == NULL) pList = calloc(1, sizeof(tSQLExprListList));

  if (pList->nAlloc <= pList->nList) {  //
    pList->nAlloc = (pList->nAlloc << 1) + 4;
    pList->a = realloc(pList->a, pList->nAlloc * sizeof(pList->a[0]));
    if (pList->a == 0) {
      pList->nList = pList->nAlloc = 0;
      return pList;
    }
  }
  assert(pList->a != 0);

  if (pExprList) {
    pList->a[pList->nList++] = pExprList;
  }

  return pList;
}

587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616
void doDestroyQuerySql(SQuerySQL *pQuerySql) {
  if (pQuerySql == NULL) {
    return;
  }
  
  tSQLExprListDestroy(pQuerySql->pSelection);
  
  pQuerySql->pSelection = NULL;
  
  tSQLExprDestroy(pQuerySql->pWhere);
  pQuerySql->pWhere = NULL;
  
  tVariantListDestroy(pQuerySql->pSortOrder);
  pQuerySql->pSortOrder = NULL;
  
  tVariantListDestroy(pQuerySql->pGroupby);
  pQuerySql->pGroupby = NULL;
  
  tVariantListDestroy(pQuerySql->from);
  pQuerySql->from = NULL;
  
  tVariantListDestroy(pQuerySql->fillType);
  
  free(pQuerySql);
}

void destroyAllSelectClause(SSubclauseInfo *pClause) {
  if (pClause == NULL || pClause->numOfClause == 0) {
    return;
  }
H
hzcheng 已提交
617

618 619 620 621
  for(int32_t i = 0; i < pClause->numOfClause; ++i) {
    SQuerySQL *pQuerySql = pClause->pClause[i];
    doDestroyQuerySql(pQuerySql);
  }
622
  
S
Shengliang Guan 已提交
623
  taosTFree(pClause->pClause);
H
hzcheng 已提交
624 625
}

H
Haojun Liao 已提交
626
SCreateTableSQL *tSetCreateSQLElems(tFieldList *pCols, tFieldList *pTags, SStrToken *pStableName,
H
hzcheng 已提交
627 628 629 630
                                    tVariantList *pTagVals, SQuerySQL *pSelect, int32_t type) {
  SCreateTableSQL *pCreate = calloc(1, sizeof(SCreateTableSQL));

  switch (type) {
631
    case TSQL_CREATE_TABLE: {
H
hzcheng 已提交
632 633 634 635
      pCreate->colInfo.pColumns = pCols;
      assert(pTagVals == NULL && pTags == NULL);
      break;
    }
636
    case TSQL_CREATE_STABLE: {
H
hzcheng 已提交
637 638 639 640 641
      pCreate->colInfo.pColumns = pCols;
      pCreate->colInfo.pTagColumns = pTags;
      assert(pTagVals == NULL && pTags != NULL && pCols != NULL);
      break;
    }
642
    case TSQL_CREATE_TABLE_FROM_STABLE: {
H
hzcheng 已提交
643
      pCreate->usingInfo.pTagVals = pTagVals;
644
      pCreate->usingInfo.stableName = *pStableName;
H
hzcheng 已提交
645 646 647 648 649 650 651 652 653 654
      break;
    }
    case TSQL_CREATE_STREAM: {
      pCreate->pSelect = pSelect;
      break;
    }
    default:
      assert(false);
  }

655
  pCreate->type = type;
H
hzcheng 已提交
656 657 658
  return pCreate;
}

H
Haojun Liao 已提交
659
SAlterTableSQL *tAlterTableSQLElems(SStrToken *pMeterName, tFieldList *pCols, tVariantList *pVals, int32_t type) {
H
hzcheng 已提交
660
  SAlterTableSQL *pAlterTable = calloc(1, sizeof(SAlterTableSQL));
661
  
H
hzcheng 已提交
662
  pAlterTable->name = *pMeterName;
663
  pAlterTable->type = type;
H
hzcheng 已提交
664

665
  if (type == TSDB_ALTER_TABLE_ADD_COLUMN || type == TSDB_ALTER_TABLE_ADD_TAG_COLUMN) {
H
hzcheng 已提交
666 667 668
    pAlterTable->pAddColumns = pCols;
    assert(pVals == NULL);
  } else {
669 670 671 672
    /*
     * ALTER_TABLE_TAGS_CHG, ALTER_TABLE_TAGS_SET, ALTER_TABLE_TAGS_DROP,
     * ALTER_TABLE_DROP_COLUMN
     */
H
hzcheng 已提交
673 674 675 676 677 678 679 680 681 682
    pAlterTable->varList = pVals;
    assert(pCols == NULL);
  }

  return pAlterTable;
}

void SQLInfoDestroy(SSqlInfo *pInfo) {
  if (pInfo == NULL) return;

683 684 685
  if (pInfo->type == TSDB_SQL_SELECT) {
    destroyAllSelectClause(&pInfo->subclauseInfo);
  } else if (pInfo->type == TSDB_SQL_CREATE_TABLE) {
H
hzcheng 已提交
686
    SCreateTableSQL *pCreateTableInfo = pInfo->pCreateTableInfo;
687
    doDestroyQuerySql(pCreateTableInfo->pSelect);
H
hzcheng 已提交
688 689 690 691 692

    tFieldListDestroy(pCreateTableInfo->colInfo.pColumns);
    tFieldListDestroy(pCreateTableInfo->colInfo.pTagColumns);

    tVariantListDestroy(pCreateTableInfo->usingInfo.pTagVals);
S
Shengliang Guan 已提交
693
    taosTFree(pInfo->pCreateTableInfo);
694
  } else if (pInfo->type == TSDB_SQL_ALTER_TABLE) {
H
hzcheng 已提交
695 696
    tVariantListDestroy(pInfo->pAlterInfo->varList);
    tFieldListDestroy(pInfo->pAlterInfo->pAddColumns);
697
    
S
Shengliang Guan 已提交
698
    taosTFree(pInfo->pAlterInfo);
H
hzcheng 已提交
699 700 701 702 703
  } else {
    if (pInfo->pDCLInfo != NULL && pInfo->pDCLInfo->nAlloc > 0) {
      free(pInfo->pDCLInfo->a);
    }

704
    if (pInfo->pDCLInfo != NULL && pInfo->type == TSDB_SQL_CREATE_DB) {
H
hzcheng 已提交
705 706 707
      tVariantListDestroy(pInfo->pDCLInfo->dbOpt.keep);
    }

S
Shengliang Guan 已提交
708
    taosTFree(pInfo->pDCLInfo);
H
hzcheng 已提交
709 710 711
  }
}

712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729
SSubclauseInfo* setSubclause(SSubclauseInfo* pSubclause, void *pSqlExprInfo) {
  if (pSubclause == NULL) {
    pSubclause = calloc(1, sizeof(SSubclauseInfo));
  }
  
  int32_t newSize = pSubclause->numOfClause + 1;
  char* tmp = realloc(pSubclause->pClause, newSize * POINTER_BYTES);
  if (tmp == NULL) {
    return pSubclause;
  }
  
  pSubclause->pClause = (SQuerySQL**) tmp;
  
  pSubclause->pClause[newSize - 1] = pSqlExprInfo;
  pSubclause->numOfClause++;
  
  return pSubclause;
}
H
hzcheng 已提交
730

H
Haojun Liao 已提交
731
SSqlInfo* setSQLInfo(SSqlInfo *pInfo, void *pSqlExprInfo, SStrToken *pMeterName, int32_t type) {
732 733 734 735 736 737 738 739 740
  pInfo->type = type;
  
  if (type == TSDB_SQL_SELECT) {
    pInfo->subclauseInfo = *(SSubclauseInfo*) pSqlExprInfo;
    free(pSqlExprInfo);
  } else {
    pInfo->pCreateTableInfo = pSqlExprInfo;
  }
  
H
hzcheng 已提交
741 742 743
  if (pMeterName != NULL) {
    pInfo->pCreateTableInfo->name = *pMeterName;
  }
744 745 746 747 748 749 750 751 752 753 754 755 756 757
  
  return pInfo;
}

SSubclauseInfo* appendSelectClause(SSubclauseInfo *pQueryInfo, void *pSubclause) {
  char* tmp = realloc(pQueryInfo->pClause, (pQueryInfo->numOfClause + 1) * POINTER_BYTES);
  if (tmp == NULL) {  // out of memory
    return pQueryInfo;
  }
  
  pQueryInfo->pClause = (SQuerySQL**) tmp;
  pQueryInfo->pClause[pQueryInfo->numOfClause++] = pSubclause;
  
  return pQueryInfo;
H
hzcheng 已提交
758 759
}

H
Haojun Liao 已提交
760
void setCreatedTableName(SSqlInfo *pInfo, SStrToken *pMeterName, SStrToken *pIfNotExists) {
H
hzcheng 已提交
761 762 763 764 765 766 767 768 769 770 771 772 773 774
  pInfo->pCreateTableInfo->name = *pMeterName;
  pInfo->pCreateTableInfo->existCheck = (pIfNotExists->n != 0);
}

void tTokenListBuyMoreSpace(tDCLSQL *pTokenList) {
  if (pTokenList->nAlloc <= pTokenList->nTokens) {  //
    pTokenList->nAlloc = (pTokenList->nAlloc << 1) + 4;
    pTokenList->a = realloc(pTokenList->a, pTokenList->nAlloc * sizeof(pTokenList->a[0]));
    if (pTokenList->a == 0) {
      pTokenList->nTokens = pTokenList->nAlloc = 0;
    }
  }
}

H
Haojun Liao 已提交
775
tDCLSQL *tTokenListAppend(tDCLSQL *pTokenList, SStrToken *pToken) {
H
hzcheng 已提交
776 777 778 779 780 781 782 783 784 785 786
  if (pToken == NULL) return NULL;

  if (pTokenList == NULL) pTokenList = calloc(1, sizeof(tDCLSQL));

  tTokenListBuyMoreSpace(pTokenList);
  pTokenList->a[pTokenList->nTokens++] = *pToken;

  return pTokenList;
}

void setDCLSQLElems(SSqlInfo *pInfo, int32_t type, int32_t nParam, ...) {
787
  pInfo->type = type;
H
hzcheng 已提交
788 789

  if (nParam == 0) return;
L
lihui 已提交
790
  if (pInfo->pDCLInfo == NULL) pInfo->pDCLInfo = (tDCLSQL *)calloc(1, sizeof(tDCLSQL));
H
hzcheng 已提交
791 792 793 794 795

  va_list va;
  va_start(va, nParam);

  while (nParam-- > 0) {
H
Haojun Liao 已提交
796
    SStrToken *pToken = va_arg(va, SStrToken *);
dengyihao's avatar
dengyihao 已提交
797
    pInfo->pDCLInfo = tTokenListAppend(pInfo->pDCLInfo, pToken);
H
hzcheng 已提交
798 799 800 801
  }
  va_end(va);
}

H
Haojun Liao 已提交
802
void setDropDBTableInfo(SSqlInfo *pInfo, int32_t type, SStrToken* pToken, SStrToken* existsCheck) {
803
  pInfo->type = type;
dengyihao's avatar
dengyihao 已提交
804
  pInfo->pDCLInfo = tTokenListAppend(pInfo->pDCLInfo, pToken);
805 806 807
  pInfo->pDCLInfo->existsCheck = (existsCheck->n == 1);
}

H
Haojun Liao 已提交
808
void setShowOptions(SSqlInfo *pInfo, int32_t type, SStrToken* prefix, SStrToken* pPatterns) {
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830
  if (pInfo->pDCLInfo == NULL) {
    pInfo->pDCLInfo = calloc(1, sizeof(tDCLSQL));
  }
  
  pInfo->type = TSDB_SQL_SHOW;
  
  SShowInfo* pShowInfo = &pInfo->pDCLInfo->showOpt;
  pShowInfo->showType = type;
  
  if (prefix != NULL && prefix->type != 0) {
    pShowInfo->prefix = *prefix;
  } else {
    pShowInfo->prefix.type = 0;
  }
  
  if (pPatterns != NULL && pPatterns->type != 0) {
    pShowInfo->pattern = *pPatterns;
  } else {
    pShowInfo->pattern.type = 0;
  }
}

H
Haojun Liao 已提交
831
void setCreateDBSQL(SSqlInfo *pInfo, int32_t type, SStrToken *pToken, SCreateDBInfo *pDB, SStrToken *pIgExists) {
832
  pInfo->type = type;
H
hzcheng 已提交
833 834 835 836 837 838
  if (pInfo->pDCLInfo == NULL) {
    pInfo->pDCLInfo = calloc(1, sizeof(tDCLSQL));
  }

  pInfo->pDCLInfo->dbOpt = *pDB;
  pInfo->pDCLInfo->dbOpt.dbname = *pToken;
S
Steven Li 已提交
839
  pInfo->pDCLInfo->dbOpt.ignoreExists = pIgExists->n; // sql.y has: ifnotexists(X) ::= IF NOT EXISTS.   {X.n = 1;}
H
hzcheng 已提交
840 841
}

H
Haojun Liao 已提交
842
void setCreateAcctSQL(SSqlInfo *pInfo, int32_t type, SStrToken *pName, SStrToken *pPwd, SCreateAcctSQL *pAcctInfo) {
843
  pInfo->type = type;
H
hzcheng 已提交
844 845 846 847 848
  if (pInfo->pDCLInfo == NULL) {
    pInfo->pDCLInfo = calloc(1, sizeof(tDCLSQL));
  }

  pInfo->pDCLInfo->acctOpt = *pAcctInfo;
849 850 851 852 853 854 855 856
  
  assert(pName != NULL);
  pInfo->pDCLInfo->user.user = *pName;
  
  if (pPwd != NULL) {
    pInfo->pDCLInfo->user.passwd = *pPwd;
  }
}
H
hzcheng 已提交
857

H
Haojun Liao 已提交
858
void setCreateUserSQL(SSqlInfo *pInfo, SStrToken *pName, SStrToken *pPasswd) {
859 860 861 862 863 864 865 866 867 868
  pInfo->type = TSDB_SQL_CREATE_USER;
  if (pInfo->pDCLInfo == NULL) {
    pInfo->pDCLInfo = calloc(1, sizeof(tDCLSQL));
  }
  
  assert(pName != NULL && pPasswd != NULL);
  
  pInfo->pDCLInfo->user.user = *pName;
  pInfo->pDCLInfo->user.passwd = *pPasswd;
}
H
hzcheng 已提交
869

H
Haojun Liao 已提交
870
void setAlterUserSQL(SSqlInfo *pInfo, int16_t type, SStrToken *pName, SStrToken* pPwd, SStrToken *pPrivilege) {
871 872 873 874 875 876 877 878 879 880 881 882 883
  pInfo->type = TSDB_SQL_ALTER_USER;
  if (pInfo->pDCLInfo == NULL) {
    pInfo->pDCLInfo = calloc(1, sizeof(tDCLSQL));
  }
  
  assert(pName != NULL);
  
  SUserInfo* pUser = &pInfo->pDCLInfo->user;
  pUser->type = type;
  pUser->user = *pName;
  
  if (pPwd != NULL) {
    pUser->passwd = *pPwd;
L
lihui 已提交
884 885
  } else {
    pUser->passwd.type = TSDB_DATA_TYPE_NULL;
886 887 888 889
  }
  
  if (pPrivilege != NULL) {
    pUser->privilege = *pPrivilege;
L
lihui 已提交
890 891
  } else {
    pUser->privilege.type = TSDB_DATA_TYPE_NULL;
892 893 894
  }
}

H
Haojun Liao 已提交
895
void setKillSQL(SSqlInfo *pInfo, int32_t type, SStrToken *ip) {
896 897 898
  pInfo->type = type;
  if (pInfo->pDCLInfo == NULL) {
    pInfo->pDCLInfo = calloc(1, sizeof(tDCLSQL));
H
hzcheng 已提交
899
  }
900 901 902 903
  
  assert(ip != NULL);
  
  pInfo->pDCLInfo->ip = *ip;
H
hzcheng 已提交
904
}
H
hjxilinx 已提交
905 906 907 908

void setDefaultCreateDbOption(SCreateDBInfo *pDBInfo) {
  pDBInfo->compressionLevel = -1;

H
hjxilinx 已提交
909
  pDBInfo->walLevel = -1;
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
910
  pDBInfo->fsyncPeriod = -1;
H
hjxilinx 已提交
911
  pDBInfo->commitTime = -1;
H
hjxilinx 已提交
912
  pDBInfo->maxTablesPerVnode = -1;
H
hjxilinx 已提交
913 914

  pDBInfo->cacheBlockSize = -1;
H
hjxilinx 已提交
915 916 917
  pDBInfo->numOfBlocks = -1;
  pDBInfo->maxRowsPerBlock = -1;
  pDBInfo->minRowsPerBlock = -1;
H
hjxilinx 已提交
918 919 920
  pDBInfo->daysPerFile = -1;

  pDBInfo->replica = -1;
921
  pDBInfo->quorum = -1;
H
hjxilinx 已提交
922 923
  pDBInfo->keep = NULL;

H
Haojun Liao 已提交
924
  memset(&pDBInfo->precision, 0, sizeof(SStrToken));
925
}