/src/tdengine/source/common/src/tcol.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com> |
3 | | * |
4 | | * This program is free software: you can use, redistribute, and/or modify |
5 | | * it under the terms of the GNU Affero General Public License, version 3 |
6 | | * or later ("AGPL"), as published by the Free Software Foundation. |
7 | | * |
8 | | * This program is distributed in the hope that it will be useful, but WITHOUT |
9 | | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
10 | | * FITNESS FOR A PARTICULAR PURPOSE. |
11 | | * |
12 | | * You should have received a copy of the GNU Affero General Public License |
13 | | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
14 | | */ |
15 | | |
16 | | |
17 | | #include "tcol.h" |
18 | | #include "tcompression.h" |
19 | | #include "tutil.h" |
20 | | |
21 | | const char* supportedEncode[] = { |
22 | | TSDB_COLUMN_ENCODE_SIMPLE8B, TSDB_COLUMN_ENCODE_XOR, TSDB_COLUMN_ENCODE_RLE, |
23 | | TSDB_COLUMN_ENCODE_DELTAD, TSDB_COLUMN_ENCODE_DISABLED, TSDB_COLUMN_ENCODE_BYTE_STREAM_SPLIT, |
24 | | }; |
25 | | |
26 | | const char* supportedCompress[6] = {TSDB_COLUMN_COMPRESS_LZ4, TSDB_COLUMN_COMPRESS_TSZ, |
27 | | TSDB_COLUMN_COMPRESS_XZ, TSDB_COLUMN_COMPRESS_ZLIB, |
28 | | TSDB_COLUMN_COMPRESS_ZSTD, TSDB_COLUMN_COMPRESS_DISABLED}; |
29 | | |
30 | | const char* supportedLevel[3] = {TSDB_COLUMN_LEVEL_HIGH, TSDB_COLUMN_LEVEL_MEDIUM, TSDB_COLUMN_LEVEL_LOW}; |
31 | | |
32 | | const int supportedEncodeNum = sizeof(supportedEncode) / sizeof(char*); |
33 | | const int supportedCompressNum = sizeof(supportedCompress) / sizeof(char*); |
34 | | const int supportedLevelNum = sizeof(supportedLevel) / sizeof(char*); |
35 | | |
36 | 0 | uint8_t getDefaultEncode(uint8_t type) { |
37 | 0 | switch (type) { |
38 | 0 | case TSDB_DATA_TYPE_NULL: |
39 | 0 | case TSDB_DATA_TYPE_BOOL: |
40 | 0 | return TSDB_COLVAL_ENCODE_RLE; |
41 | 0 | case TSDB_DATA_TYPE_TINYINT: |
42 | 0 | case TSDB_DATA_TYPE_SMALLINT: |
43 | 0 | case TSDB_DATA_TYPE_INT: |
44 | 0 | case TSDB_DATA_TYPE_BIGINT: |
45 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B; |
46 | 0 | case TSDB_DATA_TYPE_FLOAT: |
47 | 0 | case TSDB_DATA_TYPE_DOUBLE: |
48 | 0 | return TSDB_COLVAL_ENCODE_BYTE_STREAM_SPLIT; |
49 | 0 | case TSDB_DATA_TYPE_VARCHAR: // TSDB_DATA_TYPE_BINARY |
50 | 0 | return TSDB_COLVAL_ENCODE_DISABLED; |
51 | 0 | case TSDB_DATA_TYPE_TIMESTAMP: |
52 | 0 | return TSDB_COLVAL_ENCODE_XOR; |
53 | 0 | case TSDB_DATA_TYPE_NCHAR: |
54 | 0 | return TSDB_COLVAL_ENCODE_DISABLED; |
55 | 0 | case TSDB_DATA_TYPE_UTINYINT: |
56 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B; |
57 | 0 | case TSDB_DATA_TYPE_USMALLINT: |
58 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B; |
59 | 0 | case TSDB_DATA_TYPE_UINT: |
60 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B; |
61 | 0 | case TSDB_DATA_TYPE_UBIGINT: |
62 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B; |
63 | 0 | case TSDB_DATA_TYPE_JSON: |
64 | 0 | return TSDB_COLVAL_ENCODE_DISABLED; |
65 | 0 | case TSDB_DATA_TYPE_VARBINARY: |
66 | 0 | return TSDB_COLVAL_ENCODE_DISABLED; |
67 | 0 | case TSDB_DATA_TYPE_DECIMAL64: |
68 | 0 | case TSDB_DATA_TYPE_DECIMAL: |
69 | 0 | return TSDB_COLVAL_ENCODE_DISABLED; |
70 | 0 | case TSDB_DATA_TYPE_BLOB: |
71 | 0 | return TSDB_COLVAL_ENCODE_DISABLED; |
72 | 0 | case TSDB_DATA_TYPE_MEDIUMBLOB: |
73 | 0 | return TSDB_COLVAL_ENCODE_DISABLED; |
74 | 0 | case TSDB_DATA_TYPE_GEOMETRY: |
75 | 0 | return TSDB_COLVAL_ENCODE_DISABLED; |
76 | | |
77 | 0 | case TSDB_DATA_TYPE_MAX: |
78 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B; |
79 | | |
80 | 0 | default: |
81 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B; |
82 | 0 | } |
83 | 0 | } |
84 | 0 | const char* getDefaultEncodeStr(uint8_t type) { return columnEncodeStr(getDefaultEncode(type)); } |
85 | | |
86 | 0 | uint16_t getDefaultCompress(uint8_t type) { |
87 | 0 | switch (type) { |
88 | 0 | case TSDB_DATA_TYPE_NULL: |
89 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
90 | 0 | case TSDB_DATA_TYPE_BOOL: |
91 | 0 | return TSDB_COLVAL_COMPRESS_ZSTD; |
92 | 0 | case TSDB_DATA_TYPE_TINYINT: |
93 | 0 | case TSDB_DATA_TYPE_SMALLINT: |
94 | 0 | return TSDB_COLVAL_COMPRESS_ZLIB; |
95 | 0 | case TSDB_DATA_TYPE_INT: |
96 | 0 | case TSDB_DATA_TYPE_BIGINT: |
97 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
98 | 0 | case TSDB_DATA_TYPE_FLOAT: |
99 | 0 | case TSDB_DATA_TYPE_DOUBLE: |
100 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
101 | 0 | case TSDB_DATA_TYPE_VARCHAR: // TSDB_DATA_TYPE_BINARY |
102 | 0 | return TSDB_COLVAL_COMPRESS_ZSTD; |
103 | 0 | case TSDB_DATA_TYPE_TIMESTAMP: |
104 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
105 | 0 | case TSDB_DATA_TYPE_NCHAR: |
106 | 0 | return TSDB_COLVAL_COMPRESS_ZSTD; |
107 | 0 | case TSDB_DATA_TYPE_UTINYINT: |
108 | 0 | case TSDB_DATA_TYPE_USMALLINT: |
109 | 0 | return TSDB_COLVAL_COMPRESS_ZLIB; |
110 | 0 | case TSDB_DATA_TYPE_UINT: |
111 | 0 | case TSDB_DATA_TYPE_UBIGINT: |
112 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
113 | 0 | case TSDB_DATA_TYPE_JSON: |
114 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
115 | 0 | case TSDB_DATA_TYPE_VARBINARY: |
116 | 0 | return TSDB_COLVAL_COMPRESS_ZSTD; |
117 | 0 | case TSDB_DATA_TYPE_DECIMAL64: |
118 | 0 | case TSDB_DATA_TYPE_DECIMAL: |
119 | 0 | return TSDB_COLVAL_COMPRESS_ZSTD; |
120 | 0 | case TSDB_DATA_TYPE_BLOB: |
121 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
122 | 0 | case TSDB_DATA_TYPE_MEDIUMBLOB: |
123 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
124 | 0 | case TSDB_DATA_TYPE_GEOMETRY: |
125 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
126 | 0 | case TSDB_DATA_TYPE_MAX: |
127 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
128 | 0 | default: |
129 | 0 | return TSDB_COLVAL_COMPRESS_LZ4; |
130 | 0 | } |
131 | 0 | } |
132 | 0 | const char* getDefaultCompressStr(uint8_t type) { return columnCompressStr(getDefaultCompress(type)); } |
133 | | |
134 | 0 | uint8_t getDefaultLevel(uint8_t type) { return TSDB_COLVAL_LEVEL_MEDIUM; } |
135 | 0 | const char* getDefaultLevelStr(uint8_t type) { return columnLevelStr(getDefaultLevel(type)); } |
136 | | |
137 | 0 | const char* columnEncodeStr(uint8_t type) { |
138 | 0 | const char* encode = NULL; |
139 | 0 | switch (type) { |
140 | 0 | case TSDB_COLVAL_ENCODE_SIMPLE8B: |
141 | 0 | encode = TSDB_COLUMN_ENCODE_SIMPLE8B; |
142 | 0 | break; |
143 | 0 | case TSDB_COLVAL_ENCODE_XOR: |
144 | 0 | encode = TSDB_COLUMN_ENCODE_XOR; |
145 | 0 | break; |
146 | 0 | case TSDB_COLVAL_ENCODE_RLE: |
147 | 0 | encode = TSDB_COLUMN_ENCODE_RLE; |
148 | 0 | break; |
149 | 0 | case TSDB_COLVAL_ENCODE_DELTAD: |
150 | 0 | encode = TSDB_COLUMN_ENCODE_DELTAD; |
151 | 0 | break; |
152 | 0 | case TSDB_COLVAL_ENCODE_DISABLED: |
153 | 0 | encode = TSDB_COLUMN_ENCODE_DISABLED; |
154 | 0 | break; |
155 | 0 | case TSDB_COLVAL_ENCODE_BYTE_STREAM_SPLIT: |
156 | 0 | encode = TSDB_COLUMN_ENCODE_BYTE_STREAM_SPLIT; |
157 | 0 | break; |
158 | 0 | default: |
159 | 0 | encode = TSDB_COLUMN_ENCODE_UNKNOWN; |
160 | 0 | break; |
161 | 0 | } |
162 | 0 | return encode; |
163 | 0 | } |
164 | | |
165 | 0 | const char* columnCompressStr(uint16_t type) { |
166 | 0 | const char* compress = NULL; |
167 | 0 | switch (type) { |
168 | 0 | case TSDB_COLVAL_COMPRESS_LZ4: |
169 | 0 | compress = TSDB_COLUMN_COMPRESS_LZ4; |
170 | 0 | break; |
171 | 0 | case TSDB_COLVAL_COMPRESS_TSZ: |
172 | 0 | compress = TSDB_COLUMN_COMPRESS_TSZ; |
173 | 0 | break; |
174 | 0 | case TSDB_COLVAL_COMPRESS_XZ: |
175 | 0 | compress = TSDB_COLUMN_COMPRESS_XZ; |
176 | 0 | break; |
177 | 0 | case TSDB_COLVAL_COMPRESS_ZLIB: |
178 | 0 | compress = TSDB_COLUMN_COMPRESS_ZLIB; |
179 | 0 | break; |
180 | 0 | case TSDB_COLVAL_COMPRESS_ZSTD: |
181 | 0 | compress = TSDB_COLUMN_COMPRESS_ZSTD; |
182 | 0 | break; |
183 | 0 | case TSDB_COLVAL_COMPRESS_DISABLED: |
184 | 0 | compress = TSDB_COLUMN_COMPRESS_DISABLED; |
185 | 0 | break; |
186 | 0 | default: |
187 | 0 | compress = TSDB_COLUMN_COMPRESS_UNKNOWN; |
188 | 0 | break; |
189 | 0 | } |
190 | 0 | return compress; |
191 | 0 | } |
192 | | |
193 | 0 | uint8_t columnLevelVal(const char* level) { |
194 | 0 | if (level == NULL) return TSDB_COLVAL_LEVEL_NOCHANGE; |
195 | 0 | uint8_t l = TSDB_COLVAL_LEVEL_MEDIUM; |
196 | 0 | if (0 == strcmp(level, "h") || 0 == strcmp(level, TSDB_COLUMN_LEVEL_HIGH)) { |
197 | 0 | l = TSDB_COLVAL_LEVEL_HIGH; |
198 | 0 | } else if (0 == strcmp(level, "m") || 0 == strcmp(level, TSDB_COLUMN_LEVEL_MEDIUM)) { |
199 | 0 | l = TSDB_COLVAL_LEVEL_MEDIUM; |
200 | 0 | } else if (0 == strcmp(level, "l") || 0 == strcmp(level, TSDB_COLUMN_LEVEL_LOW)) { |
201 | 0 | l = TSDB_COLVAL_LEVEL_LOW; |
202 | 0 | } else { |
203 | 0 | l = TSDB_COLVAL_LEVEL_NOCHANGE; |
204 | 0 | } |
205 | 0 | return l; |
206 | 0 | } |
207 | | |
208 | 0 | uint16_t columnCompressVal(const char* compress) { |
209 | 0 | if (compress == NULL) return TSDB_COLVAL_COMPRESS_NOCHANGE; |
210 | 0 | uint16_t c = TSDB_COLVAL_COMPRESS_LZ4; |
211 | 0 | if (0 == strcmp(compress, TSDB_COLUMN_COMPRESS_LZ4)) { |
212 | 0 | c = TSDB_COLVAL_COMPRESS_LZ4; |
213 | 0 | } else if (0 == strcmp(compress, TSDB_COLUMN_COMPRESS_TSZ)) { |
214 | 0 | c = TSDB_COLVAL_COMPRESS_TSZ; |
215 | 0 | } else if (0 == strcmp(compress, TSDB_COLUMN_COMPRESS_XZ)) { |
216 | 0 | c = TSDB_COLVAL_COMPRESS_XZ; |
217 | 0 | } else if (0 == strcmp(compress, TSDB_COLUMN_COMPRESS_ZLIB)) { |
218 | 0 | c = TSDB_COLVAL_COMPRESS_ZLIB; |
219 | 0 | } else if (0 == strcmp(compress, TSDB_COLUMN_COMPRESS_ZSTD)) { |
220 | 0 | c = TSDB_COLVAL_COMPRESS_ZSTD; |
221 | 0 | } else if (0 == strcmp(compress, TSDB_COLUMN_COMPRESS_DISABLED)) { |
222 | 0 | c = TSDB_COLVAL_COMPRESS_DISABLED; |
223 | 0 | } else { |
224 | 0 | c = TSDB_COLVAL_COMPRESS_NOCHANGE; |
225 | 0 | } |
226 | 0 | return c; |
227 | 0 | } |
228 | | |
229 | 0 | uint8_t columnEncodeVal(const char* encode) { |
230 | 0 | if (encode == NULL) return TSDB_COLVAL_ENCODE_NOCHANGE; |
231 | 0 | uint8_t e = TSDB_COLVAL_ENCODE_SIMPLE8B; |
232 | 0 | if (0 == strcmp(encode, TSDB_COLUMN_ENCODE_SIMPLE8B)) { |
233 | 0 | e = TSDB_COLVAL_ENCODE_SIMPLE8B; |
234 | 0 | } else if (0 == strcmp(encode, TSDB_COLUMN_ENCODE_XOR)) { |
235 | 0 | e = TSDB_COLVAL_ENCODE_XOR; |
236 | 0 | } else if (0 == strcmp(encode, TSDB_COLUMN_ENCODE_RLE)) { |
237 | 0 | e = TSDB_COLVAL_ENCODE_RLE; |
238 | 0 | } else if (0 == strcmp(encode, TSDB_COLUMN_ENCODE_DELTAD)) { |
239 | 0 | e = TSDB_COLVAL_ENCODE_DELTAD; |
240 | 0 | } else if (0 == strcmp(encode, TSDB_COLUMN_ENCODE_DISABLED)) { |
241 | 0 | e = TSDB_COLVAL_ENCODE_DISABLED; |
242 | 0 | } else if (0 == strcmp(encode, TSDB_COLUMN_ENCODE_BYTE_STREAM_SPLIT)) { |
243 | 0 | e = TSDB_COLVAL_ENCODE_BYTE_STREAM_SPLIT; |
244 | 0 | } else { |
245 | 0 | e = TSDB_COLVAL_ENCODE_NOCHANGE; |
246 | 0 | } |
247 | 0 | return e; |
248 | 0 | } |
249 | | |
250 | 0 | const char* columnLevelStr(uint8_t type) { |
251 | 0 | const char* level = NULL; |
252 | 0 | switch (type) { |
253 | 0 | case TSDB_COLVAL_LEVEL_HIGH: |
254 | 0 | level = TSDB_COLUMN_LEVEL_HIGH; |
255 | 0 | break; |
256 | 0 | case TSDB_COLVAL_LEVEL_MEDIUM: |
257 | 0 | level = TSDB_COLUMN_LEVEL_MEDIUM; |
258 | 0 | break; |
259 | 0 | case TSDB_COLVAL_LEVEL_LOW: |
260 | 0 | level = TSDB_COLUMN_LEVEL_LOW; |
261 | 0 | break; |
262 | 0 | default: |
263 | 0 | level = TSDB_COLUMN_LEVEL_UNKNOWN; |
264 | 0 | break; |
265 | 0 | } |
266 | 0 | return level; |
267 | 0 | } |
268 | | |
269 | 0 | bool checkColumnEncode(char encode[TSDB_CL_COMPRESS_OPTION_LEN]) { |
270 | 0 | if (0 == strlen(encode)) return true; |
271 | 0 | TAOS_UNUSED(strtolower(encode, encode)); |
272 | 0 | for (int i = 0; i < supportedEncodeNum; ++i) { |
273 | 0 | if (0 == strcmp((const char*)encode, supportedEncode[i])) { |
274 | 0 | return true; |
275 | 0 | } |
276 | 0 | } |
277 | 0 | return false; |
278 | 0 | } |
279 | 0 | bool checkColumnEncodeOrSetDefault(uint8_t type, char encode[TSDB_CL_COMPRESS_OPTION_LEN]) { |
280 | 0 | if (0 == strlen(encode)) { |
281 | 0 | tstrncpy(encode, getDefaultEncodeStr(type), TSDB_CL_COMPRESS_OPTION_LEN); |
282 | 0 | return true; |
283 | 0 | } |
284 | 0 | return checkColumnEncode(encode) && validColEncode(type, columnEncodeVal(encode)); |
285 | 0 | } |
286 | 0 | bool checkColumnCompress(char compress[TSDB_CL_COMPRESS_OPTION_LEN]) { |
287 | 0 | if (0 == strlen(compress)) return true; |
288 | 0 | TAOS_UNUSED(strtolower(compress, compress)); |
289 | 0 | for (int i = 0; i < supportedCompressNum; ++i) { |
290 | 0 | if (0 == strcmp((const char*)compress, supportedCompress[i])) { |
291 | 0 | return true; |
292 | 0 | } |
293 | 0 | } |
294 | 0 | return false; |
295 | 0 | } |
296 | 0 | bool checkColumnCompressOrSetDefault(uint8_t type, char compress[TSDB_CL_COMPRESS_OPTION_LEN]) { |
297 | 0 | if (0 == strlen(compress)) { |
298 | 0 | tstrncpy(compress, getDefaultCompressStr(type), TSDB_CL_COMPRESS_OPTION_LEN); |
299 | 0 | return true; |
300 | 0 | } |
301 | | |
302 | 0 | return checkColumnCompress(compress) && validColCompress(type, columnCompressVal(compress)); |
303 | 0 | } |
304 | 0 | bool checkColumnLevel(char level[TSDB_CL_COMPRESS_OPTION_LEN]) { |
305 | 0 | if (0 == strlen(level)) return true; |
306 | 0 | TAOS_UNUSED(strtolower(level, level)); |
307 | 0 | if (1 == strlen(level)) { |
308 | 0 | if ('h' == level[0] || 'm' == level[0] || 'l' == level[0]) return true; |
309 | 0 | } else { |
310 | 0 | for (int i = 0; i < supportedLevelNum; ++i) { |
311 | 0 | if (0 == strcmp((const char*)level, supportedLevel[i])) { |
312 | 0 | return true; |
313 | 0 | } |
314 | 0 | } |
315 | 0 | } |
316 | 0 | return false; |
317 | 0 | } |
318 | 0 | bool checkColumnLevelOrSetDefault(uint8_t type, char level[TSDB_CL_COMPRESS_OPTION_LEN]) { |
319 | 0 | if (0 == strlen(level)) { |
320 | 0 | tstrncpy(level, getDefaultLevelStr(type), TSDB_CL_COMPRESS_OPTION_LEN); |
321 | 0 | return true; |
322 | 0 | } |
323 | 0 | return checkColumnLevel(level) && validColCompressLevel(type, columnLevelVal(level)); |
324 | 0 | } |
325 | | |
326 | 0 | void setColEncode(uint32_t* compress, uint8_t l1) { |
327 | 0 | *compress &= 0x00FFFFFF; |
328 | 0 | *compress |= (l1 << 24); |
329 | 0 | return; |
330 | 0 | } |
331 | 0 | void setColCompress(uint32_t* compress, uint16_t l2) { |
332 | 0 | *compress &= 0xFF0000FF; |
333 | 0 | *compress |= (l2 << 8); |
334 | 0 | return; |
335 | 0 | } |
336 | 0 | void setColLevel(uint32_t* compress, uint8_t level) { |
337 | 0 | *compress &= 0xFFFFFF00; |
338 | 0 | *compress |= level; |
339 | 0 | return; |
340 | 0 | } |
341 | | |
342 | | int32_t setColCompressByOption(uint8_t type, uint8_t encode, uint16_t compressType, uint8_t level, bool check, |
343 | 0 | uint32_t* compress) { |
344 | 0 | if (compress == NULL) return TSDB_CODE_TSC_ENCODE_PARAM_ERROR; |
345 | 0 | if (check && !validColEncode(type, encode)) return TSDB_CODE_TSC_ENCODE_PARAM_ERROR; |
346 | 0 | setColEncode(compress, encode); |
347 | |
|
348 | 0 | if (compressType == TSDB_COLVAL_COMPRESS_DISABLED) { |
349 | 0 | setColCompress(compress, compressType); |
350 | 0 | setColLevel(compress, TSDB_COLVAL_LEVEL_DISABLED); |
351 | 0 | } else { |
352 | 0 | if (check && !validColCompress(type, compressType)) return TSDB_CODE_TSC_COMPRESS_PARAM_ERROR; |
353 | 0 | setColCompress(compress, compressType); |
354 | |
|
355 | 0 | if (check && !validColCompressLevel(type, level)) return TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR; |
356 | 0 | setColLevel(compress, level); |
357 | 0 | } |
358 | 0 | return TSDB_CODE_SUCCESS; |
359 | 0 | } |
360 | | |
361 | 0 | bool withColCompress(uint8_t tableType) { |
362 | 0 | return TSDB_SUPER_TABLE == tableType || TSDB_NORMAL_TABLE == tableType || TSDB_CHILD_TABLE == tableType; |
363 | 0 | } |
364 | | |
365 | 0 | bool withExtSchema(uint8_t tableType) { |
366 | 0 | return TSDB_SUPER_TABLE == tableType || TSDB_NORMAL_TABLE == tableType || TSDB_CHILD_TABLE == tableType || |
367 | 0 | TSDB_VIRTUAL_NORMAL_TABLE == tableType || TSDB_VIRTUAL_CHILD_TABLE == tableType; |
368 | 0 | } |
369 | | |
370 | 0 | bool hasColRef(uint8_t tableType) { |
371 | 0 | return TSDB_VIRTUAL_NORMAL_TABLE == tableType || TSDB_VIRTUAL_CHILD_TABLE == tableType; |
372 | 0 | } |
373 | | |
374 | 0 | bool hasTagRef(uint8_t tableType) { |
375 | 0 | return TSDB_VIRTUAL_NORMAL_TABLE == tableType || TSDB_VIRTUAL_CHILD_TABLE == tableType; |
376 | 0 | } |
377 | | |
378 | 0 | int8_t validColCompressLevel(uint8_t type, uint8_t level) { |
379 | 0 | if (level == TSDB_COLVAL_LEVEL_DISABLED) return 1; |
380 | 0 | if (level < TSDB_COLVAL_LEVEL_NOCHANGE || level > TSDB_COLVAL_LEVEL_HIGH) { |
381 | 0 | return 0; |
382 | 0 | } |
383 | 0 | return 1; |
384 | 0 | } |
385 | 0 | int8_t validColCompress(uint8_t type, uint8_t l2) { |
386 | 0 | if (l2 > TSDB_COLVAL_COMPRESS_XZ && l2 < TSDB_COLVAL_COMPRESS_DISABLED) { |
387 | 0 | return 0; |
388 | 0 | } |
389 | 0 | if (l2 == TSDB_COLVAL_COMPRESS_TSZ) { |
390 | 0 | if (type == TSDB_DATA_TYPE_FLOAT || type == TSDB_DATA_TYPE_DOUBLE) { |
391 | 0 | return 1; |
392 | 0 | } else { |
393 | 0 | return 0; |
394 | 0 | } |
395 | 0 | } |
396 | 0 | return 1; |
397 | 0 | } |
398 | | |
399 | | // |
400 | | // | --------type----------|----- supported encode ----| |
401 | | // |tinyint/smallint/int/bigint/utinyint/usmallinit/uint/ubiginint| simple8b | |
402 | | // | timestamp/bigint/ubigint | delta-i | |
403 | | // | bool | bit-packing | |
404 | | // | float/double | delta-d/byte-stream-split | |
405 | | // |
406 | 0 | int8_t validColEncode(uint8_t type, uint8_t l1) { |
407 | 0 | if (l1 == TSDB_COLVAL_ENCODE_NOCHANGE) { |
408 | 0 | return 1; |
409 | 0 | } |
410 | 0 | if (l1 == TSDB_COLVAL_ENCODE_DISABLED) { |
411 | 0 | return 1; |
412 | 0 | } |
413 | 0 | if (type == TSDB_DATA_TYPE_BOOL) { |
414 | 0 | return TSDB_COLVAL_ENCODE_RLE == l1 ? 1 : 0; |
415 | 0 | } else if (type >= TSDB_DATA_TYPE_TINYINT && type <= TSDB_DATA_TYPE_INT) { |
416 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B == l1 ? 1 : 0; |
417 | 0 | } else if (type == TSDB_DATA_TYPE_BIGINT) { |
418 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B == l1 || TSDB_COLVAL_ENCODE_XOR == l1 ? 1 : 0; |
419 | 0 | } else if (type == TSDB_DATA_TYPE_FLOAT || type == TSDB_DATA_TYPE_DOUBLE) { |
420 | 0 | return (l1 == TSDB_COLVAL_ENCODE_DELTAD || l1 == TSDB_COLVAL_ENCODE_BYTE_STREAM_SPLIT) ? 1 : 0; |
421 | 0 | } else if ((type == TSDB_DATA_TYPE_VARCHAR || type == TSDB_DATA_TYPE_NCHAR) || type == TSDB_DATA_TYPE_JSON || |
422 | 0 | type == TSDB_DATA_TYPE_VARBINARY || type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_GEOMETRY || |
423 | 0 | type == TSDB_DATA_TYPE_BLOB || type == TSDB_DATA_TYPE_MEDIUMBLOB) { |
424 | 0 | return l1 == TSDB_COLVAL_ENCODE_DISABLED ? 1 : 0; |
425 | | // if (l1 >= TSDB_COLVAL_ENCODE_NOCHANGE || l1 <= TSDB_COLVAL_ENCODE_DELTAD) { |
426 | | // return 1; |
427 | | // } else if (l1 == TSDB_COLVAL_ENCODE_DISABLED) { |
428 | | // return 1; |
429 | | // } else { |
430 | | // return 0; |
431 | | // } |
432 | 0 | } else if (type == TSDB_DATA_TYPE_TIMESTAMP) { |
433 | 0 | return TSDB_COLVAL_ENCODE_XOR == l1 ? 1 : 0; |
434 | 0 | } else if (type >= TSDB_DATA_TYPE_UTINYINT && type <= TSDB_DATA_TYPE_UINT) { |
435 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B == l1 ? 1 : 0; |
436 | 0 | } else if (type == TSDB_DATA_TYPE_UBIGINT) { |
437 | 0 | return TSDB_COLVAL_ENCODE_SIMPLE8B == l1 || TSDB_COLVAL_ENCODE_XOR == l1 ? 1 : 0; |
438 | 0 | } else if (type == TSDB_DATA_TYPE_GEOMETRY) { |
439 | 0 | return 1; |
440 | 0 | } else if (type == TSDB_DATA_TYPE_DECIMAL64 || type == TSDB_DATA_TYPE_DECIMAL) { |
441 | 0 | return l1 == TSDB_COLVAL_ENCODE_DISABLED ? 1 : 0; |
442 | 0 | } |
443 | 0 | return 0; |
444 | 0 | } |
445 | | |
446 | 0 | uint32_t createDefaultColCmprByType(uint8_t type) { |
447 | 0 | uint32_t ret = 0; |
448 | 0 | uint8_t encode = getDefaultEncode(type); |
449 | 0 | uint8_t compress = getDefaultCompress(type); |
450 | 0 | uint8_t lvl = getDefaultLevel(type); |
451 | |
|
452 | 0 | SET_COMPRESS(encode, compress, lvl, ret); |
453 | 0 | return ret; |
454 | 0 | } |
455 | 0 | int32_t validColCmprByType(uint8_t type, uint32_t cmpr) { |
456 | 0 | DEFINE_VAR(cmpr); |
457 | 0 | if (!validColEncode(type, l1)) { |
458 | 0 | return TSDB_CODE_TSC_ENCODE_PARAM_ERROR; |
459 | 0 | } |
460 | 0 | if (!validColCompress(type, l2)) { |
461 | 0 | return TSDB_CODE_TSC_COMPRESS_PARAM_ERROR; |
462 | 0 | } |
463 | | |
464 | 0 | if (!validColCompressLevel(type, lvl)) { |
465 | 0 | return TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR; |
466 | 0 | } |
467 | 0 | return TSDB_CODE_SUCCESS; |
468 | 0 | } |