clientStmt.c 30.8 KB
Newer Older
D
dapan1121 已提交
1 2 3 4 5

#include "clientInt.h"
#include "clientLog.h"
#include "tdef.h"

X
Xiaoyu Wang 已提交
6 7
#include "clientStmt.h"

8
static int32_t stmtCreateRequest(STscStmt* pStmt) {
D
dapan1121 已提交
9
  int32_t code = 0;
H
Hongze Cheng 已提交
10 11

  if (pStmt->exec.pRequest == NULL) {
D
dapan1121 已提交
12 13 14 15
    code = buildRequest(pStmt->taos->id, pStmt->sql.sqlStr, pStmt->sql.sqlLen, NULL, false, &pStmt->exec.pRequest);
    if (TSDB_CODE_SUCCESS == code) {
      pStmt->exec.pRequest->syncQuery = true;
    }
16
  }
D
dapan1121 已提交
17 18

  return code;
19 20
}

D
stmt  
dapan1121 已提交
21
int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
D
dapan1121 已提交
22
  int32_t code = 0;
X
Xiaoyu Wang 已提交
23

D
stmt  
dapan1121 已提交
24
  switch (newStatus) {
D
dapan1121 已提交
25 26
    case STMT_PREPARE:
      break;
D
stmt  
dapan1121 已提交
27
    case STMT_SETTBNAME:
D
dapan1121 已提交
28
      if (STMT_STATUS_EQ(INIT) || STMT_STATUS_EQ(BIND) || STMT_STATUS_EQ(BIND_COL)) {
D
dapan1121 已提交
29 30 31 32
        code = TSDB_CODE_TSC_STMT_API_ERROR;
      }
      break;
    case STMT_SETTAGS:
D
dapan1121 已提交
33
      if (STMT_STATUS_NE(SETTBNAME) && STMT_STATUS_NE(FETCH_FIELDS)) {
D
dapan1121 已提交
34 35 36 37 38 39 40 41 42 43 44 45
        code = TSDB_CODE_TSC_STMT_API_ERROR;
      }
      break;
    case STMT_FETCH_FIELDS:
      if (STMT_STATUS_EQ(INIT)) {
        code = TSDB_CODE_TSC_STMT_API_ERROR;
      }
      break;
    case STMT_BIND:
      if (STMT_STATUS_EQ(INIT) || STMT_STATUS_EQ(BIND_COL)) {
        code = TSDB_CODE_TSC_STMT_API_ERROR;
      }
X
Xiaoyu Wang 已提交
46 47 48 49 50
      /*
            if ((pStmt->sql.type == STMT_TYPE_MULTI_INSERT) && ()) {
              code = TSDB_CODE_TSC_STMT_API_ERROR;
            }
      */
D
dapan1121 已提交
51 52 53 54 55 56 57 58 59 60
      break;
    case STMT_BIND_COL:
      if (STMT_STATUS_EQ(INIT) || STMT_STATUS_EQ(BIND)) {
        code = TSDB_CODE_TSC_STMT_API_ERROR;
      }
      break;
    case STMT_ADD_BATCH:
      if (STMT_STATUS_NE(BIND) && STMT_STATUS_NE(BIND_COL) && STMT_STATUS_NE(FETCH_FIELDS)) {
        code = TSDB_CODE_TSC_STMT_API_ERROR;
      }
D
stmt  
dapan1121 已提交
61
      break;
D
dapan1121 已提交
62
    case STMT_EXECUTE:
D
dapan1121 已提交
63
      if (STMT_TYPE_QUERY == pStmt->sql.type) {
X
Xiaoyu Wang 已提交
64 65
        if (STMT_STATUS_NE(ADD_BATCH) && STMT_STATUS_NE(FETCH_FIELDS) && STMT_STATUS_NE(BIND) &&
            STMT_STATUS_NE(BIND_COL)) {
D
dapan1121 已提交
66 67 68 69 70 71
          code = TSDB_CODE_TSC_STMT_API_ERROR;
        }
      } else {
        if (STMT_STATUS_NE(ADD_BATCH) && STMT_STATUS_NE(FETCH_FIELDS)) {
          code = TSDB_CODE_TSC_STMT_API_ERROR;
        }
D
dapan1121 已提交
72
      }
D
dapan1121 已提交
73
      break;
D
stmt  
dapan1121 已提交
74
    default:
D
dapan1121 已提交
75
      code = TSDB_CODE_TSC_APP_ERROR;
D
stmt  
dapan1121 已提交
76 77 78
      break;
  }

D
dapan1121 已提交
79
  STMT_ERR_RET(code);
D
stmt  
dapan1121 已提交
80 81 82 83 84 85

  pStmt->sql.status = newStatus;

  return TSDB_CODE_SUCCESS;
}

X
Xiaoyu Wang 已提交
86
int32_t stmtGetTbName(TAOS_STMT* stmt, char** tbName) {
D
stmt  
dapan1121 已提交
87 88
  STscStmt* pStmt = (STscStmt*)stmt;

D
stmt  
dapan1121 已提交
89
  pStmt->sql.type = STMT_TYPE_MULTI_INSERT;
90

D
dapan 已提交
91
  if ('\0' == pStmt->bInfo.tbName[0]) {
D
stmt  
dapan1121 已提交
92 93 94 95
    tscError("no table name set");
    STMT_ERR_RET(TSDB_CODE_TSC_STMT_TBNAME_ERROR);
  }

D
stmt  
dapan1121 已提交
96
  *tbName = pStmt->bInfo.tbName;
D
stmt  
dapan1121 已提交
97 98 99 100

  return TSDB_CODE_SUCCESS;
}

D
dapan1121 已提交
101
int32_t stmtBackupQueryFields(STscStmt* pStmt) {
X
Xiaoyu Wang 已提交
102
  SStmtQueryResInfo* pRes = &pStmt->sql.queryRes;
D
dapan1121 已提交
103 104
  pRes->numOfCols = pStmt->exec.pRequest->body.resInfo.numOfCols;
  pRes->precision = pStmt->exec.pRequest->body.resInfo.precision;
X
Xiaoyu Wang 已提交
105

D
dapan1121 已提交
106 107 108 109
  int32_t size = pRes->numOfCols * sizeof(TAOS_FIELD);
  pRes->fields = taosMemoryMalloc(size);
  pRes->userFields = taosMemoryMalloc(size);
  if (NULL == pRes->fields || NULL == pRes->userFields) {
D
dapan1121 已提交
110 111
    STMT_ERR_RET(TSDB_CODE_TSC_OUT_OF_MEMORY);
  }
D
dapan1121 已提交
112 113 114 115 116 117 118
  memcpy(pRes->fields, pStmt->exec.pRequest->body.resInfo.fields, size);
  memcpy(pRes->userFields, pStmt->exec.pRequest->body.resInfo.userFields, size);

  return TSDB_CODE_SUCCESS;
}

