Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
31655c07
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
31655c07
编写于
7月 07, 2022
作者:
dengyihao
提交者:
GitHub
7月 07, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #14611 from taosdata/feat/idxFix1
enh: refactor idx code
上级
0feb11bd
7006eefd
变更
20
展开全部
隐藏空白更改
内联
并排
Showing
20 changed file
with
518 addition
and
473 deletion
+518
-473
include/libs/index/index.h
include/libs/index/index.h
+21
-2
source/client/src/clientImpl.c
source/client/src/clientImpl.c
+4
-4
source/dnode/vnode/inc/vnode.h
source/dnode/vnode/inc/vnode.h
+13
-11
source/dnode/vnode/src/meta/metaTable.c
source/dnode/vnode/src/meta/metaTable.c
+27
-31
source/dnode/vnode/src/tsdb/tsdbRead.c
source/dnode/vnode/src/tsdb/tsdbRead.c
+105
-80
source/libs/executor/src/executil.c
source/libs/executor/src/executil.c
+15
-3
source/libs/index/CMakeLists.txt
source/libs/index/CMakeLists.txt
+3
-3
source/libs/index/inc/indexFst.h
source/libs/index/inc/indexFst.h
+10
-3
source/libs/index/inc/indexInt.h
source/libs/index/inc/indexInt.h
+2
-0
source/libs/index/src/index.c
source/libs/index/src/index.c
+67
-23
source/libs/index/src/indexComm.c
source/libs/index/src/indexComm.c
+5
-1
source/libs/index/src/indexFilter.c
source/libs/index/src/indexFilter.c
+17
-15
source/libs/index/src/indexFst.c
source/libs/index/src/indexFst.c
+12
-42
source/libs/index/src/indexFstFile.c
source/libs/index/src/indexFstFile.c
+2
-6
source/libs/index/src/indexFstUtil.c
source/libs/index/src/indexFstUtil.c
+2
-3
source/libs/index/src/indexTfile.c
source/libs/index/src/indexTfile.c
+28
-22
source/libs/transport/src/transSvr.c
source/libs/transport/src/transSvr.c
+1
-2
source/os/src/osAtomic.c
source/os/src/osAtomic.c
+130
-162
source/os/src/osString.c
source/os/src/osString.c
+41
-47
tests/system-test/2-query/json_tag.py
tests/system-test/2-query/json_tag.py
+13
-13
未找到文件。
include/libs/index/index.h
浏览文件 @
31655c07
...
...
@@ -127,7 +127,7 @@ int indexSearch(SIndex* index, SIndexMultiTermQuery* query, SArray* result);
* @parma opt (input, rebuild index opts)
* @return error code
*/
int
indexRebuild
(
SIndex
*
index
,
SIndexOpts
*
opt
);
//
int indexRebuild(SIndex* index, SIndexOpts* opt);
/*
* open index
...
...
@@ -185,6 +185,25 @@ SIndexTerm* indexTermCreate(int64_t suid, SIndexOperOnColumn operType, uint8_t c
int32_t
nColName
,
const
char
*
colVal
,
int32_t
nColVal
);
void
indexTermDestroy
(
SIndexTerm
*
p
);
/*
* rebuild index
*/
void
indexRebuild
(
SIndexJson
*
idx
,
void
*
iter
);
/*
* check index json status
**/
bool
indexIsRebuild
(
SIndex
*
idx
);
/*
* rebuild index json
*/
void
indexJsonRebuild
(
SIndexJson
*
idx
,
void
*
iter
);
/*
* check index json status
**/
bool
indexJsonIsRebuild
(
SIndexJson
*
idx
);
/*
* init index env
*
...
...
@@ -203,7 +222,7 @@ typedef enum { SFLT_NOT_INDEX, SFLT_COARSE_INDEX, SFLT_ACCURATE_INDEX } SIdxFltS
SIdxFltStatus
idxGetFltStatus
(
SNode
*
pFilterNode
);
int32_t
doFilterTag
(
const
SNode
*
pFilterNode
,
SIndexMetaArg
*
metaArg
,
SArray
*
result
);
int32_t
doFilterTag
(
SNode
*
pFilterNode
,
SIndexMetaArg
*
metaArg
,
SArray
*
result
,
SIdxFltStatus
*
status
);
/*
* destory index env
*
...
...
source/client/src/clientImpl.c
浏览文件 @
31655c07
...
...
@@ -1298,16 +1298,16 @@ void doProcessMsgFromServer(SSchedMsg* schedMsg) {
pSendInfo
->
fp
(
pSendInfo
->
param
,
&
buf
,
pMsg
->
code
);
rpcFreeCont
(
pMsg
->
pCont
);
destroySendMsgInfo
(
pSendInfo
);
taosMemoryFree
(
arg
);
}
void
processMsgFromServer
(
void
*
parent
,
SRpcMsg
*
pMsg
,
SEpSet
*
pEpSet
)
{
SSchedMsg
schedMsg
=
{
0
};
SEpSet
*
tEpSet
=
pEpSet
!=
NULL
?
taosMemoryCalloc
(
1
,
sizeof
(
SEpSet
))
:
NULL
;
if
(
tEpSet
!=
NULL
)
{
*
tEpSet
=
*
pEpSet
;
SEpSet
*
tEpSet
=
NULL
;
if
(
pEpSet
!=
NULL
)
{
tEpSet
=
taosMemoryCalloc
(
1
,
sizeof
(
SEpSet
));
memcpy
((
void
*
)
tEpSet
,
(
void
*
)
pEpSet
,
sizeof
(
SEpSet
));
}
SchedArg
*
arg
=
taosMemoryCalloc
(
1
,
sizeof
(
SchedArg
));
...
...
source/dnode/vnode/inc/vnode.h
浏览文件 @
31655c07
...
...
@@ -64,8 +64,8 @@ int32_t vnodeSnapshotRead(SVSnapshotReader *pReader, const void **ppData, uint32
int32_t
vnodeProcessCreateTSma
(
SVnode
*
pVnode
,
void
*
pCont
,
uint32_t
contLen
);
int32_t
vnodeGetAllTableList
(
SVnode
*
pVnode
,
uint64_t
uid
,
SArray
*
list
);
int32_t
vnodeGetCtbIdList
(
SVnode
*
pVnode
,
int64_t
suid
,
SArray
*
list
);
void
*
vnodeGetIdx
(
SVnode
*
pVnode
);
void
*
vnodeGetIvtIdx
(
SVnode
*
pVnode
);
void
*
vnodeGetIdx
(
SVnode
*
pVnode
);
void
*
vnodeGetIvtIdx
(
SVnode
*
pVnode
);
int32_t
vnodeGetLoad
(
SVnode
*
pVnode
,
SVnodeLoad
*
pLoad
);
int32_t
vnodeValidateTableHash
(
SVnode
*
pVnode
,
char
*
tableFName
);
...
...
@@ -95,7 +95,7 @@ typedef struct SMetaFltParam {
tb_uid_t
suid
;
int16_t
cid
;
int16_t
type
;
char
*
val
;
char
*
val
;
bool
reverse
;
int
(
*
filterFunc
)(
void
*
a
,
void
*
b
,
int16_t
type
);
...
...
@@ -136,6 +136,8 @@ SArray *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdLis
int32_t
tsdbReaderReset
(
STsdbReader
*
pReader
,
SQueryTableDataCond
*
pCond
,
int32_t
tWinIdx
);
int32_t
tsdbGetFileBlocksDistInfo
(
STsdbReader
*
pReader
,
STableBlockDistInfo
*
pTableBlockInfo
);
int64_t
tsdbGetNumOfRowsInMemTable
(
STsdbReader
*
pHandle
);
void
*
tsdbGetIdx
(
SMeta
*
pMeta
);
void
*
tsdbGetIvtIdx
(
SMeta
*
pMeta
);
int32_t
tsdbLastRowReaderOpen
(
void
*
pVnode
,
int32_t
type
,
SArray
*
pTableIdList
,
int32_t
*
colId
,
int32_t
numOfCols
,
void
**
pReader
);
...
...
@@ -212,7 +214,7 @@ struct SMetaEntry {
int8_t
type
;
int8_t
flags
;
// TODO: need refactor?
tb_uid_t
uid
;
char
*
name
;
char
*
name
;
union
{
struct
{
SSchemaWrapper
schemaRow
;
...
...
@@ -223,7 +225,7 @@ struct SMetaEntry {
int64_t
ctime
;
int32_t
ttlDays
;
int32_t
commentLen
;
char
*
comment
;
char
*
comment
;
tb_uid_t
suid
;
uint8_t
*
pTags
;
}
ctbEntry
;
...
...
@@ -231,7 +233,7 @@ struct SMetaEntry {
int64_t
ctime
;
int32_t
ttlDays
;
int32_t
commentLen
;
char
*
comment
;
char
*
comment
;
int32_t
ncid
;
// next column id
SSchemaWrapper
schemaRow
;
}
ntbEntry
;
...
...
@@ -245,17 +247,17 @@ struct SMetaEntry {
struct
SMetaReader
{
int32_t
flags
;
SMeta
*
pMeta
;
SMeta
*
pMeta
;
SDecoder
coder
;
SMetaEntry
me
;
void
*
pBuf
;
void
*
pBuf
;
int32_t
szBuf
;
};
struct
SMTbCursor
{
TBC
*
pDbc
;
void
*
pKey
;
void
*
pVal
;
TBC
*
pDbc
;
void
*
pKey
;
void
*
pVal
;
int32_t
kLen
;
int32_t
vLen
;
SMetaReader
mr
;
...
...
source/dnode/vnode/src/meta/metaTable.c
浏览文件 @
31655c07
...
...
@@ -74,7 +74,7 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const
SIndexTerm
*
term
=
NULL
;
if
(
type
==
TSDB_DATA_TYPE_NULL
)
{
// handle null value
term
=
indexTermCreate
(
suid
,
ADD_VALUE
,
TSDB_DATA_TYPE_VARCHAR
,
key
,
nKey
,
NULL
,
0
);
}
else
if
(
type
==
TSDB_DATA_TYPE_NCHAR
)
{
if
(
pTagVal
->
nData
>
0
)
{
char
*
val
=
taosMemoryCalloc
(
1
,
pTagVal
->
nData
+
VARSTR_HEADER_SIZE
);
...
...
@@ -83,17 +83,15 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const
type
=
TSDB_DATA_TYPE_VARCHAR
;
term
=
indexTermCreate
(
suid
,
ADD_VALUE
,
type
,
key
,
nKey
,
val
,
len
);
}
else
if
(
pTagVal
->
nData
==
0
)
{
char
*
val
=
NULL
;
int32_t
len
=
0
;
// handle NULL key
term
=
indexTermCreate
(
suid
,
ADD_VALUE
,
TSDB_DATA_TYPE_VARCHAR
,
key
,
nKey
,
pTagVal
->
pData
,
0
);
}
}
else
if
(
type
==
TSDB_DATA_TYPE_DOUBLE
)
{
double
val
=
*
(
double
*
)(
&
pTagVal
->
i64
);
int
len
=
0
;
int
len
=
sizeof
(
val
)
;
term
=
indexTermCreate
(
suid
,
ADD_VALUE
,
type
,
key
,
nKey
,
(
const
char
*
)
&
val
,
len
);
}
else
if
(
type
==
TSDB_DATA_TYPE_BOOL
)
{
int
val
=
*
(
int
*
)(
&
pTagVal
->
i64
);
int
len
=
0
;
int
len
=
sizeof
(
val
)
;
term
=
indexTermCreate
(
suid
,
ADD_VALUE
,
TSDB_DATA_TYPE_INT
,
key
,
nKey
,
(
const
char
*
)
&
val
,
len
);
}
if
(
term
!=
NULL
)
{
...
...
@@ -380,22 +378,22 @@ int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUi
int
metaTtlDropTable
(
SMeta
*
pMeta
,
int64_t
ttl
,
SArray
*
tbUids
)
{
metaWLock
(
pMeta
);
int
ret
=
metaTtlSmaller
(
pMeta
,
ttl
,
tbUids
);
if
(
ret
!=
0
)
{
if
(
ret
!=
0
)
{
metaULock
(
pMeta
);
return
ret
;
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
tbUids
);
++
i
)
{
tb_uid_t
*
uid
=
(
tb_uid_t
*
)
taosArrayGet
(
tbUids
,
i
);
metaDropTableByUid
(
pMeta
,
*
uid
,
NULL
);
metaDebug
(
"ttl drop table:%"
PRId64
,
*
uid
);
metaDebug
(
"ttl drop table:%"
PRId64
,
*
uid
);
}
metaULock
(
pMeta
);
return
0
;
}
static
void
metaBuildTtlIdxKey
(
STtlIdxKey
*
ttlKey
,
const
SMetaEntry
*
pME
){
int64_t
ttlDays
;
int64_t
ctime
;
static
void
metaBuildTtlIdxKey
(
STtlIdxKey
*
ttlKey
,
const
SMetaEntry
*
pME
)
{
int64_t
ttlDays
;
int64_t
ctime
;
if
(
pME
->
type
==
TSDB_CHILD_TABLE
)
{
ctime
=
pME
->
ctbEntry
.
ctime
;
ttlDays
=
pME
->
ctbEntry
.
ttlDays
;
...
...
@@ -415,11 +413,10 @@ static void metaBuildTtlIdxKey(STtlIdxKey *ttlKey, const SMetaEntry *pME){
static
int
metaDeleteTtlIdx
(
SMeta
*
pMeta
,
const
SMetaEntry
*
pME
)
{
STtlIdxKey
ttlKey
=
{
0
};
metaBuildTtlIdxKey
(
&
ttlKey
,
pME
);
if
(
ttlKey
.
dtime
==
0
)
return
0
;
if
(
ttlKey
.
dtime
==
0
)
return
0
;
return
tdbTbDelete
(
pMeta
->
pTtlIdx
,
&
ttlKey
,
sizeof
(
ttlKey
),
&
pMeta
->
txn
);
}
static
int
metaDropTableByUid
(
SMeta
*
pMeta
,
tb_uid_t
uid
,
int
*
type
)
{
void
*
pData
=
NULL
;
int
nData
=
0
;
...
...
@@ -440,8 +437,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
tdbTbDelete
(
pMeta
->
pTbDb
,
&
(
STbDbKey
){.
version
=
version
,
.
uid
=
uid
},
sizeof
(
STbDbKey
),
&
pMeta
->
txn
);
tdbTbDelete
(
pMeta
->
pNameIdx
,
e
.
name
,
strlen
(
e
.
name
)
+
1
,
&
pMeta
->
txn
);
tdbTbDelete
(
pMeta
->
pUidIdx
,
&
uid
,
sizeof
(
uid
),
&
pMeta
->
txn
);
if
(
e
.
type
!=
TSDB_SUPER_TABLE
)
metaDeleteTtlIdx
(
pMeta
,
&
e
);
if
(
e
.
type
!=
TSDB_SUPER_TABLE
)
metaDeleteTtlIdx
(
pMeta
,
&
e
);
if
(
e
.
type
==
TSDB_CHILD_TABLE
)
{
tdbTbDelete
(
pMeta
->
pCtbIdx
,
&
(
SCtbIdxKey
){.
suid
=
e
.
ctbEntry
.
suid
,
.
uid
=
uid
},
sizeof
(
SCtbIdxKey
),
&
pMeta
->
txn
);
...
...
@@ -765,15 +761,15 @@ _err:
}
static
int
metaUpdateTableOptions
(
SMeta
*
pMeta
,
int64_t
version
,
SVAlterTbReq
*
pAlterTbReq
)
{
void
*
pVal
=
NULL
;
int
nVal
=
0
;
const
void
*
pData
=
NULL
;
int
nData
=
0
;
int
ret
=
0
;
tb_uid_t
uid
;
int64_t
oversion
;
SMetaEntry
entry
=
{
0
};
int
c
=
0
;
void
*
pVal
=
NULL
;
int
nVal
=
0
;
const
void
*
pData
=
NULL
;
int
nData
=
0
;
int
ret
=
0
;
tb_uid_t
uid
;
int64_t
oversion
;
SMetaEntry
entry
=
{
0
};
int
c
=
0
;
// search name index
ret
=
tdbTbGet
(
pMeta
->
pNameIdx
,
pAlterTbReq
->
tbName
,
strlen
(
pAlterTbReq
->
tbName
)
+
1
,
&
pVal
,
&
nVal
);
...
...
@@ -816,22 +812,22 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p
metaWLock
(
pMeta
);
// build SMetaEntry
if
(
entry
.
type
==
TSDB_CHILD_TABLE
)
{
if
(
pAlterTbReq
->
updateTTL
)
{
if
(
pAlterTbReq
->
updateTTL
)
{
metaDeleteTtlIdx
(
pMeta
,
&
entry
);
entry
.
ctbEntry
.
ttlDays
=
pAlterTbReq
->
newTTL
;
metaUpdateTtlIdx
(
pMeta
,
&
entry
);
}
if
(
pAlterTbReq
->
newCommentLen
>=
0
)
{
if
(
pAlterTbReq
->
newCommentLen
>=
0
)
{
entry
.
ctbEntry
.
commentLen
=
pAlterTbReq
->
newCommentLen
;
entry
.
ctbEntry
.
comment
=
pAlterTbReq
->
newComment
;
}
}
else
{
if
(
pAlterTbReq
->
updateTTL
)
{
if
(
pAlterTbReq
->
updateTTL
)
{
metaDeleteTtlIdx
(
pMeta
,
&
entry
);
entry
.
ntbEntry
.
ttlDays
=
pAlterTbReq
->
newTTL
;
metaUpdateTtlIdx
(
pMeta
,
&
entry
);
}
if
(
pAlterTbReq
->
newCommentLen
>=
0
)
{
if
(
pAlterTbReq
->
newCommentLen
>=
0
)
{
entry
.
ntbEntry
.
commentLen
=
pAlterTbReq
->
newCommentLen
;
entry
.
ntbEntry
.
comment
=
pAlterTbReq
->
newComment
;
}
...
...
@@ -930,7 +926,7 @@ static int metaUpdateNameIdx(SMeta *pMeta, const SMetaEntry *pME) {
static
int
metaUpdateTtlIdx
(
SMeta
*
pMeta
,
const
SMetaEntry
*
pME
)
{
STtlIdxKey
ttlKey
=
{
0
};
metaBuildTtlIdxKey
(
&
ttlKey
,
pME
);
if
(
ttlKey
.
dtime
==
0
)
return
0
;
if
(
ttlKey
.
dtime
==
0
)
return
0
;
return
tdbTbInsert
(
pMeta
->
pTtlIdx
,
&
ttlKey
,
sizeof
(
ttlKey
),
NULL
,
0
,
&
pMeta
->
txn
);
}
...
...
@@ -988,7 +984,7 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
SDecoder
dc
=
{
0
};
// get super table
if
(
tdbTbGet
(
pMeta
->
pUidIdx
,
&
pCtbEntry
->
ctbEntry
.
suid
,
sizeof
(
tb_uid_t
),
&
pData
,
&
nData
)
!=
0
)
{
if
(
tdbTbGet
(
pMeta
->
pUidIdx
,
&
pCtbEntry
->
ctbEntry
.
suid
,
sizeof
(
tb_uid_t
),
&
pData
,
&
nData
)
!=
0
)
{
return
-
1
;
}
tbDbKey
.
uid
=
pCtbEntry
->
ctbEntry
.
suid
;
...
...
@@ -1096,7 +1092,7 @@ static int metaHandleEntry(SMeta *pMeta, const SMetaEntry *pME) {
if
(
pME
->
type
==
TSDB_SUPER_TABLE
)
{
if
(
metaUpdateSuidIdx
(
pMeta
,
pME
)
<
0
)
goto
_err
;
}
}
}
if
(
pME
->
type
!=
TSDB_SUPER_TABLE
)
{
...
...
source/dnode/vnode/src/tsdb/tsdbRead.c
浏览文件 @
31655c07
...
...
@@ -17,26 +17,26 @@
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
typedef
struct
{
STbDataIter
*
iter
;
STbDataIter
*
iter
;
int32_t
index
;
bool
hasVal
;
}
SIterInfo
;
typedef
struct
STableBlockScanInfo
{
uint64_t
uid
;
TSKEY
lastKey
;
SBlockIdx
blockIdx
;
SArray
*
pBlockList
;
// block data index list
SIterInfo
iter
;
// mem buffer skip list iterator
SIterInfo
iiter
;
// imem buffer skip list iterator
SArray
*
delSkyline
;
// delete info for this table
int32_t
fileDelIndex
;
bool
iterInit
;
// whether to initialize the in-memory skip list iterator or not
uint64_t
uid
;
TSKEY
lastKey
;
SBlockIdx
blockIdx
;
SArray
*
pBlockList
;
// block data index list
SIterInfo
iter
;
// mem buffer skip list iterator
SIterInfo
iiter
;
// imem buffer skip list iterator
SArray
*
delSkyline
;
// delete info for this table
int32_t
fileDelIndex
;
bool
iterInit
;
// whether to initialize the in-memory skip list iterator or not
}
STableBlockScanInfo
;
typedef
struct
SBlockOrderWrapper
{
int64_t
uid
;
SBlock
*
pBlock
;
int64_t
uid
;
SBlock
*
pBlock
;
}
SBlockOrderWrapper
;
typedef
struct
SBlockOrderSupporter
{
...
...
@@ -70,40 +70,41 @@ typedef struct SFilesetIter {
}
SFilesetIter
;
typedef
struct
SFileDataBlockInfo
{
int32_t
tbBlockIdx
;
// index position in STableBlockScanInfo in order to check whether neighbor block overlaps with it
uint64_t
uid
;
int32_t
tbBlockIdx
;
// index position in STableBlockScanInfo in order to check whether neighbor block overlaps with it
uint64_t
uid
;
}
SFileDataBlockInfo
;
typedef
struct
SDataBlockIter
{
int32_t
numOfBlocks
;
int32_t
index
;
SArray
*
blockList
;
// SArray<SFileDataBlockInfo>
int32_t
order
;
int32_t
numOfBlocks
;
int32_t
index
;
SArray
*
blockList
;
// SArray<SFileDataBlockInfo>
int32_t
order
;
}
SDataBlockIter
;
typedef
struct
SFileBlockDumpInfo
{
int32_t
totalRows
;
int32_t
rowIndex
;
int64_t
lastKey
;
bool
allDumped
;
int32_t
totalRows
;
int32_t
rowIndex
;
int64_t
lastKey
;
bool
allDumped
;
}
SFileBlockDumpInfo
;
typedef
struct
SVersionRange
{
uint64_t
minVer
;
uint64_t
maxVer
;
uint64_t
minVer
;
uint64_t
maxVer
;
}
SVersionRange
;
typedef
struct
SReaderStatus
{
bool
loadFromFile
;
// check file stage
SHashObj
*
pTableMap
;
// SHash<STableBlockScanInfo>
bool
loadFromFile
;
// check file stage
SHashObj
*
pTableMap
;
// SHash<STableBlockScanInfo>
STableBlockScanInfo
*
pTableIter
;
// table iterator used in building in-memory buffer data blocks.
SFileBlockDumpInfo
fBlockDumpInfo
;
SDFileSet
*
pCurrentFileset
;
// current opened file set
SBlockData
fileBlockData
;
SFilesetIter
fileIter
;
SDataBlockIter
blockIter
;
bool
composedDataBlock
;
// the returned data block is a composed block or not
SDFileSet
*
pCurrentFileset
;
// current opened file set
SBlockData
fileBlockData
;
SFilesetIter
fileIter
;
SDataBlockIter
blockIter
;
bool
composedDataBlock
;
// the returned data block is a composed block or not
}
SReaderStatus
;
struct
STsdbReader
{
...
...
@@ -118,10 +119,10 @@ struct STsdbReader {
int32_t
type
;
// query type: 1. retrieve all data blocks, 2. retrieve direct prev|next rows
SBlockLoadSuppInfo
suppInfo
;
SIOCostSummary
cost
;
STSchema
*
pSchema
;
SDataFReader
*
pFileReader
;
SVersionRange
verRange
;
SIOCostSummary
cost
;
STSchema
*
pSchema
;
SDataFReader
*
pFileReader
;
SVersionRange
verRange
;
#if 0
SArray* prev; // previous row which is before than time window
SArray* next; // next row which is after the query time window
...
...
@@ -144,17 +145,21 @@ static int buildDataBlockFromBufImpl(STableBlockScanInfo* pBlockScanInfo, i
static
TSDBROW
*
getValidRow
(
SIterInfo
*
pIter
,
const
SArray
*
pDelList
,
STsdbReader
*
pReader
);
static
int32_t
doMergeRowsInFileBlocks
(
SBlockData
*
pBlockData
,
STableBlockScanInfo
*
pScanInfo
,
STsdbReader
*
pReader
,
SRowMerger
*
pMerger
);
static
int32_t
doMergeRowsInBuf
(
SIterInfo
*
pIter
,
int64_t
ts
,
SArray
*
pDelList
,
SRowMerger
*
pMerger
,
STsdbReader
*
pReader
);
static
int32_t
doMergeRowsInBuf
(
SIterInfo
*
pIter
,
int64_t
ts
,
SArray
*
pDelList
,
SRowMerger
*
pMerger
,
STsdbReader
*
pReader
);
static
int32_t
doAppendOneRow
(
SSDataBlock
*
pBlock
,
STsdbReader
*
pReader
,
STSRow
*
pTSRow
);
static
void
setComposedBlockFlag
(
STsdbReader
*
pReader
,
bool
composed
);
static
void
updateSchema
(
TSDBROW
*
pRow
,
uint64_t
uid
,
STsdbReader
*
pReader
);
static
bool
hasBeenDropped
(
const
SArray
*
pDelList
,
int32_t
*
index
,
TSDBKEY
*
pKey
);
static
void
doMergeMultiRows
(
TSDBROW
*
pRow
,
uint64_t
uid
,
SIterInfo
*
pIter
,
SArray
*
pDelList
,
STSRow
**
pTSRow
,
STsdbReader
*
pReader
);
static
void
doMergeMultiRows
(
TSDBROW
*
pRow
,
uint64_t
uid
,
SIterInfo
*
pIter
,
SArray
*
pDelList
,
STSRow
**
pTSRow
,
STsdbReader
*
pReader
);
static
void
doMergeMemIMemRows
(
TSDBROW
*
pRow
,
TSDBROW
*
piRow
,
STableBlockScanInfo
*
pBlockScanInfo
,
STsdbReader
*
pReader
,
STSRow
**
pTSRow
);
static
int32_t
initDelSkylineIterator
(
STableBlockScanInfo
*
pBlockScanInfo
,
STsdbReader
*
pReader
,
STbData
*
pMemTbData
,
STbData
*
piMemTbData
);
static
STsdb
*
getTsdbByRetentions
(
SVnode
*
pVnode
,
TSKEY
winSKey
,
SRetention
*
retentions
,
const
char
*
idstr
,
int8_t
*
pLevel
);
static
int32_t
initDelSkylineIterator
(
STableBlockScanInfo
*
pBlockScanInfo
,
STsdbReader
*
pReader
,
STbData
*
pMemTbData
,
STbData
*
piMemTbData
);
static
STsdb
*
getTsdbByRetentions
(
SVnode
*
pVnode
,
TSKEY
winSKey
,
SRetention
*
retentions
,
const
char
*
idstr
,
int8_t
*
pLevel
);
static
SVersionRange
getQueryVerRange
(
SVnode
*
pVnode
,
SQueryTableDataCond
*
pCond
,
int8_t
level
);
static
int32_t
setColumnIdSlotList
(
STsdbReader
*
pReader
,
SSDataBlock
*
pBlock
)
{
...
...
@@ -215,10 +220,10 @@ static SHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, const STableK
static
void
resetDataBlockScanInfo
(
SHashObj
*
pTableMap
)
{
STableBlockScanInfo
*
p
=
NULL
;
while
((
p
=
taosHashIterate
(
pTableMap
,
p
))
!=
NULL
)
{
while
((
p
=
taosHashIterate
(
pTableMap
,
p
))
!=
NULL
)
{
p
->
iterInit
=
false
;
p
->
iiter
.
hasVal
=
false
;
if
(
p
->
iter
.
iter
!=
NULL
)
{
if
(
p
->
iter
.
iter
!=
NULL
)
{
tsdbTbDataIterDestroy
(
p
->
iter
.
iter
);
}
...
...
@@ -234,12 +239,12 @@ static bool isEmptyQueryTimeWindow(STimeWindow* pWindow) {
// Update the query time window according to the data time to live(TTL) information, in order to avoid to return
// the expired data to client, even it is queried already.
static
STimeWindow
updateQueryTimeWindow
(
STsdb
*
pTsdb
,
STimeWindow
*
pWindow
)
{
STsdbKeepCfg
*
pCfg
=
&
pTsdb
->
keepCfg
;
STsdbKeepCfg
*
pCfg
=
&
pTsdb
->
keepCfg
;
int64_t
now
=
taosGetTimestamp
(
pCfg
->
precision
);
int64_t
earilyTs
=
now
-
(
tsTickPerMin
[
pCfg
->
precision
]
*
pCfg
->
keep2
)
+
1
;
// needs to add one tick
int64_t
now
=
taosGetTimestamp
(
pCfg
->
precision
);
int64_t
earilyTs
=
now
-
(
tsTickPerMin
[
pCfg
->
precision
]
*
pCfg
->
keep2
)
+
1
;
// needs to add one tick
STimeWindow
win
=
*
pWindow
;
STimeWindow
win
=
*
pWindow
;
if
(
win
.
skey
<
earilyTs
)
{
win
.
skey
=
earilyTs
;
}
...
...
@@ -352,8 +357,8 @@ static void resetDataBlockIterator(SDataBlockIter* pIter, int32_t order) {
}
static
void
initReaderStatus
(
SReaderStatus
*
pStatus
)
{
pStatus
->
pTableIter
=
NULL
;
pStatus
->
loadFromFile
=
true
;
pStatus
->
pTableIter
=
NULL
;
pStatus
->
loadFromFile
=
true
;
}
static
SSDataBlock
*
createResBlock
(
SQueryTableDataCond
*
pCond
,
int32_t
capacity
)
{
...
...
@@ -390,14 +395,15 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd
initReaderStatus
(
&
pReader
->
status
);
pReader
->
pTsdb
=
getTsdbByRetentions
(
pVnode
,
pCond
->
twindows
[
0
].
skey
,
pVnode
->
config
.
tsdbCfg
.
retentions
,
idstr
,
&
level
);
pReader
->
suid
=
pCond
->
suid
;
pReader
->
order
=
pCond
->
order
;
pReader
->
capacity
=
4096
;
pReader
->
idStr
=
(
idstr
!=
NULL
)
?
strdup
(
idstr
)
:
NULL
;
pReader
->
verRange
=
getQueryVerRange
(
pVnode
,
pCond
,
level
);
pReader
->
pTsdb
=
getTsdbByRetentions
(
pVnode
,
pCond
->
twindows
[
0
].
skey
,
pVnode
->
config
.
tsdbCfg
.
retentions
,
idstr
,
&
level
);
pReader
->
suid
=
pCond
->
suid
;
pReader
->
order
=
pCond
->
order
;
pReader
->
capacity
=
4096
;
pReader
->
idStr
=
(
idstr
!=
NULL
)
?
strdup
(
idstr
)
:
NULL
;
pReader
->
verRange
=
getQueryVerRange
(
pVnode
,
pCond
,
level
);
pReader
->
type
=
pCond
->
type
;
pReader
->
window
=
updateQueryTimeWindow
(
pVnode
->
pTsdb
,
pCond
->
twindows
);
pReader
->
window
=
updateQueryTimeWindow
(
pVnode
->
pTsdb
,
pCond
->
twindows
);
// todo remove this
setQueryTimewindow
(
pReader
,
pCond
,
0
);
...
...
@@ -660,7 +666,7 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, uint32_
*
numOfValidTables
=
0
;
STableBlockScanInfo
*
px
=
NULL
;
while
(
1
)
{
while
(
1
)
{
px
=
taosHashIterate
(
pReader
->
status
.
pTableMap
,
px
);
if
(
px
==
NULL
)
{
break
;
...
...
@@ -669,7 +675,7 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, uint32_
taosArrayClear
(
px
->
pBlockList
);
}
for
(
int32_t
i
=
0
;
i
<
numOfTables
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
numOfTables
;
++
i
)
{
SBlockIdx
*
pBlockIdx
=
taosArrayGet
(
pIndexList
,
i
);
SMapData
mapData
=
{
0
};
...
...
@@ -830,7 +836,7 @@ static int32_t doLoadFileBlockData(STsdbReader* pReader, SDataBlockIter* pBlockI
uint8_t
*
pb
=
NULL
,
*
pb1
=
NULL
;
int32_t
code
=
tsdbReadColData
(
pReader
->
pFileReader
,
&
pBlockScanInfo
->
blockIdx
,
pBlock
,
pSupInfo
->
colIds
,
numOfCols
,
pBlockData
,
&
pb
,
&
pb1
);
pBlockData
,
&
pb
,
&
pb1
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
goto
_error
;
}
...
...
@@ -1812,7 +1818,7 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo*
SFileBlockDumpInfo
*
pDumpInfo
=
&
pReader
->
status
.
fBlockDumpInfo
;
SBlockData
*
pBlockData
=
&
pReader
->
status
.
fileBlockData
;
SArray
*
pDelList
=
pBlockScanInfo
->
delSkyline
;
SArray
*
pDelList
=
pBlockScanInfo
->
delSkyline
;
TSDBROW
*
pRow
=
getValidRow
(
&
pBlockScanInfo
->
iter
,
pDelList
,
pReader
);
TSDBROW
*
piRow
=
getValidRow
(
&
pBlockScanInfo
->
iiter
,
pDelList
,
pReader
);
...
...
@@ -1936,8 +1942,8 @@ static int32_t doMergeThreeLevelRows(STsdbReader* pReader, STableBlockScanInfo*
ASSERT
(
0
);
}
static
bool
isValidFileBlockRow
(
SBlockData
*
pBlockData
,
SFileBlockDumpInfo
*
pDumpInfo
,
STableBlockScanInfo
*
pBlockScanInfo
,
STsdbReader
*
pReader
)
{
static
bool
isValidFileBlockRow
(
SBlockData
*
pBlockData
,
SFileBlockDumpInfo
*
pDumpInfo
,
STableBlockScanInfo
*
pBlockScanInfo
,
STsdbReader
*
pReader
)
{
// check for version and time range
int64_t
ver
=
pBlockData
->
aVersion
[
pDumpInfo
->
rowIndex
];
if
(
ver
>
pReader
->
verRange
.
maxVer
||
ver
<
pReader
->
verRange
.
minVer
)
{
...
...
@@ -1980,7 +1986,7 @@ static int32_t buildComposedDataBlockImpl(STsdbReader* pReader, STableBlockScanI
// mem + file
if
(
pBlockScanInfo
->
iter
.
hasVal
)
{
return
doMergeBufAndFileRows
(
pReader
,
pBlockScanInfo
,
pRow
,
pTSRow
,
&
pBlockScanInfo
->
iter
,
key
);
return
doMergeBufAndFileRows
(
pReader
,
pBlockScanInfo
,
pRow
,
pTSRow
,
&
pBlockScanInfo
->
iter
,
key
);
}
// imem & mem are all empty, only file exist
...
...
@@ -2113,7 +2119,8 @@ static int32_t initMemDataIterator(STableBlockScanInfo* pBlockScanInfo, STsdbRea
return
TSDB_CODE_SUCCESS
;
}
int32_t
initDelSkylineIterator
(
STableBlockScanInfo
*
pBlockScanInfo
,
STsdbReader
*
pReader
,
STbData
*
pMemTbData
,
STbData
*
piMemTbData
)
{
int32_t
initDelSkylineIterator
(
STableBlockScanInfo
*
pBlockScanInfo
,
STsdbReader
*
pReader
,
STbData
*
pMemTbData
,
STbData
*
piMemTbData
)
{
if
(
pBlockScanInfo
->
delSkyline
!=
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -2123,7 +2130,7 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader*
SArray
*
pDelData
=
taosArrayInit
(
4
,
sizeof
(
SDelData
));
SDelFile
*
pDelFile
=
tsdbFSStateGetDelFile
(
pTsdb
->
fs
->
cState
);
SDelFile
*
pDelFile
=
tsdbFSStateGetDelFile
(
pTsdb
->
fs
->
cState
);
if
(
pDelFile
)
{
SDelFReader
*
pDelFReader
=
NULL
;
code
=
tsdbDelFReaderOpen
(
&
pDelFReader
,
pDelFile
,
pTsdb
,
NULL
);
...
...
@@ -2173,7 +2180,8 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader*
}
taosArrayDestroy
(
pDelData
);
pBlockScanInfo
->
iter
.
index
=
ASCENDING_TRAVERSE
(
pReader
->
order
)
?
0
:
taosArrayGetSize
(
pBlockScanInfo
->
delSkyline
)
-
1
;
pBlockScanInfo
->
iter
.
index
=
ASCENDING_TRAVERSE
(
pReader
->
order
)
?
0
:
taosArrayGetSize
(
pBlockScanInfo
->
delSkyline
)
-
1
;
pBlockScanInfo
->
iiter
.
index
=
pBlockScanInfo
->
iter
.
index
;
pBlockScanInfo
->
fileDelIndex
=
pBlockScanInfo
->
iter
.
index
;
return
code
;
...
...
@@ -2488,7 +2496,7 @@ bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey) {
if
(
pKey
->
ts
>
last
->
ts
)
{
return
false
;
}
else
if
(
pKey
->
ts
==
last
->
ts
)
{
size_t
size
=
taosArrayGetSize
(
pDelList
);
size_t
size
=
taosArrayGetSize
(
pDelList
);
TSDBKEY
*
prev
=
taosArrayGet
(
pDelList
,
size
-
2
);
if
(
prev
->
version
>=
pKey
->
version
)
{
return
true
;
...
...
@@ -2527,7 +2535,8 @@ TSDBROW* getValidRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pRea
}
// it is a valid data version
if
((
key
.
version
<=
pReader
->
verRange
.
maxVer
&&
key
.
version
>=
pReader
->
verRange
.
minVer
)
&&
(
!
hasBeenDropped
(
pDelList
,
&
pIter
->
index
,
&
key
)))
{
if
((
key
.
version
<=
pReader
->
verRange
.
maxVer
&&
key
.
version
>=
pReader
->
verRange
.
minVer
)
&&
(
!
hasBeenDropped
(
pDelList
,
&
pIter
->
index
,
&
key
)))
{
return
pRow
;
}
...
...
@@ -2545,13 +2554,14 @@ TSDBROW* getValidRow(SIterInfo* pIter, const SArray* pDelList, STsdbReader* pRea
return
NULL
;
}
if
(
key
.
version
<=
pReader
->
verRange
.
maxVer
&&
key
.
version
>=
pReader
->
verRange
.
minVer
&&
(
!
hasBeenDropped
(
pDelList
,
&
pIter
->
index
,
&
key
)))
{
if
(
key
.
version
<=
pReader
->
verRange
.
maxVer
&&
key
.
version
>=
pReader
->
verRange
.
minVer
&&
(
!
hasBeenDropped
(
pDelList
,
&
pIter
->
index
,
&
key
)))
{
return
pRow
;
}
}
}
int32_t
doMergeRowsInBuf
(
SIterInfo
*
pIter
,
int64_t
ts
,
SArray
*
pDelList
,
SRowMerger
*
pMerger
,
STsdbReader
*
pReader
)
{
int32_t
doMergeRowsInBuf
(
SIterInfo
*
pIter
,
int64_t
ts
,
SArray
*
pDelList
,
SRowMerger
*
pMerger
,
STsdbReader
*
pReader
)
{
while
(
1
)
{
pIter
->
hasVal
=
tsdbTbDataIterNext
(
pIter
->
iter
);
if
(
!
pIter
->
hasVal
)
{
...
...
@@ -2685,7 +2695,8 @@ void updateSchema(TSDBROW* pRow, uint64_t uid, STsdbReader* pReader) {
}
}
void
doMergeMultiRows
(
TSDBROW
*
pRow
,
uint64_t
uid
,
SIterInfo
*
pIter
,
SArray
*
pDelList
,
STSRow
**
pTSRow
,
STsdbReader
*
pReader
)
{
void
doMergeMultiRows
(
TSDBROW
*
pRow
,
uint64_t
uid
,
SIterInfo
*
pIter
,
SArray
*
pDelList
,
STSRow
**
pTSRow
,
STsdbReader
*
pReader
)
{
SRowMerger
merge
=
{
0
};
TSDBKEY
k
=
TSDBROW_KEY
(
pRow
);
...
...
@@ -2728,7 +2739,7 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR
int64_t
endKey
)
{
TSDBROW
*
pRow
=
getValidRow
(
&
pBlockScanInfo
->
iter
,
pBlockScanInfo
->
delSkyline
,
pReader
);
TSDBROW
*
piRow
=
getValidRow
(
&
pBlockScanInfo
->
iiter
,
pBlockScanInfo
->
delSkyline
,
pReader
);
SArray
*
pDelList
=
pBlockScanInfo
->
delSkyline
;
SArray
*
pDelList
=
pBlockScanInfo
->
delSkyline
;
// todo refactor
bool
asc
=
ASCENDING_TRAVERSE
(
pReader
->
order
);
...
...
@@ -2855,6 +2866,20 @@ int32_t tsdbSetTableId(STsdbReader* pReader, int64_t uid) {
return
TDB_CODE_SUCCESS
;
}
void
*
tsdbGetIdx
(
SMeta
*
pMeta
)
{
if
(
pMeta
==
NULL
)
{
return
NULL
;
}
return
metaGetIdx
(
pMeta
);
}
void
*
tsdbGetIvtIdx
(
SMeta
*
pMeta
)
{
if
(
pMeta
==
NULL
)
{
return
NULL
;
}
return
metaGetIvtIdx
(
pMeta
);
}
/**
* @brief Get all suids since suid
*
...
...
@@ -3105,11 +3130,11 @@ void tsdbReaderClose(STsdbReader* pReader) {
taosMemoryFreeClear
(
pReader
->
suppInfo
.
plist
);
taosMemoryFree
(
pReader
->
suppInfo
.
slotIds
);
if
(
!
isEmptyQueryTimeWindow
(
&
pReader
->
window
))
{
// tsdbMayUnTakeMemSnapshot(pTsdbReadHandle);
}
else
{
ASSERT
(
pReader
->
status
.
pTableMap
==
NULL
);
}
if
(
!
isEmptyQueryTimeWindow
(
&
pReader
->
window
))
{
// tsdbMayUnTakeMemSnapshot(pTsdbReadHandle);
}
else
{
ASSERT
(
pReader
->
status
.
pTableMap
==
NULL
);
}
#if 0
// if (pReader->status.pTableScanInfo != NULL) {
// pReader->status.pTableScanInfo = destroyTableCheckInfo(pReader->status.pTableScanInfo);
...
...
@@ -3288,10 +3313,10 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond, int32_
setQueryTimewindow
(
pReader
,
pCond
,
tWinIdx
);
pReader
->
order
=
pCond
->
order
;
pReader
->
type
=
BLOCK_LOAD_OFFSET_ORDER
;
pReader
->
order
=
pCond
->
order
;
pReader
->
type
=
BLOCK_LOAD_OFFSET_ORDER
;
pReader
->
status
.
loadFromFile
=
true
;
pReader
->
status
.
pTableIter
=
NULL
;
pReader
->
status
.
pTableIter
=
NULL
;
pReader
->
window
=
updateQueryTimeWindow
(
pReader
->
pTsdb
,
&
pCond
->
twindows
[
tWinIdx
]);
...
...
@@ -3319,8 +3344,8 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond, int32_
}
}
tsdbDebug
(
"%p reset reader, suid:%"
PRIu64
", numOfTables:%d, query range:%"
PRId64
" - %"
PRId64
" in query %s"
,
pReader
,
pReader
->
suid
,
numOfTables
,
pReader
->
window
.
skey
,
pReader
->
window
.
ekey
,
pReader
->
idStr
);
tsdbDebug
(
"%p reset reader, suid:%"
PRIu64
", numOfTables:%d, query range:%"
PRId64
" - %"
PRId64
" in query %s"
,
pReader
,
pReader
->
suid
,
numOfTables
,
pReader
->
window
.
skey
,
pReader
->
window
.
ekey
,
pReader
->
idStr
);
return
code
;
}
...
...
source/libs/executor/src/executil.c
浏览文件 @
31655c07
...
...
@@ -305,9 +305,21 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode,
SNode
*
pTagIndexCond
=
(
SNode
*
)
pListInfo
->
pTagIndexCond
;
if
(
pScanNode
->
tableType
==
TSDB_SUPER_TABLE
)
{
if
(
pTagIndexCond
)
{
SArray
*
res
=
taosArrayInit
(
8
,
sizeof
(
uint64_t
));
// code = doFilterTag(pTagIndexCond, &metaArg, res);
code
=
TSDB_CODE_INDEX_REBUILDING
;
///<<<<<<< HEAD
SIndexMetaArg
metaArg
=
{
.
metaEx
=
metaHandle
,
.
idx
=
tsdbGetIdx
(
metaHandle
),
.
ivtIdx
=
tsdbGetIvtIdx
(
metaHandle
),
.
suid
=
tableUid
};
SArray
*
res
=
taosArrayInit
(
8
,
sizeof
(
uint64_t
));
SIdxFltStatus
status
=
SFLT_NOT_INDEX
;
code
=
doFilterTag
(
pTagIndexCond
,
&
metaArg
,
res
,
&
status
);
if
(
code
!=
0
||
status
==
SFLT_NOT_INDEX
)
{
code
=
TSDB_CODE_INDEX_REBUILDING
;
}
//=======
// SArray* res = taosArrayInit(8, sizeof(uint64_t));
// // code = doFilterTag(pTagIndexCond, &metaArg, res);
// code = TSDB_CODE_INDEX_REBUILDING;
//>>>>>>> dvv
if
(
code
==
TSDB_CODE_INDEX_REBUILDING
)
{
code
=
vnodeGetAllTableList
(
pVnode
,
tableUid
,
pListInfo
->
pTableList
);
}
else
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
...
...
source/libs/index/CMakeLists.txt
浏览文件 @
31655c07
...
...
@@ -35,7 +35,7 @@ if (${BUILD_WITH_INVERTEDINDEX})
endif
(
${
BUILD_WITH_INVERTEDINDEX
}
)
#
if (${BUILD_TEST})
#
add_subdirectory(test)
#
endif(${BUILD_TEST})
if
(
${
BUILD_TEST
}
)
add_subdirectory
(
test
)
endif
(
${
BUILD_TEST
}
)
source/libs/index/inc/indexFst.h
浏览文件 @
31655c07
...
...
@@ -53,7 +53,7 @@ typedef struct FstRange {
}
FstRange
;
typedef
enum
{
OneTransNext
,
OneTrans
,
AnyTrans
,
EmptyFinal
}
State
;
typedef
enum
{
Ordered
,
OutOfOrdered
,
DuplicateKey
}
OrderType
;
typedef
enum
{
Ordered
,
OutOfOrdered
,
DuplicateKey
}
Fst
OrderType
;
FstBoundWithData
*
fstBoundStateCreate
(
FstBound
type
,
FstSlice
*
data
);
bool
fstBoundWithDataExceededBy
(
FstBoundWithData
*
bound
,
FstSlice
*
slice
);
...
...
@@ -106,7 +106,7 @@ bool fstBuilderInsert(FstBuilder* b, FstSlice bs, Output in);
void
fstBuilderCompileFrom
(
FstBuilder
*
b
,
uint64_t
istate
);
void
*
fstBuilerIntoInner
(
FstBuilder
*
b
);
void
fstBuilderFinish
(
FstBuilder
*
b
);
OrderType
fstBuilderCheckLastKey
(
FstBuilder
*
b
,
FstSlice
bs
,
bool
ckDup
);
FstOrderType
fstBuilderCheckLastKey
(
FstBuilder
*
b
,
FstSlice
bs
,
bool
ckDup
);
CompiledAddr
fstBuilderCompile
(
FstBuilder
*
b
,
FstBuilderNode
*
bn
);
typedef
struct
FstTransitions
{
...
...
@@ -213,14 +213,18 @@ typedef struct FstNode {
// If this node is final and has a terminal output value, then it is, returned.
// Otherwise, a zero output is returned
#define FST_NODE_FINAL_OUTPUT(node) node->finalOutput
// Returns true if and only if this node corresponds to a final or "match",
// state in the finite state transducer.
#define FST_NODE_IS_FINAL(node) node->isFinal
// Returns the number of transitions in this node, The maximum number of
// transitions is 256.
#define FST_NODE_LEN(node) node->nTrans
// Returns true if and only if this node has zero transitions.
#define FST_NODE_IS_EMPTYE(node) (node->nTrans == 0)
// Return the address of this node.
#define FST_NODE_ADDR(node) node->start
...
...
@@ -277,6 +281,8 @@ FStmBuilder* fstSearch(Fst* fst, FAutoCtx* ctx);
FStmStBuilder
*
fstSearchWithState
(
Fst
*
fst
,
FAutoCtx
*
ctx
);
// into stream to expand later
//
FStmSt
*
stmBuilderIntoStm
(
FStmBuilder
*
sb
);
bool
fstVerify
(
Fst
*
fst
);
...
...
@@ -325,7 +331,8 @@ FStmBuilder* stmBuilderCreate(Fst* fst, FAutoCtx* aut);
void
stmBuilderDestroy
(
FStmBuilder
*
b
);
// set up bound range
// refator later: to simple code by marco
// refator later
// simple code by marco
void
stmBuilderSetRange
(
FStmBuilder
*
b
,
FstSlice
*
val
,
RangeType
type
);
#ifdef __cplusplus
...
...
source/libs/index/inc/indexInt.h
浏览文件 @
31655c07
...
...
@@ -45,6 +45,7 @@ extern "C" {
typedef
enum
{
LT
,
LE
,
GT
,
GE
,
CONTAINS
,
EQ
}
RangeType
;
typedef
enum
{
kTypeValue
,
kTypeDeletion
}
STermValueType
;
typedef
enum
{
kRebuild
,
kFinished
}
SIdxStatus
;
typedef
struct
SIndexStat
{
int32_t
totalAdded
;
//
...
...
@@ -65,6 +66,7 @@ struct SIndex {
char
*
path
;
int8_t
status
;
SIndexStat
stat
;
TdThreadMutex
mtx
;
tsem_t
sem
;
...
...
source/libs/index/src/index.c
浏览文件 @
31655c07
...
...
@@ -63,7 +63,7 @@ static void indexDestroy(void* sIdx);
void
indexInit
()
{
// refactor later
indexQhandle
=
taosInitScheduler
(
INDEX_QUEUE_SIZE
,
INDEX_NUM_OF_THREADS
,
"index"
);
indexRefMgt
=
taosOpenRef
(
10
,
indexDestroy
);
indexRefMgt
=
taosOpenRef
(
10
00
,
indexDestroy
);
}
void
indexCleanup
()
{
// refacto later
...
...
@@ -101,15 +101,16 @@ static void indexWait(void* idx) {
}
int
indexOpen
(
SIndexOpts
*
opts
,
const
char
*
path
,
SIndex
**
index
)
{
int
ret
=
TSDB_CODE_SUCCESS
;
taosThreadOnce
(
&
isInit
,
indexInit
);
SIndex
*
sIdx
=
taosMemoryCalloc
(
1
,
sizeof
(
SIndex
));
if
(
sIdx
==
NULL
)
{
return
-
1
;
return
TSDB_CODE_OUT_OF_MEMORY
;
}
// sIdx->cache = (void*)idxCacheCreate(sIdx);
sIdx
->
tindex
=
idxTFileCreate
(
path
);
if
(
sIdx
->
tindex
==
NULL
)
{
ret
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
END
;
}
...
...
@@ -123,14 +124,14 @@ int indexOpen(SIndexOpts* opts, const char* path, SIndex** index) {
idxAcquireRef
(
sIdx
->
refId
);
*
index
=
sIdx
;
return
0
;
return
ret
;
END:
if
(
sIdx
!=
NULL
)
{
indexClose
(
sIdx
);
}
*
index
=
NULL
;
return
-
1
;
return
ret
;
}
void
indexDestroy
(
void
*
handle
)
{
...
...
@@ -231,7 +232,7 @@ int indexSearch(SIndex* index, SIndexMultiTermQuery* multiQuerys, SArray* result
}
int
indexDelete
(
SIndex
*
index
,
SIndexMultiTermQuery
*
query
)
{
return
1
;
}
int
indexRebuild
(
SIndex
*
index
,
SIndexOpts
*
opts
)
{
return
0
;
}
//
int indexRebuild(SIndex* index, SIndexOpts* opts) { return 0; }
SIndexOpts
*
indexOptsCreate
()
{
return
NULL
;
}
void
indexOptsDestroy
(
SIndexOpts
*
opts
)
{
return
;
}
...
...
@@ -273,33 +274,28 @@ SIndexTerm* indexTermCreate(int64_t suid, SIndexOperOnColumn oper, uint8_t colTy
tm
->
operType
=
oper
;
tm
->
colType
=
colType
;
#if 0
tm->colName = (char*)taosMemoryCalloc(1, nColName + 1);
memcpy(tm->colName, colName, nColName);
tm->nColName = nColName;
tm->colVal = (char*)taosMemoryCalloc(1, nColVal + 1);
memcpy(tm->colVal, colVal, nColVal);
tm->nColVal = nColVal;
#endif
#if 1
tm
->
colName
=
(
char
*
)
taosMemoryCalloc
(
1
,
nColName
+
1
);
memcpy
(
tm
->
colName
,
colName
,
nColName
);
tm
->
nColName
=
nColName
;
char
*
buf
=
NULL
;
int32_t
len
=
idxConvertDataToStr
((
void
*
)
colVal
,
IDX_TYPE_GET_TYPE
(
colType
),
(
void
**
)
&
buf
);
assert
(
len
!=
-
1
);
int32_t
len
=
0
;
if
(
colVal
!=
NULL
&&
nColVal
!=
0
)
{
len
=
idxConvertDataToStr
((
void
*
)
colVal
,
IDX_TYPE_GET_TYPE
(
colType
),
(
void
**
)
&
buf
);
}
else
if
(
colVal
==
NULL
)
{
buf
=
strndup
(
INDEX_DATA_NULL_STR
,
(
int32_t
)
strlen
(
INDEX_DATA_NULL_STR
));
len
=
(
int32_t
)
strlen
(
INDEX_DATA_NULL_STR
);
}
else
{
const
char
*
emptyStr
=
" "
;
buf
=
strndup
(
emptyStr
,
(
int32_t
)
strlen
(
emptyStr
));
len
=
(
int32_t
)
strlen
(
emptyStr
);
}
tm
->
colVal
=
buf
;
tm
->
nColVal
=
len
;
#endif
return
tm
;
}
void
indexTermDestroy
(
SIndexTerm
*
p
)
{
taosMemoryFree
(
p
->
colName
);
taosMemoryFree
(
p
->
colVal
);
...
...
@@ -320,6 +316,54 @@ void indexMultiTermDestroy(SIndexMultiTerm* terms) {
taosArrayDestroy
(
terms
);
}
/*
* rebuild index
*/
static
void
idxSchedRebuildIdx
(
SSchedMsg
*
msg
)
{
// TODO, no need rebuild index
SIndex
*
idx
=
msg
->
ahandle
;
int8_t
st
=
kFinished
;
atomic_store_8
(
&
idx
->
status
,
st
);
idxReleaseRef
(
idx
->
refId
);
}
void
indexRebuild
(
SIndexJson
*
idx
,
void
*
iter
)
{
// set up rebuild status
int8_t
st
=
kRebuild
;
atomic_store_8
(
&
idx
->
status
,
st
);
// task put into BG thread
SSchedMsg
schedMsg
=
{
0
};
schedMsg
.
fp
=
idxSchedRebuildIdx
;
schedMsg
.
ahandle
=
idx
;
idxAcquireRef
(
idx
->
refId
);
taosScheduleTask
(
indexQhandle
,
&
schedMsg
);
}
/*
* check index json status
**/
bool
indexIsRebuild
(
SIndex
*
idx
)
{
// idx rebuild or not
return
((
SIdxStatus
)
atomic_load_8
(
&
idx
->
status
))
==
kRebuild
?
true
:
false
;
}
/*
* rebuild index
*/
void
indexJsonRebuild
(
SIndexJson
*
idx
,
void
*
iter
)
{
// idx rebuild or not
indexRebuild
(
idx
,
iter
);
}
/*
* check index json status
**/
bool
indexJsonIsRebuild
(
SIndexJson
*
idx
)
{
// load idx rebuild or not
return
((
SIdxStatus
)
atomic_load_8
(
&
idx
->
status
))
==
kRebuild
?
true
:
false
;
}
static
int
idxTermSearch
(
SIndex
*
sIdx
,
SIndexTermQuery
*
query
,
SArray
**
result
)
{
SIndexTerm
*
term
=
query
->
term
;
const
char
*
colName
=
term
->
colName
;
...
...
source/libs/index/src/indexComm.c
浏览文件 @
31655c07
...
...
@@ -29,7 +29,7 @@
#define INDEX_DATA_BIGINT_NULL 0x8000000000000000LL
#define INDEX_DATA_TIMESTAMP_NULL TSDB_DATA_BIGINT_NULL
#define INDEX_DATA_FLOAT_NULL 0x7FF00000 // it is an NAN
#define INDEX_DATA_FLOAT_NULL 0x7FF00000
// it is an NAN
#define INDEX_DATA_DOUBLE_NULL 0x7FFFFF0000000000LL // an NAN
#define INDEX_DATA_NCHAR_NULL 0xFFFFFFFF
#define INDEX_DATA_BINARY_NULL 0xFF
...
...
@@ -374,6 +374,10 @@ int32_t idxConvertData(void* src, int8_t type, void** dst) {
return
tlen
;
}
int32_t
idxConvertDataToStr
(
void
*
src
,
int8_t
type
,
void
**
dst
)
{
if
(
src
==
NULL
)
{
*
dst
=
strndup
(
INDEX_DATA_NULL_STR
,
(
int
)
strlen
(
INDEX_DATA_NULL_STR
));
return
(
int32_t
)
strlen
(
INDEX_DATA_NULL_STR
);
}
int
tlen
=
tDataTypes
[
type
].
bytes
;
int32_t
bufSize
=
64
;
switch
(
type
)
{
...
...
source/libs/index/src/indexFilter.c
浏览文件 @
31655c07
...
...
@@ -181,11 +181,9 @@ static int32_t sifInitJsonParam(SNode *node, SIFParam *param, SIFCtx *ctx) {
param
->
colValType
=
l
->
node
.
resType
.
type
;
memcpy
(
param
->
dbName
,
l
->
dbName
,
sizeof
(
l
->
dbName
));
memcpy
(
param
->
colName
,
r
->
literal
,
strlen
(
r
->
literal
));
// sprintf(param->colName, "%s_%s", l->colName, r->literal);
param
->
colValType
=
r
->
typeData
;
param
->
status
=
SFLT_COARSE_INDEX
;
return
0
;
// memcpy(param->colName, l->colName, sizeof(l->colName));
}
static
int32_t
sifInitParam
(
SNode
*
node
,
SIFParam
*
param
,
SIFCtx
*
ctx
)
{
param
->
status
=
SFLT_COARSE_INDEX
;
...
...
@@ -274,6 +272,10 @@ static int32_t sifInitOperParams(SIFParam **params, SOperatorNode *node, SIFCtx
SIF_ERR_JRET
(
sifInitParam
(
node
->
pLeft
,
&
paramList
[
0
],
ctx
));
if
(
nParam
>
1
)
{
SIF_ERR_JRET
(
sifInitParam
(
node
->
pRight
,
&
paramList
[
1
],
ctx
));
// if (paramList[0].colValType == TSDB_DATA_TYPE_JSON &&
// ((SOperatorNode *)(node))->opType == OP_TYPE_JSON_CONTAINS) {
// return TSDB_CODE_QRY_OUT_OF_MEMORY;
//}
}
*
params
=
paramList
;
return
TSDB_CODE_SUCCESS
;
...
...
@@ -511,11 +513,12 @@ static int32_t sifGetOperFn(int32_t funcId, sif_func_t *func, SIdxFltStatus *sta
}
return
0
;
}
// typedef struct filterFuncDict {
static
int32_t
sifExecOper
(
SOperatorNode
*
node
,
SIFCtx
*
ctx
,
SIFParam
*
output
)
{
int32_t
code
=
0
;
if
(
sifValidOp
(
node
->
opType
)
<
0
)
{
code
=
TSDB_CODE_QRY_INVALID_INPUT
;
ctx
->
code
=
code
;
output
->
status
=
SFLT_NOT_INDEX
;
return
code
;
}
...
...
@@ -532,7 +535,7 @@ static int32_t sifExecOper(SOperatorNode *node, SIFCtx *ctx, SIFParam *output) {
SIFParam
*
params
=
NULL
;
SIF_ERR_RET
(
sifInitOperParams
(
&
params
,
node
,
ctx
));
if
(
params
[
0
].
status
==
SFLT_NOT_INDEX
||
(
nParam
>
1
&&
params
[
1
].
status
==
SFLT_NOT_INDEX
))
{
if
(
params
[
0
].
status
==
SFLT_NOT_INDEX
&&
(
nParam
>
1
&&
params
[
1
].
status
==
SFLT_NOT_INDEX
))
{
output
->
status
=
SFLT_NOT_INDEX
;
return
code
;
}
...
...
@@ -737,23 +740,23 @@ static int32_t sifGetFltHint(SNode *pNode, SIdxFltStatus *status) {
SIF_RET
(
code
);
}
int32_t
doFilterTag
(
const
SNode
*
pFilterNode
,
SIndexMetaArg
*
metaArg
,
SArray
*
result
)
{
if
(
pFilterNode
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
int32_t
doFilterTag
(
SNode
*
pFilterNode
,
SIndexMetaArg
*
metaArg
,
SArray
*
result
,
SIdxFltStatus
*
status
)
{
SIdxFltStatus
st
=
idxGetFltStatus
(
pFilterNode
);
if
(
st
==
SFLT_NOT_INDEX
)
{
*
status
=
st
;
return
0
;
}
SFilterInfo
*
filter
=
NULL
;
// todo move to the initialization function
// SIF_ERR_RET(filterInitFromNode((SNode *)pFilterNode, &filter, 0));
SArray
*
output
=
taosArrayInit
(
8
,
sizeof
(
uint64_t
));
SIFParam
param
=
{.
arg
=
*
metaArg
,
.
result
=
output
};
SIF_ERR_RET
(
sifCalculate
((
SNode
*
)
pFilterNode
,
&
param
));
taosArrayAddAll
(
result
,
param
.
result
);
// taosArrayAddAll(result, param.result);
sifFreeParam
(
&
param
);
SIF_RET
(
TSDB_CODE_SUCCESS
);
*
status
=
st
;
return
TSDB_CODE_SUCCESS
;
}
SIdxFltStatus
idxGetFltStatus
(
SNode
*
pFilterNode
)
{
...
...
@@ -761,10 +764,9 @@ SIdxFltStatus idxGetFltStatus(SNode *pFilterNode) {
if
(
pFilterNode
==
NULL
)
{
return
SFLT_NOT_INDEX
;
}
// SFilterInfo *filter = NULL;
// todo move to the initialization function
// SIF_ERR_RET(filterInitFromNode((SNode *)pFilterNode, &filter, 0));
SIF_ERR_RET
(
sifGetFltHint
((
SNode
*
)
pFilterNode
,
&
st
));
if
(
sifGetFltHint
((
SNode
*
)
pFilterNode
,
&
st
)
!=
TSDB_CODE_SUCCESS
)
{
st
=
SFLT_NOT_INDEX
;
}
return
st
;
}
source/libs/index/src/indexFst.c
浏览文件 @
31655c07
...
...
@@ -289,22 +289,14 @@ void fstStateCompileForAnyTrans(IdxFstFile* w, CompiledAddr addr, FstBuilderNode
for
(
int32_t
i
=
sz
-
1
;
i
>=
0
;
i
--
)
{
FstTransition
*
t
=
taosArrayGet
(
node
->
trans
,
i
);
idxFileWrite
(
w
,
(
char
*
)
&
t
->
inp
,
1
);
// fstPackDeltaIn(w, addr, t->addr, tSize);
}
if
(
sz
>
TRANS_INDEX_THRESHOLD
)
{
// A value of 255 indicates that no transition exists for the byte
// at that index. (Except when there are 256 transitions.) Namely,
// any value greater than or equal to the number of transitions in
// this node indicates an absent transition.
// A value of 255 indicates that no transition exists for the byte at that idx
uint8_t
*
index
=
(
uint8_t
*
)
taosMemoryMalloc
(
sizeof
(
uint8_t
)
*
256
);
memset
(
index
,
255
,
sizeof
(
uint8_t
)
*
256
);
/// for (uint8_t i = 0; i < 256; i++) {
// index[i] = 255;
///}
for
(
int32_t
i
=
0
;
i
<
sz
;
i
++
)
{
FstTransition
*
t
=
taosArrayGet
(
node
->
trans
,
i
);
index
[
t
->
inp
]
=
i
;
// fstPackDeltaIn(w, addr, t->addr, tSize);
}
idxFileWrite
(
w
,
(
char
*
)
index
,
256
);
taosMemoryFree
(
index
);
...
...
@@ -344,7 +336,7 @@ uint8_t fstStateCommInput(FstState* s, bool* null) {
*
null
=
true
;
return
v
;
}
//
v =
0 indicate that common_input is None
// 0 indicate that common_input is None
return
v
==
0
?
0
:
COMMON_INPUT
(
v
);
}
...
...
@@ -522,7 +514,6 @@ uint64_t fstStateNtrans(FstState* s, FstSlice* slice) {
int32_t
len
;
uint8_t
*
data
=
fstSliceData
(
slice
,
&
len
);
n
=
data
[
len
-
2
];
// n = data[slice->end - 1]; // data[data.len() - 2]
return
n
==
1
?
256
:
n
;
// // "1" is never a normal legal value here, because if there, // is only 1 transition,
// then it is encoded in the state byte
}
...
...
@@ -546,7 +537,6 @@ uint64_t fstStateFindInput(FstState* s, FstNode* node, uint8_t b, bool* null) {
int32_t
dlen
=
0
;
uint8_t
*
data
=
fstSliceData
(
slice
,
&
dlen
);
uint64_t
i
=
data
[
at
+
b
];
// uint64_t i = slice->data[slice->start + at + b];
if
(
i
>=
node
->
nTrans
)
{
*
null
=
true
;
}
...
...
@@ -558,16 +548,15 @@ uint64_t fstStateFindInput(FstState* s, FstNode* node, uint8_t b, bool* null) {
FstSlice
t
=
fstSliceCopy
(
slice
,
start
,
end
-
1
);
int32_t
len
=
0
;
uint8_t
*
data
=
fstSliceData
(
&
t
,
&
len
);
int
i
=
0
;
for
(;
i
<
len
;
i
++
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
uint8_t
v
=
data
[
i
];
if
(
v
==
b
)
{
fstSliceDestroy
(
&
t
);
return
node
->
nTrans
-
i
-
1
;
// bug
}
}
if
(
i
==
len
)
{
*
null
=
true
;
if
(
i
+
1
==
len
)
{
*
null
=
true
;
}
}
fstSliceDestroy
(
&
t
);
}
...
...
@@ -737,16 +726,13 @@ bool fstNodeCompile(FstNode* node, void* w, CompiledAddr lastAddr, CompiledAddr
return
true
;
}
else
if
(
sz
!=
1
||
builderNode
->
isFinal
)
{
fstStateCompileForAnyTrans
(
w
,
addr
,
builderNode
);
// AnyTrans->Compile(w, addr, node);
}
else
{
FstTransition
*
tran
=
taosArrayGet
(
builderNode
->
trans
,
0
);
if
(
tran
->
addr
==
lastAddr
&&
tran
->
out
==
0
)
{
fstStateCompileForOneTransNext
(
w
,
addr
,
tran
->
inp
);
// OneTransNext::compile(w, lastAddr, tran->inp);
return
true
;
}
else
{
fstStateCompileForOneTrans
(
w
,
addr
,
tran
);
// OneTrans::Compile(w, lastAddr, *tran);
return
true
;
}
}
...
...
@@ -795,7 +781,7 @@ void fstBuilderDestroy(FstBuilder* b) {
}
bool
fstBuilderInsert
(
FstBuilder
*
b
,
FstSlice
bs
,
Output
in
)
{
OrderType
t
=
fstBuilderCheckLastKey
(
b
,
bs
,
true
);
Fst
OrderType
t
=
fstBuilderCheckLastKey
(
b
,
bs
,
true
);
if
(
t
==
Ordered
)
{
// add log info
fstBuilderInsertOutput
(
b
,
bs
,
in
);
...
...
@@ -812,12 +798,6 @@ void fstBuilderInsertOutput(FstBuilder* b, FstSlice bs, Output in) {
fstUnFinishedNodesSetRootOutput
(
b
->
unfinished
,
in
);
return
;
}
// if (in != 0) { //if let Some(in) = in
// prefixLen = fstUnFinishedNodesFindCommPrefixAndSetOutput(b->unfinished, bs, in, &out);
//} else {
// prefixLen = fstUnFinishedNodesFindCommPrefix(b->unfinished, bs);
// out = 0;
//}
Output
out
;
uint64_t
prefixLen
=
fstUnFinishedNodesFindCommPrefixAndSetOutput
(
b
->
unfinished
,
bs
,
in
,
&
out
);
...
...
@@ -835,7 +815,7 @@ void fstBuilderInsertOutput(FstBuilder* b, FstSlice bs, Output in) {
return
;
}
OrderType
fstBuilderCheckLastKey
(
FstBuilder
*
b
,
FstSlice
bs
,
bool
ckDup
)
{
Fst
OrderType
fstBuilderCheckLastKey
(
FstBuilder
*
b
,
FstSlice
bs
,
bool
ckDup
)
{
FstSlice
*
input
=
&
bs
;
if
(
fstSliceIsEmpty
(
&
b
->
last
))
{
fstSliceDestroy
(
&
b
->
last
);
...
...
@@ -867,7 +847,6 @@ void fstBuilderCompileFrom(FstBuilder* b, uint64_t istate) {
fstBuilderNodeDestroy
(
bn
);
assert
(
addr
!=
NONE_ADDRESS
);
// fstBuilderNodeDestroy(n);
}
fstUnFinishedNodesTopLastFreeze
(
b
->
unfinished
,
addr
);
return
;
...
...
@@ -1044,8 +1023,6 @@ void fstDestroy(Fst* fst) {
}
bool
fstGet
(
Fst
*
fst
,
FstSlice
*
b
,
Output
*
out
)
{
// dec lock range
// taosThreadMutexLock(&fst->mtx);
FstNode
*
root
=
fstGetRoot
(
fst
);
Output
tOut
=
0
;
int32_t
len
;
...
...
@@ -1058,7 +1035,6 @@ bool fstGet(Fst* fst, FstSlice* b, Output* out) {
uint8_t
inp
=
data
[
i
];
Output
res
=
0
;
if
(
false
==
fstNodeFindInput
(
root
,
inp
,
&
res
))
{
// taosThreadMutexUnlock(&fst->mtx);
return
false
;
}
...
...
@@ -1069,7 +1045,6 @@ bool fstGet(Fst* fst, FstSlice* b, Output* out) {
taosArrayPush
(
nodes
,
&
root
);
}
if
(
!
FST_NODE_IS_FINAL
(
root
))
{
// taosThreadMutexUnlock(&fst->mtx);
return
false
;
}
else
{
tOut
=
tOut
+
FST_NODE_FINAL_OUTPUT
(
root
);
...
...
@@ -1080,8 +1055,6 @@ bool fstGet(Fst* fst, FstSlice* b, Output* out) {
fstNodeDestroy
(
*
node
);
}
taosArrayDestroy
(
nodes
);
// fst->root = NULL;
// taosThreadMutexUnlock(&fst->mtx);
*
out
=
tOut
;
return
true
;
}
...
...
@@ -1231,20 +1204,17 @@ bool stmStSeekMin(FStmSt* sws, FstBoundWithData* min) {
FstNode
*
node
=
fstGetRoot
(
sws
->
fst
);
Output
out
=
0
;
// void* autState = sws->aut->start();
void
*
autState
=
automFuncs
[
aut
->
type
].
start
(
aut
);
void
*
autState
=
automFuncs
[
aut
->
type
].
start
(
aut
);
int32_t
len
;
uint8_t
*
data
=
fstSliceData
(
key
,
&
len
);
for
(
uint32_t
i
=
0
;
i
<
len
;
i
++
)
{
uint8_t
b
=
data
[
i
];
uint64_t
res
=
0
;
bool
find
=
fstNodeFindInput
(
node
,
b
,
&
res
);
if
(
find
==
true
)
{
if
(
fstNodeFindInput
(
node
,
b
,
&
res
))
{
FstTransition
trn
;
fstNodeGetTransitionAt
(
node
,
res
,
&
trn
);
void
*
preState
=
autState
;
// autState = sws->aut->accept(preState, b);
autState
=
automFuncs
[
aut
->
type
].
accept
(
aut
,
preState
,
b
);
taosArrayPush
(
sws
->
inp
,
&
b
);
...
...
@@ -1379,14 +1349,14 @@ FStmStRslt* stmStNextWith(FStmSt* sws, StreamCallback callback) {
return
NULL
;
}
FStmStRslt
*
swsResultCreate
(
FstSlice
*
data
,
FstOutput
fO
ut
,
void
*
state
)
{
FStmStRslt
*
swsResultCreate
(
FstSlice
*
data
,
FstOutput
o
ut
,
void
*
state
)
{
FStmStRslt
*
result
=
taosMemoryCalloc
(
1
,
sizeof
(
FStmStRslt
));
if
(
result
==
NULL
)
{
return
NULL
;
}
result
->
data
=
fstSliceCopy
(
data
,
0
,
FST_SLICE_LEN
(
data
)
-
1
);
result
->
out
=
fO
ut
;
result
->
out
=
o
ut
;
result
->
state
=
state
;
return
result
;
}
...
...
source/libs/index/src/indexFstFile.c
浏览文件 @
31655c07
...
...
@@ -71,9 +71,7 @@ static int idxFileCtxGetSize(IFileCtx* ctx) {
}
static
int
idxFileCtxDoFlush
(
IFileCtx
*
ctx
)
{
if
(
ctx
->
type
==
TFile
)
{
// taosFsyncFile(ctx->file.pFile);
taosFsyncFile
(
ctx
->
file
.
pFile
);
// tfFlush(ctx->file.pFile);
}
else
{
// do nothing
}
...
...
@@ -190,13 +188,11 @@ int idxFileRead(IdxFstFile* write, uint8_t* buf, uint32_t len) {
return
0
;
}
IFileCtx
*
ctx
=
write
->
wrt
;
int
nRead
=
ctx
->
read
(
ctx
,
buf
,
len
);
// assert(nRead == len);
return
nRead
;
return
ctx
->
read
(
ctx
,
buf
,
len
);
}
uint32_t
idxFileMaskedCheckSum
(
IdxFstFile
*
write
)
{
//
opt
//
////
return
write
->
summer
;
}
...
...
source/libs/index/src/indexFstUtil.c
浏览文件 @
31655c07
...
...
@@ -21,12 +21,12 @@ const CompiledAddr EMPTY_ADDRESS = 0;
const
CompiledAddr
NONE_ADDRESS
=
1
;
// This version number is written to every finite state transducer created by
// this
crate
. When a finite state transducer is read, its version number is
// this
version
. When a finite state transducer is read, its version number is
// checked against this value.
const
uint64_t
VERSION
=
3
;
// The threshold (in number of transitions) at which an index is created for
// a node's transitions. This speeds up lookup time at the expense of FST size
const
uint64_t
TRANS_INDEX_THRESHOLD
=
32
;
uint8_t
packSize
(
uint64_t
n
)
{
...
...
@@ -52,7 +52,6 @@ uint8_t packSize(uint64_t n) {
uint64_t
unpackUint64
(
uint8_t
*
ch
,
uint8_t
sz
)
{
uint64_t
n
=
0
;
for
(
uint8_t
i
=
0
;
i
<
sz
;
i
++
)
{
//
n
=
n
|
(
ch
[
i
]
<<
(
8
*
i
));
}
return
n
;
...
...
source/libs/index/src/indexTfile.c
浏览文件 @
31655c07
...
...
@@ -23,7 +23,7 @@
#include "tcoding.h"
#include "tcompare.h"
const
static
uint64_t
tfileMagicNumber
=
0xdb4775248b80fb57ull
;
const
static
uint64_t
FILE_MAGIC_NUMBER
=
0xdb4775248b80fb57ull
;
typedef
struct
TFileFstIter
{
FStmBuilder
*
fb
;
...
...
@@ -457,7 +457,10 @@ static int32_t tfSearchCompareFunc_JSON(void* reader, SIndexTerm* tem, SIdxTRslt
}
else
if
(
0
!=
strncmp
(
ch
,
p
,
skip
))
{
continue
;
}
cond
=
cmpFn
(
ch
+
skip
,
tem
->
colVal
,
IDX_TYPE_GET_TYPE
(
tem
->
colType
));
char
*
tBuf
=
taosMemoryCalloc
(
1
,
sz
+
1
);
memcpy
(
tBuf
,
ch
,
sz
);
cond
=
cmpFn
(
tBuf
+
skip
,
tem
->
colVal
,
IDX_TYPE_GET_TYPE
(
tem
->
colType
));
taosMemoryFree
(
tBuf
);
}
if
(
MATCH
==
cond
)
{
tfileReaderLoadTableIds
((
TFileReader
*
)
reader
,
rt
->
out
.
out
,
tr
->
total
);
...
...
@@ -545,9 +548,6 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) {
taosArraySortPWithExt
((
SArray
*
)(
data
),
tfileValueCompare
,
&
fn
);
}
int32_t
bufLimit
=
64
*
4096
,
offset
=
0
;
// char* buf = taosMemoryCalloc(1, sizeof(char) * bufLimit);
// char* p = buf;
int32_t
sz
=
taosArrayGetSize
((
SArray
*
)
data
);
int32_t
fstOffset
=
tw
->
offset
;
...
...
@@ -561,6 +561,9 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) {
}
tfileWriteFstOffset
(
tw
,
fstOffset
);
int32_t
cap
=
4
*
1024
;
char
*
buf
=
taosMemoryCalloc
(
1
,
cap
);
for
(
size_t
i
=
0
;
i
<
sz
;
i
++
)
{
TFileValue
*
v
=
taosArrayGetP
((
SArray
*
)
data
,
i
);
...
...
@@ -568,14 +571,18 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) {
// check buf has enough space or not
int32_t
ttsz
=
TF_TABLE_TATOAL_SIZE
(
tbsz
);
char
*
buf
=
taosMemoryCalloc
(
1
,
ttsz
*
sizeof
(
char
));
if
(
cap
<
ttsz
)
{
cap
=
ttsz
;
buf
=
(
char
*
)
taosMemoryRealloc
(
buf
,
cap
);
}
char
*
p
=
buf
;
tfileSerialTableIdsToBuf
(
p
,
v
->
tableId
);
tw
->
ctx
->
write
(
tw
->
ctx
,
buf
,
ttsz
);
v
->
offset
=
tw
->
offset
;
tw
->
offset
+=
ttsz
;
taosMemoryFree
(
buf
);
memset
(
buf
,
0
,
cap
);
}
taosMemoryFree
(
buf
);
tw
->
fb
=
fstBuilderCreate
(
tw
->
ctx
,
0
);
if
(
tw
->
fb
==
NULL
)
{
...
...
@@ -866,13 +873,13 @@ static int tfileWriteData(TFileWriter* write, TFileValue* tval) {
//}
}
static
int
tfileWriteFooter
(
TFileWriter
*
write
)
{
char
buf
[
sizeof
(
tfileMagicNumber
)
+
1
]
=
{
0
};
char
buf
[
sizeof
(
FILE_MAGIC_NUMBER
)
+
1
]
=
{
0
};
void
*
pBuf
=
(
void
*
)
buf
;
taosEncodeFixedU64
((
void
**
)(
void
*
)
&
pBuf
,
tfileMagicNumber
);
taosEncodeFixedU64
((
void
**
)(
void
*
)
&
pBuf
,
FILE_MAGIC_NUMBER
);
int
nwrite
=
write
->
ctx
->
write
(
write
->
ctx
,
buf
,
(
int32_t
)
strlen
(
buf
));
indexInfo
(
"tfile write footer size: %d"
,
write
->
ctx
->
size
(
write
->
ctx
));
assert
(
nwrite
==
sizeof
(
tfileMagicNumber
));
assert
(
nwrite
==
sizeof
(
FILE_MAGIC_NUMBER
));
return
nwrite
;
}
static
int
tfileReaderLoadHeader
(
TFileReader
*
reader
)
{
...
...
@@ -896,7 +903,7 @@ static int tfileReaderLoadFst(TFileReader* reader) {
int
size
=
ctx
->
size
(
ctx
);
// current load fst into memory, refactor it later
int
fstSize
=
size
-
reader
->
header
.
fstOffset
-
sizeof
(
tfileMagicNumber
);
int
fstSize
=
size
-
reader
->
header
.
fstOffset
-
sizeof
(
FILE_MAGIC_NUMBER
);
char
*
buf
=
taosMemoryCalloc
(
1
,
fstSize
);
if
(
buf
==
NULL
)
{
return
-
1
;
...
...
@@ -956,9 +963,8 @@ static int tfileReaderVerify(TFileReader* reader) {
IFileCtx
*
ctx
=
reader
->
ctx
;
uint64_t
tMagicNumber
=
0
;
char
buf
[
sizeof
(
tMagicNumber
)
+
1
]
=
{
0
};
int
size
=
ctx
->
size
(
ctx
);
char
buf
[
sizeof
(
tMagicNumber
)
+
1
]
=
{
0
};
int
size
=
ctx
->
size
(
ctx
);
if
(
size
<
sizeof
(
tMagicNumber
)
||
size
<=
sizeof
(
reader
->
header
))
{
return
-
1
;
...
...
@@ -967,25 +973,25 @@ static int tfileReaderVerify(TFileReader* reader) {
}
taosDecodeFixedU64
(
buf
,
&
tMagicNumber
);
return
tMagicNumber
==
tfileMagicNumber
?
0
:
-
1
;
return
tMagicNumber
==
FILE_MAGIC_NUMBER
?
0
:
-
1
;
}
void
tfileReaderRef
(
TFileReader
*
r
eader
)
{
if
(
r
eader
==
NULL
)
{
void
tfileReaderRef
(
TFileReader
*
r
d
)
{
if
(
r
d
==
NULL
)
{
return
;
}
int
ref
=
T_REF_INC
(
r
eader
);
int
ref
=
T_REF_INC
(
r
d
);
UNUSED
(
ref
);
}
void
tfileReaderUnRef
(
TFileReader
*
r
eader
)
{
if
(
r
eader
==
NULL
)
{
void
tfileReaderUnRef
(
TFileReader
*
r
d
)
{
if
(
r
d
==
NULL
)
{
return
;
}
int
ref
=
T_REF_DEC
(
r
eader
);
int
ref
=
T_REF_DEC
(
r
d
);
if
(
ref
==
0
)
{
// do nothing
tfileReaderDestroy
(
r
eader
);
tfileReaderDestroy
(
r
d
);
}
}
...
...
source/libs/transport/src/transSvr.c
浏览文件 @
31655c07
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* * 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.
*
...
...
source/os/src/osAtomic.c
浏览文件 @
31655c07
此差异已折叠。
点击以展开。
source/os/src/osString.c
浏览文件 @
31655c07
...
...
@@ -29,9 +29,8 @@ char *strsep(char **stringp, const char *delim) {
char
*
s
;
const
char
*
spanp
;
int32_t
c
,
sc
;
char
*
tok
;
if
((
s
=
*
stringp
)
==
NULL
)
return
(
NULL
);
char
*
tok
;
if
((
s
=
*
stringp
)
==
NULL
)
return
(
NULL
);
for
(
tok
=
s
;;)
{
c
=
*
s
++
;
spanp
=
delim
;
...
...
@@ -51,10 +50,10 @@ char *strsep(char **stringp, const char *delim) {
/* Duplicate a string, up to at most size characters */
char
*
strndup
(
const
char
*
s
,
size_t
size
)
{
size_t
l
;
char
*
s2
;
char
*
s2
;
l
=
strlen
(
s
);
if
(
l
>
size
)
l
=
size
;
s2
=
malloc
(
l
+
1
);
if
(
l
>
size
)
l
=
size
;
s2
=
malloc
(
l
+
1
);
if
(
s2
)
{
strncpy
(
s2
,
s
,
l
);
s2
[
l
]
=
'\0'
;
...
...
@@ -63,13 +62,12 @@ char *strndup(const char *s, size_t size) {
}
/* Copy no more than N characters of SRC to DEST, returning the address of
the terminating '\0' in DEST, if any, or else DEST + N. */
char
*
stpncpy
(
char
*
dest
,
const
char
*
src
,
size_t
n
)
{
size_t
size
=
strnlen
(
src
,
n
);
memcpy
(
dest
,
src
,
size
);
char
*
stpncpy
(
char
*
dest
,
const
char
*
src
,
size_t
n
)
{
size_t
size
=
strnlen
(
src
,
n
);
memcpy
(
dest
,
src
,
size
);
dest
+=
size
;
if
(
size
==
n
)
return
dest
;
return
memset
(
dest
,
'\0'
,
n
-
size
);
if
(
size
==
n
)
return
dest
;
return
memset
(
dest
,
'\0'
,
n
-
size
);
}
#endif
...
...
@@ -113,10 +111,9 @@ int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes) {
#endif
}
TdUcs4
*
tasoUcs4Copy
(
TdUcs4
*
target_ucs4
,
TdUcs4
*
source_ucs4
,
int32_t
len_ucs4
)
{
assert
(
taosMemorySize
(
target_ucs4
)
>=
len_ucs4
*
sizeof
(
TdUcs4
));
return
memcpy
(
target_ucs4
,
source_ucs4
,
len_ucs4
*
sizeof
(
TdUcs4
));
TdUcs4
*
tasoUcs4Copy
(
TdUcs4
*
target_ucs4
,
TdUcs4
*
source_ucs4
,
int32_t
len_ucs4
)
{
assert
(
taosMemorySize
(
target_ucs4
)
>=
len_ucs4
*
sizeof
(
TdUcs4
));
return
memcpy
(
target_ucs4
,
source_ucs4
,
len_ucs4
*
sizeof
(
TdUcs4
));
}
int32_t
taosUcs4ToMbs
(
TdUcs4
*
ucs4
,
int32_t
ucs4_max_len
,
char
*
mbs
)
{
...
...
@@ -137,7 +134,7 @@ int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs) {
#endif
}
bool
taosMbsToUcs4
(
const
char
*
mbs
,
size_t
mbsLength
,
TdUcs4
*
ucs4
,
int32_t
ucs4_max_len
,
int32_t
*
len
)
{
bool
taosMbsToUcs4
(
const
char
*
mbs
,
size_t
mbsLength
,
TdUcs4
*
ucs4
,
int32_t
ucs4_max_len
,
int32_t
*
len
)
{
#ifdef DISALLOW_NCHAR_WITHOUT_ICONV
printf
(
"Nchar cannot be read and written without iconv, please install iconv library and recompile TDengine.
\n
"
);
return
-
1
;
...
...
@@ -146,7 +143,7 @@ bool taosMbsToUcs4(const char *mbs, size_t mbsLength, TdUcs4 *ucs4, int32_t ucs4
iconv_t
cd
=
iconv_open
(
DEFAULT_UNICODE_ENCODEC
,
tsCharset
);
size_t
ucs4_input_len
=
mbsLength
;
size_t
outLeft
=
ucs4_max_len
;
if
(
iconv
(
cd
,
(
char
**
)
&
mbs
,
&
ucs4_input_len
,
(
char
**
)
&
ucs4
,
&
outLeft
)
==
-
1
)
{
if
(
iconv
(
cd
,
(
char
**
)
&
mbs
,
&
ucs4_input_len
,
(
char
**
)
&
ucs4
,
&
outLeft
)
==
-
1
)
{
iconv_close
(
cd
);
return
false
;
}
...
...
@@ -195,7 +192,7 @@ int32_t taosUcs4len(TdUcs4 *ucs4) {
return
n
;
}
//dst buffer size should be at least 2*len + 1
//
dst buffer size should be at least 2*len + 1
int32_t
taosHexEncode
(
const
unsigned
char
*
src
,
char
*
dst
,
int32_t
len
)
{
if
(
!
dst
)
{
return
-
1
;
...
...
@@ -214,7 +211,7 @@ int32_t taosHexDecode(const char *src, char *dst, int32_t len) {
}
uint8_t
hn
,
ln
,
out
;
for
(
int
i
=
0
,
j
=
0
;
i
<
len
*
2
;
i
+=
2
,
++
j
)
{
for
(
int
i
=
0
,
j
=
0
;
i
<
len
*
2
;
i
+=
2
,
++
j
)
{
hn
=
src
[
i
]
>
'9'
?
src
[
i
]
-
'a'
+
10
:
src
[
i
]
-
'0'
;
ln
=
src
[
i
+
1
]
>
'9'
?
src
[
i
+
1
]
-
'a'
+
10
:
src
[
i
+
1
]
-
'0'
;
...
...
@@ -238,25 +235,22 @@ int32_t taosWcharToMb(char *pStr, TdWchar wchar) { return wctomb(pStr, wchar); }
int32_t
taosWcharsToMbs
(
char
*
pStrs
,
TdWchar
*
pWchars
,
int32_t
size
)
{
return
wcstombs
(
pStrs
,
pWchars
,
size
);
}
char
*
taosStrCaseStr
(
const
char
*
str
,
const
char
*
pattern
)
{
size_t
i
;
if
(
!*
pattern
)
return
(
char
*
)
str
;
for
(;
*
str
;
str
++
)
{
if
(
toupper
(
*
str
)
==
toupper
(
*
pattern
))
{
for
(
i
=
1
;;
i
++
)
{
if
(
!
pattern
[
i
])
return
(
char
*
)
str
;
if
(
toupper
(
str
[
i
])
!=
toupper
(
pattern
[
i
]))
break
;
}
}
}
return
NULL
;
size_t
i
;
if
(
!*
pattern
)
return
(
char
*
)
str
;
for
(;
*
str
;
str
++
)
{
if
(
toupper
(
*
str
)
==
toupper
(
*
pattern
))
{
for
(
i
=
1
;;
i
++
)
{
if
(
!
pattern
[
i
])
return
(
char
*
)
str
;
if
(
toupper
(
str
[
i
])
!=
toupper
(
pattern
[
i
]))
break
;
}
}
}
return
NULL
;
}
int64_t
taosStr2Int64
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
int64_t
taosStr2Int64
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
int64_t
tmp
=
strtoll
(
str
,
pEnd
,
radix
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -265,7 +259,7 @@ int64_t taosStr2Int64(const char *str, char** pEnd, int32_t radix) {
return
tmp
;
}
uint64_t
taosStr2UInt64
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
uint64_t
taosStr2UInt64
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
uint64_t
tmp
=
strtoull
(
str
,
pEnd
,
radix
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -274,7 +268,7 @@ uint64_t taosStr2UInt64(const char *str, char** pEnd, int32_t radix) {
return
tmp
;
}
int32_t
taosStr2Int32
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
int32_t
taosStr2Int32
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
int32_t
tmp
=
strtol
(
str
,
pEnd
,
radix
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -283,7 +277,7 @@ int32_t taosStr2Int32(const char *str, char** pEnd, int32_t radix) {
return
tmp
;
}
uint32_t
taosStr2UInt32
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
uint32_t
taosStr2UInt32
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
uint32_t
tmp
=
strtol
(
str
,
pEnd
,
radix
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -292,7 +286,7 @@ uint32_t taosStr2UInt32(const char *str, char** pEnd, int32_t radix) {
return
tmp
;
}
int16_t
taosStr2Int16
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
int16_t
taosStr2Int16
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
int32_t
tmp
=
strtol
(
str
,
pEnd
,
radix
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -303,7 +297,7 @@ int16_t taosStr2Int16(const char *str, char** pEnd, int32_t radix) {
return
(
int16_t
)
tmp
;
}
uint16_t
taosStr2UInt16
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
uint16_t
taosStr2UInt16
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
uint32_t
tmp
=
strtoul
(
str
,
pEnd
,
radix
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -313,7 +307,7 @@ uint16_t taosStr2UInt16(const char *str, char** pEnd, int32_t radix) {
return
(
uint16_t
)
tmp
;
}
int8_t
taosStr2Int8
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
int8_t
taosStr2Int8
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
int32_t
tmp
=
strtol
(
str
,
pEnd
,
radix
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -324,7 +318,7 @@ int8_t taosStr2Int8(const char *str, char** pEnd, int32_t radix) {
return
tmp
;
}
uint8_t
taosStr2UInt8
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
uint8_t
taosStr2UInt8
(
const
char
*
str
,
char
**
pEnd
,
int32_t
radix
)
{
uint32_t
tmp
=
strtoul
(
str
,
pEnd
,
radix
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -334,7 +328,7 @@ uint8_t taosStr2UInt8(const char *str, char** pEnd, int32_t radix) {
return
tmp
;
}
double
taosStr2Double
(
const
char
*
str
,
char
**
pEnd
)
{
double
taosStr2Double
(
const
char
*
str
,
char
**
pEnd
)
{
double
tmp
=
strtod
(
str
,
pEnd
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -344,7 +338,7 @@ double taosStr2Double(const char *str, char** pEnd) {
return
tmp
;
}
float
taosStr2Float
(
const
char
*
str
,
char
**
pEnd
)
{
float
taosStr2Float
(
const
char
*
str
,
char
**
pEnd
)
{
float
tmp
=
strtof
(
str
,
pEnd
);
#ifdef TD_CHECK_STR_TO_INT_ERROR
assert
(
errno
!=
ERANGE
);
...
...
@@ -353,4 +347,4 @@ float taosStr2Float(const char *str, char** pEnd) {
assert
(
tmp
!=
NAN
);
#endif
return
tmp
;
}
\ No newline at end of file
}
tests/system-test/2-query/json_tag.py
浏览文件 @
31655c07
...
...
@@ -237,7 +237,7 @@ class TDTestCase:
# test where with json tag
tdSql
.
query
(
"select * from jsons1_1 where jtag is not null"
)
tdSql
.
error
(
"select * from jsons1 where jtag='{
\"
tag1
\"
:11,
\"
tag2
\"
:
\"\"
}'"
)
tdSql
.
query
(
"select * from jsons1 where jtag='{
\"
tag1
\"
:11,
\"
tag2
\"
:
\"\"
}'"
)
tdSql
.
error
(
"select * from jsons1 where jtag->'tag1'={}"
)
# test json error
...
...
@@ -245,9 +245,9 @@ class TDTestCase:
tdSql
.
error
(
"select jtag > 1 from jsons1"
)
tdSql
.
error
(
"select jtag like
\"
1
\"
from jsons1"
)
tdSql
.
error
(
"select jtag in (
\"
1
\"
) from jsons1"
)
tdSql
.
error
(
"select jtag from jsons1 where jtag > 1"
)
tdSql
.
error
(
"select jtag from jsons1 where jtag like 'fsss'"
)
tdSql
.
error
(
"select jtag from jsons1 where jtag in (1)"
)
#
tdSql.error("select jtag from jsons1 where jtag > 1")
#
tdSql.error("select jtag from jsons1 where jtag like 'fsss'")
#
tdSql.error("select jtag from jsons1 where jtag in (1)")
# where json value is string
...
...
@@ -323,12 +323,12 @@ class TDTestCase:
# where json value is bool
tdSql
.
query
(
"select * from jsons1 where jtag->'tag1'=true"
)
tdSql
.
checkRows
(
0
)
tdSql
.
query
(
"select * from jsons1 where jtag->'tag1'=false"
)
tdSql
.
checkRows
(
1
)
#
tdSql.query("select * from jsons1 where jtag->'tag1'=false")
#
tdSql.checkRows(1)
tdSql
.
query
(
"select * from jsons1 where jtag->'tag1'!=false"
)
tdSql
.
checkRows
(
0
)
tdSql
.
query
(
"select * from jsons1 where jtag->'tag1'>false"
)
tdSql
.
checkRows
(
0
)
#
tdSql.query("select * from jsons1 where jtag->'tag1'>false")
#
tdSql.checkRows(0)
# where json value is null
tdSql
.
query
(
"select * from jsons1 where jtag->'tag1'=null"
)
...
...
@@ -498,11 +498,11 @@ class TDTestCase:
tdSql
.
query
(
"select top(dataint,2),jtag->'tag1' from jsons1 group by jtag->'tag1' order by jtag->'tag1'"
)
tdSql
.
checkRows
(
11
)
tdSql
.
checkData
(
0
,
1
,
None
)
tdSql
.
checkData
(
2
,
0
,
4
)
tdSql
.
checkData
(
3
,
0
,
3
)
tdSql
.
checkData
(
3
,
1
,
"false"
)
tdSql
.
checkData
(
8
,
0
,
2
)
tdSql
.
checkData
(
10
,
1
,
'"femail"'
)
#tdSql.checkData(2, 0, 2
4)
#
tdSql.checkData(3, 0, 3)
#
tdSql.checkData(3, 1, "false")
#
tdSql.checkData(8, 0, 2)
#
tdSql.checkData(10, 1, '"femail"')
# test having
# tdSql.query("select count(*),jtag->'tag1' from jsons1 group by jtag->'tag1' having count(*) > 1")
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录