【问题标题】:How to change the max length of column name in TDengine?如何更改 TDengine 中列名的最大长度?
【发布时间】:2021-08-21 11:29:18
【问题描述】:

根据TDengine的文档,

The maximum length of a column name is 64.

我想在源代码中将它从 64 更改为 100,并构建一个新版本。

然后我找到taosdef.h,并改了:

#define TSDB_COL_NAME_LEN   100

然后我构建成功了。

我尝试创建列名超过 64 的表,但失败了。

 invalid column name 

我该如何解决?

【问题讨论】:

    标签: sql c tdengine


    【解决方案1】:

    产生该错误(或类似错误)的方法有很多。改正不代表就没有其他问题了。

    请显示导致错误的确切执行语句(以及确切/完整的错误)。

    添加断点或以其他方式跟踪执行以查找问题的根源。

    问题可能在以下某处(可能是 validateColumnName),但如果上述细节不准确,情况可能会改变:

    validateStateWindowNode
    validateSessionNode
    validateTableColumnInfo  <===== which then calls validateColumnName
    validateOneColumn
    handleArithmeticExpr
    addProjectionExprAndResultField
    doGetColumnIndexByName
    validateGroupbyNode
    checkAndSetJoinCondInfo
    doAddJoinTagsColumnsIntoTagList
    validateOrderbyNode
    setAlterTableInfo
    
    
    ./src/client/src/tscSQLParser.c
    
    validateTableColumnInfo
        if (validateColumnName(pField->name) != TSDB_CODE_SUCCESS) {
          invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg6);
          return false;
        }
    
    
    int32_t validateColumnName(char* name) {
      bool ret = taosIsKeyWordToken(name, (int32_t)strlen(name));
      if (ret) {
        return TSDB_CODE_TSC_INVALID_OPERATION;
      }
    
      SStrToken token = {.z = name};
      token.n = tGetToken(name, &token.type);
    
      if (token.type != TK_STRING && token.type != TK_ID) {
        return TSDB_CODE_TSC_INVALID_OPERATION;
      }
    
      if (token.type == TK_STRING) {
        strdequote(token.z);
        strntolower(token.z, token.z, token.n);
        token.n = (uint32_t)strtrim(token.z);
    
        int32_t k = tGetToken(token.z, &token.type);
        if (k != token.n) {
          return TSDB_CODE_TSC_INVALID_OPERATION;
        }
    
        return validateColumnName(token.z);
      } else {
        if (isNumber(&token)) {
          return TSDB_CODE_TSC_INVALID_OPERATION;
        }
      }
    
      return TSDB_CODE_SUCCESS;
    }
    
    
    $ find . -name "*.[ch]" | xargs grep "taosIsKeyWordToken"
    ./src/client/src/tscSQLParser.c:  bool ret = taosIsKeyWordToken(name, (int32_t)strlen(name));
    ./src/util/inc/ttoken.h:bool taosIsKeyWordToken(const char *z, int32_t len);
    ./src/util/src/ttokenizer.c:bool taosIsKeyWordToken(const char* z, int32_t len) {
    
    ./src/util/src/ttokenizer.c:bool taosIsKeyWordToken(const char* z, int32_t len) {
    
    
    ./src/util/src/ttokenizer.c
    
    bool taosIsKeyWordToken(const char* z, int32_t len) {
      return (tKeywordCode((char*)z, len) != TK_ID);
    }
    
    static int32_t tKeywordCode(const char* z, int n) {
      pthread_once(&keywordsHashTableInit, doInitKeywordsTable);
      
      char key[512] = {0};
      if (n > tListLen(key)) { // too long token, can not be any other token type
        return TK_ID;
      }
      
      for (int32_t j = 0; j < n; ++j) {
        if (z[j] >= 'a' && z[j] <= 'z') {
          key[j] = (char)(z[j] & 0xDF);  // to uppercase and set the null-terminated
        } else {
          key[j] = z[j];
        }
      }
    
      SKeyword** pKey = (SKeyword**)taosHashGet(keywordHashTable, key, n);
      return (pKey != NULL)? (*pKey)->type:TK_ID;
    }
    

    【讨论】:

    • 感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2013-11-27
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多