int32_t stmtRestoreQueryFields(STscStmt* pStmt) {
X
Xiaoyu Wang 已提交
119 120 121
  SStmtQueryResInfo* pRes = &pStmt->sql.queryRes;
  int32_t            size = pRes->numOfCols * sizeof(TAOS_FIELD);

D
dapan1121 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
  pStmt->exec.pRequest->body.resInfo.numOfCols = pRes->numOfCols;
  pStmt->exec.pRequest->body.resInfo.precision = pRes->precision;

  if (NULL == pStmt->exec.pRequest->body.resInfo.fields) {
    pStmt->exec.pRequest->body.resInfo.fields = taosMemoryMalloc(size);
    if (NULL == pStmt->exec.pRequest->body.resInfo.fields) {
      STMT_ERR_RET(TSDB_CODE_TSC_OUT_OF_MEMORY);
    }
    memcpy(pStmt->exec.pRequest->body.resInfo.fields, pRes->fields, size);
  }

  if (NULL == pStmt->exec.pRequest->body.resInfo.userFields) {
    pStmt->exec.pRequest->body.resInfo.userFields = taosMemoryMalloc(size);
    if (NULL == pStmt->exec.pRequest->body.resInfo.userFields) {
      STMT_ERR_RET(TSDB_CODE_TSC_OUT_OF_MEMORY);
    }
    memcpy(pStmt->exec.pRequest->body.resInfo.userFields, pRes->userFields, size);
  }
D
dapan1121 已提交
140 141 142 143

  return TSDB_CODE_SUCCESS;
}

wmmhello's avatar
wmmhello 已提交
144
int32_t stmtUpdateBindInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, char* tbFName, const char* sTableName) {
D
stmt  
dapan1121 已提交
145 146
  STscStmt* pStmt = (STscStmt*)stmt;

D
dapan 已提交
147 148
  strncpy(pStmt->bInfo.tbFName, tbFName, sizeof(pStmt->bInfo.tbFName) - 1);
  pStmt->bInfo.tbFName[sizeof(pStmt->bInfo.tbFName) - 1] = 0;
149

D
stmt  
dapan1121 已提交
150 151 152 153
  pStmt->bInfo.tbUid = pTableMeta->uid;
  pStmt->bInfo.tbSuid = pTableMeta->suid;
  pStmt->bInfo.tbType = pTableMeta->tableType;
  pStmt->bInfo.boundTags = tags;
D
dapan1121 已提交
154
  pStmt->bInfo.tagsCached = false;
wmmhello's avatar
wmmhello 已提交
155
  strcpy(pStmt->bInfo.stbFName, sTableName);
D
stmt  
dapan1121 已提交
156 157 158 159

  return TSDB_CODE_SUCCESS;
}

D
dapan 已提交
160
int32_t stmtUpdateExecInfo(TAOS_STMT* stmt, SHashObj* pVgHash, SHashObj* pBlockHash, bool autoCreateTbl) {
D
stmt  
dapan1121 已提交
161 162
  STscStmt* pStmt = (STscStmt*)stmt;

D
dapan1121 已提交
163
  pStmt->sql.pVgHash = pVgHash;
D
stmt  
dapan1121 已提交
164
  pStmt->exec.pBlockHash = pBlockHash;
D
dapan 已提交
165
  pStmt->exec.autoCreateTbl = autoCreateTbl;
D
stmt  
dapan1121 已提交
166 167 168 169

  return TSDB_CODE_SUCCESS;
}

170
int32_t stmtUpdateInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, char* tbFName, bool autoCreateTbl,
wmmhello's avatar
wmmhello 已提交
171
                       SHashObj* pVgHash, SHashObj* pBlockHash, const char* sTableName) {
D
dapan 已提交
172 173
  STscStmt* pStmt = (STscStmt*)stmt;

wmmhello's avatar
wmmhello 已提交
174
  STMT_ERR_RET(stmtUpdateBindInfo(stmt, pTableMeta, tags, tbFName, sTableName));
D
dapan 已提交
175
  STMT_ERR_RET(stmtUpdateExecInfo(stmt, pVgHash, pBlockHash, autoCreateTbl));
D
dapan 已提交
176

D
dapan 已提交
177
  pStmt->sql.autoCreateTbl = autoCreateTbl;
178

D
dapan 已提交
179 180 181
  return TSDB_CODE_SUCCESS;
}

D
stmt  
dapan1121 已提交
182 183 184
int32_t stmtGetExecInfo(TAOS_STMT* stmt, SHashObj** pVgHash, SHashObj** pBlockHash) {
  STscStmt* pStmt = (STscStmt*)stmt;

D
dapan1121 已提交
185
  *pVgHash = pStmt->sql.pVgHash;
D
stmt  
dapan1121 已提交
186
  *pBlockHash = pStmt->exec.pBlockHash;
D
stmt  
dapan1121 已提交
187 188 189 190

  return TSDB_CODE_SUCCESS;
}

X
Xiaoyu Wang 已提交
191
int32_t stmtCacheBlock(STscStmt* pStmt) {
D
stmt  
dapan1121 已提交
192 193 194
  if (pStmt->sql.type != STMT_TYPE_MULTI_INSERT) {
    return TSDB_CODE_SUCCESS;
  }
D
stmt  
dapan1121 已提交
195

196
  uint64_t uid = pStmt->bInfo.tbUid;
D
dapan 已提交
197
  uint64_t cacheUid = (TSDB_CHILD_TABLE == pStmt->bInfo.tbType) ? pStmt->bInfo.tbSuid : uid;
D
stmt  
dapan1121 已提交
198

D
dapan 已提交
199
  if (taosHashGet(pStmt->sql.pTableCache, &cacheUid, sizeof(cacheUid))) {
D
stmt  
dapan1121 已提交
200 201 202
    return TSDB_CODE_SUCCESS;
  }

D
dapan 已提交
203
  STableDataBlocks** pSrc = taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
204 205
  STableDataBlocks*  pDst = NULL;

D
stmt  
dapan1121 已提交
206
  STMT_ERR_RET(qCloneStmtDataBlock(&pDst, *pSrc));
D
stmt  
dapan1121 已提交
207 208

  SStmtTableCache cache = {
X
Xiaoyu Wang 已提交
209 210
      .pDataBlock = pDst,
      .boundTags = pStmt->bInfo.boundTags,
D
stmt  
dapan1121 已提交
211 212
  };

D
dapan 已提交
213
  if (taosHashPut(pStmt->sql.pTableCache, &cacheUid, sizeof(cacheUid), &cache, sizeof(cache))) {
D
stmt  
dapan1121 已提交
214 215
    return TSDB_CODE_OUT_OF_MEMORY;
  }
D
stmt  
dapan1121 已提交
216

D
dapan 已提交
217 218 219 220 221
  if (pStmt->sql.autoCreateTbl) {
    pStmt->bInfo.tagsCached = true;
  } else {
    pStmt->bInfo.boundTags = NULL;
  }
222

D
stmt  
dapan1121 已提交
223 224 225
  return TSDB_CODE_SUCCESS;
}

D
stmt  
dapan1121 已提交
226 227
int32_t stmtParseSql(STscStmt* pStmt) {
  SStmtCallback stmtCb = {
228 229 230 231
      .pStmt = pStmt,
      .getTbNameFn = stmtGetTbName,
      .setInfoFn = stmtUpdateInfo,
      .getExecInfoFn = stmtGetExecInfo,
D
stmt  
dapan1121 已提交
232
  };
D
stmt  
dapan1121 已提交
233

234
  STMT_ERR_RET(stmtCreateRequest(pStmt));
H
Hongze Cheng 已提交
235

D
stmt  
dapan1121 已提交
236 237
  STMT_ERR_RET(parseSql(pStmt->exec.pRequest, false, &pStmt->sql.pQuery, &stmtCb));

D
stmt  
dapan1121 已提交
238
  pStmt->bInfo.needParse = false;
X
Xiaoyu Wang 已提交
239

D
dapan1121 已提交
240 241 242 243 244 245
  if (pStmt->sql.pQuery->pRoot && 0 == pStmt->sql.type) {
    pStmt->sql.type = STMT_TYPE_INSERT;
  } else if (pStmt->sql.pQuery->pPrepareRoot) {
    pStmt->sql.type = STMT_TYPE_QUERY;
  }

D
stmt  
dapan1121 已提交
246 247
  return TSDB_CODE_SUCCESS;
}
D
stmt  
dapan1121 已提交
248

