diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index bdb0173e9c86870446a0d31eed09d5f81d82dbba..47f4a654429e3fea1acd5512ad234a4e93fae6ac 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -449,6 +449,9 @@ void doAsyncQuery(STscObj *pObj, SSqlObj *pSql, __async_cb_func_t fp, void *para void tscImportDataFromFile(SSqlObj *pSql); void tscInitResObjForLocalQuery(SSqlObj *pObj, int32_t numOfRes, int32_t rowLen); bool tscIsUpdateQuery(SSqlObj* pSql); +char* tscGetSqlStr(SSqlObj* pSql); +bool tscIsQueryWithLimit(SSqlObj* pSql); + bool tscHasReachLimitation(SQueryInfo *pQueryInfo, SSqlRes *pRes); char *tscGetErrorMsgPayload(SSqlCmd *pCmd); diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 727ca9ad7f3a50442eb5a4eb461deda1ff283b32..aa9dae4001d6b9c74c30ad36572aca7967edff24 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -2310,6 +2310,35 @@ bool tscIsUpdateQuery(SSqlObj* pSql) { return ((pCmd->command >= TSDB_SQL_INSERT && pCmd->command <= TSDB_SQL_DROP_DNODE) || TSDB_SQL_USE_DB == pCmd->command); } +char* tscGetSqlStr(SSqlObj* pSql) { + if (pSql == NULL || pSql->signature != pSql) { + return NULL; + } + + return pSql->sqlstr; +} + +bool tscIsQueryWithLimit(SSqlObj* pSql) { + if (pSql == NULL || pSql->signature != pSql) { + return false; + } + + SSqlCmd* pCmd = &pSql->cmd; + for (int32_t i = 0; i < pCmd->numOfClause; ++i) { + SQueryInfo* pqi = tscGetQueryInfoDetailSafely(pCmd, i); + if (pqi == NULL) { + continue; + } + + if (pqi->limit.limit > 0) { + return true; + } + } + + return false; +} + + int32_t tscSQLSyntaxErrMsg(char* msg, const char* additionalInfo, const char* sql) { const char* msgFormat1 = "syntax error near \'%s\'"; const char* msgFormat2 = "syntax error near \'%s\' (%s)"; diff --git a/src/kit/shell/inc/shell.h b/src/kit/shell/inc/shell.h index 24156956174364ae1be6abfa2af4c3db7c0db712..3702a7d02debb6f8891ad10e3da876bbe554618b 100644 --- a/src/kit/shell/inc/shell.h +++ b/src/kit/shell/inc/shell.h @@ -30,6 +30,8 @@ #define MAX_COMMAND_SIZE 65536 #define HISTORY_FILE ".taos_history" +#define DEFAULT_RES_SHOW_NUM 100 + typedef struct SShellHistory { char* hist[MAX_HISTORY_SIZE]; int hstart; diff --git a/src/kit/shell/src/shellEngine.c b/src/kit/shell/src/shellEngine.c index 1f3eb7927cc3554db132138253d66f5a01868e9b..e0da6084dd1852167394f2c286add9c06699627c 100644 --- a/src/kit/shell/src/shellEngine.c +++ b/src/kit/shell/src/shellEngine.c @@ -48,6 +48,9 @@ int prompt_size = 6; int64_t result = 0; SShellHistory history; +uint32_t resShowMaxNum = UINT32_MAX; +int32_t resShowMaxReached = 0; + #define DEFAULT_MAX_BINARY_DISPLAY_WIDTH 30 extern int32_t tsMaxBinaryDisplayWidth; @@ -324,7 +327,9 @@ void shellRunCommandOnServer(TAOS *con, char command[]) { } if (!tscIsUpdateQuery(pSql)) { // select and show kinds of commands - int error_no = 0; + int error_no = 0; + resShowMaxReached = 0; + int numOfRows = shellDumpResult(pSql, fname, &error_no, printMode); if (numOfRows < 0) { atomic_store_64(&result, 0); @@ -335,6 +340,10 @@ void shellRunCommandOnServer(TAOS *con, char command[]) { et = taosGetTimestampUs(); if (error_no == 0) { printf("Query OK, %d row(s) in set (%.6fs)\n", numOfRows, (et - st) / 1E6); + + if (resShowMaxReached) { + printf("Displayed 100 rows. You can add \"limit %d\" or redirect results to specific file to get all.\n", numOfRows); + } } else { printf("Query interrupted (%s), %d row(s) in set (%.6fs)\n", taos_errstr(pSql), numOfRows, (et - st) / 1E6); } @@ -659,6 +668,17 @@ static void printField(const char* val, TAOS_FIELD* field, int width, int32_t le } +bool isSelectQuery(TAOS_RES* tres) { + char *sql = tscGetSqlStr(tres); + + if (regex_match(sql, "^[\t ]*select[ \t]*", REG_EXTENDED | REG_ICASE)) { + return true; + } + + return false; +} + + static int verticalPrintResult(TAOS_RES* tres) { TAOS_ROW row = taos_fetch_row(tres); if (row == NULL) { @@ -677,18 +697,29 @@ static int verticalPrintResult(TAOS_RES* tres) { } } + if (isSelectQuery(tres) && !tscIsQueryWithLimit(tres)) { + resShowMaxNum = DEFAULT_RES_SHOW_NUM; + } else { + resShowMaxNum = UINT32_MAX; + } + int numOfRows = 0; do { printf("*************************** %d.row ***************************\n", numOfRows + 1); int32_t* length = taos_fetch_lengths(tres); - for (int i = 0; i < num_fields; i++) { - TAOS_FIELD* field = fields + i; + + if (numOfRows < resShowMaxNum) { + for (int i = 0; i < num_fields; i++) { + TAOS_FIELD* field = fields + i; - int padding = (int)(maxColNameLen - strlen(field->name)); - printf("%*.s%s: ", padding, " ", field->name); + int padding = (int)(maxColNameLen - strlen(field->name)); + printf("%*.s%s: ", padding, " ", field->name); - printField((const char*)row[i], field, 0, length[i], precision); - putchar('\n'); + printField((const char*)row[i], field, 0, length[i], precision); + putchar('\n'); + } + } else { + resShowMaxReached = 1; } numOfRows++; @@ -795,16 +826,27 @@ static int horizontalPrintResult(TAOS_RES* tres) { printHeader(fields, width, num_fields); + if (isSelectQuery(tres) && !tscIsQueryWithLimit(tres)) { + resShowMaxNum = DEFAULT_RES_SHOW_NUM; + } else { + resShowMaxNum = UINT32_MAX; + } + int numOfRows = 0; do { int32_t* length = taos_fetch_lengths(tres); - for (int i = 0; i < num_fields; i++) { - putchar(' '); - printField((const char*)row[i], fields + i, width[i], length[i], precision); - putchar(' '); - putchar('|'); + if (numOfRows < resShowMaxNum) { + for (int i = 0; i < num_fields; i++) { + putchar(' '); + printField((const char*)row[i], fields + i, width[i], length[i], precision); + putchar(' '); + putchar('|'); + } + putchar('\n'); + } else { + resShowMaxReached = 1; } - putchar('\n'); + numOfRows++; row = taos_fetch_row(tres); } while(row != NULL);