Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
fe3cda4f
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fe3cda4f
编写于
11月 22, 2022
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
more code
上级
cede9e14
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
101 addition
and
215 deletion
+101
-215
source/common/src/tdataformat.c
source/common/src/tdataformat.c
+101
-215
未找到文件。
source/common/src/tdataformat.c
浏览文件 @
fe3cda4f
...
@@ -498,19 +498,22 @@ struct SRowIter {
...
@@ -498,19 +498,22 @@ struct SRowIter {
int32_t
iTColumn
;
int32_t
iTColumn
;
union
{
union
{
struct
{
// kv
struct
{
// kv
int32_t
iCol
;
int32_t
iCol
;
SKVIdx
*
pIdx
;
SKVIdx
*
pIdx
;
uint8_t
*
pv
;
};
};
struct
{
// tupl
struct
{
// tuple
// todo
uint8_t
*
pb
;
uint8_t
*
pf
;
};
};
uint8_t
*
pv
;
};
};
SColVal
cv
;
SColVal
cv
;
};
};
int32_t
tRowIterOpen
(
SRow
*
pRow
,
STSchema
*
pTSchema
,
SRowIter
**
ppIter
)
{
int32_t
tRowIterOpen
(
SRow
*
pRow
,
STSchema
*
pTSchema
,
SRowIter
**
ppIter
)
{
ASSERT
(
pRow
->
sver
==
pTSchema
->
version
);
int32_t
code
=
0
;
int32_t
code
=
0
;
SRowIter
*
pIter
=
taosMemoryCalloc
(
1
,
sizeof
(
*
pIter
));
SRowIter
*
pIter
=
taosMemoryCalloc
(
1
,
sizeof
(
*
pIter
));
...
@@ -521,6 +524,45 @@ int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter) {
...
@@ -521,6 +524,45 @@ int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter) {
pIter
->
pRow
=
pRow
;
pIter
->
pRow
=
pRow
;
pIter
->
pTSchema
=
pTSchema
;
pIter
->
pTSchema
=
pTSchema
;
pIter
->
iTColumn
=
0
;
if
(
pRow
->
flag
==
HAS_NONE
||
pRow
->
flag
==
HAS_NULL
)
goto
_exit
;
if
(
pRow
->
flag
&
0xf0
)
{
pIter
->
iCol
=
0
;
pIter
->
pIdx
=
(
SKVIdx
*
)
pRow
->
data
;
if
(
pRow
->
flag
&
KV_FLG_LIT
)
{
pIter
->
pv
=
pIter
->
pIdx
->
idx
+
pIter
->
pIdx
->
nCol
;
}
else
if
(
pRow
->
flag
&
KV_FLG_MID
)
{
pIter
->
pv
=
pIter
->
pIdx
->
idx
+
(
pIter
->
pIdx
->
nCol
<<
1
);
}
else
{
pIter
->
pv
=
pIter
->
pIdx
->
idx
+
(
pIter
->
pIdx
->
nCol
<<
2
);
}
}
else
{
switch
(
pRow
->
flag
)
{
case
(
HAS_NULL
|
HAS_NONE
):
pIter
->
pb
=
pRow
->
data
;
break
;
case
HAS_VALUE
:
pIter
->
pf
=
pRow
->
data
;
pIter
->
pv
=
pIter
->
pf
+
pTSchema
->
flen
;
break
;
case
(
HAS_VALUE
|
HAS_NONE
):
case
(
HAS_VALUE
|
HAS_NULL
):
pIter
->
pb
=
pRow
->
data
;
pIter
->
pf
=
pRow
->
data
+
BIT1_SIZE
(
pTSchema
->
numOfCols
-
1
);
pIter
->
pv
=
pIter
->
pf
+
pTSchema
->
flen
;
break
;
case
(
HAS_VALUE
|
HAS_NULL
|
HAS_NONE
):
pIter
->
pb
=
pRow
->
data
;
pIter
->
pf
=
pRow
->
data
+
BIT2_SIZE
(
pTSchema
->
numOfCols
-
1
);
pIter
->
pv
=
pIter
->
pf
+
pTSchema
->
flen
;
break
;
default:
ASSERT
(
0
);
break
;
}
}
_exit:
_exit:
if
(
code
)
{
if
(
code
)
{
...
@@ -568,9 +610,17 @@ SColVal *tRowIterNext(SRowIter *pIter) {
...
@@ -568,9 +610,17 @@ SColVal *tRowIterNext(SRowIter *pIter) {
if
(
pIter
->
pRow
->
flag
&
0xf0
)
{
// KV
if
(
pIter
->
pRow
->
flag
&
0xf0
)
{
// KV
if
(
pIter
->
iCol
<
pIter
->
pIdx
->
nCol
)
{
if
(
pIter
->
iCol
<
pIter
->
pIdx
->
nCol
)
{
uint8_t
*
pData
=
pIter
->
pv
+
pIter
->
pIdx
->
idx
[
pIter
->
iCol
];
// todo
uint8_t
*
pData
;
int16_t
cid
;
if
(
pIter
->
pRow
->
flag
&
KV_FLG_LIT
)
{
pData
=
pIter
->
pv
+
((
uint8_t
*
)
pIter
->
pIdx
->
idx
)[
pIter
->
iCol
];
}
else
if
(
pIter
->
pRow
->
flag
&
KV_FLG_MID
)
{
pData
=
pIter
->
pv
+
((
uint16_t
*
)
pIter
->
pIdx
->
idx
)[
pIter
->
iCol
];
}
else
{
pData
=
pIter
->
pv
+
((
uint32_t
*
)
pIter
->
pIdx
->
idx
)[
pIter
->
iCol
];
}
int16_t
cid
;
pData
+=
tGetI16v
(
pData
,
&
cid
);
pData
+=
tGetI16v
(
pData
,
&
cid
);
if
(
TABS
(
cid
)
==
pTColumn
->
colId
)
{
if
(
TABS
(
cid
)
==
pTColumn
->
colId
)
{
...
@@ -606,228 +656,64 @@ SColVal *tRowIterNext(SRowIter *pIter) {
...
@@ -606,228 +656,64 @@ SColVal *tRowIterNext(SRowIter *pIter) {
goto
_exit
;
goto
_exit
;
}
}
}
else
{
// Tuple
}
else
{
// Tuple
// todo
uint8_t
bv
=
ROW_BIT_VALUE
;
}
if
(
pIter
->
pb
)
{
switch
(
pIter
->
pRow
->
flag
)
{
_exit:
case
(
HAS_NULL
|
HAS_NONE
):
pIter
->
iTColumn
++
;
bv
=
GET_BIT1
(
pIter
->
pb
,
pIter
->
iTColumn
-
1
);
return
&
pIter
->
cv
;
}
SColVal
*
tRowIterNextNotNone
(
SRowIter
*
pIter
)
{
// todo
return
NULL
;
}
#if 0
static void setBitMap(uint8_t *pb, uint8_t v, int32_t idx, uint8_t flags) {
if (pb) {
switch (flags & 0xf) {
case TSROW_HAS_NULL | TSROW_HAS_NONE:
case TSROW_HAS_VAL | TSROW_HAS_NONE:
if (v) {
SET_BIT1(pb, idx, (uint8_t)1);
} else {
SET_BIT1(pb, idx, (uint8_t)0);
}
break;
case TSROW_HAS_VAL | TSROW_HAS_NULL:
v = v - 1;
SET_BIT1(pb, idx, v);
break;
case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
SET_BIT2(pb, idx, v);
break;
default:
ASSERT(0);
}
}
}
#define SET_IDX(p, i, n, f) \
do { \
if ((f)&TSROW_KV_SMALL) { \
((uint8_t *)(p))[i] = (n); \
} else if ((f)&TSROW_KV_MID) { \
((uint16_t *)(p))[i] = (n); \
} else { \
((uint32_t *)(p))[i] = (n); \
} \
} while (0)
void tTSRowFree(SRow *pRow) {
if (pRow) {
taosMemoryFree(pRow);
}
}
void tTSRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
uint8_t isTuple = ((pRow->flags & 0xf0) == 0) ? 1 : 0;
STColumn *pTColumn = &pTSchema->columns[iCol];
uint8_t flags = pRow->flags & (uint8_t)0xf;
SValue value;
ASSERT(iCol < pTSchema->numOfCols);
ASSERT(flags);
ASSERT(pRow->sver == pTSchema->version);
if (iCol == 0) {
value.ts = pRow->ts;
goto _return_value;
}
if (flags == TSROW_HAS_NONE) {
goto _return_none;
} else if (flags == TSROW_HAS_NULL) {
goto _return_null;
}
ASSERT(pRow->nData && pRow->pData);
if (isTuple) {
uint8_t *pb = pRow->pData;
uint8_t *pf = NULL;
uint8_t *pv = NULL;
uint8_t *p;
uint8_t b;
// bit
switch (flags) {
case TSROW_HAS_VAL:
pf = pb;
break;
case TSROW_HAS_NULL | TSROW_HAS_NONE:
b = GET_BIT1(pb, iCol - 1);
if (b == 0) {
goto _return_none;
} else {
goto _return_null;
}
case TSROW_HAS_VAL | TSROW_HAS_NONE:
b = GET_BIT1(pb, iCol - 1);
if (b == 0) {
goto _return_none;
} else {
pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
break
;
break
;
}
case
HAS_VALUE
:
case TSROW_HAS_VAL | TSROW_HAS_NULL:
b = GET_BIT1(pb, iCol - 1);
if (b == 0) {
goto _return_null;
} else {
pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
break
;
break
;
}
case
(
HAS_VALUE
|
HAS_NONE
):
case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
bv
=
GET_BIT1
(
pIter
->
pb
,
pIter
->
iTColumn
-
1
);
b = GET_BIT2(pb, iCol - 1);
if
(
bv
)
bv
++
;
if (b == 0) {
break
;
goto _return_none;
case
(
HAS_VALUE
|
HAS_NULL
):
} else if (b == 1) {
bv
=
GET_BIT1
(
pIter
->
pb
,
pIter
->
iTColumn
-
1
)
+
1
;
goto _return_null;
break
;
} else {
case
(
HAS_VALUE
|
HAS_NULL
|
HAS_NONE
):
pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
bv
=
GET_BIT2
(
pIter
->
pb
,
pIter
->
iTColumn
-
1
);
break
;
default:
ASSERT
(
0
);
break
;
break
;
}
default:
ASSERT(0);
}
ASSERT(pf);
p = pf + pTColumn->offset;
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
pv = pf + pTSchema->flen;
p = pv + *(VarDataOffsetT *)p;
}
tGetValue(p, &value, pTColumn->type);
goto _return_value;
} else {
STSKVRow *pRowK = (STSKVRow *)pRow->pData;
int16_t lidx = 0;
int16_t ridx = pRowK->nCols - 1;
uint8_t *p;
int16_t midx;
uint32_t n;
int16_t cid;
ASSERT(pRowK->nCols > 0);
if (pRow->flags & TSROW_KV_SMALL) {
p = pRow->pData + sizeof(STSKVRow) + sizeof(uint8_t) * pRowK->nCols;
} else if (pRow->flags & TSROW_KV_MID) {
p = pRow->pData + sizeof(STSKVRow) + sizeof(uint16_t) * pRowK->nCols;
} else if (pRow->flags & TSROW_KV_BIG) {
p = pRow->pData + sizeof(STSKVRow) + sizeof(uint32_t) * pRowK->nCols;
} else {
ASSERT(0);
}
while (lidx <= ridx) {
midx = (lidx + ridx) / 2;
if (pRow->flags & TSROW_KV_SMALL) {
n = ((uint8_t *)pRowK->idx)[midx];
} else if (pRow->flags & TSROW_KV_MID) {
n = ((uint16_t *)pRowK->idx)[midx];
} else {
n = ((uint32_t *)pRowK->idx)[midx];
}
}
n += tGetI16v(p + n, &cid);
if
(
bv
==
ROW_BIT_NONE
)
{
pIter
->
cv
=
COL_VAL_NONE
(
pTColumn
->
colId
,
pTColumn
->
type
);
if (TABS(cid) == pTColumn->colId) {
goto
_exit
;
if (cid < 0) {
}
else
if
(
bv
==
ROW_BIT_NULL
)
{
goto _return_null;
pIter
->
cv
=
COL_VAL_NULL
(
pTColumn
->
colId
,
pTColumn
->
type
);
} else {
goto
_exit
;
n += tGetValue(p + n, &value, pTColumn->type);
}
goto _return_value;
}
}
return;
pIter
->
cv
.
cid
=
pTColumn
->
colId
;
} else if (TABS(cid) > pTColumn->colId) {
pIter
->
cv
.
type
=
pTColumn
->
type
;
ridx = midx - 1;
pIter
->
cv
.
flag
=
CV_FLAG_VALUE
;
if
(
IS_VAR_DATA_TYPE
(
pTColumn
->
type
))
{
uint8_t
*
pData
=
pIter
->
pv
+
*
(
int32_t
*
)(
pIter
->
pf
+
pTColumn
->
offset
);
pData
+=
tGetU32v
(
pData
,
&
pIter
->
cv
.
value
.
nData
);
if
(
pIter
->
cv
.
value
.
nData
>
0
)
{
pIter
->
cv
.
value
.
pData
=
pData
;
}
else
{
}
else
{
lidx = midx + 1
;
pIter
->
cv
.
value
.
pData
=
NULL
;
}
}
}
else
{
memcpy
(
&
pIter
->
cv
.
value
.
val
,
pIter
->
pv
+
pTColumn
->
offset
,
pTColumn
->
bytes
);
}
}
// not found, return NONE
goto _return_none;
}
_return_none:
*pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
return;
_return_null:
*pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
return;
_return_value:
*pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, value);
return;
}
int32_t tTSRowToArray(SRow *pRow, STSchema *pTSchema, SArray **ppArray) {
int32_t code = 0;
SColVal cv;
(*ppArray) = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
if (*ppArray == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto
_exit
;
goto
_exit
;
}
}
for (int32_t iColumn = 0; iColumn < pTSchema->numOfCols; iColumn++) {
tTSRowGet(pRow, pTSchema, iColumn, &cv);
taosArrayPush(*ppArray, &cv);
}
_exit:
_exit:
return code;
pIter
->
iTColumn
++
;
return
&
pIter
->
cv
;
}
SColVal
*
tRowIterNextNotNone
(
SRowIter
*
pIter
)
{
// todo
return
NULL
;
}
}
#endif
// STSchema ========================================
// STSchema ========================================
void
tTSchemaDestroy
(
STSchema
*
pTSchema
)
{
void
tTSchemaDestroy
(
STSchema
*
pTSchema
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录