D
stmt  
dapan1121 已提交
249
int32_t stmtCleanBindInfo(STscStmt* pStmt) {
D
stmt  
dapan1121 已提交
250 251 252 253
  pStmt->bInfo.tbUid = 0;
  pStmt->bInfo.tbSuid = 0;
  pStmt->bInfo.tbType = 0;
  pStmt->bInfo.needParse = true;
D
dapan 已提交
254
  pStmt->bInfo.inExecCache = false;
D
stmt  
dapan1121 已提交
255

D
dapan 已提交
256 257
  pStmt->bInfo.tbName[0] = 0;
  pStmt->bInfo.tbFName[0] = 0;
D
dapan1121 已提交
258 259 260 261
  if (!pStmt->bInfo.tagsCached) {
    destroyBoundColumnInfo(pStmt->bInfo.boundTags);
    taosMemoryFreeClear(pStmt->bInfo.boundTags);
  }
wmmhello's avatar
wmmhello 已提交
262
  memset(pStmt->bInfo.stbFName, 0, TSDB_TABLE_FNAME_LEN);
D
stmt  
dapan1121 已提交
263
  return TSDB_CODE_SUCCESS;
D
stmt  
dapan1121 已提交
264 265
}

D
dapan1121 已提交
266 267
int32_t stmtCleanExecInfo(STscStmt* pStmt, bool keepTable, bool deepClean) {
  if (STMT_TYPE_QUERY != pStmt->sql.type || deepClean) {
D
dapan1121 已提交
268 269 270
    taos_free_result(pStmt->exec.pRequest);
    pStmt->exec.pRequest = NULL;
  }
D
stmt  
dapan1121 已提交
271

D
dapan 已提交
272
  size_t keyLen = 0;
273
  void*  pIter = taosHashIterate(pStmt->exec.pBlockHash, NULL);
D
stmt  
dapan1121 已提交
274
  while (pIter) {
275 276 277 278
    STableDataBlocks* pBlocks = *(STableDataBlocks**)pIter;
    char*             key = taosHashGetKey(pIter, &keyLen);
    STableMeta*       pMeta = qGetTableMetaInDataBlock(pBlocks);

D
dapan 已提交
279
    if (keepTable && (strlen(pStmt->bInfo.tbFName) == keyLen) && strncmp(pStmt->bInfo.tbFName, key, keyLen) == 0) {
D
stmt  
dapan1121 已提交
280
      STMT_ERR_RET(qResetStmtDataBlock(pBlocks, true));
X
Xiaoyu Wang 已提交
281

D
stmt  
dapan1121 已提交
282 283 284 285
      pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
      continue;
    }

D
dapan1121 已提交
286 287 288 289 290
    if (STMT_TYPE_MULTI_INSERT == pStmt->sql.type) {
      qFreeStmtDataBlock(pBlocks);
    } else {
      qDestroyStmtDataBlock(pBlocks);
    }
D
dapan 已提交
291
    taosHashRemove(pStmt->exec.pBlockHash, key, keyLen);
D
stmt  
dapan1121 已提交
292 293 294 295

    pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
  }

D
dapan 已提交
296
  pStmt->exec.autoCreateTbl = false;
297

D
stmt  
dapan1121 已提交
298 299 300 301 302 303
  if (keepTable) {
    return TSDB_CODE_SUCCESS;
  }

  taosHashCleanup(pStmt->exec.pBlockHash);
  pStmt->exec.pBlockHash = NULL;
D
stmt  
dapan1121 已提交
304 305 306 307 308 309 310

  STMT_ERR_RET(stmtCleanBindInfo(pStmt));

  return TSDB_CODE_SUCCESS;
}

int32_t stmtCleanSQLInfo(STscStmt* pStmt) {
D
dapan1121 已提交
311 312
  taosMemoryFree(pStmt->sql.queryRes.fields);
  taosMemoryFree(pStmt->sql.queryRes.userFields);
D
stmt  
dapan1121 已提交
313 314
  taosMemoryFree(pStmt->sql.sqlStr);
  qDestroyQuery(pStmt->sql.pQuery);
D
dapan1121 已提交
315
  taosArrayDestroy(pStmt->sql.nodeList);
D
dapan1121 已提交
316 317
  taosHashCleanup(pStmt->sql.pVgHash);
  pStmt->sql.pVgHash = NULL;
X
Xiaoyu Wang 已提交
318 319

  void* pIter = taosHashIterate(pStmt->sql.pTableCache, NULL);
D
stmt  
dapan1121 已提交
320
  while (pIter) {
X
Xiaoyu Wang 已提交
321
    SStmtTableCache* pCache = (SStmtTableCache*)pIter;
D
stmt  
dapan1121 已提交
322

D
stmt  
dapan1121 已提交
323
    qDestroyStmtDataBlock(pCache->pDataBlock);
D
stmt  
dapan1121 已提交
324
    destroyBoundColumnInfo(pCache->boundTags);
D
dapan1121 已提交
325
    taosMemoryFreeClear(pCache->boundTags);
X
Xiaoyu Wang 已提交
326

D
stmt  
dapan1121 已提交
327 328 329 330 331
    pIter = taosHashIterate(pStmt->sql.pTableCache, pIter);
  }
  taosHashCleanup(pStmt->sql.pTableCache);
  pStmt->sql.pTableCache = NULL;

D
dapan1121 已提交
332
  STMT_ERR_RET(stmtCleanExecInfo(pStmt, false, true));
D
stmt  
dapan1121 已提交
333
  STMT_ERR_RET(stmtCleanBindInfo(pStmt));
D
stmt  
dapan1121 已提交
334

D
dapan1121 已提交
335 336
  memset(&pStmt->sql, 0, sizeof(pStmt->sql));

D
stmt  
dapan1121 已提交
337 338 339
  return TSDB_CODE_SUCCESS;
}

340
int32_t stmtRebuildDataBlock(STscStmt* pStmt, STableDataBlocks* pDataBlock, STableDataBlocks** newBlock, uint64_t uid) {
341 342 343
  SEpSet           ep = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp);
  SVgroupInfo      vgInfo = {0};
  SRequestConnInfo conn = {.pTrans = pStmt->taos->pAppInfo->pTransporter,
D
dapan1121 已提交
344 345 346
                           .requestId = pStmt->exec.pRequest->requestId,
                           .requestObjRefId = pStmt->exec.pRequest->self,
                           .mgmtEps = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp)};
347

D
dapan1121 已提交
348
  STMT_ERR_RET(catalogGetTableHashVgroup(pStmt->pCatalog, &conn, &pStmt->bInfo.sname, &vgInfo));
349
  STMT_ERR_RET(
D
dapan1121 已提交
350
      taosHashPut(pStmt->sql.pVgHash, (const char*)&vgInfo.vgId, sizeof(vgInfo.vgId), (char*)&vgInfo, sizeof(vgInfo)));
351

D
dapan 已提交
352 353 354 355 356
  STMT_ERR_RET(qRebuildStmtDataBlock(newBlock, pDataBlock, uid, vgInfo.vgId));

  return TSDB_CODE_SUCCESS;
}

D
stmt  
dapan1121 已提交
357
int32_t stmtGetFromCache(STscStmt* pStmt) {
D
stmt  
dapan1121 已提交
358
  pStmt->bInfo.needParse = true;
D
dapan 已提交
359
  pStmt->bInfo.inExecCache = false;
360 361 362

  STableDataBlocks* pBlockInExec =
      taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
D
dapan 已提交
363
  if (pBlockInExec) {
D
dapan1121 已提交
364
    pStmt->bInfo.needParse = false;
D
dapan 已提交
365 366 367
    pStmt->bInfo.inExecCache = true;

    if (pStmt->sql.autoCreateTbl) {
D
dapan1121 已提交
368
      tscDebug("reuse stmt block for tb %s in execBlock", pStmt->bInfo.tbFName);
D
dapan 已提交
369 370 371
      return TSDB_CODE_SUCCESS;
    }
  }
D
stmt  
dapan1121 已提交
372

D
stmt  
dapan1121 已提交
373
  if (NULL == pStmt->sql.pTableCache || taosHashGetSize(pStmt->sql.pTableCache) <= 0) {
D
dapan 已提交
374 375 376
    if (pStmt->bInfo.inExecCache) {
      ASSERT(taosHashGetSize(pStmt->exec.pBlockHash) == 1);
      pStmt->bInfo.needParse = false;
D
dapan1121 已提交
377
      tscDebug("reuse stmt block for tb %s in execBlock", pStmt->bInfo.tbFName);
D
dapan 已提交
378 379
      return TSDB_CODE_SUCCESS;
    }
380

D
dapan1121 已提交
381
    tscDebug("no stmt block cache for tb %s", pStmt->bInfo.tbFName);
D
stmt  
dapan1121 已提交
382 383 384
    return TSDB_CODE_SUCCESS;
  }

D
dapan 已提交
385 386 387 388
  if (NULL == pStmt->pCatalog) {
    STMT_ERR_RET(catalogGetHandle(pStmt->taos->pAppInfo->clusterId, &pStmt->pCatalog));
  }

D
dapan 已提交
389 390 391 392
  if (pStmt->sql.autoCreateTbl) {
    SStmtTableCache* pCache = taosHashGet(pStmt->sql.pTableCache, &pStmt->bInfo.tbSuid, sizeof(pStmt->bInfo.tbSuid));
    if (pCache) {
      pStmt->bInfo.needParse = false;
D
dapan1121 已提交
393 394 395
      pStmt->exec.autoCreateTbl = true;

      pStmt->bInfo.tbUid = 0;
396

D
dapan 已提交
397
      STableDataBlocks* pNewBlock = NULL;
D
dapan 已提交
398
      STMT_ERR_RET(stmtRebuildDataBlock(pStmt, pCache->pDataBlock, &pNewBlock, 0));
399 400 401

      if (taosHashPut(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName), &pNewBlock,
                      POINTER_BYTES)) {
D
dapan 已提交
402 403
        STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
      }
404

H
Hongze Cheng 已提交
405
      tscDebug("reuse stmt block for tb %s in sqlBlock, suid:0x%" PRIx64, pStmt->bInfo.tbFName, pStmt->bInfo.tbSuid);
D
dapan1121 已提交
406

D
dapan 已提交
407 408
      return TSDB_CODE_SUCCESS;
    }
409

D
dapan 已提交
410 411
    STMT_RET(stmtCleanBindInfo(pStmt));
  }
D
stmt  
dapan1121 已提交
412

413 414
  STableMeta*      pTableMeta = NULL;
  SRequestConnInfo conn = {.pTrans = pStmt->taos->pAppInfo->pTransporter,
D
dapan1121 已提交
415 416 417
                           .requestId = pStmt->exec.pRequest->requestId,
                           .requestObjRefId = pStmt->exec.pRequest->self,
                           .mgmtEps = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp)};
418
  int32_t          code = catalogGetTableMeta(pStmt->pCatalog, &conn, &pStmt->bInfo.sname, &pTableMeta);
D
dapan1121 已提交
419 420
  if (TSDB_CODE_PAR_TABLE_NOT_EXIST == code) {
    STMT_ERR_RET(stmtCleanBindInfo(pStmt));
X
Xiaoyu Wang 已提交
421

D
dapan1121 已提交
422 423
    tscDebug("tb %s not exist", pStmt->bInfo.tbFName);

D
dapan1121 已提交
424 425 426 427
    return TSDB_CODE_SUCCESS;
  }

  STMT_ERR_RET(code);
X
Xiaoyu Wang 已提交
428

D
dapan1121 已提交
429 430
  uint64_t uid = pTableMeta->uid;
  uint64_t suid = pTableMeta->suid;
X
Xiaoyu Wang 已提交
431
  int8_t   tableType = pTableMeta->tableType;
D
dapan1121 已提交
432
  taosMemoryFree(pTableMeta);
D
dapan 已提交
433
  uint64_t cacheUid = (TSDB_CHILD_TABLE == tableType) ? suid : uid;
434

D
dapan1121 已提交
435
  if (uid == pStmt->bInfo.tbUid) {
D
stmt  
dapan1121 已提交
436
    pStmt->bInfo.needParse = false;
D
dapan1121 已提交
437

D
dapan1121 已提交
438 439
    tscDebug("tb %s is current table", pStmt->bInfo.tbFName);

D
stmt  
dapan1121 已提交
440 441 442
    return TSDB_CODE_SUCCESS;
  }

D
dapan 已提交
443
  if (pStmt->bInfo.inExecCache) {
D
dapan 已提交
444
    SStmtTableCache* pCache = taosHashGet(pStmt->sql.pTableCache, &cacheUid, sizeof(cacheUid));
D
stmt  
dapan1121 已提交
445
    if (NULL == pCache) {
446 447 448
      tscError("table [%s, %" PRIx64 ", %" PRIx64 "] found in exec blockHash, but not in sql blockHash",
               pStmt->bInfo.tbFName, uid, cacheUid);

D
stmt  
dapan1121 已提交
449 450
      STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
    }
X
Xiaoyu Wang 已提交
451

D
stmt  
dapan1121 已提交
452
    pStmt->bInfo.needParse = false;
X
Xiaoyu Wang 已提交
453

D
dapan1121 已提交
454 455 456
    pStmt->bInfo.tbUid = uid;
    pStmt->bInfo.tbSuid = suid;
    pStmt->bInfo.tbType = tableType;
D
stmt  
dapan1121 已提交
457
    pStmt->bInfo.boundTags = pCache->boundTags;
D
dapan1121 已提交
458
    pStmt->bInfo.tagsCached = true;
D
dapan1121 已提交
459

D
dapan1121 已提交
460 461
    tscDebug("tb %s in execBlock list, set to current", pStmt->bInfo.tbFName);

D
stmt  
dapan1121 已提交
462 463 464
    return TSDB_CODE_SUCCESS;
  }

D
dapan 已提交
465
  SStmtTableCache* pCache = taosHashGet(pStmt->sql.pTableCache, &cacheUid, sizeof(cacheUid));
D
stmt  
dapan1121 已提交
466
  if (pCache) {
D
stmt  
dapan1121 已提交
467
    pStmt->bInfo.needParse = false;
D
stmt  
dapan1121 已提交
468

D
dapan1121 已提交
469 470 471
    pStmt->bInfo.tbUid = uid;
    pStmt->bInfo.tbSuid = suid;
    pStmt->bInfo.tbType = tableType;
D
stmt  
dapan1121 已提交
472
    pStmt->bInfo.boundTags = pCache->boundTags;
D
dapan1121 已提交
473
    pStmt->bInfo.tagsCached = true;
D
stmt  
dapan1121 已提交
474

D
stmt  
dapan1121 已提交
475
    STableDataBlocks* pNewBlock = NULL;
D
dapan 已提交
476
    STMT_ERR_RET(stmtRebuildDataBlock(pStmt, pCache->pDataBlock, &pNewBlock, uid));
D
stmt  
dapan1121 已提交
477

478 479
    if (taosHashPut(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName), &pNewBlock,
                    POINTER_BYTES)) {
D
stmt  
dapan1121 已提交
480 481
      STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
    }
X
Xiaoyu Wang 已提交
482

D
dapan1121 已提交
483 484
    tscDebug("tb %s in sqlBlock list, set to current", pStmt->bInfo.tbFName);

D
stmt  
dapan1121 已提交
485 486 487
    return TSDB_CODE_SUCCESS;
  }

D
stmt  
dapan1121 已提交
488 489
  STMT_ERR_RET(stmtCleanBindInfo(pStmt));

D
stmt  
dapan1121 已提交
490 491 492
  return TSDB_CODE_SUCCESS;
}

D
stmt  
dapan1121 已提交
493 494 495 496 497 498 499 500 501 502 503 504 505 506
int32_t stmtResetStmt(STscStmt* pStmt) {
  STMT_ERR_RET(stmtCleanSQLInfo(pStmt));

  pStmt->sql.pTableCache = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
  if (NULL == pStmt->sql.pTableCache) {
    terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
    STMT_ERR_RET(terrno);
  }

  pStmt->sql.status = STMT_INIT;

  return TSDB_CODE_SUCCESS;
}

507
TAOS_STMT* stmtInit(STscObj* taos) {
X
Xiaoyu Wang 已提交
508
  STscObj*  pObj = (STscObj*)taos;
D
dapan1121 已提交
509 510 511
  STscStmt* pStmt = NULL;

  pStmt = taosMemoryCalloc(1, sizeof(STscStmt));
D
stmt  
dapan1121 已提交
512
  if (NULL == pStmt) {
D
dapan1121 已提交
513 514 515
    terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
    return NULL;
  }
D
stmt  
dapan1121 已提交
516

D
stmt  
dapan1121 已提交
517 518
  pStmt->sql.pTableCache = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
  if (NULL == pStmt->sql.pTableCache) {
D
stmt  
dapan1121 已提交
519 520 521 522
    terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
    taosMemoryFree(pStmt);
    return NULL;
  }
D
stmt  
dapan1121 已提交
523

D
dapan1121 已提交
524
  pStmt->taos = pObj;
D
stmt  
dapan1121 已提交
525
  pStmt->bInfo.needParse = true;
D
stmt  
dapan1121 已提交
526
  pStmt->sql.status = STMT_INIT;
X
Xiaoyu Wang 已提交
527

D
stmt  
dapan1121 已提交
528 529
  return pStmt;
}
D
dapan1121 已提交
530

X
Xiaoyu Wang 已提交
531
int stmtPrepare(TAOS_STMT* stmt, const char* sql, unsigned long length) {
D
stmt  
dapan1121 已提交
532 533
  STscStmt* pStmt = (STscStmt*)stmt;

D
dapan1121 已提交
534 535
  tscDebug("stmt start to prepare");

D
stmt  
dapan1121 已提交
536
  if (pStmt->sql.status >= STMT_PREPARE) {
D
stmt  
dapan1121 已提交
537
    STMT_ERR_RET(stmtResetStmt(pStmt));
D
stmt  
dapan1121 已提交
538 539
  }

D
stmt  
dapan1121 已提交
540 541 542 543 544
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_PREPARE));

  if (length <= 0) {
    length = strlen(sql);
  }
X
Xiaoyu Wang 已提交
545

D
stmt  
dapan1121 已提交
546 547
  pStmt->sql.sqlStr = strndup(sql, length);
  pStmt->sql.sqlLen = length;
D
stmt  
dapan1121 已提交
548 549 550 551

  return TSDB_CODE_SUCCESS;
}

X
Xiaoyu Wang 已提交
552
int stmtSetTbName(TAOS_STMT* stmt, const char* tbName) {
D
stmt  
dapan1121 已提交
553 554
  STscStmt* pStmt = (STscStmt*)stmt;

D
dapan1121 已提交
555
  tscDebug("stmt start to set tbName: %s", tbName);
D
dapan1121 已提交
556

D
stmt  
dapan1121 已提交
557
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTBNAME));
D
stmt  
dapan1121 已提交
558

D
dapan1121 已提交
559 560 561 562 563 564 565
  int32_t insert = 0;
  stmtIsInsert(stmt, &insert);
  if (0 == insert) {
    tscError("set tb name not available for none insert statement");
    STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
  }

566
  STMT_ERR_RET(stmtCreateRequest(pStmt));
567 568 569

  STMT_ERR_RET(qCreateSName(&pStmt->bInfo.sname, tbName, pStmt->taos->acctId, pStmt->exec.pRequest->pDb,
                            pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen));
D
dapan 已提交
570
  tNameExtractFullName(&pStmt->bInfo.sname, pStmt->bInfo.tbFName);
571

D
stmt  
dapan1121 已提交
572
  STMT_ERR_RET(stmtGetFromCache(pStmt));
D
stmt  
dapan1121 已提交
573

D
stmt  
dapan1121 已提交
574
  if (pStmt->bInfo.needParse) {
D
dapan 已提交
575 576
    strncpy(pStmt->bInfo.tbName, tbName, sizeof(pStmt->bInfo.tbName) - 1);
    pStmt->bInfo.tbName[sizeof(pStmt->bInfo.tbName) - 1] = 0;
D
dapan1121 已提交
577 578

    STMT_ERR_RET(stmtParseSql(pStmt));
D
stmt  
dapan1121 已提交
579 580
  }

D
stmt  
dapan1121 已提交
581 582 583
  return TSDB_CODE_SUCCESS;
}

X
Xiaoyu Wang 已提交
584
int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) {
D
stmt  
dapan1121 已提交
585
  STscStmt* pStmt = (STscStmt*)stmt;
D
dapan1121 已提交
586

D
dapan1121 已提交
587 588
  tscDebug("stmt start to set tbTags");

D
stmt  
dapan1121 已提交
589
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_SETTAGS));
D
stmt  
dapan1121 已提交
590

D
dapan 已提交
591 592 593
  if (pStmt->bInfo.inExecCache) {
    return TSDB_CODE_SUCCESS;
  }
D
dapan 已提交
594

595 596
  STableDataBlocks** pDataBlock =
      (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
D
stmt  
dapan1121 已提交
597
  if (NULL == pDataBlock) {
D
dapan 已提交
598
    tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
D
stmt  
dapan1121 已提交
599 600
    STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
  }
X
Xiaoyu Wang 已提交
601

D
dapan1121 已提交
602
  tscDebug("start to bind stmt tag values");
H
Hongze Cheng 已提交
603 604 605
  STMT_ERR_RET(qBindStmtTagsValue(*pDataBlock, pStmt->bInfo.boundTags, pStmt->bInfo.tbSuid, pStmt->bInfo.stbFName,
                                  pStmt->bInfo.sname.tname, tags, pStmt->exec.pRequest->msgBuf,
                                  pStmt->exec.pRequest->msgBufLen));
D
stmt  
dapan1121 已提交
606

D
stmt  
dapan1121 已提交
607 608 609
  return TSDB_CODE_SUCCESS;
}

D
dapan1121 已提交
610
int stmtFetchTagFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD_E** fields) {
D
stmt  
dapan1121 已提交
611 612 613 614 615
  if (STMT_TYPE_QUERY == pStmt->sql.type) {
    tscError("invalid operation to get query tag fileds");
    STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
  }

616 617
  STableDataBlocks** pDataBlock =
      (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
D
stmt  
dapan1121 已提交
618
  if (NULL == pDataBlock) {
D
dapan 已提交
619
    tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
D
stmt  
dapan1121 已提交
620 621 622
    STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
  }

D
stmt  
dapan1121 已提交
623
  STMT_ERR_RET(qBuildStmtTagFields(*pDataBlock, pStmt->bInfo.boundTags, fieldNum, fields));
D
stmt  
dapan1121 已提交
624

D
stmt  
dapan1121 已提交
625 626
  return TSDB_CODE_SUCCESS;
}
D
dapan1121 已提交
627

D
dapan1121 已提交
628
int stmtFetchColFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD_E** fields) {
D
stmt  
dapan1121 已提交
629 630 631 632 633
  if (STMT_TYPE_QUERY == pStmt->sql.type) {
    tscError("invalid operation to get query column fileds");
    STMT_ERR_RET(TSDB_CODE_TSC_STMT_API_ERROR);
  }

634 635
  STableDataBlocks** pDataBlock =
      (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
D
stmt  
dapan1121 已提交
636
  if (NULL == pDataBlock) {
D
dapan 已提交
637
    tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
D
stmt  
dapan1121 已提交
638 639 640
    STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
  }

D
stmt  
dapan1121 已提交
641
  STMT_ERR_RET(qBuildStmtColFields(*pDataBlock, fieldNum, fields));
D
stmt  
dapan1121 已提交
642

X
Xiaoyu Wang 已提交
643
  return TSDB_CODE_SUCCESS;
D
stmt  
dapan1121 已提交
644 645
}

X
Xiaoyu Wang 已提交
646
int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) {
D
stmt  
dapan1121 已提交
647 648
  STscStmt* pStmt = (STscStmt*)stmt;

D
dapan1121 已提交
649 650
  tscDebug("start to bind stmt data, colIdx: %d", colIdx);

D
dapan1121 已提交
651 652
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_BIND));

X
Xiaoyu Wang 已提交
653 654
  if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
      STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
D
stmt  
dapan1121 已提交
655
    pStmt->bInfo.needParse = false;
D
stmt  
dapan1121 已提交
656
  }
D
stmt  
dapan1121 已提交
657

D
dapan1121 已提交
658 659 660 661
  if (pStmt->exec.pRequest && STMT_TYPE_QUERY == pStmt->sql.type && pStmt->sql.runTimes) {
    taos_free_result(pStmt->exec.pRequest);
    pStmt->exec.pRequest = NULL;
  }
X
Xiaoyu Wang 已提交
662

663
  STMT_ERR_RET(stmtCreateRequest(pStmt));
D
stmt  
dapan1121 已提交
664

D
stmt  
dapan1121 已提交
665
  if (pStmt->bInfo.needParse) {
D
stmt  
dapan1121 已提交
666 667
    STMT_ERR_RET(stmtParseSql(pStmt));
  }
D
stmt  
dapan1121 已提交
668

D
dapan1121 已提交
669
  if (STMT_TYPE_QUERY == pStmt->sql.type) {
670 671
    STMT_ERR_RET(qStmtBindParams(pStmt->sql.pQuery, bind, colIdx));

D
dapan1121 已提交
672 673 674 675 676 677 678 679 680 681 682
    SParseContext ctx = {.requestId = pStmt->exec.pRequest->requestId,
                         .acctId = pStmt->taos->acctId,
                         .db = pStmt->exec.pRequest->pDb,
                         .topicQuery = false,
                         .pSql = pStmt->sql.sqlStr,
                         .sqlLen = pStmt->sql.sqlLen,
                         .pMsg = pStmt->exec.pRequest->msgBuf,
                         .msgLen = ERROR_MSG_BUF_DEFAULT_SIZE,
                         .pTransporter = pStmt->taos->pAppInfo->pTransporter,
                         .pStmtCb = NULL,
                         .pUser = pStmt->taos->user};
D
dapan1121 已提交
683 684
    ctx.mgmtEpSet = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp);
    STMT_ERR_RET(catalogGetHandle(pStmt->taos->pAppInfo->clusterId, &ctx.pCatalog));
685

D
dapan1121 已提交
686
    STMT_ERR_RET(qStmtParseQuerySql(&ctx, pStmt->sql.pQuery));
X
Xiaoyu Wang 已提交
687

D
dapan1121 已提交
688
    if (pStmt->sql.pQuery->haveResultSet) {
689 690
      setResSchemaInfo(&pStmt->exec.pRequest->body.resInfo, pStmt->sql.pQuery->pResSchema,
                       pStmt->sql.pQuery->numOfResCols);
D
dapan1121 已提交
691
      taosMemoryFreeClear(pStmt->sql.pQuery->pResSchema);
D
dapan1121 已提交
692 693
      setResPrecision(&pStmt->exec.pRequest->body.resInfo, pStmt->sql.pQuery->precision);
    }
694

D
dapan1121 已提交
695
    TSWAP(pStmt->exec.pRequest->dbList, pStmt->sql.pQuery->pDbList);
696
    TSWAP(pStmt->exec.pRequest->tableList, pStmt->sql.pQuery->pTableList);
D
dapan1121 已提交
697
    TSWAP(pStmt->exec.pRequest->targetTableList, pStmt->sql.pQuery->pTargetTableList);
D
dapan1121 已提交
698

699 700 701
    // if (STMT_TYPE_QUERY == pStmt->sql.queryRes) {
    //   STMT_ERR_RET(stmtRestoreQueryFields(pStmt));
    // }
D
dapan1121 已提交
702

703
    // STMT_ERR_RET(stmtBackupQueryFields(pStmt));
D
dapan1121 已提交
704

D
dapan1121 已提交
705
    return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
706
  }
707 708 709

  STableDataBlocks** pDataBlock =
      (STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
D
stmt  
dapan1121 已提交
710
  if (NULL == pDataBlock) {
D
dapan 已提交
711
    tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
D
stmt  
dapan1121 已提交
712 713
    STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
  }
D
stmt  
dapan1121 已提交
714 715

  if (colIdx < 0) {
D
dapan1121 已提交
716 717 718 719 720
    int32_t code = qBindStmtColsValue(*pDataBlock, bind, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen);
    if (code) {
      tscError("qBindStmtColsValue failed, error:%s", tstrerror(code));
      STMT_ERR_RET(code);
    }
D
stmt  
dapan1121 已提交
721 722 723 724 725 726 727
  } else {
    if (colIdx != (pStmt->bInfo.sBindLastIdx + 1) && colIdx != 0) {
      tscError("bind column index not in sequence");
      STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
    }

    pStmt->bInfo.sBindLastIdx = colIdx;
X
Xiaoyu Wang 已提交
728

D
stmt  
dapan1121 已提交
729 730 731
    if (0 == colIdx) {
      pStmt->bInfo.sBindRowNum = bind->num;
    }
X
Xiaoyu Wang 已提交
732 733 734

    qBindStmtSingleColValue(*pDataBlock, bind, pStmt->exec.pRequest->msgBuf, pStmt->exec.pRequest->msgBufLen, colIdx,
                            pStmt->bInfo.sBindRowNum);
D
stmt  
dapan1121 已提交
735
  }
X
Xiaoyu Wang 已提交
736

D
stmt  
dapan1121 已提交
737
  return TSDB_CODE_SUCCESS;
D
dapan1121 已提交
738 739
}

X
Xiaoyu Wang 已提交
740
int stmtAddBatch(TAOS_STMT* stmt) {
D
stmt  
dapan1121 已提交
741 742
  STscStmt* pStmt = (STscStmt*)stmt;

D
dapan1121 已提交
743 744
  tscDebug("stmt start to add batch");

D
stmt  
dapan1121 已提交
745
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_ADD_BATCH));
D
stmt  
dapan1121 已提交
746

D
stmt  
dapan1121 已提交
747
  STMT_ERR_RET(stmtCacheBlock(pStmt));
X
Xiaoyu Wang 已提交
748

D
stmt  
dapan1121 已提交
749 750 751
  return TSDB_CODE_SUCCESS;
}

752
int stmtUpdateTableUid(STscStmt* pStmt, SSubmitRsp* pRsp) {
D
dapan1121 已提交
753
  tscDebug("stmt start to update tbUid, blockNum: %d", pRsp->nBlocks);
D
dapan1121 已提交
754

D
dapan 已提交
755 756 757 758 759
  if (pRsp->nBlocks <= 0) {
    tscError("invalid submit resp block number %d", pRsp->nBlocks);
    STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
  }

760 761
  size_t             keyLen = 0;
  STableDataBlocks** pIter = taosHashIterate(pStmt->exec.pBlockHash, NULL);
D
dapan 已提交
762
  while (pIter) {
763 764 765 766
    STableDataBlocks* pBlock = *pIter;
    char*             key = taosHashGetKey(pIter, &keyLen);

    STableMeta* pMeta = qGetTableMetaInDataBlock(pBlock);
D
dapan 已提交
767 768 769 770 771
    if (pMeta->uid) {
      pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
      continue;
    }

772 773
    SSubmitBlkRsp* blkRsp = NULL;
    int32_t        i = 0;
D
dapan 已提交
774 775 776 777 778
    for (; i < pRsp->nBlocks; ++i) {
      blkRsp = pRsp->pBlocks + i;
      if (strlen(blkRsp->tblFName) != keyLen) {
        continue;
      }
779

D
dapan 已提交
780 781 782
      if (strncmp(blkRsp->tblFName, key, keyLen)) {
        continue;
      }
783

D
dapan 已提交
784 785 786 787
      break;
    }

    if (i < pRsp->nBlocks) {
788 789 790
      tscDebug("auto created table %s uid updated from %" PRIx64 " to %" PRIx64, blkRsp->tblFName, pMeta->uid,
               blkRsp->uid);

D
dapan 已提交
791 792 793 794 795 796 797 798 799 800 801 802 803
      pMeta->uid = blkRsp->uid;
      pStmt->bInfo.tbUid = blkRsp->uid;
    } else {
      tscError("table %s not found in submit rsp", pStmt->bInfo.tbFName);
      STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
    }

    pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
  }

  return TSDB_CODE_SUCCESS;
}

804 805 806 807 808
int stmtExec(TAOS_STMT* stmt) {
  STscStmt*   pStmt = (STscStmt*)stmt;
  int32_t     code = 0;
  SSubmitRsp* pRsp = NULL;
  bool        autoCreateTbl = pStmt->exec.autoCreateTbl;
D
stmt  
dapan1121 已提交
809

D
dapan1121 已提交
810 811
  tscDebug("stmt start to exec");

D
stmt  
dapan1121 已提交
812
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_EXECUTE));
D
stmt  
dapan1121 已提交
813

D
dapan1121 已提交
814
  if (STMT_TYPE_QUERY == pStmt->sql.type) {
815
    launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, true, NULL);
D
dapan1121 已提交
816
  } else {
D
dapan1121 已提交
817
    STMT_ERR_RET(qBuildStmtOutput(pStmt->sql.pQuery, pStmt->sql.pVgHash, pStmt->exec.pBlockHash));
818
    launchQueryImpl(pStmt->exec.pRequest, pStmt->sql.pQuery, true, (autoCreateTbl ? (void**)&pRsp : NULL));
D
dapan1121 已提交
819
  }
D
fix bug  
dapan1121 已提交
820 821 822 823 824 825

  if (pStmt->exec.pRequest->code && NEED_CLIENT_HANDLE_ERROR(pStmt->exec.pRequest->code)) {
    code = refreshMeta(pStmt->exec.pRequest->pTscObj, pStmt->exec.pRequest);
    if (code) {
      pStmt->exec.pRequest->code = code;
    } else {
D
dapan1121 已提交
826
      tFreeSSubmitRsp(pRsp);
D
fix bug  
dapan1121 已提交
827 828 829 830
      STMT_ERR_RET(stmtResetStmt(pStmt));
      STMT_ERR_RET(TSDB_CODE_NEED_RETRY);
    }
  }
X
Xiaoyu Wang 已提交
831

D
stmt  
dapan1121 已提交
832
  STMT_ERR_JRET(pStmt->exec.pRequest->code);
D
stmt  
dapan1121 已提交
833

D
dapan1121 已提交
834 835
  pStmt->exec.affectedRows = taos_affected_rows(pStmt->exec.pRequest);
  pStmt->affectedRows += pStmt->exec.affectedRows;
D
stmt  
dapan1121 已提交
836

D
stmt  
dapan1121 已提交
837 838
_return:

D
dapan1121 已提交
839
  stmtCleanExecInfo(pStmt, (code ? false : true), false);
D
dapan 已提交
840 841 842 843

  if (TSDB_CODE_SUCCESS == code && autoCreateTbl) {
    if (NULL == pRsp) {
      tscError("no submit resp got for auto create table");
D
dapan1121 已提交
844 845 846
      code = TSDB_CODE_TSC_APP_ERROR;
    } else {
      code = stmtUpdateTableUid(pStmt, pRsp);
D
dapan 已提交
847 848
    }
  }
X
Xiaoyu Wang 已提交
849

D
dapan1121 已提交
850
  tFreeSSubmitRsp(pRsp);
851

D
stmt  
dapan1121 已提交
852
  ++pStmt->sql.runTimes;
X
Xiaoyu Wang 已提交
853

D
stmt  
dapan1121 已提交
854
  STMT_RET(code);
D
stmt  
dapan1121 已提交
855 856
}

X
Xiaoyu Wang 已提交
857
int stmtClose(TAOS_STMT* stmt) {
D
stmt  
dapan1121 已提交
858 859
  STscStmt* pStmt = (STscStmt*)stmt;

D
dapan1121 已提交
860
  stmtCleanSQLInfo(pStmt);
D
dapan1121 已提交
861
  taosMemoryFree(stmt);
D
dapan1121 已提交
862 863

  return TSDB_CODE_SUCCESS;
D
stmt  
dapan1121 已提交
864 865
}

X
Xiaoyu Wang 已提交
866
const char* stmtErrstr(TAOS_STMT* stmt) {
D
stmt  
dapan1121 已提交
867
  STscStmt* pStmt = (STscStmt*)stmt;
D
stmt  
dapan1121 已提交
868

D
fix bug  
dapan1121 已提交
869
  if (stmt == NULL || NULL == pStmt->exec.pRequest) {
X
Xiaoyu Wang 已提交
870
    return (char*)tstrerror(terrno);
D
stmt  
dapan1121 已提交
871 872
  }

D
fix bug  
dapan1121 已提交
873
  pStmt->exec.pRequest->code = terrno;
D
stmt  
dapan1121 已提交
874

D
stmt  
dapan1121 已提交
875
  return taos_errstr(pStmt->exec.pRequest);
D
stmt  
dapan1121 已提交
876 877
}

X
Xiaoyu Wang 已提交
878
int stmtAffectedRows(TAOS_STMT* stmt) { return ((STscStmt*)stmt)->affectedRows; }
D
stmt  
dapan1121 已提交
879

X
Xiaoyu Wang 已提交
880
int stmtAffectedRowsOnce(TAOS_STMT* stmt) { return ((STscStmt*)stmt)->exec.affectedRows; }
D
dapan1121 已提交
881

X
Xiaoyu Wang 已提交
882
int stmtIsInsert(TAOS_STMT* stmt, int* insert) {
D
stmt  
dapan1121 已提交
883 884
  STscStmt* pStmt = (STscStmt*)stmt;

D
stmt  
dapan1121 已提交
885 886 887
  if (pStmt->sql.type) {
    *insert = (STMT_TYPE_INSERT == pStmt->sql.type || STMT_TYPE_MULTI_INSERT == pStmt->sql.type);
  } else {
888
    *insert = qIsInsertValuesSql(pStmt->sql.sqlStr, pStmt->sql.sqlLen);
D
stmt  
dapan1121 已提交
889
  }
X
Xiaoyu Wang 已提交
890

D
stmt  
dapan1121 已提交
891 892 893
  return TSDB_CODE_SUCCESS;
}

D
dapan1121 已提交
894 895 896 897 898 899
int stmtGetTagFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields) {
  STscStmt* pStmt = (STscStmt*)stmt;

  if (STMT_TYPE_QUERY == pStmt->sql.type) {
    STMT_RET(TSDB_CODE_TSC_STMT_API_ERROR);
  }
900

D
dapan1121 已提交
901 902 903 904 905 906 907 908 909 910 911 912
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));

  if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
      STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
    pStmt->bInfo.needParse = false;
  }

  if (pStmt->exec.pRequest && STMT_TYPE_QUERY == pStmt->sql.type && pStmt->sql.runTimes) {
    taos_free_result(pStmt->exec.pRequest);
    pStmt->exec.pRequest = NULL;
  }

913
  STMT_ERR_RET(stmtCreateRequest(pStmt));
D
dapan1121 已提交
914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929

  if (pStmt->bInfo.needParse) {
    STMT_ERR_RET(stmtParseSql(pStmt));
  }

  STMT_ERR_RET(stmtFetchTagFields(stmt, nums, fields));

  return TSDB_CODE_SUCCESS;
}

int stmtGetColFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields) {
  STscStmt* pStmt = (STscStmt*)stmt;

  if (STMT_TYPE_QUERY == pStmt->sql.type) {
    STMT_RET(TSDB_CODE_TSC_STMT_API_ERROR);
  }
930

D
dapan1121 已提交
931 932 933 934 935 936 937 938 939 940 941 942
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));

  if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
      STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
    pStmt->bInfo.needParse = false;
  }

  if (pStmt->exec.pRequest && STMT_TYPE_QUERY == pStmt->sql.type && pStmt->sql.runTimes) {
    taos_free_result(pStmt->exec.pRequest);
    pStmt->exec.pRequest = NULL;
  }

943
  STMT_ERR_RET(stmtCreateRequest(pStmt));
D
dapan1121 已提交
944 945 946 947 948 949 950 951 952 953

  if (pStmt->bInfo.needParse) {
    STMT_ERR_RET(stmtParseSql(pStmt));
  }

  STMT_ERR_RET(stmtFetchColFields(stmt, nums, fields));

  return TSDB_CODE_SUCCESS;
}

X
Xiaoyu Wang 已提交
954
int stmtGetParamNum(TAOS_STMT* stmt, int* nums) {
D
dapan1121 已提交
955 956 957 958
  STscStmt* pStmt = (STscStmt*)stmt;

  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));

X
Xiaoyu Wang 已提交
959 960
  if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
      STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
D
dapan1121 已提交
961 962 963 964 965 966 967
    pStmt->bInfo.needParse = false;
  }

  if (pStmt->exec.pRequest && STMT_TYPE_QUERY == pStmt->sql.type && pStmt->sql.runTimes) {
    taos_free_result(pStmt->exec.pRequest);
    pStmt->exec.pRequest = NULL;
  }
X
Xiaoyu Wang 已提交
968

969
  STMT_ERR_RET(stmtCreateRequest(pStmt));
D
dapan1121 已提交
970 971 972 973 974
  if (pStmt->bInfo.needParse) {
    STMT_ERR_RET(stmtParseSql(pStmt));
  }

  if (STMT_TYPE_QUERY == pStmt->sql.type) {
D
dapan1121 已提交
975
    *nums = taosArrayGetSize(pStmt->sql.pQuery->pPlaceholderValues);
D
dapan1121 已提交
976 977 978
  } else {
    STMT_ERR_RET(stmtFetchColFields(stmt, nums, NULL));
  }
X
Xiaoyu Wang 已提交
979

D
stmt  
dapan1121 已提交
980 981 982
  return TSDB_CODE_SUCCESS;
}

983
int stmtGetParam(TAOS_STMT* stmt, int idx, int* type, int* bytes) {
D
dapan1121 已提交
984 985 986 987 988
  STscStmt* pStmt = (STscStmt*)stmt;

  if (STMT_TYPE_QUERY == pStmt->sql.type) {
    STMT_RET(TSDB_CODE_TSC_STMT_API_ERROR);
  }
989

D
dapan1121 已提交
990 991 992 993 994 995 996 997 998 999 1000 1001
  STMT_ERR_RET(stmtSwitchStatus(pStmt, STMT_FETCH_FIELDS));

  if (pStmt->bInfo.needParse && pStmt->sql.runTimes && pStmt->sql.type > 0 &&
      STMT_TYPE_MULTI_INSERT != pStmt->sql.type) {
    pStmt->bInfo.needParse = false;
  }

  if (pStmt->exec.pRequest && STMT_TYPE_QUERY == pStmt->sql.type && pStmt->sql.runTimes) {
    taos_free_result(pStmt->exec.pRequest);
    pStmt->exec.pRequest = NULL;
  }

1002
  STMT_ERR_RET(stmtCreateRequest(pStmt));
D
dapan1121 已提交
1003 1004 1005 1006 1007

  if (pStmt->bInfo.needParse) {
    STMT_ERR_RET(stmtParseSql(pStmt));
  }

1008 1009
  int32_t       nums = 0;
  TAOS_FIELD_E* pField = NULL;
D
dapan1121 已提交
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
  STMT_ERR_RET(stmtFetchColFields(stmt, &nums, &pField));
  if (idx >= nums) {
    tscError("idx %d is too big", idx);
    taosMemoryFree(pField);
    STMT_ERR_RET(TSDB_CODE_INVALID_PARA);
  }

  *type = pField[idx].type;
  *bytes = pField[idx].bytes;

  taosMemoryFree(pField);

  return TSDB_CODE_SUCCESS;
}

X
Xiaoyu Wang 已提交
1025
TAOS_RES* stmtUseResult(TAOS_STMT* stmt) {
D
dapan1121 已提交
1026 1027 1028 1029 1030 1031 1032 1033
  STscStmt* pStmt = (STscStmt*)stmt;

  if (STMT_TYPE_QUERY != pStmt->sql.type) {
    tscError("useResult only for query statement");
    return NULL;
  }

  return pStmt->exec.pRequest;
D
stmt  
dapan1121 已提交
1034
}