Merge branch '3.0' into feature/3.0_interval_hash_optimize
This commit is contained in:
commit
66199e4e7a
|
@ -2,7 +2,7 @@
|
||||||
# taos-tools
|
# taos-tools
|
||||||
ExternalProject_Add(taos-tools
|
ExternalProject_Add(taos-tools
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
||||||
GIT_TAG e8bfca6
|
GIT_TAG aa45ad4
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -3,7 +3,7 @@ title: Introduction
|
||||||
toc_max_heading_level: 2
|
toc_max_heading_level: 2
|
||||||
---
|
---
|
||||||
|
|
||||||
TDengine is an open source, high-performance, cloud native [time-series database](https://tdengine.com/tsdb/) optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT. Its code, including its cluster feature is open source under GNU AGPL v3.0. Besides the database engine, it provides [caching](/develop/cache), [stream processing](/develop/stream), [data subscription](/develop/tmq) and other functionalities to reduce the system complexity and cost of development and operation.
|
TDengine is an open source, high-performance, cloud native [time-series database](https://tdengine.com/tsdb/) optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT. Its code, including its cluster feature is open source under GNU AGPL v3.0. Besides the database engine, it provides [caching](../develop/cache), [stream processing](../develop/stream), [data subscription](../develop/tmq) and other functionalities to reduce the system complexity and cost of development and operation.
|
||||||
|
|
||||||
This section introduces the major features, competitive advantages, typical use-cases and benchmarks to help you get a high level overview of TDengine.
|
This section introduces the major features, competitive advantages, typical use-cases and benchmarks to help you get a high level overview of TDengine.
|
||||||
|
|
||||||
|
@ -12,32 +12,32 @@ This section introduces the major features, competitive advantages, typical use-
|
||||||
The major features are listed below:
|
The major features are listed below:
|
||||||
|
|
||||||
1. Insert data
|
1. Insert data
|
||||||
* supports [using SQL to insert](/develop/insert-data/sql-writing).
|
* supports [using SQL to insert](../develop/insert-data/sql-writing).
|
||||||
* supports [schemaless writing](/reference/schemaless/) just like NoSQL databases. It also supports standard protocols like [InfluxDB LINE](/develop/insert-data/influxdb-line),[OpenTSDB Telnet](/develop/insert-data/opentsdb-telnet), [OpenTSDB JSON ](/develop/insert-data/opentsdb-json) among others.
|
* supports [schemaless writing](../reference/schemaless/) just like NoSQL databases. It also supports standard protocols like [InfluxDB LINE](../develop/insert-data/influxdb-line),[OpenTSDB Telnet](../develop/insert-data/opentsdb-telnet), [OpenTSDB JSON ](../develop/insert-data/opentsdb-json) among others.
|
||||||
* supports seamless integration with third-party tools like [Telegraf](/third-party/telegraf/), [Prometheus](/third-party/prometheus/), [collectd](/third-party/collectd/), [StatsD](/third-party/statsd/), [TCollector](/third-party/tcollector/) and [icinga2/](/third-party/icinga2/), they can write data into TDengine with simple configuration and without a single line of code.
|
* supports seamless integration with third-party tools like [Telegraf](../third-party/telegraf/), [Prometheus](../third-party/prometheus/), [collectd](../third-party/collectd/), [StatsD](../third-party/statsd/), [TCollector](../third-party/tcollector/) and [icinga2/](../third-party/icinga2/), they can write data into TDengine with simple configuration and without a single line of code.
|
||||||
2. Query data
|
2. Query data
|
||||||
* supports standard [SQL](/taos-sql/), including nested query.
|
* supports standard [SQL](../taos-sql/), including nested query.
|
||||||
* supports [time series specific functions](/taos-sql/function/#time-series-extensions) and [time series specific queries](/taos-sql/distinguished), like downsampling, interpolation, cumulated sum, time weighted average, state window, session window and many others.
|
* supports [time series specific functions](../taos-sql/function/#time-series-extensions) and [time series specific queries](../taos-sql/distinguished), like downsampling, interpolation, cumulated sum, time weighted average, state window, session window and many others.
|
||||||
* supports [user defined functions](/taos-sql/udf).
|
* supports [user defined functions](../taos-sql/udf).
|
||||||
3. [Caching](/develop/cache/): TDengine always saves the last data point in cache, so Redis is not needed for time-series data processing.
|
3. [Caching](../develop/cache/): TDengine always saves the last data point in cache, so Redis is not needed for time-series data processing.
|
||||||
4. [Stream Processing](/develop/stream/): not only is the continuous query is supported, but TDengine also supports even driven stream processing, so Flink or spark is not needed for time-series daata processing.
|
4. [Stream Processing](../develop/stream/): not only is the continuous query is supported, but TDengine also supports even driven stream processing, so Flink or spark is not needed for time-series daata processing.
|
||||||
5. [Data Dubscription](/develop/tmq/): application can subscribe a table or a set of tables. API is the same as Kafka, but you can specify filter conditions.
|
5. [Data Dubscription](../develop/tmq/): application can subscribe a table or a set of tables. API is the same as Kafka, but you can specify filter conditions.
|
||||||
6. Visualization
|
6. Visualization
|
||||||
* supports seamless integration with [Grafana](/third-party/grafana/) for visualization.
|
* supports seamless integration with [Grafana](../third-party/grafana/) for visualization.
|
||||||
* supports seamless integration with Google Data Studio.
|
* supports seamless integration with Google Data Studio.
|
||||||
7. Cluster
|
7. Cluster
|
||||||
* supports [cluster](/deployment/) with the capability of increasing processing power by adding more nodes.
|
* supports [cluster](../deployment/) with the capability of increasing processing power by adding more nodes.
|
||||||
* supports [deployment on Kubernetes](/deployment/k8s/)
|
* supports [deployment on Kubernetes](../deployment/k8s/)
|
||||||
* supports high availability via data replication.
|
* supports high availability via data replication.
|
||||||
8. Administration
|
8. Administration
|
||||||
* provides [monitoring](/operation/monitor) on running instances of TDengine.
|
* provides [monitoring](../operation/monitor) on running instances of TDengine.
|
||||||
* provides many ways to [import](/operation/import) and [export](/operation/export) data.
|
* provides many ways to [import](../operation/import) and [export](../operation/export) data.
|
||||||
9. Tools
|
9. Tools
|
||||||
* provides an interactive [command-line interface](/reference/taos-shell) for management, maintenance and ad-hoc queries.
|
* provides an interactive [command-line interface](../reference/taos-shell) for management, maintenance and ad-hoc queries.
|
||||||
* provides a tool [taosBenchmark](/reference/taosbenchmark/) for testing the performance of TDengine.
|
* provides a tool [taosBenchmark](../reference/taosbenchmark/) for testing the performance of TDengine.
|
||||||
10. Programming
|
10. Programming
|
||||||
* provides [connectors](/reference/connector/) for [C/C++](/reference/connector/cpp), [Java](/reference/connector/java), [Python](/reference/connector/python), [Go](/reference/connector/go), [Rust](/reference/connector/rust), [Node.js](/reference/connector/node) and other programming languages.
|
* provides [connectors](../reference/connector/) for [C/C++](../reference/connector/cpp), [Java](../reference/connector/java), [Python](../reference/connector/python), [Go](../reference/connector/go), [Rust](../reference/connector/rust), [Node.js](../reference/connector/node) and other programming languages.
|
||||||
* provides a [REST API](/reference/rest-api/).
|
* provides a [REST API](../reference/rest-api/).
|
||||||
|
|
||||||
For more details on features, please read through the entire documentation.
|
For more details on features, please read through the entire documentation.
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
---
|
---
|
||||||
title: Install & Uninstall
|
title: Install and Uninstall
|
||||||
description: Install, Uninstall, Start, Stop and Upgrade
|
description: Install, Uninstall, Start, Stop and Upgrade
|
||||||
---
|
---
|
||||||
|
|
||||||
import Tabs from "@theme/Tabs";
|
import Tabs from "@theme/Tabs";
|
||||||
import TabItem from "@theme/TabItem";
|
import TabItem from "@theme/TabItem";
|
||||||
|
|
||||||
TDengine community version provides deb and rpm packages for users to choose from, based on their system environment. The deb package supports Debian, Ubuntu and derivative systems. The rpm package supports CentOS, RHEL, SUSE and derivative systems. Furthermore, a tar.gz package is provided for TDengine Enterprise customers.
|
This document gives more information about installing, uninstalling, and upgrading TDengine.
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ Removing taostools (2.1.2) ...
|
||||||
|
|
||||||
Deb package of TDengine can be uninstalled as below:
|
Deb package of TDengine can be uninstalled as below:
|
||||||
|
|
||||||
```bash
|
```
|
||||||
$ sudo dpkg -r tdengine
|
$ sudo dpkg -r tdengine
|
||||||
(Reading database ... 137504 files and directories currently installed.)
|
(Reading database ... 137504 files and directories currently installed.)
|
||||||
Removing tdengine (3.0.0.0) ...
|
Removing tdengine (3.0.0.0) ...
|
||||||
|
@ -110,109 +110,57 @@ Start to uninstall taos tools ...
|
||||||
taos tools is uninstalled successfully!
|
taos tools is uninstalled successfully!
|
||||||
```
|
```
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem label="Windows uninstall" value="windows">
|
||||||
|
Run C:\TDengine\unins000.exe to uninstall TDengine on a Windows system.
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
:::note
|
:::info
|
||||||
|
|
||||||
- We strongly recommend not to use multiple kinds of installation packages on a single host TDengine.
|
- We strongly recommend not to use multiple kinds of installation packages on a single host TDengine. The packages may affect each other and cause errors.
|
||||||
- After deb package is installed, if the installation directory is removed manually, uninstall or reinstall will not work. This issue can be resolved by using the command below which cleans up TDengine package information. You can then reinstall if needed.
|
|
||||||
|
|
||||||
```bash
|
- After deb package is installed, if the installation directory is removed manually, uninstall or reinstall will not work. This issue can be resolved by using the command below which cleans up TDengine package information.
|
||||||
$ sudo rm -f /var/lib/dpkg/info/tdengine*
|
|
||||||
```
|
|
||||||
|
|
||||||
- After rpm package is installed, if the installation directory is removed manually, uninstall or reinstall will not work. This issue can be resolved by using the command below which cleans up TDengine package information. You can then reinstall if needed.
|
```
|
||||||
|
$ sudo rm -f /var/lib/dpkg/info/tdengine*
|
||||||
|
```
|
||||||
|
|
||||||
```bash
|
You can then reinstall if needed.
|
||||||
$ sudo rpm -e --noscripts tdengine
|
|
||||||
```
|
- After rpm package is installed, if the installation directory is removed manually, uninstall or reinstall will not work. This issue can be resolved by using the command below which cleans up TDengine package information.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo rpm -e --noscripts tdengine
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then reinstall if needed.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Installation Directory
|
Uninstalling and Modifying Files
|
||||||
|
|
||||||
TDengine is installed at /usr/local/taos if successful.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ cd /usr/local/taos
|
|
||||||
$ ll
|
|
||||||
$ ll
|
|
||||||
total 28
|
|
||||||
drwxr-xr-x 7 root root 4096 Feb 22 09:34 ./
|
|
||||||
drwxr-xr-x 12 root root 4096 Feb 22 09:34 ../
|
|
||||||
drwxr-xr-x 2 root root 4096 Feb 22 09:34 bin/
|
|
||||||
drwxr-xr-x 2 root root 4096 Feb 22 09:34 cfg/
|
|
||||||
lrwxrwxrwx 1 root root 13 Feb 22 09:34 data -> /var/lib/taos/
|
|
||||||
drwxr-xr-x 2 root root 4096 Feb 22 09:34 driver/
|
|
||||||
drwxr-xr-x 10 root root 4096 Feb 22 09:34 examples/
|
|
||||||
drwxr-xr-x 2 root root 4096 Feb 22 09:34 include/
|
|
||||||
lrwxrwxrwx 1 root root 13 Feb 22 09:34 log -> /var/log/taos/
|
|
||||||
```
|
|
||||||
|
|
||||||
During the installation process:
|
|
||||||
|
|
||||||
- Configuration directory, data directory, and log directory are created automatically if they don't exist
|
|
||||||
- The default configuration file is located at /etc/taos/taos.cfg, which is a copy of /usr/local/taos/cfg/taos.cfg
|
|
||||||
- The default data directory is /var/lib/taos, which is a soft link to /usr/local/taos/data
|
|
||||||
- The default log directory is /var/log/taos, which is a soft link to /usr/local/taos/log
|
|
||||||
- The executables at /usr/local/taos/bin are linked to /usr/bin
|
|
||||||
- The DLL files at /usr/local/taos/driver are linked to /usr/lib
|
|
||||||
- The header files at /usr/local/taos/include are linked to /usr/include
|
|
||||||
|
|
||||||
:::note
|
|
||||||
|
|
||||||
- When TDengine is uninstalled, the configuration /etc/taos/taos.cfg, data directory /var/lib/taos, log directory /var/log/taos are kept. They can be deleted manually with caution, because data can't be recovered. Please follow data integrity, security, backup or relevant SOPs before deleting any data.
|
- When TDengine is uninstalled, the configuration /etc/taos/taos.cfg, data directory /var/lib/taos, log directory /var/log/taos are kept. They can be deleted manually with caution, because data can't be recovered. Please follow data integrity, security, backup or relevant SOPs before deleting any data.
|
||||||
|
|
||||||
- When reinstalling TDengine, if the default configuration file /etc/taos/taos.cfg exists, it will be kept and the configuration file in the installation package will be renamed to taos.cfg.orig and stored at /usr/local/taos/cfg to be used as configuration sample. Otherwise the configuration file in the installation package will be installed to /etc/taos/taos.cfg and used.
|
- When reinstalling TDengine, if the default configuration file /etc/taos/taos.cfg exists, it will be kept and the configuration file in the installation package will be renamed to taos.cfg.orig and stored at /usr/local/taos/cfg to be used as configuration sample. Otherwise the configuration file in the installation package will be installed to /etc/taos/taos.cfg and used.
|
||||||
|
|
||||||
## Start and Stop
|
|
||||||
|
|
||||||
Linux system services `systemd`, `systemctl` or `service` are used to start, stop and restart TDengine. The server process of TDengine is `taosd`, which is started automatically after the Linux system is started. System operators can use `systemd`, `systemctl` or `service` to start, stop or restart TDengine server.
|
|
||||||
|
|
||||||
For example, if using `systemctl` , the commands to start, stop, restart and check TDengine server are below:
|
|
||||||
|
|
||||||
- Start server:`systemctl start taosd`
|
|
||||||
|
|
||||||
- Stop server:`systemctl stop taosd`
|
|
||||||
|
|
||||||
- Restart server:`systemctl restart taosd`
|
|
||||||
|
|
||||||
- Check server status:`systemctl status taosd`
|
|
||||||
|
|
||||||
Another component named as `taosAdapter` is to provide HTTP service for TDengine, it should be started and stopped using `systemctl`.
|
|
||||||
|
|
||||||
If the server process is OK, the output of `systemctl status` is like below:
|
|
||||||
|
|
||||||
```
|
|
||||||
Active: active (running)
|
|
||||||
```
|
|
||||||
|
|
||||||
Otherwise, the output is as below:
|
|
||||||
|
|
||||||
```
|
|
||||||
Active: inactive (dead)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Upgrade
|
## Upgrade
|
||||||
|
|
||||||
There are two aspects in upgrade operation: upgrade installation package and upgrade a running server.
|
There are two aspects in upgrade operation: upgrade installation package and upgrade a running server.
|
||||||
|
|
||||||
To upgrade a package, follow the steps mentioned previously to first uninstall the old version then install the new version.
|
To upgrade a package, follow the steps mentioned previously to first uninstall the old version then install the new version.
|
||||||
|
|
||||||
Upgrading a running server is much more complex. First please check the version number of the old version and the new version. The version number of TDengine consists of 4 sections, only if the first 3 sections match can the old version be upgraded to the new version. The steps of upgrading a running server are as below:
|
Upgrading a running server is much more complex. First please check the version number of the old version and the new version. The version number of TDengine consists of 4 sections, only if the first 3 sections match can the old version be upgraded to the new version. The steps of upgrading a running server are as below:
|
||||||
|
|
||||||
- Stop inserting data
|
- Stop inserting data
|
||||||
- Make sure all data is persisted to disk
|
- Make sure all data is persisted to disk
|
||||||
- Make some simple queries (Such as total rows in stables, tables and so on. Note down the values. Follow best practices and relevant SOPs.)
|
|
||||||
- Stop the cluster of TDengine
|
- Stop the cluster of TDengine
|
||||||
- Uninstall old version and install new version
|
- Uninstall old version and install new version
|
||||||
- Start the cluster of TDengine
|
- Start the cluster of TDengine
|
||||||
- Execute simple queries, such as the ones executed prior to installing the new package, to make sure there is no data loss
|
- Execute simple queries, such as the ones executed prior to installing the new package, to make sure there is no data loss
|
||||||
- Run some simple data insertion statements to make sure the cluster works well
|
- Run some simple data insertion statements to make sure the cluster works well
|
||||||
- Restore business services
|
- Restore business services
|
||||||
|
|
||||||
:::warning
|
:::warning
|
||||||
|
|
||||||
TDengine doesn't guarantee any lower version is compatible with the data generated by a higher version, so it's never recommended to downgrade the version.
|
TDengine doesn't guarantee any lower version is compatible with the data generated by a higher version, so it's never recommended to downgrade the version.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
|
@ -380,6 +380,35 @@ The charset that takes effect is UTF-8.
|
||||||
| Unit | bytes |
|
| Unit | bytes |
|
||||||
| Value Range | 0: always compress; >0: only compress when the size of any column data exceeds the threshold; -1: always uncompress |
|
| Value Range | 0: always compress; >0: only compress when the size of any column data exceeds the threshold; -1: always uncompress |
|
||||||
| Default Value | -1 |
|
| Default Value | -1 |
|
||||||
|
| Default Value | -1 |
|
||||||
|
| Note | available from version 2.3.0.0 | |
|
||||||
|
|
||||||
|
## Continuous Query Parameters |
|
||||||
|
|
||||||
|
### minSlidingTime
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| ------------- | -------------------------------------------------------- |
|
||||||
|
| Applicable | Server Only |
|
||||||
|
| Meaning | Minimum sliding time of time window |
|
||||||
|
| Unit | millisecond or microsecond , depending on time precision |
|
||||||
|
| Value Range | 10-1000000 |
|
||||||
|
| Default Value | 10 |
|
||||||
|
|
||||||
|
### minIntervalTime
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| ------------- | --------------------------- |
|
||||||
|
| Applicable | Server Only |
|
||||||
|
| Meaning | Minimum size of time window |
|
||||||
|
| Unit | millisecond |
|
||||||
|
| Value Range | 1-1000000 |
|
||||||
|
| Default Value | 10 |
|
||||||
|
|
||||||
|
:::info
|
||||||
|
To prevent system resource from being exhausted by multiple concurrent streams, a random delay is applied on each stream automatically. `maxFirstStreamCompDelay` is the maximum delay time before a continuous query is started the first time. `streamCompDelayRatio` is the ratio for calculating delay time, with the size of the time window as base. `maxStreamCompDelay` is the maximum delay time. The actual delay time is a random time not bigger than `maxStreamCompDelay`. If a continuous query fails, `retryStreamComDelay` is the delay time before retrying it, also not bigger than `maxStreamCompDelay`.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
## Log Parameters
|
## Log Parameters
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ description: 简要介绍 TDengine 的主要功能
|
||||||
toc_max_heading_level: 2
|
toc_max_heading_level: 2
|
||||||
---
|
---
|
||||||
|
|
||||||
TDengine 是一款[开源](https://www.taosdata.com/tdengine/open_source_time-series_database)、[高性能](https://www.taosdata.com/tdengine/fast)、[云原生](https://www.taosdata.com/tdengine/cloud_native_time-series_database)的<a href="https://www.taosdata.com/" data-internallinksmanager029f6b8e52c="2" title="时序数据库" target="_blank" rel="noopener">时序数据库</a>(<a href="https://www.taosdata.com/time-series-database" data-internallinksmanager029f6b8e52c="9" title="Time Series DataBase" target="_blank" rel="noopener">Time Series Database</a>, <a href="https://www.taosdata.com/tsdb" data-internallinksmanager029f6b8e52c="8" title="TSDB" target="_blank" rel="noopener">TSDB</a>)。TDengine 能被广泛运用于物联网、工业互联网、车联网、IT 运维、金融等领域。除核心的时序数据库功能外,TDengine 还提供[缓存](../develop/cache/)、[数据订阅](../develop/tmq)、[流式计算](../develop/stream)等功能,是一极简的时序数据处理平台,最大程度的减小系统设计的复杂度,降低研发和运营成本。
|
TDengine 是一款开源、高性能、云原生的[时序数据库](https://tdengine.com/tsdb/),且针对物联网、车联网以及工业互联网进行了优化。TDengine 的代码,包括其集群功能,都在 GNU AGPL v3.0 下开源。除核心的时序数据库功能外,TDengine 还提供[缓存](../develop/cache/)、[数据订阅](../develop/tmq)、[流式计算](../develop/stream)等其它功能以降低系统复杂度及研发和运维成本。
|
||||||
|
|
||||||
本章节介绍TDengine的主要功能、竞争优势、适用场景、与其他数据库的对比测试等等,让大家对TDengine有个整体的了解。
|
本章节介绍TDengine的主要功能、竞争优势、适用场景、与其他数据库的对比测试等等,让大家对TDengine有个整体的了解。
|
||||||
|
|
||||||
|
@ -12,47 +12,70 @@ TDengine 是一款[开源](https://www.taosdata.com/tdengine/open_source_time-se
|
||||||
|
|
||||||
TDengine的主要功能如下:
|
TDengine的主要功能如下:
|
||||||
|
|
||||||
1. 高速数据写入,除 [SQL 写入](../develop/insert-data/sql-writing)外,还支持 [Schemaless 写入](../reference/schemaless/),支持 [InfluxDB LINE 协议](../develop/insert-data/influxdb-line),[OpenTSDB Telnet](../develop/insert-data/opentsdb-telnet), [OpenTSDB JSON ](../develop/insert-data/opentsdb-json)等协议写入;
|
1. 写入数据,支持
|
||||||
2. 第三方数据采集工具 [Telegraf](../third-party/telegraf),[Prometheus](../third-party/prometheus),[StatsD](../third-party/statsd),[collectd](../third-party/collectd),[icinga2](../third-party/icinga2), [TCollector](../third-party/tcollector), [EMQ](../third-party/emq-broker), [HiveMQ](../third-party/hive-mq-broker) 等都可以进行配置后,不用任何代码,即可将数据写入;
|
- [SQL 写入](../develop/insert-data/sql-writing)
|
||||||
3. 支持[各种查询](../develop/query-data),包括聚合查询、嵌套查询、降采样查询、插值等
|
- [Schemaless 写入](../reference/schemaless/),支持多种标准写入协议
|
||||||
4. 支持[用户自定义函数](../develop/udf)
|
- [InfluxDB LINE 协议](../develop/insert-data/influxdb-line)
|
||||||
5. 支持[缓存](../develop/cache),将每张表的最后一条记录缓存起来,这样无需 Redis
|
- [OpenTSDB Telnet 协议](../develop/insert-data/opentsdb-telnet)
|
||||||
6. 支持[流式计算](../develop/stream)(Stream Processing)
|
- [OpenTSDB JSON 协议](../develop/insert-data/opentsdb-json)
|
||||||
7. 支持[数据订阅](../develop/tmq),而且可以指定过滤条件
|
- 与多种第三方工具的无缝集成,它们都可以仅通过配置而无需任何代码即可将数据写入 TDengine
|
||||||
8. 支持[集群](../deployment/),可以通过多节点进行水平扩展,并通过多副本实现高可靠
|
- [Telegraf](../third-party/telegraf)
|
||||||
9. 提供[命令行程序](../reference/taos-shell),便于管理集群,检查系统状态,做即席查询
|
- [Prometheus](../third-party/prometheus)
|
||||||
10. 提供多种数据的[导入](../operation/import)、[导出](../operation/export)
|
- [StatsD](../third-party/statsd)
|
||||||
11. 支持对[TDengine 集群本身的监控](../operation/monitor)
|
- [collectd](../third-party/collectd)
|
||||||
12. 提供各种语言的[连接器](../connector): 如 C/C++, Java, Go, Node.JS, Rust, Python, C# 等
|
- [icinga2](../third-party/icinga2)
|
||||||
13. 支持 [REST 接口](../connector/rest-api/)
|
- [TCollector](../third-party/tcollector)
|
||||||
14. 支持与[ Grafana 无缝集成](../third-party/grafana)
|
- [EMQ](../third-party/emq-broker)
|
||||||
15. 支持与 Google Data Studio 无缝集成
|
- [HiveMQ](../third-party/hive-mq-broker) ;
|
||||||
16. 支持 [Kubernetes 部署](../deployment/k8s)
|
2. 查询数据,支持
|
||||||
|
- [标准SQL](../taos-sql),含嵌套查询
|
||||||
|
- [时序数据特色函数](../taos-sql/function/#time-series-extensions)
|
||||||
|
- [时序顺序特色查询](../taos-sql/distinguished),例如降采样、插值、累加和、时间加权平均、状态窗口、会话窗口等
|
||||||
|
- [用户自定义函数](../taos-sql/udf)
|
||||||
|
3. [缓存](../develop/cache),将每张表的最后一条记录缓存起来,这样无需 Redis 就能对时序数据进行高效处理
|
||||||
|
4. [流式计算](../develop/stream)(Stream Processing),TDengine 不仅支持连续查询,还支持事件驱动的流式计算,这样在处理时序数据时就无需 Flink 或 Spark 这样流计算组件
|
||||||
|
5. [数据订阅](../develop/tmq),应用程序可以订阅一张表或一组表的数据,API 与 Kafka 相同,而且可以指定过滤条件
|
||||||
|
6. 可视化
|
||||||
|
- 支持与 [Grafana](../third-party/grafana/) 的无缝集成
|
||||||
|
- 支持与 Google Data Studio 的无缝集成
|
||||||
|
7. 集群
|
||||||
|
- 集群部署(../deployment/),可以通过增加节点进行水平扩展以提升处理能力
|
||||||
|
- 可以通过 [Kubernets 部署 TDengine](../deployment/k8s/)
|
||||||
|
- 通过多副本提供高可用能力
|
||||||
|
8. 管理
|
||||||
|
- [监控](../operation/monitor)运行中的 TDengine 实例
|
||||||
|
- 多种[数据导入](../operation/import)方式
|
||||||
|
- 多种[数据导出](../operation/export)方式
|
||||||
|
9. 工具
|
||||||
|
- 提供交互式[命令行程序](../reference/taos-shell),便于管理集群,检查系统状态,做即席查询
|
||||||
|
- 提供压力测试工具[taosBenchmark](../reference/taosbenchmark),用于测试 TDengine 的性能
|
||||||
|
10. 编程
|
||||||
|
- 提供各种语言的[连接器](../connector): 如 [C/C++](../connector/cpp), [Java](../connector/java), [Go](../connector/go), [Node.JS](../connector/node), [Rust](../connector/rust), [Python](../connector/python), [C#](../connector/csharp) 等
|
||||||
|
- 支持 [REST 接口](../connector/rest-api/)
|
||||||
|
|
||||||
更多细小的功能,请阅读整个文档。
|
更多细节功能,请阅读整个文档。
|
||||||
|
|
||||||
## 竞争优势
|
## 竞争优势
|
||||||
|
|
||||||
由于 TDengine 充分利用了[时序数据特点](https://www.taosdata.com/blog/2019/07/09/105.html),比如结构化、无需事务、很少删除或更新、写多读少等等,设计了全新的针对时序数据的存储引擎和计算引擎,因此与其他时序数据库相比,TDengine 有以下特点:
|
由于 TDengine 充分利用了[时序数据特点](https://www.taosdata.com/blog/2019/07/09/105.html),比如结构化、无需事务、很少删除或更新、写多读少等等,因此与其他时序数据库相比,TDengine 有以下特点:
|
||||||
|
|
||||||
- **[高性能](https://www.taosdata.com/tdengine/fast)**:通过创新的存储引擎设计,无论是数据写入还是查询,TDengine 的性能比通用数据库快 10 倍以上,也远超其他时序数据库,存储空间不及通用数据库的1/10。
|
- **[高性能](https://www.taosdata.com/tdengine/fast)**:TDengine 是唯一一个解决了时序数据存储的高基数难题的时序数据库,支持上亿数据采集点,并在数据插入、查询和数据压缩上远胜其它时序数据库。
|
||||||
|
|
||||||
- **[云原生](https://www.taosdata.com/tdengine/cloud_native_time-series_database)**:通过原生分布式的设计,充分利用云平台的优势,TDengine 提供了水平扩展能力,具备弹性、韧性和可观测性,支持k8s部署,可运行在公有云、私有云和混合云上。
|
- **[极简时序数据平台](https://www.taosdata.com/tdengine/simplified_solution_for_time-series_data_processing)**:TDengine 内建缓存、流式计算和数据订阅等功能,为时序数据的处理提供了极简的解决方案,从而大幅降低了业务系统的设计复杂度和运维成本。
|
||||||
|
|
||||||
- **[极简时序数据平台](https://www.taosdata.com/tdengine/simplified_solution_for_time-series_data_processing)**:TDengine 内建消息队列、缓存、流式计算等功能,应用无需再集成 Kafka/Redis/HBase/Spark 等软件,大幅降低系统的复杂度,降低应用开发和运营成本。
|
- **[云原生](https://www.taosdata.com/tdengine/cloud_native_time-series_database)**:通过原生的分布式设计、数据分片和分区、存算分离、RAFT 协议、Kubernets 部署和完整的可观测性,TDengine 是一款云原生时序数据库并且能够部署在公有云、私有云和混合云上。
|
||||||
|
|
||||||
- **[分析能力](https://www.taosdata.com/tdengine/easy_data_analytics)**:支持 SQL,同时为时序数据特有的分析提供SQL扩展。通过超级表、存储计算分离、分区分片、预计算、自定义函数等技术,TDengine 具备强大的分析能力。
|
- **[简单易用](https://www.taosdata.com/tdengine/ease_of_use)**:对系统管理员来说,TDengine 大幅降低了管理和维护的代价。对开发者来说, TDengine 提供了简单的接口、极简的解决方案和与第三方工具的无缝集成。对数据分析专家来说,TDengine 提供了便捷的数据访问。
|
||||||
|
|
||||||
- **[简单易用](https://www.taosdata.com/tdengine/ease_of_use)**:无任何依赖,安装、集群几秒搞定;提供REST以及各种语言连接器,与众多第三方工具无缝集成;提供命令行程序,便于管理和即席查询;提供各种运维工具。
|
- **[分析能力](https://www.taosdata.com/tdengine/easy_data_analytics)**:通过超级表、存储计算分离、分区分片、预计算和其它技术,TDengine 能够高效地浏览、格式化和访问数据。
|
||||||
|
|
||||||
- **[核心开源](https://www.taosdata.com/tdengine/open_source_time-series_database)**:TDengine 的核心代码包括集群功能全部开源,截止到2022年8月1日,全球超过 135.9k 个运行实例,GitHub Star 18.7k,Fork 4.4k,社区活跃。
|
- **[核心开源](https://www.taosdata.com/tdengine/open_source_time-series_database)**:TDengine 的核心代码包括集群功能全部在开源协议下公开。全球超过 140k 个运行实例,GitHub Star 19k,且拥有一个活跃的开发者社区。
|
||||||
|
|
||||||
采用 TDengine,可将典型的物联网、车联网、工业互联网大数据平台的总拥有成本大幅降低。表现在几个方面:
|
采用 TDengine,可将典型的物联网、车联网、工业互联网大数据平台的总拥有成本大幅降低。表现在几个方面:
|
||||||
|
|
||||||
1. 由于其超强性能,它能将系统需要的计算资源和存储资源大幅降低
|
1. 由于其超强性能,它能将系统需要的计算资源和存储资源大幅降低
|
||||||
2. 因为支持 SQL,能与众多第三方软件无缝集成,学习迁移成本大幅下降
|
2. 因为支持 SQL,能与众多第三方软件无缝集成,学习迁移成本大幅下降
|
||||||
3. 因为是一极简的时序数据平台,系统复杂度、研发和运营成本大幅降低
|
3. 因为是一极简的时序数据平台,系统复杂度、研发和运营成本大幅降低
|
||||||
4. 因为维护简单,运营维护成本能大幅降低
|
|
||||||
|
|
||||||
## 技术生态
|
## 技术生态
|
||||||
|
|
||||||
|
@ -67,7 +90,7 @@ TDengine的主要功能如下:
|
||||||
|
|
||||||
上图中,左侧是各种数据采集或消息队列,包括 OPC-UA、MQTT、Telegraf、也包括 Kafka, 他们的数据将被源源不断的写入到 TDengine。右侧则是可视化、BI 工具、组态软件、应用程序。下侧则是 TDengine 自身提供的命令行程序 (CLI) 以及可视化管理管理。
|
上图中,左侧是各种数据采集或消息队列,包括 OPC-UA、MQTT、Telegraf、也包括 Kafka, 他们的数据将被源源不断的写入到 TDengine。右侧则是可视化、BI 工具、组态软件、应用程序。下侧则是 TDengine 自身提供的命令行程序 (CLI) 以及可视化管理管理。
|
||||||
|
|
||||||
## 总体适用场景
|
## 典型适用场景
|
||||||
|
|
||||||
作为一个高性能、分布式、支持 SQL 的时序数据库 (Database),TDengine 的典型适用场景包括但不限于 IoT、工业互联网、车联网、IT 运维、能源、金融证券等领域。需要指出的是,TDengine 是针对时序数据场景设计的专用数据库和专用大数据处理工具,因充分利用了时序大数据的特点,它无法用来处理网络爬虫、微博、微信、电商、ERP、CRM 等通用型数据。本文对适用场景做更多详细的分析。
|
作为一个高性能、分布式、支持 SQL 的时序数据库 (Database),TDengine 的典型适用场景包括但不限于 IoT、工业互联网、车联网、IT 运维、能源、金融证券等领域。需要指出的是,TDengine 是针对时序数据场景设计的专用数据库和专用大数据处理工具,因充分利用了时序大数据的特点,它无法用来处理网络爬虫、微博、微信、电商、ERP、CRM 等通用型数据。本文对适用场景做更多详细的分析。
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,11 @@ description: TDengine 提供的时序数据特有的查询功能
|
||||||
|
|
||||||
TDengine 是专为时序数据而研发的大数据平台,存储和计算都针对时序数据的特定进行了量身定制,在支持标准 SQL 的基础之上,还提供了一系列贴合时序业务场景的特色查询语法,极大的方便时序场景的应用开发。
|
TDengine 是专为时序数据而研发的大数据平台,存储和计算都针对时序数据的特定进行了量身定制,在支持标准 SQL 的基础之上,还提供了一系列贴合时序业务场景的特色查询语法,极大的方便时序场景的应用开发。
|
||||||
|
|
||||||
TDengine 提供的特色查询包括标签切分查询和窗口切分查询。
|
TDengine 提供的特色查询包括数据切分查询和窗口切分查询。
|
||||||
|
|
||||||
## 标签切分查询
|
## 数据切分查询
|
||||||
|
|
||||||
超级表查询中,当需要针对标签进行数据切分然后在切分出的数据空间内再进行一系列的计算时使用标签切分子句,标签切分的语句如下:
|
当需要按一定的维度对数据进行切分然后在切分出的数据空间内再进行一系列的计算时使用数据切分子句,数据切分语句的语法如下:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
PARTITION BY part_list
|
PARTITION BY part_list
|
||||||
|
@ -18,22 +18,23 @@ PARTITION BY part_list
|
||||||
|
|
||||||
part_list 可以是任意的标量表达式,包括列、常量、标量函数和它们的组合。
|
part_list 可以是任意的标量表达式,包括列、常量、标量函数和它们的组合。
|
||||||
|
|
||||||
当 PARTITION BY 和标签一起使用时,TDengine 按如下方式处理标签切分子句:
|
TDengine 按如下方式处理数据切分子句:
|
||||||
|
|
||||||
- 标签切分子句位于 WHERE 子句之后,且不能和 JOIN 子句一起使用。
|
- 数据切分子句位于 WHERE 子句之后。
|
||||||
- 标签切分子句将超级表数据按指定的标签组合进行切分,每个切分的分片进行指定的计算。计算由之后的子句定义(窗口子句、GROUP BY 子句或 SELECT 子句)。
|
- 数据切分子句将表数据按指定的维度进行切分,每个切分的分片进行指定的计算。计算由之后的子句定义(窗口子句、GROUP BY 子句或 SELECT 子句)。
|
||||||
- 标签切分子句可以和窗口切分子句(或 GROUP BY 子句)一起使用,此时后面的子句作用在每个切分的分片上。例如,将数据按标签 location 进行分组,并对每个组按 10 分钟进行降采样,取其最大值。
|
- 数据切分子句可以和窗口切分子句(或 GROUP BY 子句)一起使用,此时后面的子句作用在每个切分的分片上。例如,将数据按标签 location 进行分组,并对每个组按 10 分钟进行降采样,取其最大值。
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
select max(current) from meters partition by location interval(10m)
|
select max(current) from meters partition by location interval(10m)
|
||||||
```
|
```
|
||||||
|
数据切分子句最常见的用法就是在超级表查询中,按标签将子表数据进行切分,然后分别进行计算。特别是 PARTITION BY TBNAME 用法,它将每个子表的数据独立出来,形成一条条独立的时间序列,极大的方便了各种时序场景的统计分析。
|
||||||
|
|
||||||
## 窗口切分查询
|
## 窗口切分查询
|
||||||
|
|
||||||
TDengine 支持按时间段窗口切分方式进行聚合结果查询,比如温度传感器每秒采集一次数据,但需查询每隔 10 分钟的温度平均值。这种场景下可以使用窗口子句来获得需要的查询结果。窗口子句用于针对查询的数据集合按照窗口切分成为查询子集并进行聚合,窗口包含时间窗口(time window)、状态窗口(status window)、会话窗口(session window)三种窗口。其中时间窗口又可划分为滑动时间窗口和翻转时间窗口。窗口切分查询语法如下:
|
TDengine 支持按时间段窗口切分方式进行聚合结果查询,比如温度传感器每秒采集一次数据,但需查询每隔 10 分钟的温度平均值。这种场景下可以使用窗口子句来获得需要的查询结果。窗口子句用于针对查询的数据集合按照窗口切分成为查询子集并进行聚合,窗口包含时间窗口(time window)、状态窗口(status window)、会话窗口(session window)三种窗口。其中时间窗口又可划分为滑动时间窗口和翻转时间窗口。窗口切分查询语法如下:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT function_list FROM tb_name
|
SELECT select_list FROM tb_name
|
||||||
[WHERE where_condition]
|
[WHERE where_condition]
|
||||||
[SESSION(ts_col, tol_val)]
|
[SESSION(ts_col, tol_val)]
|
||||||
[STATE_WINDOW(col)]
|
[STATE_WINDOW(col)]
|
||||||
|
@ -43,19 +44,15 @@ SELECT function_list FROM tb_name
|
||||||
|
|
||||||
在上述语法中的具体限制如下
|
在上述语法中的具体限制如下
|
||||||
|
|
||||||
### 窗口切分查询中使用函数的限制
|
|
||||||
|
|
||||||
- 在聚合查询中,function_list 位置允许使用聚合和选择函数,并要求每个函数仅输出单个结果(例如:COUNT、AVG、SUM、STDDEV、LEASTSQUARES、PERCENTILE、MIN、MAX、FIRST、LAST),而不能使用具有多行输出结果的函数(例如:DIFF 以及四则运算)。
|
|
||||||
- 此外 LAST_ROW 查询也不能与窗口聚合同时出现。
|
|
||||||
- 标量函数(如:CEIL/FLOOR 等)也不能使用在窗口聚合查询中。
|
|
||||||
|
|
||||||
### 窗口子句的规则
|
### 窗口子句的规则
|
||||||
|
|
||||||
- 窗口子句位于标签切分子句之后,GROUP BY 子句之前,且不可以和 GROUP BY 子句一起使用。
|
- 窗口子句位于数据切分子句之后,GROUP BY 子句之前,且不可以和 GROUP BY 子句一起使用。
|
||||||
- 窗口子句将数据按窗口进行切分,对每个窗口进行 SELECT 列表中的表达式的计算,SELECT 列表中的表达式只能包含:
|
- 窗口子句将数据按窗口进行切分,对每个窗口进行 SELECT 列表中的表达式的计算,SELECT 列表中的表达式只能包含:
|
||||||
- 常量。
|
- 常量。
|
||||||
- 聚集函数。
|
- _wstart伪列、_wend伪列和_wduration伪列。
|
||||||
|
- 聚集函数(包括选择函数和可以由参数确定输出行数的时序特有函数)。
|
||||||
- 包含上面表达式的表达式。
|
- 包含上面表达式的表达式。
|
||||||
|
- 且至少包含一个聚集函数。
|
||||||
- 窗口子句不可以和 GROUP BY 子句一起使用。
|
- 窗口子句不可以和 GROUP BY 子句一起使用。
|
||||||
- WHERE 语句可以指定查询的起止时间和其他过滤条件。
|
- WHERE 语句可以指定查询的起止时间和其他过滤条件。
|
||||||
|
|
||||||
|
@ -74,7 +71,7 @@ FILL 语句指定某一窗口区间数据缺失的情况下的填充模式。填
|
||||||
|
|
||||||
1. 使用 FILL 语句的时候可能生成大量的填充输出,务必指定查询的时间区间。针对每次查询,系统可返回不超过 1 千万条具有插值的结果。
|
1. 使用 FILL 语句的时候可能生成大量的填充输出,务必指定查询的时间区间。针对每次查询,系统可返回不超过 1 千万条具有插值的结果。
|
||||||
2. 在时间维度聚合中,返回的结果中时间序列严格单调递增。
|
2. 在时间维度聚合中,返回的结果中时间序列严格单调递增。
|
||||||
3. 如果查询对象是超级表,则聚合函数会作用于该超级表下满足值过滤条件的所有表的数据。如果查询中没有使用 GROUP BY 语句,则返回的结果按照时间序列严格单调递增;如果查询中使用了 GROUP BY 语句分组,则返回结果中每个 GROUP 内不按照时间序列严格单调递增。
|
3. 如果查询对象是超级表,则聚合函数会作用于该超级表下满足值过滤条件的所有表的数据。如果查询中没有使用 PARTITION BY 语句,则返回的结果按照时间序列严格单调递增;如果查询中使用了 PARTITION BY 语句分组,则返回结果中每个 PARTITION 内不按照时间序列严格单调递增。
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -106,7 +103,7 @@ SELECT COUNT(*) FROM temp_tb_1 INTERVAL(1m) SLIDING(2m);
|
||||||
|
|
||||||
### 状态窗口
|
### 状态窗口
|
||||||
|
|
||||||
使用整数(布尔值)或字符串来标识产生记录时候设备的状态量。产生的记录如果具有相同的状态量数值则归属于同一个状态窗口,数值改变后该窗口关闭。如下图所示,根据状态量确定的状态窗口分别是[2019-04-28 14:22:07,2019-04-28 14:22:10]和[2019-04-28 14:22:11,2019-04-28 14:22:12]两个。(状态窗口暂不支持对超级表使用)
|
使用整数(布尔值)或字符串来标识产生记录时候设备的状态量。产生的记录如果具有相同的状态量数值则归属于同一个状态窗口,数值改变后该窗口关闭。如下图所示,根据状态量确定的状态窗口分别是[2019-04-28 14:22:07,2019-04-28 14:22:10]和[2019-04-28 14:22:11,2019-04-28 14:22:12]两个。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@ -122,7 +119,7 @@ SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status);
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
在 tol_value 时间间隔范围内的结果都认为归属于同一个窗口,如果连续的两条记录的时间超过 tol_val,则自动开启下一个窗口。(会话窗口暂不支持对超级表使用)
|
在 tol_value 时间间隔范围内的结果都认为归属于同一个窗口,如果连续的两条记录的时间超过 tol_val,则自动开启下一个窗口。
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -163,6 +163,13 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists ct4 using st1(t3) tags('ct4')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create child table ct4, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "insert into ct3 values(1626006833600, 5, 6, 'c') ct1 values(1626006833601, 2, 3, 'sds') (1626006833602, 4, 5, 'ddd') ct0 values(1626006833602, 4, 3, 'hwj') ct1 values(now+5s, 23, 32, 's21ds')");
|
pRes = taos_query(pConn, "insert into ct3 values(1626006833600, 5, 6, 'c') ct1 values(1626006833601, 2, 3, 'sds') (1626006833602, 4, 5, 'ddd') ct0 values(1626006833602, 4, 3, 'hwj') ct1 values(now+5s, 23, 32, 's21ds')");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
@ -379,6 +386,8 @@ tmq_t* build_consumer() {
|
||||||
tmq_conf_set(conf, "td.connect.pass", "taosdata");
|
tmq_conf_set(conf, "td.connect.pass", "taosdata");
|
||||||
tmq_conf_set(conf, "msg.with.table.name", "true");
|
tmq_conf_set(conf, "msg.with.table.name", "true");
|
||||||
tmq_conf_set(conf, "enable.auto.commit", "true");
|
tmq_conf_set(conf, "enable.auto.commit", "true");
|
||||||
|
tmq_conf_set(conf, "experimental.snapshot.enable", "true");
|
||||||
|
|
||||||
|
|
||||||
/*tmq_conf_set(conf, "experimental.snapshot.enable", "true");*/
|
/*tmq_conf_set(conf, "experimental.snapshot.enable", "true");*/
|
||||||
|
|
||||||
|
@ -406,7 +415,7 @@ void basic_consume_loop(tmq_t* tmq, tmq_list_t* topics) {
|
||||||
}
|
}
|
||||||
int32_t cnt = 0;
|
int32_t cnt = 0;
|
||||||
while (running) {
|
while (running) {
|
||||||
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, -1);
|
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 1000);
|
||||||
if (tmqmessage) {
|
if (tmqmessage) {
|
||||||
cnt++;
|
cnt++;
|
||||||
msg_process(tmqmessage);
|
msg_process(tmqmessage);
|
||||||
|
|
|
@ -184,6 +184,7 @@ typedef struct SQueryTableDataCond {
|
||||||
STimeWindow twindows;
|
STimeWindow twindows;
|
||||||
int64_t startVersion;
|
int64_t startVersion;
|
||||||
int64_t endVersion;
|
int64_t endVersion;
|
||||||
|
int64_t schemaVersion;
|
||||||
} SQueryTableDataCond;
|
} SQueryTableDataCond;
|
||||||
|
|
||||||
int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock);
|
int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock);
|
||||||
|
|
|
@ -96,6 +96,7 @@ char *tTagValToData(const STagVal *pTagVal, bool isJson);
|
||||||
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag);
|
int32_t tEncodeTag(SEncoder *pEncoder, const STag *pTag);
|
||||||
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag);
|
int32_t tDecodeTag(SDecoder *pDecoder, STag **ppTag);
|
||||||
int32_t tTagToValArray(const STag *pTag, SArray **ppArray);
|
int32_t tTagToValArray(const STag *pTag, SArray **ppArray);
|
||||||
|
void tTagSetCid(const STag *pTag, int16_t iTag, int16_t cid);
|
||||||
void debugPrintSTag(STag *pTag, const char *tag, int32_t ln); // TODO: remove
|
void debugPrintSTag(STag *pTag, const char *tag, int32_t ln); // TODO: remove
|
||||||
int32_t parseJsontoTagData(const char *json, SArray *pTagVals, STag **ppTag, void *pMsgBuf);
|
int32_t parseJsontoTagData(const char *json, SArray *pTagVals, STag **ppTag, void *pMsgBuf);
|
||||||
|
|
||||||
|
|
|
@ -2617,7 +2617,7 @@ enum {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t type;
|
int8_t type;
|
||||||
union {
|
union {
|
||||||
// snapshot data
|
// snapshot
|
||||||
struct {
|
struct {
|
||||||
int64_t uid;
|
int64_t uid;
|
||||||
int64_t ts;
|
int64_t ts;
|
||||||
|
@ -2936,33 +2936,14 @@ static FORCE_INLINE void tDeleteSMqSubTopicEp(SMqSubTopicEp* pSubTopicEp) {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SMqRspHead head;
|
SMqRspHead head;
|
||||||
int64_t reqOffset;
|
STqOffsetVal rspOffset;
|
||||||
int64_t rspOffset;
|
|
||||||
STqOffsetVal reqOffsetNew;
|
|
||||||
STqOffsetVal rspOffsetNew;
|
|
||||||
int16_t resMsgType;
|
int16_t resMsgType;
|
||||||
int32_t metaRspLen;
|
int32_t metaRspLen;
|
||||||
void* metaRsp;
|
void* metaRsp;
|
||||||
} SMqMetaRsp;
|
} SMqMetaRsp;
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMqMetaRsp(void** buf, const SMqMetaRsp* pRsp) {
|
int32_t tEncodeSMqMetaRsp(SEncoder* pEncoder, const SMqMetaRsp* pRsp);
|
||||||
int32_t tlen = 0;
|
int32_t tDecodeSMqMetaRsp(SDecoder* pDecoder, SMqMetaRsp* pRsp);
|
||||||
tlen += taosEncodeFixedI64(buf, pRsp->reqOffset);
|
|
||||||
tlen += taosEncodeFixedI64(buf, pRsp->rspOffset);
|
|
||||||
tlen += taosEncodeFixedI16(buf, pRsp->resMsgType);
|
|
||||||
tlen += taosEncodeFixedI32(buf, pRsp->metaRspLen);
|
|
||||||
tlen += taosEncodeBinary(buf, pRsp->metaRsp, pRsp->metaRspLen);
|
|
||||||
return tlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeSMqMetaRsp(const void* buf, SMqMetaRsp* pRsp) {
|
|
||||||
buf = taosDecodeFixedI64(buf, &pRsp->reqOffset);
|
|
||||||
buf = taosDecodeFixedI64(buf, &pRsp->rspOffset);
|
|
||||||
buf = taosDecodeFixedI16(buf, &pRsp->resMsgType);
|
|
||||||
buf = taosDecodeFixedI32(buf, &pRsp->metaRspLen);
|
|
||||||
buf = taosDecodeBinary(buf, &pRsp->metaRsp, pRsp->metaRspLen);
|
|
||||||
return (void*)buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SMqRspHead head;
|
SMqRspHead head;
|
||||||
|
|
|
@ -41,6 +41,9 @@ typedef struct {
|
||||||
bool initTableReader;
|
bool initTableReader;
|
||||||
bool initTqReader;
|
bool initTqReader;
|
||||||
int32_t numOfVgroups;
|
int32_t numOfVgroups;
|
||||||
|
|
||||||
|
void* sContext; // SSnapContext*
|
||||||
|
|
||||||
void* pStateBackend;
|
void* pStateBackend;
|
||||||
} SReadHandle;
|
} SReadHandle;
|
||||||
|
|
||||||
|
@ -181,11 +184,17 @@ int32_t qGetStreamScanStatus(qTaskInfo_t tinfo, uint64_t* uid, int64_t* ts);
|
||||||
|
|
||||||
int32_t qStreamPrepareTsdbScan(qTaskInfo_t tinfo, uint64_t uid, int64_t ts);
|
int32_t qStreamPrepareTsdbScan(qTaskInfo_t tinfo, uint64_t uid, int64_t ts);
|
||||||
|
|
||||||
int32_t qStreamPrepareScan(qTaskInfo_t tinfo, const STqOffsetVal* pOffset);
|
int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subType);
|
||||||
|
|
||||||
int32_t qStreamExtractOffset(qTaskInfo_t tinfo, STqOffsetVal* pOffset);
|
int32_t qStreamExtractOffset(qTaskInfo_t tinfo, STqOffsetVal* pOffset);
|
||||||
|
|
||||||
void* qStreamExtractMetaMsg(qTaskInfo_t tinfo);
|
SMqMetaRsp* qStreamExtractMetaMsg(qTaskInfo_t tinfo);
|
||||||
|
|
||||||
|
int64_t qStreamExtractPrepareUid(qTaskInfo_t tinfo);
|
||||||
|
|
||||||
|
const SSchemaWrapper* qExtractSchemaFromTask(qTaskInfo_t tinfo);
|
||||||
|
|
||||||
|
const char* qExtractTbnameFromTask(qTaskInfo_t tinfo);
|
||||||
|
|
||||||
void* qExtractReaderFromStreamScanner(void* scanner);
|
void* qExtractReaderFromStreamScanner(void* scanner);
|
||||||
|
|
||||||
|
|
|
@ -1,74 +1,74 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
* 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
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _TD_OS_SEMPHONE_H_
|
#ifndef _TD_OS_SEMPHONE_H_
|
||||||
#define _TD_OS_SEMPHONE_H_
|
#define _TD_OS_SEMPHONE_H_
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <semaphore.h>
|
#include <semaphore.h>
|
||||||
|
|
||||||
#if defined(_TD_DARWIN_64)
|
#if defined(_TD_DARWIN_64)
|
||||||
#include <dispatch/dispatch.h>
|
#include <dispatch/dispatch.h>
|
||||||
// typedef struct tsem_s *tsem_t;
|
// typedef struct tsem_s *tsem_t;
|
||||||
typedef dispatch_semaphore_t tsem_t;
|
typedef dispatch_semaphore_t tsem_t;
|
||||||
|
|
||||||
int tsem_init(tsem_t *sem, int pshared, unsigned int value);
|
int tsem_init(tsem_t *sem, int pshared, unsigned int value);
|
||||||
int tsem_wait(tsem_t *sem);
|
int tsem_wait(tsem_t *sem);
|
||||||
int tsem_timewait(tsem_t *sim, int64_t nanosecs);
|
int tsem_timewait(tsem_t *sim, int64_t nanosecs);
|
||||||
int tsem_post(tsem_t *sem);
|
int tsem_post(tsem_t *sem);
|
||||||
int tsem_destroy(tsem_t *sem);
|
int tsem_destroy(tsem_t *sem);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define tsem_t sem_t
|
#define tsem_t sem_t
|
||||||
#define tsem_init sem_init
|
#define tsem_init sem_init
|
||||||
int tsem_wait(tsem_t *sem);
|
int tsem_wait(tsem_t *sem);
|
||||||
int tsem_timewait(tsem_t *sim, int64_t nanosecs);
|
int tsem_timewait(tsem_t *sim, int64_t nanosecs);
|
||||||
#define tsem_post sem_post
|
#define tsem_post sem_post
|
||||||
#define tsem_destroy sem_destroy
|
#define tsem_destroy sem_destroy
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_DARWIN_64)
|
#if defined(_TD_DARWIN_64)
|
||||||
// #define TdThreadRwlock TdThreadMutex
|
// #define TdThreadRwlock TdThreadMutex
|
||||||
// #define taosThreadRwlockInit(lock, NULL) taosThreadMutexInit(lock, NULL)
|
// #define taosThreadRwlockInit(lock, NULL) taosThreadMutexInit(lock, NULL)
|
||||||
// #define taosThreadRwlockDestroy(lock) taosThreadMutexDestroy(lock)
|
// #define taosThreadRwlockDestroy(lock) taosThreadMutexDestroy(lock)
|
||||||
// #define taosThreadRwlockWrlock(lock) taosThreadMutexLock(lock)
|
// #define taosThreadRwlockWrlock(lock) taosThreadMutexLock(lock)
|
||||||
// #define taosThreadRwlockRdlock(lock) taosThreadMutexLock(lock)
|
// #define taosThreadRwlockRdlock(lock) taosThreadMutexLock(lock)
|
||||||
// #define taosThreadRwlockUnlock(lock) taosThreadMutexUnlock(lock)
|
// #define taosThreadRwlockUnlock(lock) taosThreadMutexUnlock(lock)
|
||||||
|
|
||||||
// #define TdThreadSpinlock TdThreadMutex
|
// #define TdThreadSpinlock TdThreadMutex
|
||||||
// #define taosThreadSpinInit(lock, NULL) taosThreadMutexInit(lock, NULL)
|
// #define taosThreadSpinInit(lock, NULL) taosThreadMutexInit(lock, NULL)
|
||||||
// #define taosThreadSpinDestroy(lock) taosThreadMutexDestroy(lock)
|
// #define taosThreadSpinDestroy(lock) taosThreadMutexDestroy(lock)
|
||||||
// #define taosThreadSpinLock(lock) taosThreadMutexLock(lock)
|
// #define taosThreadSpinLock(lock) taosThreadMutexLock(lock)
|
||||||
// #define taosThreadSpinUnlock(lock) taosThreadMutexUnlock(lock)
|
// #define taosThreadSpinUnlock(lock) taosThreadMutexUnlock(lock)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool taosCheckPthreadValid(TdThread thread);
|
bool taosCheckPthreadValid(TdThread thread);
|
||||||
int64_t taosGetSelfPthreadId();
|
int64_t taosGetSelfPthreadId();
|
||||||
int64_t taosGetPthreadId(TdThread thread);
|
int64_t taosGetPthreadId(TdThread thread);
|
||||||
void taosResetPthread(TdThread *thread);
|
void taosResetPthread(TdThread *thread);
|
||||||
bool taosComparePthread(TdThread first, TdThread second);
|
bool taosComparePthread(TdThread first, TdThread second);
|
||||||
int32_t taosGetPId();
|
int32_t taosGetPId();
|
||||||
int32_t taosGetAppName(char *name, int32_t *len);
|
int32_t taosGetAppName(char *name, int32_t *len);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /*_TD_OS_SEMPHONE_H_*/
|
#endif /*_TD_OS_SEMPHONE_H_*/
|
||||||
|
|
|
@ -105,6 +105,97 @@ int32_t compareStrPatternNotMatch(const void *pLeft, const void *pRight);
|
||||||
int32_t compareWStrPatternMatch(const void *pLeft, const void *pRight);
|
int32_t compareWStrPatternMatch(const void *pLeft, const void *pRight);
|
||||||
int32_t compareWStrPatternNotMatch(const void *pLeft, const void *pRight);
|
int32_t compareWStrPatternNotMatch(const void *pLeft, const void *pRight);
|
||||||
|
|
||||||
|
int32_t compareInt8Int16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt8Int32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt8Int64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt8Float(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt8Double(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt8Uint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt8Uint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt8Uint32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt8Uint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Int8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Int32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Int64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Float(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Double(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Uint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Uint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Uint32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt16Uint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Int8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Int16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Int64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Float(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Double(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Uint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Uint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Uint32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt32Uint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Int8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Int16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Int32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Float(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Double(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Uint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Uint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Uint32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareInt64Uint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatInt8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatInt16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatInt32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatInt64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatDouble(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatUint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatUint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatUint32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareFloatUint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleInt8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleInt16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleInt32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleInt64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleFloat(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleUint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleUint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleUint32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareDoubleUint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Int8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Int16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Int32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Int64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Float(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Double(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Uint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Uint32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint8Uint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Int8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Int16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Int32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Int64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Float(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Double(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Uint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Uint32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint16Uint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Int8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Int16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Int32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Int64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Float(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Double(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Uint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Uint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint32Uint64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Int8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Int16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Int32(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Int64(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Float(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Double(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Uint8(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Uint16(const void *pLeft, const void *pRight);
|
||||||
|
int32_t compareUint64Uint32(const void *pLeft, const void *pRight);
|
||||||
|
|
||||||
__compar_fn_t getComparFunc(int32_t type, int32_t optr);
|
__compar_fn_t getComparFunc(int32_t type, int32_t optr);
|
||||||
__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order);
|
__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order);
|
||||||
int32_t doCompare(const char *a, const char *b, int32_t type, size_t size);
|
int32_t doCompare(const char *a, const char *b, int32_t type, size_t size);
|
||||||
|
|
|
@ -27,11 +27,18 @@ else()
|
||||||
INCLUDE_DIRECTORIES(jni/linux)
|
INCLUDE_DIRECTORIES(jni/linux)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(
|
||||||
|
taos
|
||||||
|
PROPERTIES
|
||||||
|
CLEAN_DIRECT_OUTPUT
|
||||||
|
1
|
||||||
|
)
|
||||||
|
|
||||||
set_target_properties(
|
set_target_properties(
|
||||||
taos
|
taos
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
VERSION ${TD_VER_NUMBER}
|
VERSION ${TD_VER_NUMBER}
|
||||||
SOVERSION ${TD_VER_NUMBER}
|
SOVERSION 1
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(taos_static STATIC ${CLIENT_SRC})
|
add_library(taos_static STATIC ${CLIENT_SRC})
|
||||||
|
|
|
@ -85,8 +85,11 @@ typedef TSDB_SML_PROTOCOL_TYPE SMLProtocolType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SCHEMA_ACTION_NULL,
|
SCHEMA_ACTION_NULL,
|
||||||
SCHEMA_ACTION_COLUMN,
|
SCHEMA_ACTION_CREATE_STABLE,
|
||||||
SCHEMA_ACTION_TAG
|
SCHEMA_ACTION_ADD_COLUMN,
|
||||||
|
SCHEMA_ACTION_ADD_TAG,
|
||||||
|
SCHEMA_ACTION_CHANGE_COLUMN_SIZE,
|
||||||
|
SCHEMA_ACTION_CHANGE_TAG_SIZE,
|
||||||
} ESchemaAction;
|
} ESchemaAction;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -219,7 +222,7 @@ static int32_t smlBuildInvalidDataMsg(SSmlMsgBuf *pBuf, const char *msg1, const
|
||||||
|
|
||||||
static int32_t smlGenerateSchemaAction(SSchema *colField, SHashObj *colHash, SSmlKv *kv, bool isTag,
|
static int32_t smlGenerateSchemaAction(SSchema *colField, SHashObj *colHash, SSmlKv *kv, bool isTag,
|
||||||
ESchemaAction *action, SSmlHandle *info) {
|
ESchemaAction *action, SSmlHandle *info) {
|
||||||
uint16_t *index = (uint16_t *)taosHashGet(colHash, kv->key, kv->keyLen);
|
uint16_t *index = colHash ? (uint16_t *)taosHashGet(colHash, kv->key, kv->keyLen) : NULL;
|
||||||
if (index) {
|
if (index) {
|
||||||
if (colField[*index].type != kv->type) {
|
if (colField[*index].type != kv->type) {
|
||||||
uError("SML:0x%" PRIx64 " point type and db type mismatch. key: %s. point type: %d, db type: %d", info->id,
|
uError("SML:0x%" PRIx64 " point type and db type mismatch. key: %s. point type: %d, db type: %d", info->id,
|
||||||
|
@ -232,16 +235,16 @@ static int32_t smlGenerateSchemaAction(SSchema *colField, SHashObj *colHash, SSm
|
||||||
(colField[*index].type == TSDB_DATA_TYPE_NCHAR &&
|
(colField[*index].type == TSDB_DATA_TYPE_NCHAR &&
|
||||||
((colField[*index].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE < kv->length))) {
|
((colField[*index].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE < kv->length))) {
|
||||||
if (isTag) {
|
if (isTag) {
|
||||||
*action = SCHEMA_ACTION_TAG;
|
*action = SCHEMA_ACTION_CHANGE_TAG_SIZE;
|
||||||
} else {
|
} else {
|
||||||
*action = SCHEMA_ACTION_COLUMN;
|
*action = SCHEMA_ACTION_CHANGE_COLUMN_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isTag) {
|
if (isTag) {
|
||||||
*action = SCHEMA_ACTION_TAG;
|
*action = SCHEMA_ACTION_ADD_TAG;
|
||||||
} else {
|
} else {
|
||||||
*action = SCHEMA_ACTION_COLUMN;
|
*action = SCHEMA_ACTION_ADD_COLUMN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -310,9 +313,31 @@ static int32_t getBytes(uint8_t type, int32_t length){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashObj *schemaHash, SArray *cols, SArray* results, int32_t numOfCols, bool isTag) {
|
||||||
|
for (int j = 0; j < taosArrayGetSize(cols); ++j) {
|
||||||
|
SSmlKv *kv = (SSmlKv *)taosArrayGetP(cols, j);
|
||||||
|
ESchemaAction action = SCHEMA_ACTION_NULL;
|
||||||
|
smlGenerateSchemaAction(schemaField, schemaHash, kv, isTag, &action, info);
|
||||||
|
if(action == SCHEMA_ACTION_ADD_COLUMN || action == SCHEMA_ACTION_ADD_TAG){
|
||||||
|
SField field = {0};
|
||||||
|
field.type = kv->type;
|
||||||
|
field.bytes = getBytes(kv->type, kv->length);
|
||||||
|
memcpy(field.name, kv->key, kv->keyLen);
|
||||||
|
taosArrayPush(results, &field);
|
||||||
|
}else if(action == SCHEMA_ACTION_CHANGE_COLUMN_SIZE || action == SCHEMA_ACTION_CHANGE_TAG_SIZE){
|
||||||
|
uint16_t *index = (uint16_t *)taosHashGet(schemaHash, kv->key, kv->keyLen);
|
||||||
|
uint16_t newIndex = *index;
|
||||||
|
if(isTag) newIndex -= numOfCols;
|
||||||
|
SField *field = (SField *)taosArrayGet(results, newIndex);
|
||||||
|
field->bytes = getBytes(kv->type, kv->length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
//static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SSmlSTableMeta *sTableData,
|
//static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SSmlSTableMeta *sTableData,
|
||||||
// int32_t colVer, int32_t tagVer, int8_t source, uint64_t suid){
|
// int32_t colVer, int32_t tagVer, int8_t source, uint64_t suid){
|
||||||
static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SSmlSTableMeta *sTableData,
|
static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray* pColumns, SArray* pTags,
|
||||||
STableMeta *pTableMeta, ESchemaAction action){
|
STableMeta *pTableMeta, ESchemaAction action){
|
||||||
|
|
||||||
SRequestObj* pRequest = NULL;
|
SRequestObj* pRequest = NULL;
|
||||||
|
@ -320,6 +345,12 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SSmlSTableMeta *s
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SCmdMsgInfo pCmdMsg = {0};
|
SCmdMsgInfo pCmdMsg = {0};
|
||||||
|
|
||||||
|
// put front for free
|
||||||
|
pReq.numOfColumns = taosArrayGetSize(pColumns);
|
||||||
|
pReq.pColumns = pColumns;
|
||||||
|
pReq.numOfTags = taosArrayGetSize(pTags);
|
||||||
|
pReq.pTags = pTags;
|
||||||
|
|
||||||
code = buildRequest(info->taos->id, "", 0, NULL, false, &pRequest);
|
code = buildRequest(info->taos->id, "", 0, NULL, false, &pRequest);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -330,91 +361,41 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SSmlSTableMeta *s
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action == SCHEMA_ACTION_NULL){
|
if (action == SCHEMA_ACTION_CREATE_STABLE){
|
||||||
pReq.colVer = 1;
|
pReq.colVer = 1;
|
||||||
pReq.tagVer = 1;
|
pReq.tagVer = 1;
|
||||||
pReq.suid = 0;
|
pReq.suid = 0;
|
||||||
pReq.source = TD_REQ_FROM_APP;
|
pReq.source = TD_REQ_FROM_APP;
|
||||||
} else if (action == SCHEMA_ACTION_TAG){
|
} else if (action == SCHEMA_ACTION_ADD_TAG || action == SCHEMA_ACTION_CHANGE_TAG_SIZE){
|
||||||
pReq.colVer = pTableMeta->sversion;
|
pReq.colVer = pTableMeta->sversion;
|
||||||
pReq.tagVer = pTableMeta->tversion + 1;
|
pReq.tagVer = pTableMeta->tversion + 1;
|
||||||
pReq.suid = pTableMeta->uid;
|
pReq.suid = pTableMeta->uid;
|
||||||
pReq.source = TD_REQ_FROM_TAOX;
|
pReq.source = TD_REQ_FROM_TAOX;
|
||||||
} else if (action == SCHEMA_ACTION_COLUMN){
|
} else if (action == SCHEMA_ACTION_ADD_COLUMN || action == SCHEMA_ACTION_CHANGE_COLUMN_SIZE){
|
||||||
pReq.colVer = pTableMeta->sversion + 1;
|
pReq.colVer = pTableMeta->sversion + 1;
|
||||||
pReq.tagVer = pTableMeta->tversion;
|
pReq.tagVer = pTableMeta->tversion;
|
||||||
pReq.suid = pTableMeta->uid;
|
pReq.suid = pTableMeta->uid;
|
||||||
pReq.source = TD_REQ_FROM_TAOX;
|
pReq.source = TD_REQ_FROM_TAOX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pReq.numOfTags == 0){
|
||||||
|
pReq.numOfTags = 1;
|
||||||
|
SField field = {0};
|
||||||
|
field.type = TSDB_DATA_TYPE_NCHAR;
|
||||||
|
field.bytes = 1;
|
||||||
|
strcpy(field.name, tsSmlTagName);
|
||||||
|
taosArrayPush(pReq.pTags, &field);
|
||||||
|
}
|
||||||
|
|
||||||
pReq.commentLen = -1;
|
pReq.commentLen = -1;
|
||||||
pReq.igExists = true;
|
pReq.igExists = true;
|
||||||
tNameExtractFullName(pName, pReq.name);
|
tNameExtractFullName(pName, pReq.name);
|
||||||
|
|
||||||
if(action == SCHEMA_ACTION_NULL || action == SCHEMA_ACTION_COLUMN){
|
|
||||||
pReq.numOfColumns = taosArrayGetSize(sTableData->cols);
|
|
||||||
pReq.pColumns = taosArrayInit(pReq.numOfColumns, sizeof(SField));
|
|
||||||
for (int i = 0; i < pReq.numOfColumns; i++) {
|
|
||||||
SSmlKv *kv = (SSmlKv *)taosArrayGetP(sTableData->cols, i);
|
|
||||||
SField field = {0};
|
|
||||||
field.type = kv->type;
|
|
||||||
field.bytes = getBytes(kv->type, kv->length);
|
|
||||||
memcpy(field.name, kv->key, kv->keyLen);
|
|
||||||
taosArrayPush(pReq.pColumns, &field);
|
|
||||||
}
|
|
||||||
}else if (action == SCHEMA_ACTION_TAG){
|
|
||||||
pReq.numOfColumns = pTableMeta->tableInfo.numOfColumns;
|
|
||||||
pReq.pColumns = taosArrayInit(pReq.numOfColumns, sizeof(SField));
|
|
||||||
for (int i = 0; i < pReq.numOfColumns; i++) {
|
|
||||||
SSchema *s = &pTableMeta->schema[i];
|
|
||||||
SField field = {0};
|
|
||||||
field.type = s->type;
|
|
||||||
field.bytes = s->bytes;
|
|
||||||
strcpy(field.name, s->name);
|
|
||||||
taosArrayPush(pReq.pColumns, &field);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(action == SCHEMA_ACTION_NULL || action == SCHEMA_ACTION_TAG){
|
|
||||||
pReq.numOfTags = taosArrayGetSize(sTableData->tags);
|
|
||||||
if (pReq.numOfTags == 0){
|
|
||||||
pReq.numOfTags = 1;
|
|
||||||
pReq.pTags = taosArrayInit(pReq.numOfTags, sizeof(SField));
|
|
||||||
SField field = {0};
|
|
||||||
field.type = TSDB_DATA_TYPE_NCHAR;
|
|
||||||
field.bytes = 1;
|
|
||||||
strcpy(field.name, tsSmlTagName);
|
|
||||||
taosArrayPush(pReq.pTags, &field);
|
|
||||||
}else{
|
|
||||||
pReq.pTags = taosArrayInit(pReq.numOfTags, sizeof(SField));
|
|
||||||
for (int i = 0; i < pReq.numOfTags; i++) {
|
|
||||||
SSmlKv *kv = (SSmlKv *)taosArrayGetP(sTableData->tags, i);
|
|
||||||
SField field = {0};
|
|
||||||
field.type = kv->type;
|
|
||||||
field.bytes = getBytes(kv->type, kv->length);
|
|
||||||
memcpy(field.name, kv->key, kv->keyLen);
|
|
||||||
taosArrayPush(pReq.pTags, &field);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else if (action == SCHEMA_ACTION_COLUMN){
|
|
||||||
pReq.numOfTags = pTableMeta->tableInfo.numOfTags;
|
|
||||||
pReq.pTags = taosArrayInit(pReq.numOfTags, sizeof(SField));
|
|
||||||
for (int i = 0; i < pReq.numOfTags; i++) {
|
|
||||||
SSchema *s = &pTableMeta->schema[i + pTableMeta->tableInfo.numOfColumns];
|
|
||||||
SField field = {0};
|
|
||||||
field.type = s->type;
|
|
||||||
field.bytes = s->bytes;
|
|
||||||
strcpy(field.name, s->name);
|
|
||||||
taosArrayPush(pReq.pTags, &field);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pCmdMsg.epSet = getEpSet_s(&info->taos->pAppInfo->mgmtEp);
|
pCmdMsg.epSet = getEpSet_s(&info->taos->pAppInfo->mgmtEp);
|
||||||
pCmdMsg.msgType = TDMT_MND_CREATE_STB;
|
pCmdMsg.msgType = TDMT_MND_CREATE_STB;
|
||||||
pCmdMsg.msgLen = tSerializeSMCreateStbReq(NULL, 0, &pReq);
|
pCmdMsg.msgLen = tSerializeSMCreateStbReq(NULL, 0, &pReq);
|
||||||
pCmdMsg.pMsg = taosMemoryMalloc(pCmdMsg.msgLen);
|
pCmdMsg.pMsg = taosMemoryMalloc(pCmdMsg.msgLen);
|
||||||
if (NULL == pCmdMsg.pMsg) {
|
if (NULL == pCmdMsg.pMsg) {
|
||||||
tFreeSMCreateStbReq(&pReq);
|
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
@ -442,7 +423,10 @@ end:
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
SHashObj *hashTmp = NULL;
|
||||||
|
STableMeta *pTableMeta = NULL;
|
||||||
|
|
||||||
SName pName = {TSDB_TABLE_NAME_T, info->taos->acctId, {0}, {0}};
|
SName pName = {TSDB_TABLE_NAME_T, info->taos->acctId, {0}, {0}};
|
||||||
strcpy(pName.dbname, info->pRequest->pDb);
|
strcpy(pName.dbname, info->pRequest->pDb);
|
||||||
|
|
||||||
|
@ -455,7 +439,6 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
SSmlSTableMeta **tableMetaSml = (SSmlSTableMeta **)taosHashIterate(info->superTables, NULL);
|
SSmlSTableMeta **tableMetaSml = (SSmlSTableMeta **)taosHashIterate(info->superTables, NULL);
|
||||||
while (tableMetaSml) {
|
while (tableMetaSml) {
|
||||||
SSmlSTableMeta *sTableData = *tableMetaSml;
|
SSmlSTableMeta *sTableData = *tableMetaSml;
|
||||||
STableMeta *pTableMeta = NULL;
|
|
||||||
bool needCheckMeta = false; // for multi thread
|
bool needCheckMeta = false; // for multi thread
|
||||||
|
|
||||||
size_t superTableLen = 0;
|
size_t superTableLen = 0;
|
||||||
|
@ -466,14 +449,19 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
|
code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
|
||||||
|
|
||||||
if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST || code == TSDB_CODE_MND_STB_NOT_EXIST) {
|
if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST || code == TSDB_CODE_MND_STB_NOT_EXIST) {
|
||||||
code = smlSendMetaMsg(info, &pName, sTableData, NULL, SCHEMA_ACTION_NULL);
|
SArray* pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols), sizeof(SField));
|
||||||
|
SArray* pTags = taosArrayInit(taosArrayGetSize(sTableData->tags), sizeof(SField));
|
||||||
|
smlBuildFieldsList(info, NULL, NULL, sTableData->tags, pTags, 0, true);
|
||||||
|
smlBuildFieldsList(info, NULL, NULL, sTableData->cols, pColumns, 0, false);
|
||||||
|
|
||||||
|
code = smlSendMetaMsg(info, &pName, pColumns, pTags, NULL, SCHEMA_ACTION_CREATE_STABLE);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, superTable);
|
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, superTable);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
info->cost.numOfCreateSTables++;
|
info->cost.numOfCreateSTables++;
|
||||||
} else if (code == TSDB_CODE_SUCCESS) {
|
} else if (code == TSDB_CODE_SUCCESS) {
|
||||||
SHashObj *hashTmp = taosHashInit(pTableMeta->tableInfo.numOfTags,
|
hashTmp = taosHashInit(pTableMeta->tableInfo.numOfTags,
|
||||||
taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
for (uint16_t i = pTableMeta->tableInfo.numOfColumns;
|
for (uint16_t i = pTableMeta->tableInfo.numOfColumns;
|
||||||
i < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; i++) {
|
i < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; i++) {
|
||||||
|
@ -483,34 +471,70 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
ESchemaAction action = SCHEMA_ACTION_NULL;
|
ESchemaAction action = SCHEMA_ACTION_NULL;
|
||||||
code = smlProcessSchemaAction(info, pTableMeta->schema, hashTmp, sTableData->tags, &action, true);
|
code = smlProcessSchemaAction(info, pTableMeta->schema, hashTmp, sTableData->tags, &action, true);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
taosHashCleanup(hashTmp);
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (action == SCHEMA_ACTION_TAG){
|
if (action != SCHEMA_ACTION_NULL){
|
||||||
code = smlSendMetaMsg(info, &pName, sTableData, pTableMeta, action);
|
SArray* pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols) + pTableMeta->tableInfo.numOfColumns, sizeof(SField));
|
||||||
|
SArray* pTags = taosArrayInit(taosArrayGetSize(sTableData->tags) + pTableMeta->tableInfo.numOfTags, sizeof(SField));
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; i++) {
|
||||||
|
SField field = {0};
|
||||||
|
field.type = pTableMeta->schema[i].type;
|
||||||
|
field.bytes = pTableMeta->schema[i].bytes;
|
||||||
|
strcpy(field.name, pTableMeta->schema[i].name);
|
||||||
|
if(i < pTableMeta->tableInfo.numOfColumns){
|
||||||
|
taosArrayPush(pColumns, &field);
|
||||||
|
}else{
|
||||||
|
taosArrayPush(pTags, &field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
smlBuildFieldsList(info, pTableMeta->schema, hashTmp, sTableData->tags, pTags, pTableMeta->tableInfo.numOfColumns, true);
|
||||||
|
|
||||||
|
code = smlSendMetaMsg(info, &pName, pColumns, pTags, pTableMeta, action);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, superTable);
|
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, superTable);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1);
|
code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
taosHashClear(hashTmp);
|
taosHashClear(hashTmp);
|
||||||
for (uint16_t i = 1; i < pTableMeta->tableInfo.numOfColumns; i++) {
|
for (uint16_t i = 0; i < pTableMeta->tableInfo.numOfColumns; i++) {
|
||||||
taosHashPut(hashTmp, pTableMeta->schema[i].name, strlen(pTableMeta->schema[i].name), &i, SHORT_BYTES);
|
taosHashPut(hashTmp, pTableMeta->schema[i].name, strlen(pTableMeta->schema[i].name), &i, SHORT_BYTES);
|
||||||
}
|
}
|
||||||
action = SCHEMA_ACTION_NULL;
|
action = SCHEMA_ACTION_NULL;
|
||||||
code = smlProcessSchemaAction(info, pTableMeta->schema, hashTmp, sTableData->cols, &action, false);
|
code = smlProcessSchemaAction(info, pTableMeta->schema, hashTmp, sTableData->cols, &action, false);
|
||||||
taosHashCleanup(hashTmp);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (action == SCHEMA_ACTION_COLUMN){
|
if (action != SCHEMA_ACTION_NULL){
|
||||||
code = smlSendMetaMsg(info, &pName, sTableData, pTableMeta, action);
|
SArray* pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols) + pTableMeta->tableInfo.numOfColumns, sizeof(SField));
|
||||||
|
SArray* pTags = taosArrayInit(taosArrayGetSize(sTableData->tags) + pTableMeta->tableInfo.numOfTags, sizeof(SField));
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; i++) {
|
||||||
|
SField field = {0};
|
||||||
|
field.type = pTableMeta->schema[i].type;
|
||||||
|
field.bytes = pTableMeta->schema[i].bytes;
|
||||||
|
strcpy(field.name, pTableMeta->schema[i].name);
|
||||||
|
if(i < pTableMeta->tableInfo.numOfColumns){
|
||||||
|
taosArrayPush(pColumns, &field);
|
||||||
|
}else{
|
||||||
|
taosArrayPush(pTags, &field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
smlBuildFieldsList(info, pTableMeta->schema, hashTmp, sTableData->cols, pColumns, pTableMeta->tableInfo.numOfColumns, false);
|
||||||
|
|
||||||
|
code = smlSendMetaMsg(info, &pName, pColumns, pTags, pTableMeta, action);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, superTable);
|
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, superTable);
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -526,7 +550,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
uError("SML:0x%" PRIx64 " load table meta error: %s", info->id, tstrerror(code));
|
uError("SML:0x%" PRIx64 " load table meta error: %s", info->id, tstrerror(code));
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (pTableMeta) taosMemoryFree(pTableMeta);
|
taosMemoryFreeClear(pTableMeta);
|
||||||
|
|
||||||
code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
|
code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -551,10 +575,13 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
|
||||||
sTableData->tableMeta = pTableMeta;
|
sTableData->tableMeta = pTableMeta;
|
||||||
|
|
||||||
tableMetaSml = (SSmlSTableMeta **)taosHashIterate(info->superTables, tableMetaSml);
|
tableMetaSml = (SSmlSTableMeta **)taosHashIterate(info->superTables, tableMetaSml);
|
||||||
|
taosHashCleanup(hashTmp);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
taosHashCleanup(hashTmp);
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
catalogRefreshTableMeta(info->pCatalog, &conn, &pName, 1);
|
catalogRefreshTableMeta(info->pCatalog, &conn, &pName, 1);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2057,10 +2084,6 @@ static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql) {
|
||||||
if (info->dataFormat) taosArrayDestroy(cols);
|
if (info->dataFormat) taosArrayDestroy(cols);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (taosArrayGetSize(cols) > TSDB_MAX_COLUMNS) {
|
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "too many columns than 4096", NULL);
|
|
||||||
return TSDB_CODE_PAR_TOO_MANY_COLUMNS;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasTable = true;
|
bool hasTable = true;
|
||||||
SSmlTableInfo *tinfo = NULL;
|
SSmlTableInfo *tinfo = NULL;
|
||||||
|
@ -2094,6 +2117,11 @@ static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql) {
|
||||||
return TSDB_CODE_PAR_INVALID_TAGS_NUM;
|
return TSDB_CODE_PAR_INVALID_TAGS_NUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (taosArrayGetSize(cols) + taosArrayGetSize((*oneTable)->tags) > TSDB_MAX_COLUMNS) {
|
||||||
|
smlBuildInvalidDataMsg(&info->msgBuf, "too many columns than 4096", NULL);
|
||||||
|
return TSDB_CODE_PAR_TOO_MANY_COLUMNS;
|
||||||
|
}
|
||||||
|
|
||||||
(*oneTable)->sTableName = elements.measure;
|
(*oneTable)->sTableName = elements.measure;
|
||||||
(*oneTable)->sTableNameLen = elements.measureLen;
|
(*oneTable)->sTableNameLen = elements.measureLen;
|
||||||
if (strlen((*oneTable)->childTableName) == 0) {
|
if (strlen((*oneTable)->childTableName) == 0) {
|
||||||
|
|
|
@ -765,6 +765,29 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
}
|
}
|
||||||
taosArrayPush(pRequest->tableList, &pName);
|
taosArrayPush(pRequest->tableList, &pName);
|
||||||
|
|
||||||
|
// change tag cid to new cid
|
||||||
|
if(pCreateReq->type == TSDB_CHILD_TABLE){
|
||||||
|
STableMeta* pTableMeta = NULL;
|
||||||
|
SName sName = {0};
|
||||||
|
toName(pTscObj->acctId, pRequest->pDb, pCreateReq->ctb.name, &sName);
|
||||||
|
code = catalogGetTableMeta(pCatalog, &conn, &sName, &pTableMeta);
|
||||||
|
if(code != TSDB_CODE_SUCCESS){
|
||||||
|
uError("taosCreateTable:catalogGetTableMeta failed. table name: %s", pCreateReq->ctb.name);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int32_t i = 0; i < taosArrayGetSize(pCreateReq->ctb.tagName); i++){
|
||||||
|
char* tName = taosArrayGet(pCreateReq->ctb.tagName, i);
|
||||||
|
for(int32_t j = pTableMeta->tableInfo.numOfColumns; j < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; j++){
|
||||||
|
SSchema *tag = &pTableMeta->schema[j];
|
||||||
|
if(strcmp(tag->name, tName) == 0 && tag->type != TSDB_DATA_TYPE_JSON){
|
||||||
|
tTagSetCid((STag *)pCreateReq->ctb.pTag, i, tag->colId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
|
}
|
||||||
|
|
||||||
SVgroupCreateTableBatch* pTableBatch = taosHashGet(pVgroupHashmap, &pInfo.vgId, sizeof(pInfo.vgId));
|
SVgroupCreateTableBatch* pTableBatch = taosHashGet(pVgroupHashmap, &pInfo.vgId, sizeof(pInfo.vgId));
|
||||||
if (pTableBatch == NULL) {
|
if (pTableBatch == NULL) {
|
||||||
SVgroupCreateTableBatch tBatch = {0};
|
SVgroupCreateTableBatch tBatch = {0};
|
||||||
|
@ -1305,6 +1328,7 @@ static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) {
|
||||||
SQuery* pQuery = NULL;
|
SQuery* pQuery = NULL;
|
||||||
SMqRspObj rspObj = {0};
|
SMqRspObj rspObj = {0};
|
||||||
SDecoder decoder = {0};
|
SDecoder decoder = {0};
|
||||||
|
STableMeta* pTableMeta = NULL;
|
||||||
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = TSDB_CODE_SUCCESS;
|
||||||
SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
|
SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
|
||||||
|
@ -1361,24 +1385,6 @@ static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t fLen = 0;
|
|
||||||
int32_t rowSize = 0;
|
|
||||||
int16_t nVar = 0;
|
|
||||||
for (int i = 0; i < pSW->nCols; i++) {
|
|
||||||
SSchema* schema = pSW->pSchema + i;
|
|
||||||
fLen += TYPE_BYTES[schema->type];
|
|
||||||
rowSize += schema->bytes;
|
|
||||||
if (IS_VAR_DATA_TYPE(schema->type)) {
|
|
||||||
nVar++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t rows = rspObj.resInfo.numOfRows;
|
|
||||||
int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
|
|
||||||
(int32_t)TD_BITMAP_BYTES(pSW->nCols - 1);
|
|
||||||
int32_t schemaLen = 0;
|
|
||||||
int32_t submitLen = sizeof(SSubmitBlk) + schemaLen + rows * extendedRowSize;
|
|
||||||
|
|
||||||
const char* tbName = (const char*)taosArrayGetP(rspObj.rsp.blockTbName, rspObj.resIter);
|
const char* tbName = (const char*)taosArrayGetP(rspObj.rsp.blockTbName, rspObj.resIter);
|
||||||
if (!tbName) {
|
if (!tbName) {
|
||||||
uError("WriteRaw: tbname is null");
|
uError("WriteRaw: tbname is null");
|
||||||
|
@ -1398,6 +1404,35 @@ static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
code = catalogGetTableMeta(pCatalog, &conn, &pName, &pTableMeta);
|
||||||
|
if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST){
|
||||||
|
uError("WriteRaw:catalogGetTableMeta table not exist. table name: %s", tbName);
|
||||||
|
code = TSDB_CODE_SUCCESS;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("WriteRaw:catalogGetTableMeta failed. table name: %s", tbName);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t fLen = 0;
|
||||||
|
int32_t rowSize = 0;
|
||||||
|
int16_t nVar = 0;
|
||||||
|
for (int i = 0; i < pTableMeta->tableInfo.numOfColumns; i++) {
|
||||||
|
SSchema* schema = &pTableMeta->schema[i];
|
||||||
|
fLen += TYPE_BYTES[schema->type];
|
||||||
|
rowSize += schema->bytes;
|
||||||
|
if (IS_VAR_DATA_TYPE(schema->type)) {
|
||||||
|
nVar++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t rows = rspObj.resInfo.numOfRows;
|
||||||
|
int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
|
||||||
|
(int32_t)TD_BITMAP_BYTES(pTableMeta->tableInfo.numOfColumns - 1);
|
||||||
|
int32_t schemaLen = 0;
|
||||||
|
int32_t submitLen = sizeof(SSubmitBlk) + schemaLen + rows * extendedRowSize;
|
||||||
|
|
||||||
SSubmitReq* subReq = NULL;
|
SSubmitReq* subReq = NULL;
|
||||||
SSubmitBlk* blk = NULL;
|
SSubmitBlk* blk = NULL;
|
||||||
void* hData = taosHashGet(pVgHash, &vgData.vg.vgId, sizeof(vgData.vg.vgId));
|
void* hData = taosHashGet(pVgHash, &vgData.vg.vgId, sizeof(vgData.vg.vgId));
|
||||||
|
@ -1430,23 +1465,25 @@ static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) {
|
||||||
blk = POINTER_SHIFT(vgData.data, sizeof(SSubmitReq));
|
blk = POINTER_SHIFT(vgData.data, sizeof(SSubmitReq));
|
||||||
}
|
}
|
||||||
|
|
||||||
STableMeta* pTableMeta = NULL;
|
// pSW->pSchema should be same as pTableMeta->schema
|
||||||
code = catalogGetTableMeta(pCatalog, &conn, &pName, &pTableMeta);
|
// ASSERT(pSW->nCols == pTableMeta->tableInfo.numOfColumns);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
uError("WriteRaw:catalogGetTableMeta failed. table name: %s", tbName);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
uint64_t suid = (TSDB_NORMAL_TABLE == pTableMeta->tableType ? 0 : pTableMeta->suid);
|
uint64_t suid = (TSDB_NORMAL_TABLE == pTableMeta->tableType ? 0 : pTableMeta->suid);
|
||||||
uint64_t uid = pTableMeta->uid;
|
uint64_t uid = pTableMeta->uid;
|
||||||
taosMemoryFreeClear(pTableMeta);
|
int16_t sver = pTableMeta->sversion;
|
||||||
|
|
||||||
void* blkSchema = POINTER_SHIFT(blk, sizeof(SSubmitBlk));
|
void* blkSchema = POINTER_SHIFT(blk, sizeof(SSubmitBlk));
|
||||||
STSRow* rowData = POINTER_SHIFT(blkSchema, schemaLen);
|
STSRow* rowData = POINTER_SHIFT(blkSchema, schemaLen);
|
||||||
|
|
||||||
SRowBuilder rb = {0};
|
SRowBuilder rb = {0};
|
||||||
tdSRowInit(&rb, pSW->version);
|
tdSRowInit(&rb, sver);
|
||||||
tdSRowSetTpInfo(&rb, pSW->nCols, fLen);
|
tdSRowSetTpInfo(&rb, pTableMeta->tableInfo.numOfColumns, fLen);
|
||||||
int32_t dataLen = 0;
|
int32_t totalLen = 0;
|
||||||
|
|
||||||
|
SHashObj* schemaHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
||||||
|
for (int i = 0; i < pSW->nCols; i++) {
|
||||||
|
SSchema* schema = &pSW->pSchema[i];
|
||||||
|
taosHashPut(schemaHash, schema->name, strlen(schema->name), &i, sizeof(int32_t));
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t j = 0; j < rows; j++) {
|
for (int32_t j = 0; j < rows; j++) {
|
||||||
tdSRowResetBuf(&rb, rowData);
|
tdSRowResetBuf(&rb, rowData);
|
||||||
|
@ -1455,33 +1492,41 @@ static int32_t tmqWriteRaw(TAOS* taos, void* data, int32_t dataLen) {
|
||||||
rspObj.resInfo.current += 1;
|
rspObj.resInfo.current += 1;
|
||||||
|
|
||||||
int32_t offset = 0;
|
int32_t offset = 0;
|
||||||
for (int32_t k = 0; k < pSW->nCols; k++) {
|
for (int32_t k = 0; k < pTableMeta->tableInfo.numOfColumns; k++) {
|
||||||
const SSchema* pColumn = &pSW->pSchema[k];
|
const SSchema* pColumn = &pTableMeta->schema[k];
|
||||||
char* data = rspObj.resInfo.row[k];
|
int32_t* index = taosHashGet(schemaHash, pColumn->name, strlen(pColumn->name));
|
||||||
if (!data) {
|
if(!index){
|
||||||
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
|
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
|
||||||
} else {
|
}else{
|
||||||
if (IS_VAR_DATA_TYPE(pColumn->type)) {
|
char* colData = rspObj.resInfo.row[*index];
|
||||||
data -= VARSTR_HEADER_SIZE;
|
if (!colData) {
|
||||||
|
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
|
||||||
|
} else {
|
||||||
|
if (IS_VAR_DATA_TYPE(pColumn->type)) {
|
||||||
|
colData -= VARSTR_HEADER_SIZE;
|
||||||
|
}
|
||||||
|
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, colData, true, offset, k);
|
||||||
}
|
}
|
||||||
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, data, true, offset, k);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += TYPE_BYTES[pColumn->type];
|
offset += TYPE_BYTES[pColumn->type];
|
||||||
}
|
}
|
||||||
tdSRowEnd(&rb);
|
tdSRowEnd(&rb);
|
||||||
int32_t rowLen = TD_ROW_LEN(rowData);
|
int32_t rowLen = TD_ROW_LEN(rowData);
|
||||||
rowData = POINTER_SHIFT(rowData, rowLen);
|
rowData = POINTER_SHIFT(rowData, rowLen);
|
||||||
dataLen += rowLen;
|
totalLen += rowLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosHashCleanup(schemaHash);
|
||||||
blk->uid = htobe64(uid);
|
blk->uid = htobe64(uid);
|
||||||
blk->suid = htobe64(suid);
|
blk->suid = htobe64(suid);
|
||||||
blk->sversion = htonl(pSW->version);
|
blk->sversion = htonl(sver);
|
||||||
blk->schemaLen = htonl(schemaLen);
|
blk->schemaLen = htonl(schemaLen);
|
||||||
blk->numOfRows = htonl(rows);
|
blk->numOfRows = htonl(rows);
|
||||||
blk->dataLen = htonl(dataLen);
|
blk->dataLen = htonl(totalLen);
|
||||||
subReq->length += sizeof(SSubmitBlk) + schemaLen + dataLen;
|
subReq->length += sizeof(SSubmitBlk) + schemaLen + totalLen;
|
||||||
subReq->numOfBlocks++;
|
subReq->numOfBlocks++;
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
|
pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
|
||||||
|
@ -1535,6 +1580,7 @@ end:
|
||||||
qDestroyQuery(pQuery);
|
qDestroyQuery(pQuery);
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
taosHashCleanup(pVgHash);
|
taosHashCleanup(pVgHash);
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1132,7 +1132,10 @@ int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
memcpy(&pRspWrapper->dataRsp, pMsg->pData, sizeof(SMqRspHead));
|
memcpy(&pRspWrapper->dataRsp, pMsg->pData, sizeof(SMqRspHead));
|
||||||
} else {
|
} else {
|
||||||
ASSERT(rspType == TMQ_MSG_TYPE__POLL_META_RSP);
|
ASSERT(rspType == TMQ_MSG_TYPE__POLL_META_RSP);
|
||||||
tDecodeSMqMetaRsp(POINTER_SHIFT(pMsg->pData, sizeof(SMqRspHead)), &pRspWrapper->metaRsp);
|
SDecoder decoder;
|
||||||
|
tDecoderInit(&decoder, POINTER_SHIFT(pMsg->pData, sizeof(SMqRspHead)), pMsg->len - sizeof(SMqRspHead));
|
||||||
|
tDecodeSMqMetaRsp(&decoder, &pRspWrapper->metaRsp);
|
||||||
|
tDecoderClear(&decoder);
|
||||||
memcpy(&pRspWrapper->metaRsp, pMsg->pData, sizeof(SMqRspHead));
|
memcpy(&pRspWrapper->metaRsp, pMsg->pData, sizeof(SMqRspHead));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1581,8 +1584,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
||||||
/*printf("vgId:%d, offset %" PRId64 " up to %" PRId64 "\n", pVg->vgId, pVg->currentOffset,
|
/*printf("vgId:%d, offset %" PRId64 " up to %" PRId64 "\n", pVg->vgId, pVg->currentOffset,
|
||||||
* rspMsg->msg.rspOffset);*/
|
* rspMsg->msg.rspOffset);*/
|
||||||
pVg->currentOffset.version = pollRspWrapper->metaRsp.rspOffset;
|
pVg->currentOffset = pollRspWrapper->metaRsp.rspOffset;
|
||||||
pVg->currentOffset.type = TMQ_OFFSET__LOG;
|
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
// build rsp
|
// build rsp
|
||||||
SMqMetaRspObj* pRsp = tmqBuildMetaRspFromWrapper(pollRspWrapper);
|
SMqMetaRspObj* pRsp = tmqBuildMetaRspFromWrapper(pollRspWrapper);
|
||||||
|
|
|
@ -692,3 +692,52 @@ TEST(testCase, smlParseTelnetLine_diff_json_type2_Test) {
|
||||||
ASSERT_NE(ret, 0);
|
ASSERT_NE(ret, 0);
|
||||||
smlDestroyInfo(info);
|
smlDestroyInfo(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(testCase, sml_col_4096_Test) {
|
||||||
|
SSmlHandle *info = smlBuildSmlInfo(NULL, NULL, TSDB_SML_LINE_PROTOCOL, TSDB_SML_TIMESTAMP_NANO_SECONDS);
|
||||||
|
ASSERT_NE(info, nullptr);
|
||||||
|
|
||||||
|
const char *sql[] = {
|
||||||
|
"spgwgvldxv,id=spgwgvldxv_1,t0=f c0=t,c1=t,c2=t,c3=t,c4=t,c5=t,c6=t,c7=t,c8=t,c9=t,c10=t,c11=t,c12=t,c13=t,c14=t,c15=t,c16=t,c17=t,c18=t,c19=t,c20=t,c21=t,c22=t,c23=t,c24=t,c25=t,c26=t,c27=t,c28=t,c29=t,c30=t,c31=t,c32=t,c33=t,c34=t,c35=t,c36=t,c37=t,c38=t,c39=t,c40=t,c41=t,c42=t,c43=t,c44=t,c45=t,c46=t,c47=t,c48=t,c49=t,c50=t,c51=t,c52=t,c53=t,c54=t,c55=t,c56=t,c57=t,c58=t,c59=t,c60=t,c61=t,c62=t,c63=t,c64=t,c65=t,c66=t,c67=t,c68=t,c69=t,c70=t,c71=t,c72=t,c73=t,c74=t,c75=t,c76=t,c77=t,c78=t,c79=t,c80=t,c81=t,c82=t,c83=t,c84=t,c85=t,c86=t,c87=t,c88=t,c89=t,c90=t,c91=t,c92=t,c93=t,c94=t,c95=t,c96=t,c97=t,c98=t,c99=t,c100=t,"
|
||||||
|
"c101=t,c102=t,c103=t,c104=t,c105=t,c106=t,c107=t,c108=t,c109=t,c110=t,c111=t,c112=t,c113=t,c114=t,c115=t,c116=t,c117=t,c118=t,c119=t,c120=t,c121=t,c122=t,c123=t,c124=t,c125=t,c126=t,c127=t,c128=t,c129=t,c130=t,c131=t,c132=t,c133=t,c134=t,c135=t,c136=t,c137=t,c138=t,c139=t,c140=t,c141=t,c142=t,c143=t,c144=t,c145=t,c146=t,c147=t,c148=t,c149=t,c150=t,c151=t,c152=t,c153=t,c154=t,c155=t,c156=t,c157=t,c158=t,c159=t,c160=t,c161=t,c162=t,c163=t,c164=t,c165=t,c166=t,c167=t,c168=t,c169=t,c170=t,c171=t,c172=t,c173=t,c174=t,c175=t,c176=t,c177=t,c178=t,c179=t,c180=t,c181=t,c182=t,c183=t,c184=t,c185=t,c186=t,c187=t,c188=t,c189=t,"
|
||||||
|
"c190=t,c191=t,c192=t,c193=t,c194=t,c195=t,c196=t,c197=t,c198=t,c199=t,c200=t,c201=t,c202=t,c203=t,c204=t,c205=t,c206=t,c207=t,c208=t,c209=t,c210=t,c211=t,c212=t,c213=t,c214=t,c215=t,c216=t,c217=t,c218=t,c219=t,c220=t,c221=t,c222=t,c223=t,c224=t,c225=t,c226=t,c227=t,c228=t,c229=t,c230=t,c231=t,c232=t,c233=t,c234=t,c235=t,c236=t,c237=t,c238=t,c239=t,c240=t,c241=t,c242=t,c243=t,c244=t,c245=t,c246=t,c247=t,c248=t,c249=t,c250=t,c251=t,c252=t,c253=t,c254=t,c255=t,c256=t,c257=t,c258=t,c259=t,c260=t,c261=t,c262=t,c263=t,c264=t,c265=t,c266=t,c267=t,c268=t,c269=t,c270=t,c271=t,c272=t,c273=t,c274=t,c275=t,c276=t,c277=t,c278=t,"
|
||||||
|
"c279=t,c280=t,c281=t,c282=t,c283=t,c284=t,c285=t,c286=t,c287=t,c288=t,c289=t,c290=t,c291=t,c292=t,c293=t,c294=t,c295=t,c296=t,c297=t,c298=t,c299=t,c300=t,c301=t,c302=t,c303=t,c304=t,c305=t,c306=t,c307=t,c308=t,c309=t,c310=t,c311=t,c312=t,c313=t,c314=t,c315=t,c316=t,c317=t,c318=t,c319=t,c320=t,c321=t,c322=t,c323=t,c324=t,c325=t,c326=t,c327=t,c328=t,c329=t,c330=t,c331=t,c332=t,c333=t,c334=t,c335=t,c336=t,c337=t,c338=t,c339=t,c340=t,c341=t,c342=t,c343=t,c344=t,c345=t,c346=t,c347=t,c348=t,c349=t,c350=t,c351=t,c352=t,c353=t,c354=t,c355=t,c356=t,c357=t,c358=t,c359=t,c360=t,c361=t,c362=t,c363=t,c364=t,c365=t,c366=t,c367=t,c368=t,c369=t,c370=t,c371=t,c372=t,c373=t,c374=t,c375=t,c376=t,c377=t,c378=t,c379=t,c380=t,c381=t,c382=t,c383=t,c384=t,c385=t,c386=t,c387=t,c388=t,c389=t,c390=t,c391=t,c392=t,c393=t,c394=t,c395=t,c396=t,c397=t,c398=t,c399=t,c400=t,c401=t,c402=t,c403=t,c404=t,c405=t,c406=t,c407=t,c408=t,c409=t,c410=t,c411=t,c412=t,c413=t,c414=t,c415=t,c416=t,c417=t,c418=t,c419=t,c420=t,c421=t,c422=t,c423=t,c424=t,c425=t,c426=t,c427=t,c428=t,c429=t,c430=t,c431=t,c432=t,c433=t,c434=t,c435=t,c436=t,c437=t,c438=t,c439=t,c440=t,c441=t,c442=t,c443=t,c444=t,c445=t,c446=t,"
|
||||||
|
"c447=t,c448=t,c449=t,c450=t,c451=t,c452=t,c453=t,c454=t,c455=t,c456=t,c457=t,c458=t,c459=t,c460=t,c461=t,c462=t,c463=t,c464=t,c465=t,c466=t,c467=t,c468=t,c469=t,c470=t,c471=t,c472=t,c473=t,c474=t,c475=t,c476=t,c477=t,c478=t,c479=t,c480=t,c481=t,c482=t,c483=t,c484=t,c485=t,c486=t,c487=t,c488=t,c489=t,c490=t,c491=t,c492=t,c493=t,c494=t,c495=t,c496=t,c497=t,c498=t,c499=t,c500=t,c501=t,c502=t,c503=t,c504=t,c505=t,c506=t,c507=t,c508=t,c509=t,c510=t,c511=t,c512=t,c513=t,c514=t,c515=t,c516=t,c517=t,c518=t,c519=t,c520=t,c521=t,c522=t,c523=t,c524=t,c525=t,c526=t,c527=t,c528=t,c529=t,c530=t,c531=t,c532=t,c533=t,c534=t,c535=t,c536=t,c537=t,c538=t,c539=t,c540=t,c541=t,c542=t,c543=t,c544=t,c545=t,c546=t,c547=t,c548=t,c549=t,c550=t,c551=t,c552=t,c553=t,c554=t,c555=t,c556=t,c557=t,c558=t,c559=t,c560=t,c561=t,c562=t,c563=t,c564=t,c565=t,c566=t,c567=t,c568=t,c569=t,c570=t,c571=t,c572=t,c573=t,c574=t,c575=t,c576=t,c577=t,c578=t,c579=t,c580=t,c581=t,c582=t,c583=t,c584=t,c585=t,c586=t,c587=t,c588=t,c589=t,c590=t,c591=t,c592=t,c593=t,c594=t,c595=t,c596=t,c597=t,c598=t,c599=t,c600=t,c601=t,c602=t,c603=t,c604=t,c605=t,c606=t,c607=t,c608=t,c609=t,c610=t,c611=t,c612=t,c613=t,c614=t,"
|
||||||
|
"c615=t,c616=t,c617=t,c618=t,c619=t,c620=t,c621=t,c622=t,c623=t,c624=t,c625=t,c626=t,c627=t,c628=t,c629=t,c630=t,c631=t,c632=t,c633=t,c634=t,c635=t,c636=t,c637=t,c638=t,c639=t,c640=t,c641=t,c642=t,c643=t,c644=t,c645=t,c646=t,c647=t,c648=t,c649=t,c650=t,c651=t,c652=t,c653=t,c654=t,c655=t,c656=t,c657=t,c658=t,c659=t,c660=t,c661=t,c662=t,c663=t,c664=t,c665=t,c666=t,c667=t,c668=t,c669=t,c670=t,c671=t,c672=t,c673=t,c674=t,c675=t,c676=t,c677=t,c678=t,c679=t,c680=t,c681=t,c682=t,c683=t,c684=t,c685=t,c686=t,c687=t,c688=t,c689=t,c690=t,c691=t,c692=t,c693=t,c694=t,c695=t,c696=t,c697=t,c698=t,c699=t,c700=t,c701=t,c702=t,c703=t,c704=t,c705=t,c706=t,c707=t,c708=t,c709=t,c710=t,c711=t,c712=t,c713=t,c714=t,c715=t,c716=t,c717=t,c718=t,c719=t,c720=t,c721=t,c722=t,c723=t,c724=t,c725=t,c726=t,c727=t,c728=t,c729=t,c730=t,c731=t,c732=t,c733=t,c734=t,c735=t,c736=t,c737=t,c738=t,c739=t,c740=t,c741=t,c742=t,c743=t,c744=t,c745=t,c746=t,c747=t,c748=t,c749=t,c750=t,c751=t,c752=t,c753=t,c754=t,c755=t,c756=t,c757=t,c758=t,c759=t,c760=t,c761=t,c762=t,c763=t,c764=t,c765=t,c766=t,c767=t,c768=t,c769=t,c770=t,c771=t,c772=t,c773=t,c774=t,c775=t,c776=t,c777=t,c778=t,c779=t,c780=t,c781=t,c782=t,"
|
||||||
|
"c783=t,c784=t,c785=t,c786=t,c787=t,c788=t,c789=t,c790=t,c791=t,c792=t,c793=t,c794=t,c795=t,c796=t,c797=t,c798=t,c799=t,c800=t,c801=t,c802=t,c803=t,c804=t,c805=t,c806=t,c807=t,c808=t,c809=t,c810=t,c811=t,c812=t,c813=t,"
|
||||||
|
"c814=t,c815=t,c816=t,c817=t,c818=t,c819=t,c820=t,c821=t,c822=t,c823=t,c824=t,c825=t,c826=t,c827=t,c828=t,c829=t,c830=t,c831=t,c832=t,c833=t,c834=t,c835=t,c836=t,c837=t,c838=t,c839=t,c840=t,c841=t,c842=t,c843=t,c844=t,c845=t,c846=t,c847=t,c848=t,c849=t,c850=t,c851=t,c852=t,c853=t,c854=t,c855=t,c856=t,c857=t,c858=t,c859=t,c860=t,c861=t,c862=t,"
|
||||||
|
"c863=t,c864=t,c865=t,c866=t,c867=t,c868=t,c869=t,c870=t,c871=t,c872=t,c873=t,c874=t,c875=t,c876=t,c877=t,c878=t,c879=t,c880=t,c881=t,c882=t,c883=t,c884=t,c885=t,c886=t,c887=t,c888=t,c889=t,c890=t,c891=t,c892=t,c893=t,c894=t,c895=t,c896=t,c897=t,c898=t,c899=t,c900=t,c901=t,c902=t,c903=t,c904=t,c905=t,c906=t,c907=t,c908=t,c909=t,c910=t,c911=t,c912=t,c913=t,c914=t,c915=t,c916=t,c917=t,c918=t,c919=t,c920=t,c921=t,c922=t,c923=t,c924=t,c925=t,c926=t,c927=t,c928=t,c929=t,c930=t,c931=t,c932=t,c933=t,c934=t,c935=t,c936=t,c937=t,c938=t,c939=t,c940=t,c941=t,c942=t,c943=t,c944=t,c945=t,c946=t,c947=t,c948=t,c949=t,c950=t,c951=t,c952=t,c953=t,c954=t,c955=t,c956=t,c957=t,c958=t,c959=t,c960=t,c961=t,c962=t,c963=t,c964=t,c965=t,c966=t,c967=t,c968=t,c969=t,c970=t,c971=t,c972=t,c973=t,c974=t,c975=t,c976=t,c977=t,c978=t,c979=t,c980=t,c981=t,c982=t,c983=t,c984=t,c985=t,c986=t,c987=t,c988=t,c989=t,c990=t,c991=t,c992=t,c993=t,c994=t,c995=t,c996=t,c997=t,c998=t,c999=t,c1000=t,c1001=t,c1002=t,c1003=t,c1004=t,c1005=t,c1006=t,c1007=t,c1008=t,c1009=t,c1010=t,c1011=t,c1012=t,c1013=t,c1014=t,c1015=t,c1016=t,c1017=t,c1018=t,c1019=t,c1020=t,c1021=t,c1022=t,c1023=t,c1024=t,c1025=t,c1026=t,"
|
||||||
|
"c1027=t,c1028=t,c1029=t,c1030=t,c1031=t,c1032=t,c1033=t,c1034=t,c1035=t,c1036=t,c1037=t,c1038=t,c1039=t,c1040=t,c1041=t,c1042=t,c1043=t,c1044=t,c1045=t,c1046=t,c1047=t,c1048=t,c1049=t,c1050=t,c1051=t,c1052=t,c1053=t,c1054=t,c1055=t,c1056=t,c1057=t,c1058=t,c1059=t,c1060=t,c1061=t,c1062=t,c1063=t,c1064=t,c1065=t,c1066=t,c1067=t,c1068=t,c1069=t,c1070=t,c1071=t,c1072=t,c1073=t,c1074=t,c1075=t,c1076=t,c1077=t,c1078=t,c1079=t,c1080=t,c1081=t,c1082=t,c1083=t,c1084=t,c1085=t,c1086=t,c1087=t,c1088=t,c1089=t,c1090=t,c1091=t,c1092=t,c1093=t,c1094=t,c1095=t,c1096=t,c1097=t,c1098=t,c1099=t,c1100=t,c1101=t,c1102=t,c1103=t,c1104=t,c1105=t,c1106=t,c1107=t,c1108=t,c1109=t,c1110=t,c1111=t,c1112=t,c1113=t,c1114=t,c1115=t,c1116=t,c1117=t,c1118=t,c1119=t,c1120=t,c1121=t,c1122=t,c1123=t,c1124=t,c1125=t,c1126=t,c1127=t,c1128=t,c1129=t,c1130=t,c1131=t,c1132=t,c1133=t,c1134=t,c1135=t,c1136=t,c1137=t,c1138=t,c1139=t,c1140=t,c1141=t,c1142=t,c1143=t,c1144=t,c1145=t,c1146=t,c1147=t,c1148=t,c1149=t,c1150=t,c1151=t,c1152=t,c1153=t,c1154=t,c1155=t,c1156=t,c1157=t,c1158=t,c1159=t,c1160=t,c1161=t,c1162=t,c1163=t,c1164=t,c1165=t,c1166=t,c1167=t,c1168=t,c1169=t,c1170=t,c1171=t,c1172=t,c1173=t,"
|
||||||
|
"c1174=t,c1175=t,c1176=t,c1177=t,c1178=t,c1179=t,c1180=t,c1181=t,c1182=t,c1183=t,c1184=t,c1185=t,c1186=t,c1187=t,c1188=t,c1189=t,c1190=t,c1191=t,c1192=t,c1193=t,c1194=t,c1195=t,c1196=t,c1197=t,c1198=t,c1199=t,c1200=t,c1201=t,c1202=t,c1203=t,c1204=t,c1205=t,c1206=t,c1207=t,c1208=t,c1209=t,c1210=t,c1211=t,c1212=t,c1213=t,c1214=t,c1215=t,c1216=t,c1217=t,c1218=t,c1219=t,c1220=t,c1221=t,c1222=t,c1223=t,c1224=t,c1225=t,c1226=t,c1227=t,c1228=t,c1229=t,c1230=t,c1231=t,c1232=t,c1233=t,c1234=t,c1235=t,c1236=t,c1237=t,c1238=t,c1239=t,c1240=t,c1241=t,c1242=t,c1243=t,c1244=t,c1245=t,c1246=t,c1247=t,c1248=t,c1249=t,c1250=t,c1251=t,c1252=t,c1253=t,c1254=t,c1255=t,c1256=t,c1257=t,c1258=t,c1259=t,c1260=t,c1261=t,c1262=t,c1263=t,c1264=t,c1265=t,c1266=t,c1267=t,c1268=t,c1269=t,c1270=t,c1271=t,c1272=t,c1273=t,c1274=t,c1275=t,c1276=t,c1277=t,c1278=t,c1279=t,c1280=t,c1281=t,c1282=t,c1283=t,c1284=t,c1285=t,c1286=t,c1287=t,c1288=t,c1289=t,c1290=t,c1291=t,c1292=t,c1293=t,c1294=t,c1295=t,c1296=t,c1297=t,c1298=t,c1299=t,c1300=t,c1301=t,c1302=t,c1303=t,c1304=t,c1305=t,c1306=t,c1307=t,c1308=t,c1309=t,c1310=t,c1311=t,c1312=t,c1313=t,c1314=t,c1315=t,c1316=t,c1317=t,c1318=t,c1319=t,c1320=t,"
|
||||||
|
"c1321=t,c1322=t,c1323=t,c1324=t,c1325=t,c1326=t,c1327=t,c1328=t,c1329=t,c1330=t,c1331=t,c1332=t,c1333=t,c1334=t,c1335=t,c1336=t,c1337=t,c1338=t,c1339=t,c1340=t,c1341=t,c1342=t,c1343=t,c1344=t,c1345=t,c1346=t,c1347=t,"
|
||||||
|
"c1348=t,c1349=t,c1350=t,c1351=t,c1352=t,c1353=t,c1354=t,c1355=t,c1356=t,c1357=t,c1358=t,c1359=t,c1360=t,c1361=t,c1362=t,c1363=t,c1364=t,c1365=t,c1366=t,c1367=t,c1368=t,c1369=t,c1370=t,c1371=t,c1372=t,c1373=t,c1374=t,c1375=t,c1376=t,c1377=t,c1378=t,c1379=t,c1380=t,c1381=t,c1382=t,c1383=t,c1384=t,c1385=t,c1386=t,c1387=t,c1388=t,c1389=t,c1390=t,c1391=t,c1392=t,c1393=t,c1394=t,c1395=t,c1396=t,c1397=t,c1398=t,c1399=t,c1400=t,c1401=t,c1402=t,c1403=t,c1404=t,c1405=t,c1406=t,c1407=t,c1408=t,c1409=t,c1410=t,c1411=t,c1412=t,c1413=t,c1414=t,c1415=t,c1416=t,c1417=t,c1418=t,c1419=t,c1420=t,c1421=t,c1422=t,c1423=t,c1424=t,c1425=t,c1426=t,c1427=t,c1428=t,c1429=t,c1430=t,c1431=t,c1432=t,c1433=t,c1434=t,c1435=t,c1436=t,c1437=t,c1438=t,c1439=t,c1440=t,c1441=t,c1442=t,c1443=t,c1444=t,c1445=t,c1446=t,c1447=t,c1448=t,c1449=t,c1450=t,c1451=t,c1452=t,c1453=t,c1454=t,c1455=t,c1456=t,c1457=t,c1458=t,c1459=t,c1460=t,c1461=t,c1462=t,c1463=t,c1464=t,c1465=t,c1466=t,c1467=t,c1468=t,c1469=t,c1470=t,c1471=t,c1472=t,c1473=t,c1474=t,c1475=t,c1476=t,c1477=t,c1478=t,c1479=t,c1480=t,c1481=t,c1482=t,c1483=t,c1484=t,c1485=t,c1486=t,c1487=t,c1488=t,c1489=t,c1490=t,c1491=t,c1492=t,c1493=t,c1494=t,"
|
||||||
|
"c1495=t,c1496=t,c1497=t,c1498=t,c1499=t,c1500=t,c1501=t,c1502=t,c1503=t,c1504=t,c1505=t,c1506=t,c1507=t,c1508=t,c1509=t,c1510=t,c1511=t,c1512=t,c1513=t,c1514=t,c1515=t,c1516=t,c1517=t,c1518=t,c1519=t,c1520=t,c1521=t,c1522=t,c1523=t,c1524=t,c1525=t,c1526=t,c1527=t,c1528=t,c1529=t,c1530=t,c1531=t,c1532=t,c1533=t,c1534=t,c1535=t,c1536=t,c1537=t,c1538=t,c1539=t,c1540=t,c1541=t,c1542=t,c1543=t,c1544=t,c1545=t,c1546=t,c1547=t,c1548=t,c1549=t,c1550=t,c1551=t,c1552=t,c1553=t,c1554=t,c1555=t,c1556=t,c1557=t,c1558=t,c1559=t,c1560=t,c1561=t,c1562=t,c1563=t,c1564=t,c1565=t,c1566=t,c1567=t,c1568=t,c1569=t,c1570=t,c1571=t,c1572=t,c1573=t,c1574=t,c1575=t,c1576=t,c1577=t,c1578=t,c1579=t,c1580=t,c1581=t,c1582=t,c1583=t,c1584=t,c1585=t,c1586=t,c1587=t,c1588=t,c1589=t,c1590=t,c1591=t,c1592=t,c1593=t,c1594=t,c1595=t,c1596=t,c1597=t,c1598=t,c1599=t,c1600=t,c1601=t,c1602=t,c1603=t,c1604=t,c1605=t,c1606=t,c1607=t,c1608=t,c1609=t,c1610=t,c1611=t,c1612=t,c1613=t,c1614=t,c1615=t,c1616=t,c1617=t,c1618=t,c1619=t,c1620=t,c1621=t,c1622=t,c1623=t,c1624=t,c1625=t,c1626=t,c1627=t,c1628=t,c1629=t,c1630=t,c1631=t,c1632=t,c1633=t,c1634=t,c1635=t,c1636=t,c1637=t,c1638=t,c1639=t,c1640=t,c1641=t,"
|
||||||
|
"c1642=t,c1643=t,c1644=t,c1645=t,c1646=t,c1647=t,c1648=t,c1649=t,c1650=t,c1651=t,c1652=t,c1653=t,c1654=t,c1655=t,c1656=t,c1657=t,c1658=t,c1659=t,c1660=t,c1661=t,c1662=t,c1663=t,c1664=t,c1665=t,c1666=t,c1667=t,c1668=t,c1669=t,c1670=t,c1671=t,c1672=t,c1673=t,c1674=t,c1675=t,c1676=t,c1677=t,c1678=t,c1679=t,c1680=t,c1681=t,c1682=t,c1683=t,c1684=t,c1685=t,c1686=t,c1687=t,c1688=t,c1689=t,c1690=t,c1691=t,c1692=t,c1693=t,c1694=t,c1695=t,c1696=t,c1697=t,c1698=t,c1699=t,c1700=t,c1701=t,c1702=t,c1703=t,c1704=t,c1705=t,c1706=t,c1707=t,c1708=t,c1709=t,c1710=t,c1711=t,c1712=t,c1713=t,c1714=t,c1715=t,c1716=t,c1717=t,c1718=t,c1719=t,c1720=t,c1721=t,c1722=t,c1723=t,c1724=t,c1725=t,c1726=t,c1727=t,c1728=t,c1729=t,c1730=t,c1731=t,c1732=t,c1733=t,c1734=t,c1735=t,c1736=t,c1737=t,c1738=t,c1739=t,c1740=t,c1741=t,c1742=t,c1743=t,c1744=t,c1745=t,c1746=t,c1747=t,c1748=t,c1749=t,c1750=t,c1751=t,c1752=t,c1753=t,c1754=t,c1755=t,c1756=t,c1757=t,c1758=t,c1759=t,c1760=t,c1761=t,c1762=t,c1763=t,c1764=t,c1765=t,c1766=t,c1767=t,c1768=t,c1769=t,c1770=t,c1771=t,c1772=t,c1773=t,c1774=t,c1775=t,c1776=t,c1777=t,c1778=t,c1779=t,c1780=t,c1781=t,c1782=t,c1783=t,c1784=t,c1785=t,c1786=t,c1787=t,c1788=t,"
|
||||||
|
"c1789=t,c1790=t,c1791=t,c1792=t,c1793=t,c1794=t,c1795=t,c1796=t,c1797=t,c1798=t,c1799=t,c1800=t,c1801=t,c1802=t,c1803=t,c1804=t,c1805=t,c1806=t,c1807=t,c1808=t,c1809=t,c1810=t,c1811=t,c1812=t,c1813=t,c1814=t,c1815=t,"
|
||||||
|
"c1816=t,c1817=t,c1818=t,c1819=t,c1820=t,c1821=t,c1822=t,c1823=t,c1824=t,c1825=t,c1826=t,c1827=t,c1828=t,c1829=t,c1830=t,c1831=t,c1832=t,c1833=t,c1834=t,c1835=t,c1836=t,c1837=t,c1838=t,c1839=t,c1840=t,c1841=t,c1842=t,c1843=t,c1844=t,c1845=t,c1846=t,c1847=t,c1848=t,c1849=t,c1850=t,c1851=t,c1852=t,c1853=t,c1854=t,c1855=t,c1856=t,c1857=t,c1858=t,c1859=t,c1860=t,c1861=t,c1862=t,c1863=t,c1864=t,c1865=t,c1866=t,c1867=t,c1868=t,c1869=t,c1870=t,c1871=t,c1872=t,c1873=t,c1874=t,c1875=t,c1876=t,c1877=t,c1878=t,c1879=t,c1880=t,c1881=t,c1882=t,c1883=t,c1884=t,c1885=t,c1886=t,c1887=t,c1888=t,c1889=t,c1890=t,c1891=t,c1892=t,c1893=t,c1894=t,c1895=t,c1896=t,c1897=t,c1898=t,c1899=t,c1900=t,c1901=t,c1902=t,c1903=t,c1904=t,c1905=t,c1906=t,c1907=t,c1908=t,c1909=t,c1910=t,c1911=t,c1912=t,c1913=t,c1914=t,c1915=t,c1916=t,c1917=t,c1918=t,c1919=t,c1920=t,c1921=t,c1922=t,c1923=t,c1924=t,c1925=t,c1926=t,c1927=t,c1928=t,c1929=t,c1930=t,c1931=t,c1932=t,c1933=t,c1934=t,c1935=t,c1936=t,c1937=t,c1938=t,c1939=t,c1940=t,c1941=t,c1942=t,c1943=t,c1944=t,c1945=t,c1946=t,c1947=t,c1948=t,c1949=t,c1950=t,c1951=t,c1952=t,c1953=t,c1954=t,c1955=t,c1956=t,c1957=t,c1958=t,c1959=t,c1960=t,c1961=t,c1962=t,"
|
||||||
|
"c1963=t,c1964=t,c1965=t,c1966=t,c1967=t,c1968=t,c1969=t,c1970=t,c1971=t,c1972=t,c1973=t,c1974=t,c1975=t,c1976=t,c1977=t,c1978=t,c1979=t,c1980=t,c1981=t,c1982=t,c1983=t,c1984=t,c1985=t,c1986=t,c1987=t,c1988=t,c1989=t,c1990=t,c1991=t,c1992=t,c1993=t,c1994=t,c1995=t,c1996=t,c1997=t,c1998=t,c1999=t,c2000=t,c2001=t,c2002=t,c2003=t,c2004=t,c2005=t,c2006=t,c2007=t,c2008=t,c2009=t,c2010=t,c2011=t,c2012=t,c2013=t,c2014=t,c2015=t,c2016=t,c2017=t,c2018=t,c2019=t,c2020=t,c2021=t,c2022=t,c2023=t,c2024=t,c2025=t,c2026=t,c2027=t,c2028=t,c2029=t,c2030=t,c2031=t,c2032=t,c2033=t,c2034=t,c2035=t,c2036=t,c2037=t,c2038=t,c2039=t,c2040=t,c2041=t,c2042=t,c2043=t,c2044=t,c2045=t,c2046=t,c2047=t,c2048=t,c2049=t,c2050=t,c2051=t,c2052=t,c2053=t,c2054=t,c2055=t,c2056=t,c2057=t,c2058=t,c2059=t,c2060=t,c2061=t,c2062=t,c2063=t,c2064=t,c2065=t,c2066=t,c2067=t,c2068=t,c2069=t,c2070=t,c2071=t,c2072=t,c2073=t,c2074=t,c2075=t,c2076=t,c2077=t,c2078=t,c2079=t,c2080=t,c2081=t,c2082=t,c2083=t,c2084=t,c2085=t,c2086=t,c2087=t,c2088=t,c2089=t,c2090=t,c2091=t,c2092=t,c2093=t,c2094=t,c2095=t,c2096=t,c2097=t,c2098=t,c2099=t,c2100=t,c2101=t,c2102=t,c2103=t,c2104=t,c2105=t,c2106=t,c2107=t,c2108=t,c2109=t,"
|
||||||
|
"c2110=t,c2111=t,c2112=t,c2113=t,c2114=t,c2115=t,c2116=t,c2117=t,c2118=t,c2119=t,c2120=t,c2121=t,c2122=t,c2123=t,c2124=t,c2125=t,c2126=t,c2127=t,c2128=t,c2129=t,c2130=t,c2131=t,c2132=t,c2133=t,c2134=t,c2135=t,c2136=t,c2137=t,c2138=t,c2139=t,c2140=t,c2141=t,c2142=t,c2143=t,c2144=t,c2145=t,c2146=t,c2147=t,c2148=t,c2149=t,c2150=t,c2151=t,c2152=t,c2153=t,c2154=t,c2155=t,c2156=t,c2157=t,c2158=t,c2159=t,c2160=t,c2161=t,c2162=t,c2163=t,c2164=t,c2165=t,c2166=t,c2167=t,c2168=t,c2169=t,c2170=t,c2171=t,c2172=t,c2173=t,c2174=t,c2175=t,c2176=t,c2177=t,c2178=t,c2179=t,c2180=t,c2181=t,c2182=t,c2183=t,c2184=t,c2185=t,c2186=t,c2187=t,c2188=t,c2189=t,c2190=t,c2191=t,c2192=t,c2193=t,c2194=t,c2195=t,c2196=t,c2197=t,c2198=t,c2199=t,c2200=t,c2201=t,c2202=t,c2203=t,c2204=t,c2205=t,c2206=t,c2207=t,c2208=t,c2209=t,c2210=t,c2211=t,c2212=t,c2213=t,c2214=t,c2215=t,c2216=t,c2217=t,c2218=t,c2219=t,c2220=t,c2221=t,c2222=t,c2223=t,c2224=t,c2225=t,c2226=t,c2227=t,c2228=t,c2229=t,c2230=t,c2231=t,c2232=t,c2233=t,c2234=t,c2235=t,c2236=t,c2237=t,c2238=t,c2239=t,c2240=t,c2241=t,c2242=t,c2243=t,c2244=t,c2245=t,c2246=t,c2247=t,c2248=t,c2249=t,c2250=t,c2251=t,c2252=t,c2253=t,c2254=t,c2255=t,c2256=t,"
|
||||||
|
"c2257=t,c2258=t,c2259=t,c2260=t,c2261=t,c2262=t,c2263=t,c2264=t,c2265=t,c2266=t,c2267=t,c2268=t,c2269=t,c2270=t,c2271=t,c2272=t,c2273=t,c2274=t,c2275=t,c2276=t,c2277=t,c2278=t,c2279=t,c2280=t,c2281=t,c2282=t,c2283=t,"
|
||||||
|
"c2284=t,c2285=t,c2286=t,c2287=t,c2288=t,c2289=t,c2290=t,c2291=t,c2292=t,c2293=t,c2294=t,c2295=t,c2296=t,c2297=t,c2298=t,c2299=t,c2300=t,c2301=t,c2302=t,c2303=t,c2304=t,c2305=t,c2306=t,c2307=t,c2308=t,c2309=t,c2310=t,c2311=t,c2312=t,c2313=t,c2314=t,c2315=t,c2316=t,c2317=t,c2318=t,c2319=t,c2320=t,c2321=t,c2322=t,c2323=t,c2324=t,c2325=t,c2326=t,c2327=t,c2328=t,c2329=t,c2330=t,c2331=t,c2332=t,c2333=t,c2334=t,c2335=t,c2336=t,c2337=t,c2338=t,c2339=t,c2340=t,c2341=t,c2342=t,c2343=t,c2344=t,c2345=t,c2346=t,c2347=t,c2348=t,c2349=t,c2350=t,c2351=t,c2352=t,c2353=t,c2354=t,c2355=t,c2356=t,c2357=t,c2358=t,c2359=t,c2360=t,c2361=t,c2362=t,c2363=t,c2364=t,c2365=t,c2366=t,c2367=t,c2368=t,c2369=t,c2370=t,c2371=t,c2372=t,c2373=t,c2374=t,c2375=t,c2376=t,c2377=t,c2378=t,c2379=t,c2380=t,c2381=t,c2382=t,c2383=t,c2384=t,c2385=t,c2386=t,c2387=t,c2388=t,c2389=t,c2390=t,c2391=t,c2392=t,c2393=t,c2394=t,c2395=t,c2396=t,c2397=t,c2398=t,c2399=t,c2400=t,c2401=t,c2402=t,c2403=t,c2404=t,c2405=t,c2406=t,c2407=t,c2408=t,c2409=t,c2410=t,c2411=t,c2412=t,c2413=t,c2414=t,c2415=t,c2416=t,c2417=t,c2418=t,c2419=t,c2420=t,c2421=t,c2422=t,c2423=t,c2424=t,c2425=t,c2426=t,c2427=t,c2428=t,c2429=t,c2430=t,"
|
||||||
|
"c2431=t,c2432=t,c2433=t,c2434=t,c2435=t,c2436=t,c2437=t,c2438=t,c2439=t,c2440=t,c2441=t,c2442=t,c2443=t,c2444=t,c2445=t,c2446=t,c2447=t,c2448=t,c2449=t,c2450=t,c2451=t,c2452=t,c2453=t,c2454=t,c2455=t,c2456=t,c2457=t,c2458=t,c2459=t,c2460=t,c2461=t,c2462=t,c2463=t,c2464=t,c2465=t,c2466=t,c2467=t,c2468=t,c2469=t,c2470=t,c2471=t,c2472=t,c2473=t,c2474=t,c2475=t,c2476=t,c2477=t,c2478=t,c2479=t,c2480=t,c2481=t,c2482=t,c2483=t,c2484=t,c2485=t,c2486=t,c2487=t,c2488=t,c2489=t,c2490=t,c2491=t,c2492=t,c2493=t,c2494=t,c2495=t,c2496=t,c2497=t,c2498=t,c2499=t,c2500=t,c2501=t,c2502=t,c2503=t,c2504=t,c2505=t,c2506=t,c2507=t,c2508=t,c2509=t,c2510=t,c2511=t,c2512=t,c2513=t,c2514=t,c2515=t,c2516=t,c2517=t,c2518=t,c2519=t,c2520=t,c2521=t,c2522=t,c2523=t,c2524=t,c2525=t,c2526=t,c2527=t,c2528=t,c2529=t,c2530=t,c2531=t,c2532=t,c2533=t,c2534=t,c2535=t,c2536=t,c2537=t,c2538=t,c2539=t,c2540=t,c2541=t,c2542=t,c2543=t,c2544=t,c2545=t,c2546=t,c2547=t,c2548=t,c2549=t,c2550=t,c2551=t,c2552=t,c2553=t,c2554=t,c2555=t,c2556=t,c2557=t,c2558=t,c2559=t,c2560=t,c2561=t,c2562=t,c2563=t,c2564=t,c2565=t,c2566=t,c2567=t,c2568=t,c2569=t,c2570=t,c2571=t,c2572=t,c2573=t,c2574=t,c2575=t,c2576=t,c2577=t,"
|
||||||
|
"c2578=t,c2579=t,c2580=t,c2581=t,c2582=t,c2583=t,c2584=t,c2585=t,c2586=t,c2587=t,c2588=t,c2589=t,c2590=t,c2591=t,c2592=t,c2593=t,c2594=t,c2595=t,c2596=t,c2597=t,c2598=t,c2599=t,c2600=t,c2601=t,c2602=t,c2603=t,c2604=t,c2605=t,c2606=t,c2607=t,c2608=t,c2609=t,c2610=t,c2611=t,c2612=t,c2613=t,c2614=t,c2615=t,c2616=t,c2617=t,c2618=t,c2619=t,c2620=t,c2621=t,c2622=t,c2623=t,c2624=t,c2625=t,c2626=t,c2627=t,c2628=t,c2629=t,c2630=t,c2631=t,c2632=t,c2633=t,c2634=t,c2635=t,c2636=t,c2637=t,c2638=t,c2639=t,c2640=t,c2641=t,c2642=t,c2643=t,c2644=t,c2645=t,c2646=t,c2647=t,c2648=t,c2649=t,c2650=t,c2651=t,c2652=t,c2653=t,c2654=t,c2655=t,c2656=t,c2657=t,c2658=t,c2659=t,c2660=t,c2661=t,c2662=t,c2663=t,c2664=t,c2665=t,c2666=t,c2667=t,c2668=t,c2669=t,c2670=t,c2671=t,c2672=t,c2673=t,c2674=t,c2675=t,c2676=t,c2677=t,c2678=t,c2679=t,c2680=t,c2681=t,c2682=t,c2683=t,c2684=t,c2685=t,c2686=t,c2687=t,c2688=t,c2689=t,c2690=t,c2691=t,c2692=t,c2693=t,c2694=t,c2695=t,c2696=t,c2697=t,c2698=t,c2699=t,c2700=t,c2701=t,c2702=t,c2703=t,c2704=t,c2705=t,c2706=t,c2707=t,c2708=t,c2709=t,c2710=t,c2711=t,c2712=t,c2713=t,c2714=t,c2715=t,c2716=t,c2717=t,c2718=t,c2719=t,c2720=t,c2721=t,c2722=t,c2723=t,c2724=t,"
|
||||||
|
"c2725=t,c2726=t,c2727=t,c2728=t,c2729=t,c2730=t,c2731=t,c2732=t,c2733=t,c2734=t,c2735=t,c2736=t,c2737=t,c2738=t,c2739=t,c2740=t,c2741=t,c2742=t,c2743=t,c2744=t,c2745=t,c2746=t,c2747=t,c2748=t,c2749=t,c2750=t,c2751=t,c2752=t,c2753=t,c2754=t,c2755=t,c2756=t,c2757=t,c2758=t,c2759=t,c2760=t,c2761=t,c2762=t,c2763=t,c2764=t,c2765=t,c2766=t,c2767=t,c2768=t,c2769=t,c2770=t,c2771=t,c2772=t,c2773=t,c2774=t,c2775=t,c2776=t,c2777=t,c2778=t,c2779=t,c2780=t,c2781=t,c2782=t,c2783=t,c2784=t,c2785=t,c2786=t,c2787=t,c2788=t,c2789=t,c2790=t,c2791=t,c2792=t,c2793=t,c2794=t,c2795=t,c2796=t,c2797=t,c2798=t,c2799=t,c2800=t,c2801=t,c2802=t,c2803=t,c2804=t,c2805=t,c2806=t,c2807=t,c2808=t,c2809=t,c2810=t,c2811=t,c2812=t,c2813=t,c2814=t,c2815=t,c2816=t,c2817=t,c2818=t,c2819=t,c2820=t,c2821=t,c2822=t,c2823=t,c2824=t,c2825=t,c2826=t,c2827=t,c2828=t,c2829=t,c2830=t,c2831=t,c2832=t,c2833=t,c2834=t,c2835=t,c2836=t,c2837=t,c2838=t,c2839=t,c2840=t,c2841=t,c2842=t,c2843=t,c2844=t,c2845=t,c2846=t,c2847=t,c2848=t,c2849=t,c2850=t,c2851=t,c2852=t,c2853=t,c2854=t,c2855=t,c2856=t,c2857=t,c2858=t,c2859=t,c2860=t,c2861=t,c2862=t,c2863=t,c2864=t,c2865=t,c2866=t,c2867=t,c2868=t,c2869=t,c2870=t,c2871=t,"
|
||||||
|
"c2872=t,c2873=t,c2874=t,c2875=t,c2876=t,c2877=t,c2878=t,c2879=t,c2880=t,c2881=t,c2882=t,c2883=t,c2884=t,c2885=t,c2886=t,c2887=t,c2888=t,c2889=t,c2890=t,c2891=t,c2892=t,c2893=t,c2894=t,c2895=t,c2896=t,c2897=t,c2898=t,c2899=t,c2900=t,c2901=t,c2902=t,c2903=t,c2904=t,c2905=t,c2906=t,c2907=t,c2908=t,c2909=t,c2910=t,c2911=t,c2912=t,c2913=t,c2914=t,c2915=t,c2916=t,c2917=t,c2918=t,c2919=t,c2920=t,c2921=t,c2922=t,c2923=t,c2924=t,c2925=t,c2926=t,c2927=t,c2928=t,c2929=t,c2930=t,c2931=t,c2932=t,c2933=t,c2934=t,c2935=t,c2936=t,c2937=t,c2938=t,c2939=t,c2940=t,c2941=t,c2942=t,c2943=t,c2944=t,c2945=t,c2946=t,c2947=t,c2948=t,c2949=t,c2950=t,c2951=t,c2952=t,c2953=t,c2954=t,c2955=t,c2956=t,c2957=t,c2958=t,c2959=t,c2960=t,c2961=t,c2962=t,c2963=t,c2964=t,c2965=t,c2966=t,c2967=t,c2968=t,c2969=t,c2970=t,c2971=t,c2972=t,c2973=t,c2974=t,c2975=t,c2976=t,c2977=t,c2978=t,c2979=t,c2980=t,c2981=t,c2982=t,c2983=t,c2984=t,c2985=t,c2986=t,c2987=t,c2988=t,c2989=t,c2990=t,c2991=t,c2992=t,c2993=t,c2994=t,c2995=t,c2996=t,c2997=t,c2998=t,c2999=t,c3000=t,c3001=t,c3002=t,c3003=t,c3004=t,c3005=t,c3006=t,c3007=t,c3008=t,c3009=t,c3010=t,c3011=t,c3012=t,c3013=t,c3014=t,c3015=t,c3016=t,c3017=t,c3018=t,"
|
||||||
|
"c3019=t,c3020=t,c3021=t,c3022=t,c3023=t,c3024=t,c3025=t,c3026=t,c3027=t,c3028=t,c3029=t,c3030=t,c3031=t,c3032=t,c3033=t,c3034=t,c3035=t,c3036=t,c3037=t,c3038=t,c3039=t,c3040=t,c3041=t,c3042=t,c3043=t,c3044=t,c3045=t,c3046=t,c3047=t,c3048=t,c3049=t,c3050=t,c3051=t,c3052=t,c3053=t,c3054=t,c3055=t,c3056=t,c3057=t,c3058=t,c3059=t,c3060=t,c3061=t,c3062=t,c3063=t,c3064=t,c3065=t,c3066=t,c3067=t,c3068=t,c3069=t,c3070=t,c3071=t,c3072=t,c3073=t,c3074=t,c3075=t,c3076=t,c3077=t,c3078=t,c3079=t,c3080=t,c3081=t,c3082=t,c3083=t,c3084=t,c3085=t,c3086=t,c3087=t,c3088=t,c3089=t,c3090=t,c3091=t,c3092=t,c3093=t,c3094=t,c3095=t,c3096=t,c3097=t,c3098=t,c3099=t,c3100=t,c3101=t,c3102=t,c3103=t,c3104=t,c3105=t,c3106=t,c3107=t,c3108=t,c3109=t,c3110=t,c3111=t,c3112=t,c3113=t,c3114=t,c3115=t,c3116=t,c3117=t,c3118=t,c3119=t,c3120=t,c3121=t,c3122=t,c3123=t,c3124=t,c3125=t,c3126=t,c3127=t,c3128=t,c3129=t,c3130=t,c3131=t,c3132=t,c3133=t,c3134=t,c3135=t,c3136=t,c3137=t,c3138=t,c3139=t,c3140=t,c3141=t,c3142=t,c3143=t,c3144=t,c3145=t,c3146=t,c3147=t,c3148=t,c3149=t,c3150=t,c3151=t,c3152=t,c3153=t,c3154=t,c3155=t,c3156=t,c3157=t,c3158=t,c3159=t,c3160=t,c3161=t,c3162=t,c3163=t,c3164=t,c3165=t,"
|
||||||
|
"c3166=t,c3167=t,c3168=t,c3169=t,c3170=t,c3171=t,c3172=t,c3173=t,c3174=t,c3175=t,c3176=t,c3177=t,c3178=t,c3179=t,c3180=t,c3181=t,c3182=t,c3183=t,c3184=t,c3185=t,c3186=t,c3187=t,c3188=t,c3189=t,c3190=t,c3191=t,c3192=t,c3193=t,c3194=t,c3195=t,c3196=t,c3197=t,c3198=t,c3199=t,c3200=t,c3201=t,c3202=t,c3203=t,c3204=t,c3205=t,c3206=t,c3207=t,c3208=t,c3209=t,c3210=t,c3211=t,c3212=t,c3213=t,c3214=t,c3215=t,c3216=t,c3217=t,c3218=t,c3219=t,c3220=t,c3221=t,c3222=t,c3223=t,c3224=t,c3225=t,c3226=t,c3227=t,c3228=t,c3229=t,c3230=t,c3231=t,c3232=t,c3233=t,c3234=t,c3235=t,c3236=t,c3237=t,c3238=t,c3239=t,c3240=t,c3241=t,c3242=t,c3243=t,c3244=t,c3245=t,c3246=t,c3247=t,c3248=t,c3249=t,c3250=t,c3251=t,c3252=t,c3253=t,c3254=t,c3255=t,c3256=t,c3257=t,c3258=t,c3259=t,c3260=t,c3261=t,c3262=t,c3263=t,c3264=t,c3265=t,c3266=t,c3267=t,c3268=t,c3269=t,c3270=t,c3271=t,c3272=t,c3273=t,c3274=t,c3275=t,c3276=t,c3277=t,c3278=t,c3279=t,c3280=t,c3281=t,c3282=t,c3283=t,c3284=t,c3285=t,c3286=t,c3287=t,c3288=t,c3289=t,c3290=t,c3291=t,c3292=t,c3293=t,c3294=t,c3295=t,c3296=t,c3297=t,c3298=t,c3299=t,c3300=t,c3301=t,c3302=t,c3303=t,c3304=t,c3305=t,c3306=t,c3307=t,c3308=t,c3309=t,c3310=t,c3311=t,c3312=t,"
|
||||||
|
"c3313=t,c3314=t,c3315=t,c3316=t,c3317=t,c3318=t,c3319=t,c3320=t,c3321=t,c3322=t,c3323=t,c3324=t,c3325=t,c3326=t,c3327=t,c3328=t,c3329=t,c3330=t,c3331=t,c3332=t,c3333=t,c3334=t,c3335=t,c3336=t,c3337=t,c3338=t,c3339=t,c3340=t,c3341=t,c3342=t,c3343=t,c3344=t,c3345=t,c3346=t,c3347=t,c3348=t,c3349=t,c3350=t,c3351=t,c3352=t,c3353=t,c3354=t,c3355=t,c3356=t,c3357=t,c3358=t,c3359=t,c3360=t,c3361=t,c3362=t,c3363=t,c3364=t,c3365=t,c3366=t,c3367=t,c3368=t,c3369=t,c3370=t,c3371=t,c3372=t,c3373=t,c3374=t,c3375=t,c3376=t,c3377=t,c3378=t,c3379=t,c3380=t,c3381=t,c3382=t,c3383=t,c3384=t,c3385=t,c3386=t,c3387=t,c3388=t,c3389=t,c3390=t,c3391=t,c3392=t,c3393=t,c3394=t,c3395=t,c3396=t,c3397=t,c3398=t,c3399=t,c3400=t,c3401=t,c3402=t,c3403=t,c3404=t,c3405=t,c3406=t,c3407=t,c3408=t,c3409=t,c3410=t,c3411=t,c3412=t,c3413=t,c3414=t,c3415=t,c3416=t,c3417=t,c3418=t,c3419=t,c3420=t,c3421=t,c3422=t,c3423=t,c3424=t,c3425=t,c3426=t,c3427=t,c3428=t,c3429=t,c3430=t,c3431=t,c3432=t,c3433=t,c3434=t,c3435=t,c3436=t,c3437=t,c3438=t,c3439=t,c3440=t,c3441=t,c3442=t,c3443=t,c3444=t,c3445=t,c3446=t,c3447=t,c3448=t,c3449=t,c3450=t,c3451=t,c3452=t,c3453=t,c3454=t,c3455=t,c3456=t,c3457=t,c3458=t,c3459=t,"
|
||||||
|
"c3460=t,c3461=t,c3462=t,c3463=t,c3464=t,c3465=t,c3466=t,c3467=t,c3468=t,c3469=t,c3470=t,c3471=t,c3472=t,c3473=t,c3474=t,c3475=t,c3476=t,c3477=t,c3478=t,c3479=t,c3480=t,c3481=t,c3482=t,c3483=t,c3484=t,c3485=t,c3486=t,c3487=t,c3488=t,c3489=t,c3490=t,c3491=t,c3492=t,c3493=t,c3494=t,c3495=t,c3496=t,c3497=t,c3498=t,c3499=t,c3500=t,c3501=t,c3502=t,c3503=t,c3504=t,c3505=t,c3506=t,c3507=t,c3508=t,c3509=t,c3510=t,c3511=t,c3512=t,c3513=t,"
|
||||||
|
"c3514=t,c3515=t,c3516=t,c3517=t,c3518=t,c3519=t,c3520=t,c3521=t,c3522=t,c3523=t,c3524=t,c3525=t,c3526=t,c3527=t,c3528=t,c3529=t,c3530=t,c3531=t,c3532=t,c3533=t,c3534=t,c3535=t,c3536=t,c3537=t,c3538=t,c3539=t,c3540=t,c3541=t,c3542=t,c3543=t,c3544=t,c3545=t,c3546=t,c3547=t,c3548=t,c3549=t,c3550=t,c3551=t,c3552=t,c3553=t,c3554=t,c3555=t,c3556=t,c3557=t,c3558=t,c3559=t,c3560=t,c3561=t,c3562=t,c3563=t,c3564=t,c3565=t,c3566=t,c3567=t,c3568=t,c3569=t,c3570=t,c3571=t,c3572=t,c3573=t,c3574=t,c3575=t,c3576=t,c3577=t,c3578=t,c3579=t,c3580=t,c3581=t,c3582=t,c3583=t,c3584=t,c3585=t,c3586=t,c3587=t,c3588=t,c3589=t,c3590=t,c3591=t,c3592=t,c3593=t,c3594=t,c3595=t,c3596=t,c3597=t,c3598=t,c3599=t,c3600=t,c3601=t,c3602=t,c3603=t,c3604=t,c3605=t,c3606=t,c3607=t,c3608=t,c3609=t,c3610=t,c3611=t,c3612=t,c3613=t,c3614=t,c3615=t,c3616=t,c3617=t,c3618=t,c3619=t,c3620=t,c3621=t,c3622=t,c3623=t,c3624=t,c3625=t,c3626=t,c3627=t,c3628=t,c3629=t,c3630=t,c3631=t,c3632=t,c3633=t,c3634=t,c3635=t,c3636=t,c3637=t,c3638=t,c3639=t,c3640=t,c3641=t,c3642=t,c3643=t,c3644=t,c3645=t,c3646=t,c3647=t,c3648=t,c3649=t,c3650=t,c3651=t,c3652=t,c3653=t,c3654=t,c3655=t,c3656=t,c3657=t,c3658=t,c3659=t,c3660=t,"
|
||||||
|
"c3661=t,c3662=t,c3663=t,c3664=t,c3665=t,c3666=t,c3667=t,c3668=t,c3669=t,c3670=t,c3671=t,c3672=t,c3673=t,c3674=t,c3675=t,c3676=t,c3677=t,c3678=t,c3679=t,c3680=t,c3681=t,c3682=t,c3683=t,c3684=t,c3685=t,c3686=t,c3687=t,c3688=t,c3689=t,c3690=t,c3691=t,c3692=t,c3693=t,c3694=t,c3695=t,c3696=t,c3697=t,c3698=t,c3699=t,c3700=t,c3701=t,c3702=t,c3703=t,c3704=t,c3705=t,c3706=t,c3707=t,c3708=t,c3709=t,c3710=t,c3711=t,c3712=t,c3713=t,c3714=t,c3715=t,c3716=t,c3717=t,c3718=t,c3719=t,c3720=t,c3721=t,c3722=t,c3723=t,c3724=t,c3725=t,c3726=t,c3727=t,c3728=t,c3729=t,c3730=t,c3731=t,c3732=t,c3733=t,c3734=t,c3735=t,c3736=t,c3737=t,c3738=t,c3739=t,c3740=t,c3741=t,c3742=t,c3743=t,c3744=t,c3745=t,c3746=t,c3747=t,c3748=t,c3749=t,c3750=t,c3751=t,c3752=t,c3753=t,c3754=t,c3755=t,c3756=t,c3757=t,c3758=t,c3759=t,c3760=t,c3761=t,c3762=t,c3763=t,c3764=t,c3765=t,c3766=t,c3767=t,c3768=t,c3769=t,c3770=t,c3771=t,c3772=t,c3773=t,c3774=t,c3775=t,c3776=t,c3777=t,c3778=t,c3779=t,c3780=t,c3781=t,c3782=t,c3783=t,c3784=t,c3785=t,c3786=t,c3787=t,c3788=t,c3789=t,c3790=t,c3791=t,c3792=t,c3793=t,c3794=t,c3795=t,c3796=t,c3797=t,c3798=t,c3799=t,c3800=t,c3801=t,c3802=t,c3803=t,c3804=t,c3805=t,c3806=t,c3807=t,"
|
||||||
|
"c3808=t,c3809=t,c3810=t,c3811=t,c3812=t,c3813=t,c3814=t,c3815=t,c3816=t,c3817=t,c3818=t,c3819=t,c3820=t,c3821=t,c3822=t,c3823=t,c3824=t,c3825=t,c3826=t,c3827=t,c3828=t,c3829=t,c3830=t,c3831=t,c3832=t,c3833=t,c3834=t,c3835=t,c3836=t,c3837=t,c3838=t,c3839=t,c3840=t,c3841=t,c3842=t,c3843=t,c3844=t,c3845=t,c3846=t,c3847=t,c3848=t,c3849=t,c3850=t,c3851=t,c3852=t,c3853=t,c3854=t,c3855=t,c3856=t,c3857=t,c3858=t,c3859=t,c3860=t,c3861=t,c3862=t,c3863=t,c3864=t,c3865=t,c3866=t,c3867=t,c3868=t,c3869=t,c3870=t,c3871=t,c3872=t,c3873=t,c3874=t,c3875=t,c3876=t,c3877=t,c3878=t,c3879=t,c3880=t,c3881=t,c3882=t,c3883=t,c3884=t,c3885=t,c3886=t,c3887=t,c3888=t,c3889=t,c3890=t,c3891=t,c3892=t,c3893=t,c3894=t,c3895=t,c3896=t,c3897=t,c3898=t,c3899=t,c3900=t,c3901=t,c3902=t,c3903=t,c3904=t,c3905=t,c3906=t,c3907=t,c3908=t,c3909=t,c3910=t,c3911=t,c3912=t,c3913=t,c3914=t,c3915=t,c3916=t,c3917=t,c3918=t,c3919=t,c3920=t,c3921=t,c3922=t,c3923=t,c3924=t,c3925=t,c3926=t,c3927=t,c3928=t,c3929=t,c3930=t,c3931=t,c3932=t,c3933=t,c3934=t,c3935=t,c3936=t,c3937=t,c3938=t,c3939=t,c3940=t,c3941=t,c3942=t,c3943=t,c3944=t,c3945=t,c3946=t,c3947=t,c3948=t,c3949=t,c3950=t,c3951=t,c3952=t,c3953=t,c3954=t,"
|
||||||
|
"c3955=t,c3956=t,c3957=t,c3958=t,c3959=t,c3960=t,c3961=t,c3962=t,c3963=t,c3964=t,c3965=t,c3966=t,c3967=t,c3968=t,c3969=t,c3970=t,c3971=t,c3972=t,c3973=t,c3974=t,c3975=t,c3976=t,c3977=t,c3978=t,c3979=t,c3980=t,c3981=t,c3982=t,c3983=t,c3984=t,c3985=t,c3986=t,c3987=t,c3988=t,c3989=t,c3990=t,c3991=t,c3992=t,c3993=t,c3994=t,c3995=t,c3996=t,c3997=t,c3998=t,c3999=t,c4000=t,c4001=t,c4002=t,c4003=t,c4004=t,c4005=t,c4006=t,c4007=t,c4008=t,c4009=t,c4010=t,c4011=t,c4012=t,c4013=t,c4014=t,c4015=t,c4016=t,c4017=t,c4018=t,c4019=t,c4020=t,c4021=t,c4022=t,c4023=t,c4024=t,c4025=t,c4026=t,c4027=t,c4028=t,c4029=t,c4030=t,c4031=t,c4032=t,c4033=t,c4034=t,c4035=t,c4036=t,c4037=t,c4038=t,c4039=t,c4040=t,c4041=t,c4042=t,c4043=t,c4044=t,c4045=t,c4046=t,c4047=t,c4048=t,c4049=t,c4050=t,c4051=t,c4052=t,c4053=t,c4054=t,c4055=t,c4056=t,c4057=t,c4058=t,c4059=t,c4060=t,c4061=t,c4062=t,c4063=t,c4064=t,c4065=t,c4066=t,c4067=t,c4068=t,c4069=t,c4070=t,c4071=t,c4072=t,c4073=t,c4074=t,c4075=t,c4076=t,c4077=t,c4078=t,c4079=t,c4080=t,c4081=t,c4082=t,c4083=t,c4084=t,c4085=t,c4086=t,c4087=t,c4088=t,c4089=t,c4090=t,c4091=t,c4092=t,c4093=t 1626006833640000000"
|
||||||
|
};
|
||||||
|
|
||||||
|
int ret = TSDB_CODE_SUCCESS;
|
||||||
|
for(int i = 0; i < sizeof(sql)/sizeof(sql[0]); i++){
|
||||||
|
ret = smlParseInfluxLine(info, sql[i]);
|
||||||
|
if(ret != TSDB_CODE_SUCCESS) break;
|
||||||
|
}
|
||||||
|
ASSERT_NE(ret, 0);
|
||||||
|
smlDestroyInfo(info);
|
||||||
|
}
|
||||||
|
|
|
@ -1228,6 +1228,7 @@ void blockDataFreeRes(SSDataBlock* pBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(pBlock->pDataBlock);
|
taosArrayDestroy(pBlock->pDataBlock);
|
||||||
|
pBlock->pDataBlock = NULL;
|
||||||
taosMemoryFreeClear(pBlock->pBlockAgg);
|
taosMemoryFreeClear(pBlock->pBlockAgg);
|
||||||
memset(&pBlock->info, 0, sizeof(SDataBlockInfo));
|
memset(&pBlock->info, 0, sizeof(SDataBlockInfo));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1064,6 +1064,26 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tTagSetCid(const STag *pTag, int16_t iTag, int16_t cid) {
|
||||||
|
uint8_t *p = NULL;
|
||||||
|
int8_t isLarge = pTag->flags & TD_TAG_LARGE;
|
||||||
|
int16_t offset = 0;
|
||||||
|
|
||||||
|
if (isLarge) {
|
||||||
|
p = (uint8_t *)&((int16_t *)pTag->idx)[pTag->nTag];
|
||||||
|
} else {
|
||||||
|
p = (uint8_t *)&pTag->idx[pTag->nTag];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLarge) {
|
||||||
|
offset = ((int16_t *)pTag->idx)[iTag];
|
||||||
|
} else {
|
||||||
|
offset = pTag->idx[iTag];
|
||||||
|
}
|
||||||
|
|
||||||
|
tPutI16v(p + offset, cid);
|
||||||
|
}
|
||||||
|
|
||||||
#if 1 // ===================================================================================================================
|
#if 1 // ===================================================================================================================
|
||||||
int tdInitTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version) {
|
int tdInitTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version) {
|
||||||
if (pBuilder == NULL) return -1;
|
if (pBuilder == NULL) return -1;
|
||||||
|
|
|
@ -5675,7 +5675,7 @@ void tFreeSMCreateStbRsp(SMCreateStbRsp *pRsp) {
|
||||||
|
|
||||||
int32_t tEncodeSTqOffsetVal(SEncoder *pEncoder, const STqOffsetVal *pOffsetVal) {
|
int32_t tEncodeSTqOffsetVal(SEncoder *pEncoder, const STqOffsetVal *pOffsetVal) {
|
||||||
if (tEncodeI8(pEncoder, pOffsetVal->type) < 0) return -1;
|
if (tEncodeI8(pEncoder, pOffsetVal->type) < 0) return -1;
|
||||||
if (pOffsetVal->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
if (pOffsetVal->type == TMQ_OFFSET__SNAPSHOT_DATA || pOffsetVal->type == TMQ_OFFSET__SNAPSHOT_META) {
|
||||||
if (tEncodeI64(pEncoder, pOffsetVal->uid) < 0) return -1;
|
if (tEncodeI64(pEncoder, pOffsetVal->uid) < 0) return -1;
|
||||||
if (tEncodeI64(pEncoder, pOffsetVal->ts) < 0) return -1;
|
if (tEncodeI64(pEncoder, pOffsetVal->ts) < 0) return -1;
|
||||||
} else if (pOffsetVal->type == TMQ_OFFSET__LOG) {
|
} else if (pOffsetVal->type == TMQ_OFFSET__LOG) {
|
||||||
|
@ -5690,7 +5690,7 @@ int32_t tEncodeSTqOffsetVal(SEncoder *pEncoder, const STqOffsetVal *pOffsetVal)
|
||||||
|
|
||||||
int32_t tDecodeSTqOffsetVal(SDecoder *pDecoder, STqOffsetVal *pOffsetVal) {
|
int32_t tDecodeSTqOffsetVal(SDecoder *pDecoder, STqOffsetVal *pOffsetVal) {
|
||||||
if (tDecodeI8(pDecoder, &pOffsetVal->type) < 0) return -1;
|
if (tDecodeI8(pDecoder, &pOffsetVal->type) < 0) return -1;
|
||||||
if (pOffsetVal->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
if (pOffsetVal->type == TMQ_OFFSET__SNAPSHOT_DATA || pOffsetVal->type == TMQ_OFFSET__SNAPSHOT_META) {
|
||||||
if (tDecodeI64(pDecoder, &pOffsetVal->uid) < 0) return -1;
|
if (tDecodeI64(pDecoder, &pOffsetVal->uid) < 0) return -1;
|
||||||
if (tDecodeI64(pDecoder, &pOffsetVal->ts) < 0) return -1;
|
if (tDecodeI64(pDecoder, &pOffsetVal->ts) < 0) return -1;
|
||||||
} else if (pOffsetVal->type == TMQ_OFFSET__LOG) {
|
} else if (pOffsetVal->type == TMQ_OFFSET__LOG) {
|
||||||
|
@ -5712,10 +5712,8 @@ int32_t tFormatOffset(char *buf, int32_t maxLen, const STqOffsetVal *pVal) {
|
||||||
snprintf(buf, maxLen, "offset(reset to latest)");
|
snprintf(buf, maxLen, "offset(reset to latest)");
|
||||||
} else if (pVal->type == TMQ_OFFSET__LOG) {
|
} else if (pVal->type == TMQ_OFFSET__LOG) {
|
||||||
snprintf(buf, maxLen, "offset(log) ver:%" PRId64, pVal->version);
|
snprintf(buf, maxLen, "offset(log) ver:%" PRId64, pVal->version);
|
||||||
} else if (pVal->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
} else if (pVal->type == TMQ_OFFSET__SNAPSHOT_DATA || pVal->type == TMQ_OFFSET__SNAPSHOT_META) {
|
||||||
snprintf(buf, maxLen, "offset(ss data) uid:%" PRId64 ", ts:%" PRId64, pVal->uid, pVal->ts);
|
snprintf(buf, maxLen, "offset(ss data) uid:%" PRId64 ", ts:%" PRId64, pVal->uid, pVal->ts);
|
||||||
} else if (pVal->type == TMQ_OFFSET__SNAPSHOT_META) {
|
|
||||||
snprintf(buf, maxLen, "offset(ss meta) uid:%" PRId64 ", ts:%" PRId64, pVal->uid, pVal->ts);
|
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
@ -5729,9 +5727,7 @@ bool tOffsetEqual(const STqOffsetVal *pLeft, const STqOffsetVal *pRight) {
|
||||||
} else if (pLeft->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
} else if (pLeft->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
return pLeft->uid == pRight->uid && pLeft->ts == pRight->ts;
|
return pLeft->uid == pRight->uid && pLeft->ts == pRight->ts;
|
||||||
} else if (pLeft->type == TMQ_OFFSET__SNAPSHOT_META) {
|
} else if (pLeft->type == TMQ_OFFSET__SNAPSHOT_META) {
|
||||||
ASSERT(0);
|
return pLeft->uid == pRight->uid;
|
||||||
// TODO
|
|
||||||
return pLeft->uid == pRight->uid && pLeft->ts == pRight->ts;
|
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
/*ASSERT(pLeft->type == TMQ_OFFSET__RESET_NONE || pLeft->type == TMQ_OFFSET__RESET_EARLIEAST ||*/
|
/*ASSERT(pLeft->type == TMQ_OFFSET__RESET_NONE || pLeft->type == TMQ_OFFSET__RESET_EARLIEAST ||*/
|
||||||
|
@ -5816,6 +5812,21 @@ int32_t tDecodeDeleteRes(SDecoder *pCoder, SDeleteRes *pRes) {
|
||||||
if (tDecodeCStrTo(pCoder, pRes->tsColName) < 0) return -1;
|
if (tDecodeCStrTo(pCoder, pRes->tsColName) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tEncodeSMqMetaRsp(SEncoder* pEncoder, const SMqMetaRsp* pRsp) {
|
||||||
|
if (tEncodeSTqOffsetVal(pEncoder, &pRsp->rspOffset) < 0) return -1;
|
||||||
|
if(tEncodeI16(pEncoder, pRsp->resMsgType)) return -1;
|
||||||
|
if(tEncodeBinary(pEncoder, pRsp->metaRsp, pRsp->metaRspLen)) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDecodeSMqMetaRsp(SDecoder* pDecoder, SMqMetaRsp* pRsp) {
|
||||||
|
if (tDecodeSTqOffsetVal(pDecoder, &pRsp->rspOffset) < 0) return -1;
|
||||||
|
if (tDecodeI16(pDecoder, &pRsp->resMsgType) < 0) return -1;
|
||||||
|
if (tDecodeBinaryAlloc(pDecoder, &pRsp->metaRsp, (uint64_t*)&pRsp->metaRspLen) < 0) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tEncodeSMqDataRsp(SEncoder *pEncoder, const SMqDataRsp *pRsp) {
|
int32_t tEncodeSMqDataRsp(SEncoder *pEncoder, const SMqDataRsp *pRsp) {
|
||||||
if (tEncodeSTqOffsetVal(pEncoder, &pRsp->reqOffset) < 0) return -1;
|
if (tEncodeSTqOffsetVal(pEncoder, &pRsp->reqOffset) < 0) return -1;
|
||||||
if (tEncodeSTqOffsetVal(pEncoder, &pRsp->rspOffset) < 0) return -1;
|
if (tEncodeSTqOffsetVal(pEncoder, &pRsp->rspOffset) < 0) return -1;
|
||||||
|
|
|
@ -536,7 +536,7 @@ int32_t mndCheckCreateStbReq(SMCreateStbReq *pCreate) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfColumns > TSDB_MAX_COLUMNS) {
|
if (pCreate->numOfColumns < TSDB_MIN_COLUMNS || pCreate->numOfTags + pCreate->numOfColumns > TSDB_MAX_COLUMNS) {
|
||||||
terrno = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
|
terrno = TSDB_CODE_PAR_INVALID_COLUMNS_NUM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,6 +157,31 @@ void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity);
|
||||||
size_t tsdbCacheGetCapacity(SVnode *pVnode);
|
size_t tsdbCacheGetCapacity(SVnode *pVnode);
|
||||||
|
|
||||||
// tq
|
// tq
|
||||||
|
typedef struct SMetaTableInfo{
|
||||||
|
int64_t suid;
|
||||||
|
int64_t uid;
|
||||||
|
SSchemaWrapper *schema;
|
||||||
|
char tbName[TSDB_TABLE_NAME_LEN];
|
||||||
|
}SMetaTableInfo;
|
||||||
|
|
||||||
|
typedef struct SIdInfo{
|
||||||
|
int64_t version;
|
||||||
|
int32_t index;
|
||||||
|
}SIdInfo;
|
||||||
|
|
||||||
|
typedef struct SSnapContext {
|
||||||
|
SMeta *pMeta;
|
||||||
|
int64_t snapVersion;
|
||||||
|
TBC *pCur;
|
||||||
|
int64_t suid;
|
||||||
|
int8_t subType;
|
||||||
|
SHashObj *idVersion;
|
||||||
|
SHashObj *suidInfo;
|
||||||
|
SArray *idList;
|
||||||
|
int32_t index;
|
||||||
|
bool withMeta;
|
||||||
|
bool queryMetaOrData; // true-get meta, false-get data
|
||||||
|
}SSnapContext;
|
||||||
|
|
||||||
typedef struct STqReader {
|
typedef struct STqReader {
|
||||||
int64_t ver;
|
int64_t ver;
|
||||||
|
@ -207,6 +232,12 @@ int32_t vnodeSnapWriterOpen(SVnode *pVnode, int64_t sver, int64_t ever, SVSnapWr
|
||||||
int32_t vnodeSnapWriterClose(SVSnapWriter *pWriter, int8_t rollback, SSnapshot *pSnapshot);
|
int32_t vnodeSnapWriterClose(SVSnapWriter *pWriter, int8_t rollback, SSnapshot *pSnapshot);
|
||||||
int32_t vnodeSnapWrite(SVSnapWriter *pWriter, uint8_t *pData, uint32_t nData);
|
int32_t vnodeSnapWrite(SVSnapWriter *pWriter, uint8_t *pData, uint32_t nData);
|
||||||
|
|
||||||
|
int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t subType, bool withMeta, SSnapContext** ctxRet);
|
||||||
|
int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, int16_t *type, int64_t *uid);
|
||||||
|
SMetaTableInfo getUidfromSnapShot(SSnapContext* ctx);
|
||||||
|
int32_t setForSnapShot(SSnapContext* ctx, int64_t uid);
|
||||||
|
int32_t destroySnapContext(SSnapContext* ctx);
|
||||||
|
|
||||||
// structs
|
// structs
|
||||||
struct STsdbCfg {
|
struct STsdbCfg {
|
||||||
int8_t precision;
|
int8_t precision;
|
||||||
|
|
|
@ -68,27 +68,27 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* qmsg;
|
char* qmsg;
|
||||||
qTaskInfo_t task;
|
|
||||||
} STqExecCol;
|
} STqExecCol;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t suid;
|
int64_t suid;
|
||||||
} STqExecTb;
|
} STqExecTb;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SHashObj* pFilterOutTbUid;
|
SHashObj* pFilterOutTbUid;
|
||||||
} STqExecDb;
|
} STqExecDb;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t subType;
|
int8_t subType;
|
||||||
|
|
||||||
STqReader* pExecReader;
|
STqReader* pExecReader;
|
||||||
|
qTaskInfo_t task;
|
||||||
union {
|
union {
|
||||||
STqExecCol execCol;
|
STqExecCol execCol;
|
||||||
STqExecTb execTb;
|
STqExecTb execTb;
|
||||||
STqExecDb execDb;
|
STqExecDb execDb;
|
||||||
};
|
};
|
||||||
int32_t numOfCols; // number of out pout column, temporarily used
|
// int32_t numOfCols; // number of out pout column, temporarily used
|
||||||
SSchemaWrapper* pSchemaWrapper; // columns that are involved in query
|
SSchemaWrapper* pSchemaWrapper; // columns that are involved in query
|
||||||
} STqExecHandle;
|
} STqExecHandle;
|
||||||
|
|
||||||
|
@ -101,7 +101,6 @@ typedef struct {
|
||||||
|
|
||||||
int64_t snapshotVer;
|
int64_t snapshotVer;
|
||||||
|
|
||||||
// TODO remove
|
|
||||||
SWalReader* pWalReader;
|
SWalReader* pWalReader;
|
||||||
|
|
||||||
SWalRef* pRef;
|
SWalRef* pRef;
|
||||||
|
@ -141,7 +140,7 @@ int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle);
|
||||||
int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle);
|
int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle);
|
||||||
|
|
||||||
// tqRead
|
// tqRead
|
||||||
int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVal* offset);
|
int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp* pMetaRsp, STqOffsetVal* offset);
|
||||||
int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHead** pHeadWithCkSum);
|
int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHead** pHeadWithCkSum);
|
||||||
|
|
||||||
// tqExec
|
// tqExec
|
||||||
|
@ -182,6 +181,11 @@ static FORCE_INLINE void tqOffsetResetToData(STqOffsetVal* pOffsetVal, int64_t u
|
||||||
pOffsetVal->ts = ts;
|
pOffsetVal->ts = ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tqOffsetResetToMeta(STqOffsetVal* pOffsetVal, int64_t uid) {
|
||||||
|
pOffsetVal->type = TMQ_OFFSET__SNAPSHOT_META;
|
||||||
|
pOffsetVal->uid = uid;
|
||||||
|
}
|
||||||
|
|
||||||
static FORCE_INLINE void tqOffsetResetToLog(STqOffsetVal* pOffsetVal, int64_t ver) {
|
static FORCE_INLINE void tqOffsetResetToLog(STqOffsetVal* pOffsetVal, int64_t ver) {
|
||||||
pOffsetVal->type = TMQ_OFFSET__LOG;
|
pOffsetVal->type = TMQ_OFFSET__LOG;
|
||||||
pOffsetVal->version = ver;
|
pOffsetVal->version = ver;
|
||||||
|
|
|
@ -887,6 +887,37 @@ const void *metaGetTableTagVal(void *pTag, int16_t type, STagVal *val) {
|
||||||
if (!find) {
|
if (!find) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TAG_FILTER_DEBUG
|
||||||
|
if (IS_VAR_DATA_TYPE(val->type)) {
|
||||||
|
char* buf = taosMemoryCalloc(val->nData + 1, 1);
|
||||||
|
memcpy(buf, val->pData, val->nData);
|
||||||
|
metaDebug("metaTag table val varchar index:%d cid:%d type:%d value:%s", 1, val->cid, val->type, buf);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
} else {
|
||||||
|
double dval = 0;
|
||||||
|
GET_TYPED_DATA(dval, double, val->type, &val->i64);
|
||||||
|
metaDebug("metaTag table val number index:%d cid:%d type:%d value:%f", 1, val->cid, val->type, dval);
|
||||||
|
}
|
||||||
|
|
||||||
|
SArray* pTagVals = NULL;
|
||||||
|
tTagToValArray((STag*)pTag, &pTagVals);
|
||||||
|
for (int i = 0; i < taosArrayGetSize(pTagVals); i++) {
|
||||||
|
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, i);
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pTagVal->type)) {
|
||||||
|
char* buf = taosMemoryCalloc(pTagVal->nData + 1, 1);
|
||||||
|
memcpy(buf, pTagVal->pData, pTagVal->nData);
|
||||||
|
metaDebug("metaTag table varchar index:%d cid:%d type:%d value:%s", i, pTagVal->cid, pTagVal->type, buf);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
} else {
|
||||||
|
double dval = 0;
|
||||||
|
GET_TYPED_DATA(dval, double, pTagVal->type, &pTagVal->i64);
|
||||||
|
metaDebug("metaTag table number index:%d cid:%d type:%d value:%f", i, pTagVal->cid, pTagVal->type, dval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -195,3 +195,434 @@ _err:
|
||||||
metaError("vgId:%d, vnode snapshot meta write failed since %s", TD_VID(pMeta->pVnode), tstrerror(code));
|
metaError("vgId:%d, vnode snapshot meta write failed since %s", TD_VID(pMeta->pVnode), tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct STableInfoForChildTable{
|
||||||
|
char *tableName;
|
||||||
|
SSchemaWrapper *schemaRow;
|
||||||
|
SSchemaWrapper *tagRow;
|
||||||
|
}STableInfoForChildTable;
|
||||||
|
|
||||||
|
static void destroySTableInfoForChildTable(void* data) {
|
||||||
|
STableInfoForChildTable* pData = (STableInfoForChildTable*)data;
|
||||||
|
taosMemoryFree(pData->tableName);
|
||||||
|
tDeleteSSchemaWrapper(pData->schemaRow);
|
||||||
|
tDeleteSSchemaWrapper(pData->tagRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void MoveToSnapShotVersion(SSnapContext* ctx){
|
||||||
|
tdbTbcClose(ctx->pCur);
|
||||||
|
tdbTbcOpen(ctx->pMeta->pTbDb, &ctx->pCur, NULL);
|
||||||
|
STbDbKey key = {.version = ctx->snapVersion, .uid = INT64_MAX};
|
||||||
|
int c = 0;
|
||||||
|
tdbTbcMoveTo(ctx->pCur, &key, sizeof(key), &c);
|
||||||
|
if(c < 0){
|
||||||
|
tdbTbcMoveToPrev(ctx->pCur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t MoveToPosition(SSnapContext* ctx, int64_t ver, int64_t uid){
|
||||||
|
tdbTbcClose(ctx->pCur);
|
||||||
|
tdbTbcOpen(ctx->pMeta->pTbDb, &ctx->pCur, NULL);
|
||||||
|
STbDbKey key = {.version = ver, .uid = uid};
|
||||||
|
int c = 0;
|
||||||
|
tdbTbcMoveTo(ctx->pCur, &key, sizeof(key), &c);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void MoveToFirst(SSnapContext* ctx){
|
||||||
|
tdbTbcClose(ctx->pCur);
|
||||||
|
tdbTbcOpen(ctx->pMeta->pTbDb, &ctx->pCur, NULL);
|
||||||
|
tdbTbcMoveToFirst(ctx->pCur);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void saveSuperTableInfoForChildTable(SMetaEntry *me, SHashObj *suidInfo){
|
||||||
|
STableInfoForChildTable* data = (STableInfoForChildTable*)taosHashGet(suidInfo, &me->uid, sizeof(tb_uid_t));
|
||||||
|
if(data){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
STableInfoForChildTable dataTmp = {0};
|
||||||
|
dataTmp.tableName = strdup(me->name);
|
||||||
|
|
||||||
|
dataTmp.schemaRow = tCloneSSchemaWrapper(&me->stbEntry.schemaRow);
|
||||||
|
dataTmp.tagRow = tCloneSSchemaWrapper(&me->stbEntry.schemaTag);
|
||||||
|
taosHashPut(suidInfo, &me->uid, sizeof(tb_uid_t), &dataTmp, sizeof(STableInfoForChildTable));
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t subType, bool withMeta, SSnapContext** ctxRet){
|
||||||
|
SSnapContext* ctx = taosMemoryCalloc(1, sizeof(SSnapContext));
|
||||||
|
if(ctx == NULL) return -1;
|
||||||
|
*ctxRet = ctx;
|
||||||
|
ctx->pMeta = pMeta;
|
||||||
|
ctx->snapVersion = snapVersion;
|
||||||
|
ctx->suid = suid;
|
||||||
|
ctx->subType = subType;
|
||||||
|
ctx->queryMetaOrData = withMeta;
|
||||||
|
ctx->withMeta = withMeta;
|
||||||
|
ctx->idVersion = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
|
||||||
|
if(ctx->idVersion == NULL){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->suidInfo = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
|
||||||
|
if(ctx->suidInfo == NULL){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taosHashSetFreeFp(ctx->suidInfo, destroySTableInfoForChildTable);
|
||||||
|
|
||||||
|
ctx->index = 0;
|
||||||
|
ctx->idList = taosArrayInit(100, sizeof(int64_t));
|
||||||
|
void *pKey = NULL;
|
||||||
|
void *pVal = NULL;
|
||||||
|
int vLen = 0, kLen = 0;
|
||||||
|
|
||||||
|
metaDebug("tmqsnap init snapVersion:%" PRIi64, ctx->snapVersion);
|
||||||
|
MoveToFirst(ctx);
|
||||||
|
while(1){
|
||||||
|
int32_t ret = tdbTbcNext(ctx->pCur, &pKey, &kLen, &pVal, &vLen);
|
||||||
|
if (ret < 0) break;
|
||||||
|
STbDbKey *tmp = (STbDbKey*)pKey;
|
||||||
|
if (tmp->version > ctx->snapVersion) break;
|
||||||
|
|
||||||
|
SIdInfo* idData = (SIdInfo*)taosHashGet(ctx->idVersion, &tmp->uid, sizeof(tb_uid_t));
|
||||||
|
if(idData) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTbGet(pMeta->pUidIdx, &tmp->uid, sizeof(tb_uid_t), NULL, NULL) < 0) { // check if table exist for now, need optimize later
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDecoder dc = {0};
|
||||||
|
SMetaEntry me = {0};
|
||||||
|
tDecoderInit(&dc, pVal, vLen);
|
||||||
|
metaDecodeEntry(&dc, &me);
|
||||||
|
if(ctx->subType == TOPIC_SUB_TYPE__TABLE){
|
||||||
|
if ((me.uid != ctx->suid && me.type == TSDB_SUPER_TABLE) ||
|
||||||
|
(me.ctbEntry.suid != ctx->suid && me.type == TSDB_CHILD_TABLE)){
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayPush(ctx->idList, &tmp->uid);
|
||||||
|
metaDebug("tmqsnap init idlist name:%s, uid:%" PRIi64, me.name, tmp->uid);
|
||||||
|
SIdInfo info = {0};
|
||||||
|
taosHashPut(ctx->idVersion, &tmp->uid, sizeof(tb_uid_t), &info, sizeof(SIdInfo));
|
||||||
|
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
}
|
||||||
|
taosHashClear(ctx->idVersion);
|
||||||
|
|
||||||
|
MoveToSnapShotVersion(ctx);
|
||||||
|
while(1){
|
||||||
|
int32_t ret = tdbTbcPrev(ctx->pCur, &pKey, &kLen, &pVal, &vLen);
|
||||||
|
if (ret < 0) break;
|
||||||
|
|
||||||
|
STbDbKey *tmp = (STbDbKey*)pKey;
|
||||||
|
SIdInfo* idData = (SIdInfo*)taosHashGet(ctx->idVersion, &tmp->uid, sizeof(tb_uid_t));
|
||||||
|
if(idData){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SIdInfo info = {.version = tmp->version, .index = 0};
|
||||||
|
taosHashPut(ctx->idVersion, &tmp->uid, sizeof(tb_uid_t), &info, sizeof(SIdInfo));
|
||||||
|
|
||||||
|
SDecoder dc = {0};
|
||||||
|
SMetaEntry me = {0};
|
||||||
|
tDecoderInit(&dc, pVal, vLen);
|
||||||
|
metaDecodeEntry(&dc, &me);
|
||||||
|
if(ctx->subType == TOPIC_SUB_TYPE__TABLE){
|
||||||
|
if ((me.uid != ctx->suid && me.type == TSDB_SUPER_TABLE) ||
|
||||||
|
(me.ctbEntry.suid != ctx->suid && me.type == TSDB_CHILD_TABLE)){
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_SUPER_TABLE)
|
||||||
|
|| (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.uid == ctx->suid)) {
|
||||||
|
saveSuperTableInfoForChildTable(&me, ctx->suidInfo);
|
||||||
|
}
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < taosArrayGetSize(ctx->idList); i++){
|
||||||
|
int64_t *uid = taosArrayGet(ctx->idList, i);
|
||||||
|
SIdInfo* idData = (SIdInfo*)taosHashGet(ctx->idVersion, uid, sizeof(int64_t));
|
||||||
|
ASSERT(idData);
|
||||||
|
idData->index = i;
|
||||||
|
metaDebug("tmqsnap init idVersion uid:%" PRIi64 " version:%" PRIi64 " index:%d", *uid, idData->version, idData->index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t destroySnapContext(SSnapContext* ctx){
|
||||||
|
tdbTbcClose(ctx->pCur);
|
||||||
|
taosArrayDestroy(ctx->idList);
|
||||||
|
taosHashCleanup(ctx->idVersion);
|
||||||
|
taosHashCleanup(ctx->suidInfo);
|
||||||
|
taosMemoryFree(ctx);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t buildNormalChildTableInfo(SVCreateTbReq *req, void **pBuf, int32_t *contLen){
|
||||||
|
int32_t ret = 0;
|
||||||
|
SVCreateTbBatchReq reqs = {0};
|
||||||
|
|
||||||
|
reqs.pArray = taosArrayInit(1, sizeof(struct SVCreateTbReq));
|
||||||
|
if (NULL == reqs.pArray){
|
||||||
|
ret = -1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
taosArrayPush(reqs.pArray, req);
|
||||||
|
reqs.nReqs = 1;
|
||||||
|
|
||||||
|
tEncodeSize(tEncodeSVCreateTbBatchReq, &reqs, *contLen, ret);
|
||||||
|
if(ret < 0){
|
||||||
|
ret = -1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
*contLen += sizeof(SMsgHead);
|
||||||
|
*pBuf = taosMemoryMalloc(*contLen);
|
||||||
|
if (NULL == *pBuf) {
|
||||||
|
ret = -1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
SEncoder coder = {0};
|
||||||
|
tEncoderInit(&coder, POINTER_SHIFT(*pBuf, sizeof(SMsgHead)), *contLen);
|
||||||
|
if (tEncodeSVCreateTbBatchReq(&coder, &reqs) < 0) {
|
||||||
|
taosMemoryFreeClear(*pBuf);
|
||||||
|
tEncoderClear(&coder);
|
||||||
|
ret = -1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
tEncoderClear(&coder);
|
||||||
|
|
||||||
|
end:
|
||||||
|
taosArrayDestroy(reqs.pArray);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t buildSuperTableInfo(SVCreateStbReq *req, void **pBuf, int32_t *contLen){
|
||||||
|
int32_t ret = 0;
|
||||||
|
tEncodeSize(tEncodeSVCreateStbReq, req, *contLen, ret);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*contLen += sizeof(SMsgHead);
|
||||||
|
*pBuf = taosMemoryMalloc(*contLen);
|
||||||
|
if (NULL == *pBuf) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEncoder encoder = {0};
|
||||||
|
tEncoderInit(&encoder, POINTER_SHIFT(*pBuf, sizeof(SMsgHead)), *contLen);
|
||||||
|
if (tEncodeSVCreateStbReq(&encoder, req) < 0) {
|
||||||
|
taosMemoryFreeClear(*pBuf);
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t setForSnapShot(SSnapContext* ctx, int64_t uid){
|
||||||
|
int c = 0;
|
||||||
|
|
||||||
|
if(uid == 0){
|
||||||
|
ctx->index = 0;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
SIdInfo* idInfo = (SIdInfo*)taosHashGet(ctx->idVersion, &uid, sizeof(tb_uid_t));
|
||||||
|
if(!idInfo){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->index = idInfo->index;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, int16_t *type, int64_t *uid){
|
||||||
|
int32_t ret = 0;
|
||||||
|
void *pKey = NULL;
|
||||||
|
void *pVal = NULL;
|
||||||
|
int vLen = 0, kLen = 0;
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
if(ctx->index >= taosArrayGetSize(ctx->idList)){
|
||||||
|
metaDebug("tmqsnap get meta end");
|
||||||
|
ctx->index = 0;
|
||||||
|
ctx->queryMetaOrData = false; // change to get data
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t* uidTmp = taosArrayGet(ctx->idList, ctx->index);
|
||||||
|
ctx->index++;
|
||||||
|
SIdInfo* idInfo = (SIdInfo*)taosHashGet(ctx->idVersion, uidTmp, sizeof(tb_uid_t));
|
||||||
|
ASSERT(idInfo);
|
||||||
|
|
||||||
|
*uid = *uidTmp;
|
||||||
|
ret = MoveToPosition(ctx, idInfo->version, *uidTmp);
|
||||||
|
if(ret == 0){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
metaDebug("tmqsnap get meta not exist uid:%" PRIi64 " version:%" PRIi64, *uid, idInfo->version);
|
||||||
|
}
|
||||||
|
|
||||||
|
tdbTbcGet(ctx->pCur, (const void**)&pKey, &kLen, (const void**)&pVal, &vLen);
|
||||||
|
SDecoder dc = {0};
|
||||||
|
SMetaEntry me = {0};
|
||||||
|
tDecoderInit(&dc, pVal, vLen);
|
||||||
|
metaDecodeEntry(&dc, &me);
|
||||||
|
metaDebug("tmqsnap get meta uid:%" PRIi64 " name:%s index:%d", *uid, me.name, ctx->index-1);
|
||||||
|
|
||||||
|
if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_SUPER_TABLE)
|
||||||
|
|| (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.uid == ctx->suid)) {
|
||||||
|
SVCreateStbReq req = {0};
|
||||||
|
req.name = me.name;
|
||||||
|
req.suid = me.uid;
|
||||||
|
req.schemaRow = me.stbEntry.schemaRow;
|
||||||
|
req.schemaTag = me.stbEntry.schemaTag;
|
||||||
|
req.schemaRow.version = 1;
|
||||||
|
req.schemaTag.version = 1;
|
||||||
|
|
||||||
|
ret = buildSuperTableInfo(&req, pBuf, contLen);
|
||||||
|
*type = TDMT_VND_CREATE_STB;
|
||||||
|
|
||||||
|
} else if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_CHILD_TABLE)
|
||||||
|
|| (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.type == TSDB_CHILD_TABLE && me.ctbEntry.suid == ctx->suid)) {
|
||||||
|
STableInfoForChildTable* data = (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t));
|
||||||
|
ASSERT(data);
|
||||||
|
SVCreateTbReq req = {0};
|
||||||
|
|
||||||
|
req.type = TSDB_CHILD_TABLE;
|
||||||
|
req.name = me.name;
|
||||||
|
req.uid = me.uid;
|
||||||
|
req.commentLen = -1;
|
||||||
|
req.ctb.suid = me.ctbEntry.suid;
|
||||||
|
req.ctb.tagNum = data->tagRow->nCols;
|
||||||
|
req.ctb.name = data->tableName;
|
||||||
|
|
||||||
|
SArray* tagName = taosArrayInit(req.ctb.tagNum, TSDB_COL_NAME_LEN);
|
||||||
|
STag* p = (STag*)me.ctbEntry.pTags;
|
||||||
|
if(tTagIsJson(p)){
|
||||||
|
if (p->nTag != 0) {
|
||||||
|
SSchema* schema = &data->tagRow->pSchema[0];
|
||||||
|
taosArrayPush(tagName, schema->name);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
SArray* pTagVals = NULL;
|
||||||
|
if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
int16_t nCols = taosArrayGetSize(pTagVals);
|
||||||
|
for (int j = 0; j < nCols; ++j) {
|
||||||
|
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
|
||||||
|
for(int i = 0; i < data->tagRow->nCols; i++){
|
||||||
|
SSchema *schema = &data->tagRow->pSchema[i];
|
||||||
|
if(schema->colId == pTagVal->cid){
|
||||||
|
taosArrayPush(tagName, schema->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// SIdInfo* sidInfo = (SIdInfo*)taosHashGet(ctx->idVersion, &me.ctbEntry.suid, sizeof(tb_uid_t));
|
||||||
|
// if(sidInfo->version >= idInfo->version){
|
||||||
|
// // need parse tag
|
||||||
|
// STag* p = (STag*)me.ctbEntry.pTags;
|
||||||
|
// SArray* pTagVals = NULL;
|
||||||
|
// if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// int16_t nCols = taosArrayGetSize(pTagVals);
|
||||||
|
// for (int j = 0; j < nCols; ++j) {
|
||||||
|
// STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
|
||||||
|
// }
|
||||||
|
// }else{
|
||||||
|
req.ctb.pTag = me.ctbEntry.pTags;
|
||||||
|
// }
|
||||||
|
|
||||||
|
req.ctb.tagName = tagName;
|
||||||
|
ret = buildNormalChildTableInfo(&req, pBuf, contLen);
|
||||||
|
*type = TDMT_VND_CREATE_TABLE;
|
||||||
|
taosArrayDestroy(tagName);
|
||||||
|
} else if(ctx->subType == TOPIC_SUB_TYPE__DB){
|
||||||
|
SVCreateTbReq req = {0};
|
||||||
|
req.type = TSDB_NORMAL_TABLE;
|
||||||
|
req.name = me.name;
|
||||||
|
req.uid = me.uid;
|
||||||
|
req.commentLen = -1;
|
||||||
|
req.ntb.schemaRow = me.ntbEntry.schemaRow;
|
||||||
|
ret = buildNormalChildTableInfo(&req, pBuf, contLen);
|
||||||
|
*type = TDMT_VND_CREATE_TABLE;
|
||||||
|
} else{
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMetaTableInfo getUidfromSnapShot(SSnapContext* ctx){
|
||||||
|
SMetaTableInfo result = {0};
|
||||||
|
void *pKey = NULL;
|
||||||
|
void *pVal = NULL;
|
||||||
|
int vLen, kLen;
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
if(ctx->index >= taosArrayGetSize(ctx->idList)){
|
||||||
|
metaDebug("tmqsnap get uid info end");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
int64_t* uidTmp = taosArrayGet(ctx->idList, ctx->index);
|
||||||
|
ctx->index++;
|
||||||
|
SIdInfo* idInfo = (SIdInfo*)taosHashGet(ctx->idVersion, uidTmp, sizeof(tb_uid_t));
|
||||||
|
ASSERT(idInfo);
|
||||||
|
|
||||||
|
int32_t ret = MoveToPosition(ctx, idInfo->version, *uidTmp);
|
||||||
|
if(ret != 0) {
|
||||||
|
metaDebug("tmqsnap getUidfromSnapShot not exist uid:%" PRIi64 " version:%" PRIi64, *uidTmp, idInfo->version);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tdbTbcGet(ctx->pCur, (const void**)&pKey, &kLen, (const void**)&pVal, &vLen);
|
||||||
|
SDecoder dc = {0};
|
||||||
|
SMetaEntry me = {0};
|
||||||
|
tDecoderInit(&dc, pVal, vLen);
|
||||||
|
metaDecodeEntry(&dc, &me);
|
||||||
|
metaDebug("tmqsnap get uid info uid:%" PRIi64 " name:%s index:%d", me.uid, me.name, ctx->index-1);
|
||||||
|
|
||||||
|
if (ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_CHILD_TABLE){
|
||||||
|
STableInfoForChildTable* data = (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t));
|
||||||
|
result.uid = me.uid;
|
||||||
|
result.suid = me.ctbEntry.suid;
|
||||||
|
result.schema = tCloneSSchemaWrapper(data->schemaRow);
|
||||||
|
strcpy(result.tbName, me.name);
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
break;
|
||||||
|
} else if (ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_NORMAL_TABLE) {
|
||||||
|
result.uid = me.uid;
|
||||||
|
result.suid = 0;
|
||||||
|
strcpy(result.tbName, me.name);
|
||||||
|
result.schema = tCloneSSchemaWrapper(&me.ntbEntry.schemaRow);
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
break;
|
||||||
|
} else if(ctx->subType == TOPIC_SUB_TYPE__TABLE && me.type == TSDB_CHILD_TABLE && me.ctbEntry.suid == ctx->suid) {
|
||||||
|
STableInfoForChildTable* data = (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t));
|
||||||
|
result.uid = me.uid;
|
||||||
|
result.suid = me.ctbEntry.suid;
|
||||||
|
strcpy(result.tbName, me.name);
|
||||||
|
result.schema = tCloneSSchemaWrapper(data->schemaRow);
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
break;
|
||||||
|
} else{
|
||||||
|
metaDebug("tmqsnap get uid continue");
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
@ -99,6 +99,7 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const
|
||||||
memcpy(val, (uint16_t *)&len, VARSTR_HEADER_SIZE);
|
memcpy(val, (uint16_t *)&len, VARSTR_HEADER_SIZE);
|
||||||
type = TSDB_DATA_TYPE_VARCHAR;
|
type = TSDB_DATA_TYPE_VARCHAR;
|
||||||
term = indexTermCreate(suid, ADD_VALUE, type, key, nKey, val, len);
|
term = indexTermCreate(suid, ADD_VALUE, type, key, nKey, val, len);
|
||||||
|
taosMemoryFree(val);
|
||||||
} else if (pTagVal->nData == 0) {
|
} else if (pTagVal->nData == 0) {
|
||||||
term = indexTermCreate(suid, ADD_VALUE, TSDB_DATA_TYPE_VARCHAR, key, nKey, pTagVal->pData, 0);
|
term = indexTermCreate(suid, ADD_VALUE, TSDB_DATA_TYPE_VARCHAR, key, nKey, pTagVal->pData, 0);
|
||||||
}
|
}
|
||||||
|
@ -115,6 +116,7 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const
|
||||||
indexMultiTermAdd(terms, term);
|
indexMultiTermAdd(terms, term);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
taosArrayDestroy(pTagVals);
|
||||||
indexJsonPut(pMeta->pTagIvtIdx, terms, tuid);
|
indexJsonPut(pMeta->pTagIvtIdx, terms, tuid);
|
||||||
indexMultiTermDestroy(terms);
|
indexMultiTermDestroy(terms);
|
||||||
#endif
|
#endif
|
||||||
|
@ -413,6 +415,25 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq, STableMe
|
||||||
me.ctbEntry.suid = pReq->ctb.suid;
|
me.ctbEntry.suid = pReq->ctb.suid;
|
||||||
me.ctbEntry.pTags = pReq->ctb.pTag;
|
me.ctbEntry.pTags = pReq->ctb.pTag;
|
||||||
|
|
||||||
|
#ifdef TAG_FILTER_DEBUG
|
||||||
|
SArray* pTagVals = NULL;
|
||||||
|
int32_t code = tTagToValArray((STag*)pReq->ctb.pTag, &pTagVals);
|
||||||
|
for (int i = 0; i < taosArrayGetSize(pTagVals); i++) {
|
||||||
|
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, i);
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pTagVal->type)) {
|
||||||
|
char* buf = taosMemoryCalloc(pTagVal->nData + 1, 1);
|
||||||
|
memcpy(buf, pTagVal->pData, pTagVal->nData);
|
||||||
|
metaDebug("metaTag table:%s varchar index:%d cid:%d type:%d value:%s", pReq->name, i, pTagVal->cid, pTagVal->type, buf);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
} else {
|
||||||
|
double val = 0;
|
||||||
|
GET_TYPED_DATA(val, double, pTagVal->type, &pTagVal->i64);
|
||||||
|
metaDebug("metaTag table:%s number index:%d cid:%d type:%d value:%f", pReq->name, i, pTagVal->cid, pTagVal->type, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
++pMeta->pVnode->config.vndStats.numOfCTables;
|
++pMeta->pVnode->config.vndStats.numOfCTables;
|
||||||
} else {
|
} else {
|
||||||
me.ntbEntry.ctime = pReq->ctime;
|
me.ntbEntry.ctime = pReq->ctime;
|
||||||
|
|
|
@ -100,7 +100,13 @@ void tqClose(STQ* pTq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqSendMetaPollRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, const SMqMetaRsp* pRsp) {
|
int32_t tqSendMetaPollRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, const SMqMetaRsp* pRsp) {
|
||||||
int32_t tlen = sizeof(SMqRspHead) + tEncodeSMqMetaRsp(NULL, pRsp);
|
int32_t len = 0;
|
||||||
|
int32_t code = 0;
|
||||||
|
tEncodeSize(tEncodeSMqMetaRsp, pRsp, len, code);
|
||||||
|
if (code < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int32_t tlen = sizeof(SMqRspHead) + len;
|
||||||
void* buf = rpcMallocCont(tlen);
|
void* buf = rpcMallocCont(tlen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -111,7 +117,11 @@ int32_t tqSendMetaPollRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq,
|
||||||
((SMqRspHead*)buf)->consumerId = pReq->consumerId;
|
((SMqRspHead*)buf)->consumerId = pReq->consumerId;
|
||||||
|
|
||||||
void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
||||||
tEncodeSMqMetaRsp(&abuf, pRsp);
|
|
||||||
|
SEncoder encoder = {0};
|
||||||
|
tEncoderInit(&encoder, abuf, len);
|
||||||
|
tEncodeSMqMetaRsp(&encoder, pRsp);
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
|
||||||
SRpcMsg resp = {
|
SRpcMsg resp = {
|
||||||
.info = pMsg->info,
|
.info = pMsg->info,
|
||||||
|
@ -121,9 +131,8 @@ int32_t tqSendMetaPollRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq,
|
||||||
};
|
};
|
||||||
tmsgSendRsp(&resp);
|
tmsgSendRsp(&resp);
|
||||||
|
|
||||||
tqDebug("vgId:%d, from consumer:%" PRId64 ", (epoch %d) send rsp, res msg type %d, reqOffset:%" PRId64
|
tqDebug("vgId:%d, from consumer:%" PRId64 ", (epoch %d) send rsp, res msg type %d, offset type:%d",
|
||||||
", rspOffset:%" PRId64,
|
TD_VID(pTq->pVnode), pReq->consumerId, pReq->epoch, pRsp->resMsgType, pRsp->rspOffset.type);
|
||||||
TD_VID(pTq->pVnode), pReq->consumerId, pReq->epoch, pRsp->resMsgType, pRsp->reqOffset, pRsp->rspOffset);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -202,7 +211,7 @@ int32_t tqProcessOffsetCommitReq(STQ* pTq, int64_t version, char* msg, int32_t m
|
||||||
}
|
}
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
|
|
||||||
if (offset.val.type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
if (offset.val.type == TMQ_OFFSET__SNAPSHOT_DATA || offset.val.type == TMQ_OFFSET__SNAPSHOT_META) {
|
||||||
tqDebug("receive offset commit msg to %s on vgId:%d, offset(type:snapshot) uid:%" PRId64 ", ts:%" PRId64,
|
tqDebug("receive offset commit msg to %s on vgId:%d, offset(type:snapshot) uid:%" PRId64 ", ts:%" PRId64,
|
||||||
offset.subKey, TD_VID(pTq->pVnode), offset.val.uid, offset.val.ts);
|
offset.subKey, TD_VID(pTq->pVnode), offset.val.uid, offset.val.ts);
|
||||||
} else if (offset.val.type == TMQ_OFFSET__LOG) {
|
} else if (offset.val.type == TMQ_OFFSET__LOG) {
|
||||||
|
@ -297,7 +306,6 @@ static int32_t tqInitDataRsp(SMqDataRsp* pRsp, const SMqPollReq* pReq, int8_t su
|
||||||
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
SMqPollReq* pReq = pMsg->pCont;
|
SMqPollReq* pReq = pMsg->pCont;
|
||||||
int64_t consumerId = pReq->consumerId;
|
int64_t consumerId = pReq->consumerId;
|
||||||
int64_t timeout = pReq->timeout;
|
|
||||||
int32_t reqEpoch = pReq->epoch;
|
int32_t reqEpoch = pReq->epoch;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
STqOffsetVal reqOffset = pReq->reqOffset;
|
STqOffsetVal reqOffset = pReq->reqOffset;
|
||||||
|
@ -349,12 +357,11 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
TD_VID(pTq->pVnode), formatBuf);
|
TD_VID(pTq->pVnode), formatBuf);
|
||||||
} else {
|
} else {
|
||||||
if (reqOffset.type == TMQ_OFFSET__RESET_EARLIEAST) {
|
if (reqOffset.type == TMQ_OFFSET__RESET_EARLIEAST) {
|
||||||
if (pReq->useSnapshot && pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pReq->useSnapshot){
|
||||||
if (!pHandle->fetchMeta) {
|
if (pHandle->fetchMeta){
|
||||||
tqOffsetResetToData(&fetchOffsetNew, 0, 0);
|
tqOffsetResetToMeta(&fetchOffsetNew, 0);
|
||||||
} else {
|
} else {
|
||||||
// reset to meta
|
tqOffsetResetToData(&fetchOffsetNew, 0, 0);
|
||||||
ASSERT(0);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tqOffsetResetToLog(&fetchOffsetNew, walGetFirstVer(pTq->pVnode->pWal));
|
tqOffsetResetToLog(&fetchOffsetNew, walGetFirstVer(pTq->pVnode->pWal));
|
||||||
|
@ -378,28 +385,34 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3.query
|
if(pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN || fetchOffsetNew.type != TMQ_OFFSET__LOG){
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
SMqMetaRsp metaRsp = {0};
|
||||||
/*if (fetchOffsetNew.type == TMQ_OFFSET__LOG) {*/
|
tqScan(pTq, pHandle, &dataRsp, &metaRsp, &fetchOffsetNew);
|
||||||
/*fetchOffsetNew.version++;*/
|
|
||||||
/*}*/
|
if(metaRsp.metaRspLen > 0){
|
||||||
if (tqScan(pTq, pHandle, &dataRsp, &fetchOffsetNew) < 0) {
|
if (tqSendMetaPollRsp(pTq, pMsg, pReq, &metaRsp) < 0) {
|
||||||
ASSERT(0);
|
code = -1;
|
||||||
code = -1;
|
}
|
||||||
|
tqDebug("tmq poll: consumer %ld, subkey %s, vg %d, send meta offset type:%d,uid:%ld,version:%ld", consumerId, pHandle->subKey,
|
||||||
|
TD_VID(pTq->pVnode), metaRsp.rspOffset.type, metaRsp.rspOffset.uid, metaRsp.rspOffset.version);
|
||||||
|
taosMemoryFree(metaRsp.metaRsp);
|
||||||
goto OVER;
|
goto OVER;
|
||||||
}
|
}
|
||||||
if (dataRsp.blockNum == 0) {
|
|
||||||
// TODO add to async task pool
|
if (dataRsp.blockNum > 0){
|
||||||
/*dataRsp.rspOffset.version--;*/
|
if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
|
||||||
|
code = -1;
|
||||||
|
}
|
||||||
|
goto OVER;
|
||||||
|
}else{
|
||||||
|
fetchOffsetNew = dataRsp.rspOffset;
|
||||||
}
|
}
|
||||||
if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
|
|
||||||
code = -1;
|
tqDebug("tmq poll: consumer %ld, subkey %s, vg %d, send data blockNum:%d, offset type:%d,uid:%ld,version:%ld", consumerId, pHandle->subKey,
|
||||||
}
|
TD_VID(pTq->pVnode), dataRsp.blockNum, dataRsp.rspOffset.type, dataRsp.rspOffset.uid, dataRsp.rspOffset.version);
|
||||||
goto OVER;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pHandle->execHandle.subType != TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType != TOPIC_SUB_TYPE__COLUMN && fetchOffsetNew.type == TMQ_OFFSET__LOG) {
|
||||||
ASSERT(fetchOffsetNew.type == TMQ_OFFSET__LOG);
|
|
||||||
int64_t fetchVer = fetchOffsetNew.version + 1;
|
int64_t fetchVer = fetchOffsetNew.version + 1;
|
||||||
pCkHead = taosMemoryMalloc(sizeof(SWalCkHead) + 2048);
|
pCkHead = taosMemoryMalloc(sizeof(SWalCkHead) + 2048);
|
||||||
if (pCkHead == NULL) {
|
if (pCkHead == NULL) {
|
||||||
|
@ -413,7 +426,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
consumerEpoch = atomic_load_32(&pHandle->epoch);
|
consumerEpoch = atomic_load_32(&pHandle->epoch);
|
||||||
if (consumerEpoch > reqEpoch) {
|
if (consumerEpoch > reqEpoch) {
|
||||||
tqWarn("tmq poll: consumer %" PRId64 " (epoch %d), subkey %s, vg %d offset %" PRId64
|
tqWarn("tmq poll: consumer %" PRId64 " (epoch %d), subkey %s, vg %d offset %" PRId64
|
||||||
", found new consumer epoch %d, discard req epoch %d",
|
", found new consumer epoch %d, discard req epoch %d",
|
||||||
consumerId, pReq->epoch, pHandle->subKey, TD_VID(pTq->pVnode), fetchVer, consumerEpoch, reqEpoch);
|
consumerId, pReq->epoch, pHandle->subKey, TD_VID(pTq->pVnode), fetchVer, consumerEpoch, reqEpoch);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -422,7 +435,6 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
// TODO add push mgr
|
// TODO add push mgr
|
||||||
|
|
||||||
tqOffsetResetToLog(&dataRsp.rspOffset, fetchVer);
|
tqOffsetResetToLog(&dataRsp.rspOffset, fetchVer);
|
||||||
ASSERT(dataRsp.rspOffset.version >= dataRsp.reqOffset.version);
|
|
||||||
if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
|
if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -444,8 +456,6 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
// TODO continue scan until meeting batch requirement
|
// TODO continue scan until meeting batch requirement
|
||||||
if (dataRsp.blockNum > 0 /* threshold */) {
|
if (dataRsp.blockNum > 0 /* threshold */) {
|
||||||
tqOffsetResetToLog(&dataRsp.rspOffset, fetchVer);
|
tqOffsetResetToLog(&dataRsp.rspOffset, fetchVer);
|
||||||
ASSERT(dataRsp.rspOffset.version >= dataRsp.reqOffset.version);
|
|
||||||
|
|
||||||
if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
|
if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
@ -459,11 +469,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
ASSERT(IS_META_MSG(pHead->msgType));
|
ASSERT(IS_META_MSG(pHead->msgType));
|
||||||
tqDebug("fetch meta msg, ver:%" PRId64 ", type:%d", pHead->version, pHead->msgType);
|
tqDebug("fetch meta msg, ver:%" PRId64 ", type:%d", pHead->version, pHead->msgType);
|
||||||
SMqMetaRsp metaRsp = {0};
|
SMqMetaRsp metaRsp = {0};
|
||||||
/*metaRsp.reqOffset = pReq->reqOffset.version;*/
|
tqOffsetResetToLog(&metaRsp.rspOffset, fetchVer);
|
||||||
metaRsp.rspOffset = fetchVer;
|
|
||||||
/*metaRsp.rspOffsetNew.version = fetchVer;*/
|
|
||||||
tqOffsetResetToLog(&metaRsp.reqOffsetNew, pReq->reqOffset.version);
|
|
||||||
tqOffsetResetToLog(&metaRsp.rspOffsetNew, fetchVer);
|
|
||||||
metaRsp.resMsgType = pHead->msgType;
|
metaRsp.resMsgType = pHead->msgType;
|
||||||
metaRsp.metaRspLen = pHead->bodyLen;
|
metaRsp.metaRspLen = pHead->bodyLen;
|
||||||
metaRsp.metaRsp = pHead->body;
|
metaRsp.metaRsp = pHead->body;
|
||||||
|
@ -477,6 +483,11 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// send empty to client
|
||||||
|
if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
|
||||||
|
code = -1;
|
||||||
|
}
|
||||||
|
|
||||||
OVER:
|
OVER:
|
||||||
if (pCkHead) taosMemoryFree(pCkHead);
|
if (pCkHead) taosMemoryFree(pCkHead);
|
||||||
// TODO wrap in destroy func
|
// TODO wrap in destroy func
|
||||||
|
@ -561,6 +572,7 @@ int32_t tqProcessVgChangeReq(STQ* pTq, int64_t version, char* msg, int32_t msgLe
|
||||||
|
|
||||||
pHandle->execHandle.subType = req.subType;
|
pHandle->execHandle.subType = req.subType;
|
||||||
pHandle->fetchMeta = req.withMeta;
|
pHandle->fetchMeta = req.withMeta;
|
||||||
|
|
||||||
// TODO version should be assigned and refed during preprocess
|
// TODO version should be assigned and refed during preprocess
|
||||||
SWalRef* pRef = walRefCommittedVer(pTq->pVnode->pWal);
|
SWalRef* pRef = walRefCommittedVer(pTq->pVnode->pWal);
|
||||||
if (pRef == NULL) {
|
if (pRef == NULL) {
|
||||||
|
@ -570,36 +582,42 @@ int32_t tqProcessVgChangeReq(STQ* pTq, int64_t version, char* msg, int32_t msgLe
|
||||||
int64_t ver = pRef->refVer;
|
int64_t ver = pRef->refVer;
|
||||||
pHandle->pRef = pRef;
|
pHandle->pRef = pRef;
|
||||||
|
|
||||||
|
SReadHandle handle = {
|
||||||
|
.meta = pTq->pVnode->pMeta,
|
||||||
|
.vnode = pTq->pVnode,
|
||||||
|
.initTableReader = true,
|
||||||
|
.initTqReader = true,
|
||||||
|
.version = ver,
|
||||||
|
};
|
||||||
|
pHandle->snapshotVer = ver;
|
||||||
|
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
pHandle->execHandle.execCol.qmsg = req.qmsg;
|
pHandle->execHandle.execCol.qmsg = req.qmsg;
|
||||||
pHandle->snapshotVer = ver;
|
|
||||||
req.qmsg = NULL;
|
req.qmsg = NULL;
|
||||||
SReadHandle handle = {
|
|
||||||
.meta = pTq->pVnode->pMeta,
|
pHandle->execHandle.task =
|
||||||
.vnode = pTq->pVnode,
|
qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, NULL,
|
||||||
.initTableReader = true,
|
|
||||||
.initTqReader = true,
|
|
||||||
.version = ver,
|
|
||||||
};
|
|
||||||
pHandle->execHandle.execCol.task =
|
|
||||||
qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, &pHandle->execHandle.numOfCols,
|
|
||||||
&pHandle->execHandle.pSchemaWrapper);
|
&pHandle->execHandle.pSchemaWrapper);
|
||||||
ASSERT(pHandle->execHandle.execCol.task);
|
ASSERT(pHandle->execHandle.task);
|
||||||
void* scanner = NULL;
|
void* scanner = NULL;
|
||||||
qExtractStreamScanner(pHandle->execHandle.execCol.task, &scanner);
|
qExtractStreamScanner(pHandle->execHandle.task, &scanner);
|
||||||
ASSERT(scanner);
|
ASSERT(scanner);
|
||||||
pHandle->execHandle.pExecReader = qExtractReaderFromStreamScanner(scanner);
|
pHandle->execHandle.pExecReader = qExtractReaderFromStreamScanner(scanner);
|
||||||
ASSERT(pHandle->execHandle.pExecReader);
|
ASSERT(pHandle->execHandle.pExecReader);
|
||||||
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
||||||
pHandle->pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
pHandle->pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
||||||
|
|
||||||
pHandle->execHandle.pExecReader = tqOpenReader(pTq->pVnode);
|
pHandle->execHandle.pExecReader = tqOpenReader(pTq->pVnode);
|
||||||
pHandle->execHandle.execDb.pFilterOutTbUid =
|
pHandle->execHandle.execDb.pFilterOutTbUid =
|
||||||
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
||||||
|
buildSnapContext(handle.meta, handle.version, 0, pHandle->execHandle.subType, pHandle->fetchMeta, (SSnapContext **)(&handle.sContext));
|
||||||
|
|
||||||
|
pHandle->execHandle.task =
|
||||||
|
qCreateQueueExecTaskInfo(NULL, &handle, NULL, NULL);
|
||||||
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
pHandle->pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
pHandle->pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
||||||
|
|
||||||
pHandle->execHandle.execTb.suid = req.suid;
|
pHandle->execHandle.execTb.suid = req.suid;
|
||||||
|
|
||||||
SArray* tbUidList = taosArrayInit(0, sizeof(int64_t));
|
SArray* tbUidList = taosArrayInit(0, sizeof(int64_t));
|
||||||
vnodeGetCtbIdList(pTq->pVnode, req.suid, tbUidList);
|
vnodeGetCtbIdList(pTq->pVnode, req.suid, tbUidList);
|
||||||
tqDebug("vgId:%d, tq try to get all ctb, suid:%" PRId64, pTq->pVnode->config.vgId, req.suid);
|
tqDebug("vgId:%d, tq try to get all ctb, suid:%" PRId64, pTq->pVnode->config.vgId, req.suid);
|
||||||
|
@ -610,6 +628,10 @@ int32_t tqProcessVgChangeReq(STQ* pTq, int64_t version, char* msg, int32_t msgLe
|
||||||
pHandle->execHandle.pExecReader = tqOpenReader(pTq->pVnode);
|
pHandle->execHandle.pExecReader = tqOpenReader(pTq->pVnode);
|
||||||
tqReaderSetTbUidList(pHandle->execHandle.pExecReader, tbUidList);
|
tqReaderSetTbUidList(pHandle->execHandle.pExecReader, tbUidList);
|
||||||
taosArrayDestroy(tbUidList);
|
taosArrayDestroy(tbUidList);
|
||||||
|
|
||||||
|
buildSnapContext(handle.meta, handle.version, req.suid, pHandle->execHandle.subType, pHandle->fetchMeta, (SSnapContext **)(&handle.sContext));
|
||||||
|
pHandle->execHandle.task =
|
||||||
|
qCreateQueueExecTaskInfo(NULL, &handle, NULL, NULL);
|
||||||
}
|
}
|
||||||
taosHashPut(pTq->pHandle, req.subKey, strlen(req.subKey), pHandle, sizeof(STqHandle));
|
taosHashPut(pTq->pHandle, req.subKey, strlen(req.subKey), pHandle, sizeof(STqHandle));
|
||||||
tqDebug("try to persist handle %s consumer %" PRId64, req.subKey, pHandle->consumerId);
|
tqDebug("try to persist handle %s consumer %" PRId64, req.subKey, pHandle->consumerId);
|
||||||
|
|
|
@ -60,18 +60,18 @@ static int32_t tqAddTbNameToRsp(const STQ* pTq, int64_t uid, SMqDataRsp* pRsp) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVal* pOffset) {
|
int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp* pMetaRsp, STqOffsetVal* pOffset) {
|
||||||
const STqExecHandle* pExec = &pHandle->execHandle;
|
const STqExecHandle* pExec = &pHandle->execHandle;
|
||||||
qTaskInfo_t task = pExec->execCol.task;
|
qTaskInfo_t task = pExec->task;
|
||||||
|
|
||||||
if (qStreamPrepareScan(task, pOffset) < 0) {
|
if (qStreamPrepareScan(task, pOffset, pHandle->execHandle.subType) < 0) {
|
||||||
tqDebug("prepare scan failed, return");
|
tqDebug("prepare scan failed, return");
|
||||||
if (pOffset->type == TMQ_OFFSET__LOG) {
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
pRsp->rspOffset = *pOffset;
|
pRsp->rspOffset = *pOffset;
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
tqOffsetResetToLog(pOffset, pHandle->snapshotVer);
|
tqOffsetResetToLog(pOffset, pHandle->snapshotVer);
|
||||||
if (qStreamPrepareScan(task, pOffset) < 0) {
|
if (qStreamPrepareScan(task, pOffset, pHandle->execHandle.subType) < 0) {
|
||||||
tqDebug("prepare scan failed, return");
|
tqDebug("prepare scan failed, return");
|
||||||
pRsp->rspOffset = *pOffset;
|
pRsp->rspOffset = *pOffset;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -83,24 +83,34 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVa
|
||||||
while (1) {
|
while (1) {
|
||||||
SSDataBlock* pDataBlock = NULL;
|
SSDataBlock* pDataBlock = NULL;
|
||||||
uint64_t ts = 0;
|
uint64_t ts = 0;
|
||||||
tqDebug("task start to execute");
|
tqDebug("tmqsnap task start to execute");
|
||||||
if (qExecTask(task, &pDataBlock, &ts) < 0) {
|
if (qExecTask(task, &pDataBlock, &ts) < 0) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
tqDebug("task execute end, get %p", pDataBlock);
|
tqDebug("tmqsnap task execute end, get %p", pDataBlock);
|
||||||
|
|
||||||
if (pDataBlock != NULL) {
|
if (pDataBlock != NULL) {
|
||||||
if (pRsp->withTbName) {
|
if (pRsp->withTbName) {
|
||||||
|
int64_t uid = 0;
|
||||||
if (pOffset->type == TMQ_OFFSET__LOG) {
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
int64_t uid = pExec->pExecReader->msgIter.uid;
|
uid = pExec->pExecReader->msgIter.uid;
|
||||||
if (tqAddTbNameToRsp(pTq, uid, pRsp) < 0) {
|
if (tqAddTbNameToRsp(pTq, uid, pRsp) < 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pRsp->withTbName = 0;
|
char* tbName = strdup(qExtractTbnameFromTask(task));
|
||||||
|
taosArrayPush(pRsp->blockTbName, &tbName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tqAddBlockDataToRsp(pDataBlock, pRsp, pExec->numOfCols);
|
if(pRsp->withSchema){
|
||||||
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
|
tqAddBlockSchemaToRsp(pExec, pRsp);
|
||||||
|
}else{
|
||||||
|
SSchemaWrapper* pSW = tCloneSSchemaWrapper(qExtractSchemaFromTask(task));
|
||||||
|
taosArrayPush(pRsp->blockSchema, &pSW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tqAddBlockDataToRsp(pDataBlock, pRsp, taosArrayGetSize(pDataBlock->pDataBlock));
|
||||||
pRsp->blockNum++;
|
pRsp->blockNum++;
|
||||||
if (pOffset->type == TMQ_OFFSET__LOG) {
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -110,39 +120,51 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRsp->blockNum == 0 && pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
if(pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN){
|
||||||
tqDebug("vgId: %d, tsdb consume over, switch to wal, ver %" PRId64, TD_VID(pTq->pVnode),
|
if (pRsp->blockNum == 0 && pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
pHandle->snapshotVer + 1);
|
tqDebug("vgId: %d, tsdb consume over, switch to wal, ver %" PRId64, TD_VID(pTq->pVnode),
|
||||||
tqOffsetResetToLog(pOffset, pHandle->snapshotVer);
|
pHandle->snapshotVer + 1);
|
||||||
qStreamPrepareScan(task, pOffset);
|
tqOffsetResetToLog(pOffset, pHandle->snapshotVer);
|
||||||
continue;
|
qStreamPrepareScan(task, pOffset, pHandle->execHandle.subType);
|
||||||
}
|
continue;
|
||||||
|
|
||||||
void* meta = qStreamExtractMetaMsg(task);
|
|
||||||
if (meta != NULL) {
|
|
||||||
// tq add meta to rsp
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qStreamExtractOffset(task, &pRsp->rspOffset) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(pRsp->rspOffset.type != 0);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (pRsp->reqOffset.type == TMQ_OFFSET__LOG) {
|
|
||||||
if (pRsp->blockNum > 0) {
|
|
||||||
ASSERT(pRsp->rspOffset.version > pRsp->reqOffset.version);
|
|
||||||
} else {
|
|
||||||
ASSERT(pRsp->rspOffset.version >= pRsp->reqOffset.version);
|
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
if (pDataBlock == NULL && pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA){
|
||||||
|
if(qStreamExtractPrepareUid(task) != 0){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tqDebug("tmqsnap vgId: %d, tsdb consume over, switch to wal, ver %" PRId64, TD_VID(pTq->pVnode),
|
||||||
|
pHandle->snapshotVer + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRsp->blockNum > 0){
|
||||||
|
tqDebug("tmqsnap task exec exited, get data");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMqMetaRsp* tmp = qStreamExtractMetaMsg(task);
|
||||||
|
if(tmp->rspOffset.type == TMQ_OFFSET__SNAPSHOT_DATA){
|
||||||
|
tqOffsetResetToData(pOffset, tmp->rspOffset.uid, tmp->rspOffset.ts);
|
||||||
|
qStreamPrepareScan(task, pOffset, pHandle->execHandle.subType);
|
||||||
|
tmp->rspOffset.type = TMQ_OFFSET__SNAPSHOT_META;
|
||||||
|
tqDebug("tmqsnap task exec change to get data");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pMetaRsp = *tmp;
|
||||||
|
tqDebug("tmqsnap task exec exited, get meta");
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
tqDebug("task exec exited");
|
tqDebug("task exec exited");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (qStreamExtractOffset(task, &pRsp->rspOffset) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(pRsp->rspOffset.type != 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -249,27 +249,34 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
|
||||||
}
|
}
|
||||||
walRefVer(handle.pRef, handle.snapshotVer);
|
walRefVer(handle.pRef, handle.snapshotVer);
|
||||||
|
|
||||||
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
SReadHandle reader = {
|
||||||
SReadHandle reader = {
|
.meta = pTq->pVnode->pMeta,
|
||||||
.meta = pTq->pVnode->pMeta,
|
.vnode = pTq->pVnode,
|
||||||
.vnode = pTq->pVnode,
|
.initTableReader = true,
|
||||||
.initTableReader = true,
|
.initTqReader = true,
|
||||||
.initTqReader = true,
|
.version = handle.snapshotVer,
|
||||||
.version = handle.snapshotVer,
|
};
|
||||||
};
|
|
||||||
|
|
||||||
handle.execHandle.execCol.task = qCreateQueueExecTaskInfo(
|
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
handle.execHandle.execCol.qmsg, &reader, &handle.execHandle.numOfCols, &handle.execHandle.pSchemaWrapper);
|
|
||||||
ASSERT(handle.execHandle.execCol.task);
|
handle.execHandle.task = qCreateQueueExecTaskInfo(
|
||||||
|
handle.execHandle.execCol.qmsg, &reader, NULL, &handle.execHandle.pSchemaWrapper);
|
||||||
|
ASSERT(handle.execHandle.task);
|
||||||
void* scanner = NULL;
|
void* scanner = NULL;
|
||||||
qExtractStreamScanner(handle.execHandle.execCol.task, &scanner);
|
qExtractStreamScanner(handle.execHandle.task, &scanner);
|
||||||
ASSERT(scanner);
|
ASSERT(scanner);
|
||||||
handle.execHandle.pExecReader = qExtractReaderFromStreamScanner(scanner);
|
handle.execHandle.pExecReader = qExtractReaderFromStreamScanner(scanner);
|
||||||
ASSERT(handle.execHandle.pExecReader);
|
ASSERT(handle.execHandle.pExecReader);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
||||||
handle.execHandle.execDb.pFilterOutTbUid =
|
handle.execHandle.execDb.pFilterOutTbUid =
|
||||||
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
||||||
|
// handle.execHandle.pExecReader = tqOpenReader(pTq->pVnode);
|
||||||
|
buildSnapContext(reader.meta, reader.version, 0, handle.execHandle.subType, handle.fetchMeta, (SSnapContext **)(&reader.sContext));
|
||||||
|
|
||||||
|
handle.execHandle.task =
|
||||||
|
qCreateQueueExecTaskInfo(NULL, &reader, NULL, NULL);
|
||||||
}
|
}
|
||||||
tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, TD_VID(pTq->pVnode));
|
tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, TD_VID(pTq->pVnode));
|
||||||
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
|
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
|
||||||
|
|
|
@ -68,7 +68,7 @@ int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHea
|
||||||
offset++;
|
offset++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
END:
|
END:
|
||||||
taosThreadMutexUnlock(&pHandle->pWalReader->mutex);
|
taosThreadMutexUnlock(&pHandle->pWalReader->mutex);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -398,7 +398,7 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) break;
|
||||||
STqHandle* pExec = (STqHandle*)pIter;
|
STqHandle* pExec = (STqHandle*)pIter;
|
||||||
if (pExec->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pExec->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
int32_t code = qUpdateQualifiedTableId(pExec->execHandle.execCol.task, tbUidList, isAdd);
|
int32_t code = qUpdateQualifiedTableId(pExec->execHandle.task, tbUidList, isAdd);
|
||||||
ASSERT(code == 0);
|
ASSERT(code == 0);
|
||||||
} else if (pExec->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
} else if (pExec->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
||||||
if (!isAdd) {
|
if (!isAdd) {
|
||||||
|
|
|
@ -3349,10 +3349,10 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCond->suid != 0) {
|
if (pCond->suid != 0) {
|
||||||
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, -1);
|
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, pCond->schemaVersion);
|
||||||
} else if (taosArrayGetSize(pTableList) > 0) {
|
} else if (taosArrayGetSize(pTableList) > 0) {
|
||||||
STableKeyInfo* pKey = taosArrayGet(pTableList, 0);
|
STableKeyInfo* pKey = taosArrayGet(pTableList, 0);
|
||||||
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pKey->uid, -1);
|
pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pKey->uid, pCond->schemaVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfTables = taosArrayGetSize(pTableList);
|
int32_t numOfTables = taosArrayGetSize(pTableList);
|
||||||
|
|
|
@ -142,7 +142,9 @@ typedef struct {
|
||||||
//TODO remove prepareStatus
|
//TODO remove prepareStatus
|
||||||
STqOffsetVal prepareStatus; // for tmq
|
STqOffsetVal prepareStatus; // for tmq
|
||||||
STqOffsetVal lastStatus; // for tmq
|
STqOffsetVal lastStatus; // for tmq
|
||||||
void* metaBlk; // for tmq fetching meta
|
SMqMetaRsp metaRsp; // for tmq fetching meta
|
||||||
|
SSchemaWrapper *schema;
|
||||||
|
char tbName[TSDB_TABLE_NAME_LEN];
|
||||||
SSDataBlock* pullOverBlk; // for streaming
|
SSDataBlock* pullOverBlk; // for streaming
|
||||||
SWalFilterCond cond;
|
SWalFilterCond cond;
|
||||||
int64_t lastScanUid;
|
int64_t lastScanUid;
|
||||||
|
@ -489,6 +491,19 @@ typedef struct SStreamScanInfo {
|
||||||
SNode* pTagIndexCond;
|
SNode* pTagIndexCond;
|
||||||
} SStreamScanInfo;
|
} SStreamScanInfo;
|
||||||
|
|
||||||
|
typedef struct SStreamRawScanInfo{
|
||||||
|
// int8_t subType;
|
||||||
|
// bool withMeta;
|
||||||
|
// int64_t suid;
|
||||||
|
// int64_t snapVersion;
|
||||||
|
// void *metaInfo;
|
||||||
|
// void *dataInfo;
|
||||||
|
SVnode* vnode;
|
||||||
|
SSDataBlock pRes; // result SSDataBlock
|
||||||
|
STsdbReader* dataReader;
|
||||||
|
SSnapContext* sContext;
|
||||||
|
}SStreamRawScanInfo;
|
||||||
|
|
||||||
typedef struct SSysTableScanInfo {
|
typedef struct SSysTableScanInfo {
|
||||||
SRetrieveMetaTableRsp* pRsp;
|
SRetrieveMetaTableRsp* pRsp;
|
||||||
SRetrieveTableReq req;
|
SRetrieveTableReq req;
|
||||||
|
@ -931,6 +946,8 @@ SOperatorInfo* createDataBlockInfoScanOperator(void* dataReader, SReadHandle* re
|
||||||
SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode, SNode* pTagCond,
|
SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode, SNode* pTagCond,
|
||||||
SExecTaskInfo* pTaskInfo);
|
SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
|
SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
|
@ -349,7 +349,7 @@ static int32_t createResultData(SDataType* pType, int32_t numOfRows, SScalarPara
|
||||||
|
|
||||||
int32_t code = colInfoDataEnsureCapacity(pColumnData, numOfRows);
|
int32_t code = colInfoDataEnsureCapacity(pColumnData, numOfRows);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = code;
|
||||||
taosMemoryFree(pColumnData);
|
taosMemoryFree(pColumnData);
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
@ -367,6 +367,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray
|
||||||
SScalarParam output = {0};
|
SScalarParam output = {0};
|
||||||
|
|
||||||
tagFilterAssist ctx = {0};
|
tagFilterAssist ctx = {0};
|
||||||
|
|
||||||
ctx.colHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT), false, HASH_NO_LOCK);
|
ctx.colHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT), false, HASH_NO_LOCK);
|
||||||
if (ctx.colHash == NULL) {
|
if (ctx.colHash == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -474,6 +475,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
qError("failed to create result, reason:%s", tstrerror(code));
|
qError("failed to create result, reason:%s", tstrerror(code));
|
||||||
|
terrno = code;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1298,6 +1300,7 @@ int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysi
|
||||||
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
|
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
|
||||||
pCond->startVersion = -1;
|
pCond->startVersion = -1;
|
||||||
pCond->endVersion = -1;
|
pCond->endVersion = -1;
|
||||||
|
pCond->schemaVersion = -1;
|
||||||
// pCond->type = pTableScanNode->scanFlag;
|
// pCond->type = pTableScanNode->scanFlag;
|
||||||
|
|
||||||
int32_t j = 0;
|
int32_t j = 0;
|
||||||
|
|
|
@ -140,7 +140,23 @@ int32_t qSetMultiStreamInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numO
|
||||||
qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* readers, int32_t* numOfCols, SSchemaWrapper** pSchema) {
|
qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* readers, int32_t* numOfCols, SSchemaWrapper** pSchema) {
|
||||||
if (msg == NULL) {
|
if (msg == NULL) {
|
||||||
// TODO create raw scan
|
// TODO create raw scan
|
||||||
return NULL;
|
|
||||||
|
SExecTaskInfo* pTaskInfo = taosMemoryCalloc(1, sizeof(SExecTaskInfo));
|
||||||
|
if (NULL == pTaskInfo) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
|
||||||
|
|
||||||
|
pTaskInfo->cost.created = taosGetTimestampMs();
|
||||||
|
pTaskInfo->execModel = OPTR_EXEC_MODEL_QUEUE;
|
||||||
|
pTaskInfo->pRoot = createRawScanOperatorInfo(readers, pTaskInfo);
|
||||||
|
if(NULL == pTaskInfo->pRoot){
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
taosMemoryFree(pTaskInfo);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return pTaskInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SSubplan* pPlan = NULL;
|
struct SSubplan* pPlan = NULL;
|
||||||
|
@ -161,13 +177,13 @@ qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* readers, int32_t* n
|
||||||
|
|
||||||
// extract the number of output columns
|
// extract the number of output columns
|
||||||
SDataBlockDescNode* pDescNode = pPlan->pNode->pOutputDataBlockDesc;
|
SDataBlockDescNode* pDescNode = pPlan->pNode->pOutputDataBlockDesc;
|
||||||
*numOfCols = 0;
|
if(numOfCols) *numOfCols = 0;
|
||||||
|
|
||||||
SNode* pNode;
|
SNode* pNode;
|
||||||
FOREACH(pNode, pDescNode->pSlots) {
|
FOREACH(pNode, pDescNode->pSlots) {
|
||||||
SSlotDescNode* pSlotDesc = (SSlotDescNode*)pNode;
|
SSlotDescNode* pSlotDesc = (SSlotDescNode*)pNode;
|
||||||
if (pSlotDesc->output) {
|
if (pSlotDesc->output) {
|
||||||
++(*numOfCols);
|
if(numOfCols) ++(*numOfCols);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -669,15 +685,26 @@ void* qExtractReaderFromStreamScanner(void* scanner) {
|
||||||
return (void*)pInfo->tqReader;
|
return (void*)pInfo->tqReader;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SSchemaWrapper* qExtractSchemaFromStreamScanner(void* scanner) {
|
const SSchemaWrapper* qExtractSchemaFromTask(qTaskInfo_t tinfo) {
|
||||||
SStreamScanInfo* pInfo = scanner;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
return pInfo->tqReader->pSchemaWrapper;
|
return pTaskInfo->streamInfo.schema;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* qStreamExtractMetaMsg(qTaskInfo_t tinfo) {
|
const char* qExtractTbnameFromTask(qTaskInfo_t tinfo) {
|
||||||
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
|
return pTaskInfo->streamInfo.tbName;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMqMetaRsp* qStreamExtractMetaMsg(qTaskInfo_t tinfo) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
ASSERT(pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE);
|
ASSERT(pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE);
|
||||||
return pTaskInfo->streamInfo.metaBlk;
|
return &pTaskInfo->streamInfo.metaRsp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t qStreamExtractPrepareUid(qTaskInfo_t tinfo) {
|
||||||
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
|
ASSERT(pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE);
|
||||||
|
return pTaskInfo->streamInfo.prepareStatus.uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qStreamExtractOffset(qTaskInfo_t tinfo, STqOffsetVal* pOffset) {
|
int32_t qStreamExtractOffset(qTaskInfo_t tinfo, STqOffsetVal* pOffset) {
|
||||||
|
@ -687,102 +714,164 @@ int32_t qStreamExtractOffset(qTaskInfo_t tinfo, STqOffsetVal* pOffset) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qStreamPrepareScan(qTaskInfo_t tinfo, const STqOffsetVal* pOffset) {
|
int32_t initQueryTableDataCondForTmq(SQueryTableDataCond* pCond, SSnapContext* sContext, SMetaTableInfo mtInfo) {
|
||||||
|
memset(pCond, 0, sizeof(SQueryTableDataCond));
|
||||||
|
pCond->order = TSDB_ORDER_ASC;
|
||||||
|
pCond->numOfCols = mtInfo.schema->nCols;
|
||||||
|
pCond->colList = taosMemoryCalloc(pCond->numOfCols, sizeof(SColumnInfo));
|
||||||
|
if (pCond->colList == NULL) {
|
||||||
|
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCond->twindows = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
|
||||||
|
pCond->suid = mtInfo.suid;
|
||||||
|
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
|
||||||
|
pCond->startVersion = -1;
|
||||||
|
pCond->endVersion = sContext->snapVersion;
|
||||||
|
pCond->schemaVersion = sContext->snapVersion;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pCond->numOfCols; ++i) {
|
||||||
|
pCond->colList[i].type = mtInfo.schema->pSchema[i].type;
|
||||||
|
pCond->colList[i].bytes = mtInfo.schema->pSchema[i].bytes;
|
||||||
|
pCond->colList[i].colId = mtInfo.schema->pSchema[i].colId;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subType) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
SOperatorInfo* pOperator = pTaskInfo->pRoot;
|
SOperatorInfo* pOperator = pTaskInfo->pRoot;
|
||||||
ASSERT(pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE);
|
ASSERT(pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE);
|
||||||
pTaskInfo->streamInfo.prepareStatus = *pOffset;
|
pTaskInfo->streamInfo.prepareStatus = *pOffset;
|
||||||
if (!tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus)) {
|
if (tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus)) {
|
||||||
while (1) {
|
return 0;
|
||||||
uint16_t type = pOperator->operatorType;
|
}
|
||||||
pOperator->status = OP_OPENED;
|
if (subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
// TODO add more check
|
uint16_t type = pOperator->operatorType;
|
||||||
if (type != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
pOperator->status = OP_OPENED;
|
||||||
ASSERT(pOperator->numOfDownstream == 1);
|
// TODO add more check
|
||||||
pOperator = pOperator->pDownstream[0];
|
if (type != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
}
|
ASSERT(pOperator->numOfDownstream == 1);
|
||||||
|
pOperator = pOperator->pDownstream[0];
|
||||||
|
}
|
||||||
|
|
||||||
SStreamScanInfo* pInfo = pOperator->info;
|
SStreamScanInfo* pInfo = pOperator->info;
|
||||||
if (pOffset->type == TMQ_OFFSET__LOG) {
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
||||||
tsdbReaderClose(pTSInfo->dataReader);
|
tsdbReaderClose(pTSInfo->dataReader);
|
||||||
pTSInfo->dataReader = NULL;
|
pTSInfo->dataReader = NULL;
|
||||||
#if 0
|
#if 0
|
||||||
if (tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus) &&
|
if (tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus) &&
|
||||||
pInfo->tqReader->pWalReader->curVersion != pOffset->version) {
|
pInfo->tqReader->pWalReader->curVersion != pOffset->version) {
|
||||||
qError("prepare scan ver %" PRId64 " actual ver %" PRId64 ", last %" PRId64, pOffset->version,
|
qError("prepare scan ver %" PRId64 " actual ver %" PRId64 ", last %" PRId64, pOffset->version,
|
||||||
pInfo->tqReader->pWalReader->curVersion, pTaskInfo->streamInfo.lastStatus.version);
|
pInfo->tqReader->pWalReader->curVersion, pTaskInfo->streamInfo.lastStatus.version);
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (tqSeekVer(pInfo->tqReader, pOffset->version + 1) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ASSERT(pInfo->tqReader->pWalReader->curVersion == pOffset->version + 1);
|
|
||||||
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
|
||||||
/*pInfo->blockType = STREAM_INPUT__TABLE_SCAN;*/
|
|
||||||
int64_t uid = pOffset->uid;
|
|
||||||
int64_t ts = pOffset->ts;
|
|
||||||
|
|
||||||
if (uid == 0) {
|
|
||||||
if (taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList) != 0) {
|
|
||||||
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, 0);
|
|
||||||
uid = pTableInfo->uid;
|
|
||||||
ts = INT64_MIN;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if (pTaskInfo->streamInfo.lastStatus.type != TMQ_OFFSET__SNAPSHOT_DATA ||*/
|
|
||||||
/*pTaskInfo->streamInfo.lastStatus.uid != uid || pTaskInfo->streamInfo.lastStatus.ts != ts) {*/
|
|
||||||
STableScanInfo* pTableScanInfo = pInfo->pTableScanOp->info;
|
|
||||||
int32_t tableSz = taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList);
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
|
||||||
|
|
||||||
qDebug("switch to next table %" PRId64 " (cursor %d), %" PRId64 " rows returned", uid,
|
|
||||||
pTableScanInfo->currentTable, pInfo->pTableScanOp->resultInfo.totalRows);
|
|
||||||
pInfo->pTableScanOp->resultInfo.totalRows = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool found = false;
|
|
||||||
for (int32_t i = 0; i < tableSz; i++) {
|
|
||||||
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, i);
|
|
||||||
if (pTableInfo->uid == uid) {
|
|
||||||
found = true;
|
|
||||||
pTableScanInfo->currentTable = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO after dropping table, table may be not found
|
|
||||||
ASSERT(found);
|
|
||||||
|
|
||||||
if (pTableScanInfo->dataReader == NULL) {
|
|
||||||
if (tsdbReaderOpen(pTableScanInfo->readHandle.vnode, &pTableScanInfo->cond,
|
|
||||||
pTaskInfo->tableqinfoList.pTableList, &pTableScanInfo->dataReader, NULL) < 0 ||
|
|
||||||
pTableScanInfo->dataReader == NULL) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tsdbSetTableId(pTableScanInfo->dataReader, uid);
|
|
||||||
int64_t oldSkey = pTableScanInfo->cond.twindows.skey;
|
|
||||||
pTableScanInfo->cond.twindows.skey = ts + 1;
|
|
||||||
tsdbReaderReset(pTableScanInfo->dataReader, &pTableScanInfo->cond);
|
|
||||||
pTableScanInfo->cond.twindows.skey = oldSkey;
|
|
||||||
pTableScanInfo->scanTimes = 0;
|
|
||||||
|
|
||||||
qDebug("tsdb reader offset seek to uid %" PRId64 " ts %" PRId64 ", table cur set to %d , all table num %d", uid,
|
|
||||||
ts, pTableScanInfo->currentTable, tableSz);
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
return 0;
|
#endif
|
||||||
|
if (tqSeekVer(pInfo->tqReader, pOffset->version + 1) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ASSERT(pInfo->tqReader->pWalReader->curVersion == pOffset->version + 1);
|
||||||
|
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
|
/*pInfo->blockType = STREAM_INPUT__TABLE_SCAN;*/
|
||||||
|
int64_t uid = pOffset->uid;
|
||||||
|
int64_t ts = pOffset->ts;
|
||||||
|
|
||||||
|
if (uid == 0) {
|
||||||
|
if (taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList) != 0) {
|
||||||
|
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, 0);
|
||||||
|
uid = pTableInfo->uid;
|
||||||
|
ts = INT64_MIN;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*if (pTaskInfo->streamInfo.lastStatus.type != TMQ_OFFSET__SNAPSHOT_DATA ||*/
|
||||||
|
/*pTaskInfo->streamInfo.lastStatus.uid != uid || pTaskInfo->streamInfo.lastStatus.ts != ts) {*/
|
||||||
|
STableScanInfo* pTableScanInfo = pInfo->pTableScanOp->info;
|
||||||
|
int32_t tableSz = taosArrayGetSize(pTaskInfo->tableqinfoList.pTableList);
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
qDebug("switch to next table %" PRId64 " (cursor %d), %" PRId64 " rows returned", uid,
|
||||||
|
pTableScanInfo->currentTable, pInfo->pTableScanOp->resultInfo.totalRows);
|
||||||
|
pInfo->pTableScanOp->resultInfo.totalRows = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
for (int32_t i = 0; i < tableSz; i++) {
|
||||||
|
STableKeyInfo* pTableInfo = taosArrayGet(pTaskInfo->tableqinfoList.pTableList, i);
|
||||||
|
if (pTableInfo->uid == uid) {
|
||||||
|
found = true;
|
||||||
|
pTableScanInfo->currentTable = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO after dropping table, table may be not found
|
||||||
|
ASSERT(found);
|
||||||
|
|
||||||
|
if (pTableScanInfo->dataReader == NULL) {
|
||||||
|
if (tsdbReaderOpen(pTableScanInfo->readHandle.vnode, &pTableScanInfo->cond,
|
||||||
|
pTaskInfo->tableqinfoList.pTableList, &pTableScanInfo->dataReader, NULL) < 0 ||
|
||||||
|
pTableScanInfo->dataReader == NULL) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tsdbSetTableId(pTableScanInfo->dataReader, uid);
|
||||||
|
int64_t oldSkey = pTableScanInfo->cond.twindows.skey;
|
||||||
|
pTableScanInfo->cond.twindows.skey = ts + 1;
|
||||||
|
tsdbReaderReset(pTableScanInfo->dataReader, &pTableScanInfo->cond);
|
||||||
|
pTableScanInfo->cond.twindows.skey = oldSkey;
|
||||||
|
pTableScanInfo->scanTimes = 0;
|
||||||
|
|
||||||
|
qDebug("tsdb reader offset seek to uid %" PRId64 " ts %" PRId64 ", table cur set to %d , all table num %d", uid,
|
||||||
|
ts, pTableScanInfo->currentTable, tableSz);
|
||||||
|
/*}*/
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
}else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA){
|
||||||
|
SStreamRawScanInfo* pInfo = pOperator->info;
|
||||||
|
SSnapContext* sContext = pInfo->sContext;
|
||||||
|
if(setForSnapShot(sContext, pOffset->uid) != 0) {
|
||||||
|
qError("setDataForSnapShot error. uid:%"PRIi64, pOffset->uid);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMetaTableInfo mtInfo = getUidfromSnapShot(sContext);
|
||||||
|
tsdbReaderClose(pInfo->dataReader);
|
||||||
|
pInfo->dataReader = NULL;
|
||||||
|
cleanupQueryTableDataCond(&pTaskInfo->streamInfo.tableCond);
|
||||||
|
taosArrayDestroy(pTaskInfo->tableqinfoList.pTableList);
|
||||||
|
if(mtInfo.uid == 0) return 0; // no data
|
||||||
|
|
||||||
|
initQueryTableDataCondForTmq(&pTaskInfo->streamInfo.tableCond, sContext, mtInfo);
|
||||||
|
pTaskInfo->streamInfo.tableCond.twindows.skey = pOffset->ts;
|
||||||
|
pTaskInfo->tableqinfoList.pTableList = taosArrayInit(1, sizeof(STableKeyInfo));
|
||||||
|
taosArrayPush(pTaskInfo->tableqinfoList.pTableList, &(STableKeyInfo){.uid = mtInfo.uid, .groupId = 0});
|
||||||
|
tsdbReaderOpen(pInfo->vnode, &pTaskInfo->streamInfo.tableCond, pTaskInfo->tableqinfoList.pTableList, &pInfo->dataReader, NULL);
|
||||||
|
|
||||||
|
strcpy(pTaskInfo->streamInfo.tbName, mtInfo.tbName);
|
||||||
|
tDeleteSSchemaWrapper(pTaskInfo->streamInfo.schema);
|
||||||
|
pTaskInfo->streamInfo.schema = mtInfo.schema;
|
||||||
|
qDebug("tmqsnap qStreamPrepareScan snapshot data uid %ld ts %ld", mtInfo.uid, pOffset->ts);
|
||||||
|
}else if(pOffset->type == TMQ_OFFSET__SNAPSHOT_META){
|
||||||
|
SStreamRawScanInfo* pInfo = pOperator->info;
|
||||||
|
SSnapContext* sContext = pInfo->sContext;
|
||||||
|
if(setForSnapShot(sContext, pOffset->uid) != 0) {
|
||||||
|
qError("setForSnapShot error. uid:%"PRIi64" ,version:%"PRIi64, pOffset->uid);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
qDebug("tmqsnap qStreamPrepareScan snapshot meta uid %ld ts %ld", pOffset->uid);
|
||||||
|
}else if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
|
SStreamRawScanInfo* pInfo = pOperator->info;
|
||||||
|
tsdbReaderClose(pInfo->dataReader);
|
||||||
|
pInfo->dataReader = NULL;
|
||||||
|
qDebug("tmqsnap qStreamPrepareScan snapshot log");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3997,6 +3997,7 @@ static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pC
|
||||||
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
|
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
|
||||||
pCond->startVersion = -1;
|
pCond->startVersion = -1;
|
||||||
pCond->endVersion = -1;
|
pCond->endVersion = -1;
|
||||||
|
pCond->schemaVersion = -1;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1334,9 +1334,9 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
} else if (ret.fetchType == FETCH_TYPE__META) {
|
} else if (ret.fetchType == FETCH_TYPE__META) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
pTaskInfo->streamInfo.lastStatus = ret.offset;
|
// pTaskInfo->streamInfo.lastStatus = ret.offset;
|
||||||
pTaskInfo->streamInfo.metaBlk = ret.meta;
|
// pTaskInfo->streamInfo.metaBlk = ret.meta;
|
||||||
return NULL;
|
// return NULL;
|
||||||
} else if (ret.fetchType == FETCH_TYPE__NONE) {
|
} else if (ret.fetchType == FETCH_TYPE__NONE) {
|
||||||
pTaskInfo->streamInfo.lastStatus = ret.offset;
|
pTaskInfo->streamInfo.lastStatus = ret.offset;
|
||||||
ASSERT(pTaskInfo->streamInfo.lastStatus.version >= pTaskInfo->streamInfo.prepareStatus.version);
|
ASSERT(pTaskInfo->streamInfo.lastStatus.version >= pTaskInfo->streamInfo.prepareStatus.version);
|
||||||
|
@ -1357,10 +1357,6 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
qDebug("stream scan tsdb return null");
|
qDebug("stream scan tsdb return null");
|
||||||
return NULL;
|
return NULL;
|
||||||
} else if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_META) {
|
|
||||||
// TODO scan meta
|
|
||||||
ASSERT(0);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE) {
|
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE) {
|
||||||
|
@ -1545,11 +1541,6 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* doRawScan(SOperatorInfo* pInfo) {
|
|
||||||
//
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SArray* extractTableIdList(const STableListInfo* pTableGroupInfo) {
|
static SArray* extractTableIdList(const STableListInfo* pTableGroupInfo) {
|
||||||
SArray* tableIdList = taosArrayInit(4, sizeof(uint64_t));
|
SArray* tableIdList = taosArrayInit(4, sizeof(uint64_t));
|
||||||
|
|
||||||
|
@ -1562,17 +1553,160 @@ static SArray* extractTableIdList(const STableListInfo* pTableGroupInfo) {
|
||||||
return tableIdList;
|
return tableIdList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
|
||||||
|
// NOTE: this operator does never check if current status is done or not
|
||||||
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
|
SStreamRawScanInfo* pInfo = pOperator->info;
|
||||||
|
pTaskInfo->streamInfo.metaRsp.metaRspLen = 0; // use metaRspLen !=0 to judge if data is meta
|
||||||
|
pTaskInfo->streamInfo.metaRsp.metaRsp = NULL;
|
||||||
|
|
||||||
|
qDebug("tmqsnap doRawScan called");
|
||||||
|
if(pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA){
|
||||||
|
SSDataBlock* pBlock = &pInfo->pRes;
|
||||||
|
|
||||||
|
if (pInfo->dataReader && tsdbNextDataBlock(pInfo->dataReader)) {
|
||||||
|
if (isTaskKilled(pTaskInfo)) {
|
||||||
|
longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
|
}
|
||||||
|
|
||||||
|
tsdbRetrieveDataBlockInfo(pInfo->dataReader, &pBlock->info);
|
||||||
|
|
||||||
|
SArray* pCols = tsdbRetrieveDataBlock(pInfo->dataReader, NULL);
|
||||||
|
pBlock->pDataBlock = pCols;
|
||||||
|
if (pCols == NULL) {
|
||||||
|
longjmp(pTaskInfo->env, terrno);
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("tmqsnap doRawScan get data uid:%ld", pBlock->info.uid);
|
||||||
|
pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__SNAPSHOT_DATA;
|
||||||
|
pTaskInfo->streamInfo.lastStatus.uid = pBlock->info.uid;
|
||||||
|
pTaskInfo->streamInfo.lastStatus.ts = pBlock->info.window.ekey;
|
||||||
|
return pBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMetaTableInfo mtInfo = getUidfromSnapShot(pInfo->sContext);
|
||||||
|
if (mtInfo.uid == 0){ //read snapshot done, change to get data from wal
|
||||||
|
qDebug("tmqsnap read snapshot done, change to get data from wal");
|
||||||
|
pTaskInfo->streamInfo.prepareStatus.uid = mtInfo.uid;
|
||||||
|
pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__LOG;
|
||||||
|
pTaskInfo->streamInfo.lastStatus.version = pInfo->sContext->snapVersion;
|
||||||
|
tDeleteSSchemaWrapper(pTaskInfo->streamInfo.schema);
|
||||||
|
}else{
|
||||||
|
pTaskInfo->streamInfo.prepareStatus.uid = mtInfo.uid;
|
||||||
|
pTaskInfo->streamInfo.prepareStatus.ts = INT64_MIN;
|
||||||
|
qDebug("tmqsnap change get data uid:%ld", mtInfo.uid);
|
||||||
|
qStreamPrepareScan(pTaskInfo, &pTaskInfo->streamInfo.prepareStatus, pInfo->sContext->subType);
|
||||||
|
strcpy(pTaskInfo->streamInfo.tbName, mtInfo.tbName);
|
||||||
|
tDeleteSSchemaWrapper(pTaskInfo->streamInfo.schema);
|
||||||
|
pTaskInfo->streamInfo.schema = mtInfo.schema;
|
||||||
|
}
|
||||||
|
qDebug("tmqsnap stream scan tsdb return null");
|
||||||
|
return NULL;
|
||||||
|
}else if(pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_META){
|
||||||
|
SSnapContext *sContext = pInfo->sContext;
|
||||||
|
void* data = NULL;
|
||||||
|
int32_t dataLen = 0;
|
||||||
|
int16_t type = 0;
|
||||||
|
int64_t uid = 0;
|
||||||
|
if(getMetafromSnapShot(sContext, &data, &dataLen, &type, &uid) < 0){
|
||||||
|
qError("tmqsnap getMetafromSnapShot error");
|
||||||
|
taosMemoryFreeClear(data);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!sContext->queryMetaOrData){ // change to get data next poll request
|
||||||
|
pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__SNAPSHOT_META;
|
||||||
|
pTaskInfo->streamInfo.lastStatus.uid = uid;
|
||||||
|
pTaskInfo->streamInfo.metaRsp.rspOffset.type = TMQ_OFFSET__SNAPSHOT_DATA;
|
||||||
|
pTaskInfo->streamInfo.metaRsp.rspOffset.uid = 0;
|
||||||
|
pTaskInfo->streamInfo.metaRsp.rspOffset.ts = INT64_MIN;
|
||||||
|
}else{
|
||||||
|
pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__SNAPSHOT_META;
|
||||||
|
pTaskInfo->streamInfo.lastStatus.uid = uid;
|
||||||
|
pTaskInfo->streamInfo.metaRsp.rspOffset = pTaskInfo->streamInfo.lastStatus;
|
||||||
|
pTaskInfo->streamInfo.metaRsp.resMsgType = type;
|
||||||
|
pTaskInfo->streamInfo.metaRsp.metaRspLen = dataLen;
|
||||||
|
pTaskInfo->streamInfo.metaRsp.metaRsp = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
// else if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__LOG) {
|
||||||
|
// int64_t fetchVer = pTaskInfo->streamInfo.prepareStatus.version + 1;
|
||||||
|
//
|
||||||
|
// while(1){
|
||||||
|
// if (tqFetchLog(pInfo->tqReader->pWalReader, pInfo->sContext->withMeta, &fetchVer, &pInfo->pCkHead) < 0) {
|
||||||
|
// qDebug("tmqsnap tmq poll: consumer log end. offset %" PRId64, fetchVer);
|
||||||
|
// pTaskInfo->streamInfo.lastStatus.version = fetchVer;
|
||||||
|
// pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__LOG;
|
||||||
|
// return NULL;
|
||||||
|
// }
|
||||||
|
// SWalCont* pHead = &pInfo->pCkHead->head;
|
||||||
|
// qDebug("tmqsnap tmq poll: consumer log offset %" PRId64 " msgType %d", fetchVer, pHead->msgType);
|
||||||
|
//
|
||||||
|
// if (pHead->msgType == TDMT_VND_SUBMIT) {
|
||||||
|
// SSubmitReq* pCont = (SSubmitReq*)&pHead->body;
|
||||||
|
// tqReaderSetDataMsg(pInfo->tqReader, pCont, 0);
|
||||||
|
// SSDataBlock* block = tqLogScanExec(pInfo->sContext->subType, pInfo->tqReader, pInfo->pFilterOutTbUid, &pInfo->pRes);
|
||||||
|
// if(block){
|
||||||
|
// pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__LOG;
|
||||||
|
// pTaskInfo->streamInfo.lastStatus.version = fetchVer;
|
||||||
|
// qDebug("tmqsnap fetch data msg, ver:%" PRId64 ", type:%d", pHead->version, pHead->msgType);
|
||||||
|
// return block;
|
||||||
|
// }else{
|
||||||
|
// fetchVer++;
|
||||||
|
// }
|
||||||
|
// } else{
|
||||||
|
// ASSERT(pInfo->sContext->withMeta);
|
||||||
|
// ASSERT(IS_META_MSG(pHead->msgType));
|
||||||
|
// qDebug("tmqsnap fetch meta msg, ver:%" PRId64 ", type:%d", pHead->version, pHead->msgType);
|
||||||
|
// pTaskInfo->streamInfo.metaRsp.rspOffset.version = fetchVer;
|
||||||
|
// pTaskInfo->streamInfo.metaRsp.rspOffset.type = TMQ_OFFSET__LOG;
|
||||||
|
// pTaskInfo->streamInfo.metaRsp.resMsgType = pHead->msgType;
|
||||||
|
// pTaskInfo->streamInfo.metaRsp.metaRspLen = pHead->bodyLen;
|
||||||
|
// pTaskInfo->streamInfo.metaRsp.metaRsp = taosMemoryMalloc(pHead->bodyLen);
|
||||||
|
// memcpy(pTaskInfo->streamInfo.metaRsp.metaRsp, pHead->body, pHead->bodyLen);
|
||||||
|
// return NULL;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void destroyRawScanOperatorInfo(void* param) {
|
||||||
|
SStreamRawScanInfo* pRawScan = (SStreamRawScanInfo*)param;
|
||||||
|
tsdbReaderClose(pRawScan->dataReader);
|
||||||
|
destroySnapContext(pRawScan->sContext);
|
||||||
|
taosMemoryFree(pRawScan);
|
||||||
|
}
|
||||||
|
|
||||||
// for subscribing db or stb (not including column),
|
// for subscribing db or stb (not including column),
|
||||||
// if this scan is used, meta data can be return
|
// if this scan is used, meta data can be return
|
||||||
// and schemas are decided when scanning
|
// and schemas are decided when scanning
|
||||||
SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode,
|
SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, SExecTaskInfo* pTaskInfo) {
|
||||||
SExecTaskInfo* pTaskInfo, STimeWindowAggSupp* pTwSup) {
|
|
||||||
// create operator
|
// create operator
|
||||||
// create tb reader
|
// create tb reader
|
||||||
// create meta reader
|
// create meta reader
|
||||||
// create tq reader
|
// create tq reader
|
||||||
|
|
||||||
return NULL;
|
SStreamRawScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamRawScanInfo));
|
||||||
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
|
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->vnode = pHandle->vnode;
|
||||||
|
|
||||||
|
pInfo->sContext = pHandle->sContext;
|
||||||
|
pOperator->name = "RawStreamScanOperator";
|
||||||
|
// pOperator->blocking = false;
|
||||||
|
// pOperator->status = OP_NOT_OPENED;
|
||||||
|
pOperator->info = pInfo;
|
||||||
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
|
|
||||||
|
pOperator->fpSet = createOperatorFpSet(NULL, doRawScan, NULL, NULL, destroyRawScanOperatorInfo,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
return pOperator;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyStreamScanOperatorInfo(void* param) {
|
static void destroyStreamScanOperatorInfo(void* param) {
|
||||||
|
|
|
@ -5001,7 +5001,7 @@ static int32_t checkCreateStream(STranslateContext* pCxt, SCreateStreamStmt* pSt
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QUERY_NODE_SELECT_STMT != nodeType(pStmt->pQuery) ||
|
if (QUERY_NODE_SELECT_STMT != nodeType(pStmt->pQuery) || NULL == ((SSelectStmt*)pStmt->pQuery)->pFromTable ||
|
||||||
QUERY_NODE_REAL_TABLE != nodeType(((SSelectStmt*)pStmt->pQuery)->pFromTable)) {
|
QUERY_NODE_REAL_TABLE != nodeType(((SSelectStmt*)pStmt->pQuery)->pFromTable)) {
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Unsupported stream query");
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Unsupported stream query");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1084,7 +1084,7 @@ static int32_t sortPriKeyOptGetSequencingNodesImpl(SLogicNode* pNode, bool* pNot
|
||||||
switch (nodeType(pNode)) {
|
switch (nodeType(pNode)) {
|
||||||
case QUERY_NODE_LOGIC_PLAN_SCAN: {
|
case QUERY_NODE_LOGIC_PLAN_SCAN: {
|
||||||
SScanLogicNode* pScan = (SScanLogicNode*)pNode;
|
SScanLogicNode* pScan = (SScanLogicNode*)pNode;
|
||||||
if (NULL != pScan->pGroupTags) {
|
if (NULL != pScan->pGroupTags || TSDB_SYSTEM_TABLE == pScan->tableType) {
|
||||||
*pNotOptimize = true;
|
*pNotOptimize = true;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -350,6 +350,7 @@ struct SFilterInfo {
|
||||||
|
|
||||||
extern bool filterDoCompare(__compar_fn_t func, uint8_t optr, void *left, void *right);
|
extern bool filterDoCompare(__compar_fn_t func, uint8_t optr, void *left, void *right);
|
||||||
extern __compar_fn_t filterGetCompFunc(int32_t type, int32_t optr);
|
extern __compar_fn_t filterGetCompFunc(int32_t type, int32_t optr);
|
||||||
|
extern __compar_fn_t filterGetCompFuncEx(int32_t lType, int32_t rType, int32_t optr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ typedef struct SScalarCtx {
|
||||||
#define SCL_IS_NULL_VALUE_NODE(_node) ((QUERY_NODE_VALUE == nodeType(_node)) && (TSDB_DATA_TYPE_NULL == ((SValueNode *)_node)->node.resType.type))
|
#define SCL_IS_NULL_VALUE_NODE(_node) ((QUERY_NODE_VALUE == nodeType(_node)) && (TSDB_DATA_TYPE_NULL == ((SValueNode *)_node)->node.resType.type))
|
||||||
#define SCL_IS_COMPARISON_OPERATOR(_opType) ((_opType) >= OP_TYPE_GREATER_THAN && (_opType) < OP_TYPE_IS_NOT_UNKNOWN)
|
#define SCL_IS_COMPARISON_OPERATOR(_opType) ((_opType) >= OP_TYPE_GREATER_THAN && (_opType) < OP_TYPE_IS_NOT_UNKNOWN)
|
||||||
#define SCL_DOWNGRADE_DATETYPE(_type) ((_type) == TSDB_DATA_TYPE_BIGINT || TSDB_DATA_TYPE_DOUBLE == (_type) || (_type) == TSDB_DATA_TYPE_UBIGINT)
|
#define SCL_DOWNGRADE_DATETYPE(_type) ((_type) == TSDB_DATA_TYPE_BIGINT || TSDB_DATA_TYPE_DOUBLE == (_type) || (_type) == TSDB_DATA_TYPE_UBIGINT)
|
||||||
|
#define SCL_NO_NEED_CONVERT_COMPARISION(_ltype, _rtype, _optr) (IS_NUMERIC_TYPE(_ltype) && IS_NUMERIC_TYPE(_rtype) && ((_optr) >= OP_TYPE_GREATER_THAN && (_optr) <= OP_TYPE_NOT_EQUAL))
|
||||||
|
|
||||||
#define sclFatal(...) qFatal(__VA_ARGS__)
|
#define sclFatal(...) qFatal(__VA_ARGS__)
|
||||||
#define sclError(...) qError(__VA_ARGS__)
|
#define sclError(...) qError(__VA_ARGS__)
|
||||||
|
|
|
@ -132,6 +132,77 @@ __compar_fn_t gDataCompare[] = {compareInt32Val, compareInt8Val, compareInt16Val
|
||||||
compareChkNotInString, compareStrPatternNotMatch, compareWStrPatternNotMatch
|
compareChkNotInString, compareStrPatternNotMatch, compareWStrPatternNotMatch
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gInt8SignCompare[] = {
|
||||||
|
compareInt8Val, compareInt8Int16, compareInt8Int32, compareInt8Int64, compareInt8Float, compareInt8Double
|
||||||
|
};
|
||||||
|
__compar_fn_t gInt8UsignCompare[] = {
|
||||||
|
compareInt8Uint8, compareInt8Uint16, compareInt8Uint32, compareInt8Uint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gInt16SignCompare[] = {
|
||||||
|
compareInt16Int8, compareInt16Val, compareInt16Int32, compareInt16Int64, compareInt16Float, compareInt16Double
|
||||||
|
};
|
||||||
|
__compar_fn_t gInt16UsignCompare[] = {
|
||||||
|
compareInt16Uint8, compareInt16Uint16, compareInt16Uint32, compareInt16Uint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gInt32SignCompare[] = {
|
||||||
|
compareInt32Int8, compareInt32Int16, compareInt32Val, compareInt32Int64, compareInt32Float, compareInt32Double
|
||||||
|
};
|
||||||
|
__compar_fn_t gInt32UsignCompare[] = {
|
||||||
|
compareInt32Uint8, compareInt32Uint16, compareInt32Uint32, compareInt32Uint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gInt64SignCompare[] = {
|
||||||
|
compareInt64Int8, compareInt64Int16, compareInt64Int32, compareInt64Val, compareInt64Float, compareInt64Double
|
||||||
|
};
|
||||||
|
__compar_fn_t gInt64UsignCompare[] = {
|
||||||
|
compareInt64Uint8, compareInt64Uint16, compareInt64Uint32, compareInt64Uint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gFloatSignCompare[] = {
|
||||||
|
compareFloatInt8, compareFloatInt16, compareFloatInt32, compareFloatInt64, compareFloatVal, compareFloatDouble
|
||||||
|
};
|
||||||
|
__compar_fn_t gFloatUsignCompare[] = {
|
||||||
|
compareFloatUint8, compareFloatUint16, compareFloatUint32, compareFloatUint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gDoubleSignCompare[] = {
|
||||||
|
compareDoubleInt8, compareDoubleInt16, compareDoubleInt32, compareDoubleInt64, compareDoubleFloat, compareDoubleVal
|
||||||
|
};
|
||||||
|
__compar_fn_t gDoubleUsignCompare[] = {
|
||||||
|
compareDoubleUint8, compareDoubleUint16, compareDoubleUint32, compareDoubleUint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gUint8SignCompare[] = {
|
||||||
|
compareUint8Int8, compareUint8Int16, compareUint8Int32, compareUint8Int64, compareUint8Float, compareUint8Double
|
||||||
|
};
|
||||||
|
__compar_fn_t gUint8UsignCompare[] = {
|
||||||
|
compareUint8Val, compareUint8Uint16, compareUint8Uint32, compareUint8Uint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gUint16SignCompare[] = {
|
||||||
|
compareUint16Int8, compareUint16Int16, compareUint16Int32, compareUint16Int64, compareUint16Float, compareUint16Double
|
||||||
|
};
|
||||||
|
__compar_fn_t gUint16UsignCompare[] = {
|
||||||
|
compareUint16Uint8, compareUint16Val, compareUint16Uint32, compareUint16Uint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gUint32SignCompare[] = {
|
||||||
|
compareUint32Int8, compareUint32Int16, compareUint32Int32, compareUint32Int64, compareUint32Float, compareUint32Double
|
||||||
|
};
|
||||||
|
__compar_fn_t gUint32UsignCompare[] = {
|
||||||
|
compareUint32Uint8, compareUint32Uint16, compareUint32Val, compareUint32Uint64
|
||||||
|
};
|
||||||
|
|
||||||
|
__compar_fn_t gUint64SignCompare[] = {
|
||||||
|
compareUint64Int8, compareUint64Int16, compareUint64Int32, compareUint64Int64, compareUint64Float, compareUint64Double
|
||||||
|
};
|
||||||
|
__compar_fn_t gUint64UsignCompare[] = {
|
||||||
|
compareUint64Uint8, compareUint64Uint16, compareUint64Uint32, compareUint64Val
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int8_t filterGetCompFuncIdx(int32_t type, int32_t optr) {
|
int8_t filterGetCompFuncIdx(int32_t type, int32_t optr) {
|
||||||
int8_t comparFn = 0;
|
int8_t comparFn = 0;
|
||||||
|
|
||||||
|
@ -257,6 +328,93 @@ __compar_fn_t filterGetCompFunc(int32_t type, int32_t optr) {
|
||||||
return gDataCompare[filterGetCompFuncIdx(type, optr)];
|
return gDataCompare[filterGetCompFuncIdx(type, optr)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__compar_fn_t filterGetCompFuncEx(int32_t lType, int32_t rType, int32_t optr) {
|
||||||
|
switch (lType) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gInt8SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gInt8UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gInt16SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gInt16UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_INT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gInt32SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gInt32UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gInt64SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gInt64UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gFloatSignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gFloatUsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gDoubleSignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gDoubleUsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gUint8SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gUint8UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gUint16SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gUint16UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gUint32SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gUint32UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
|
||||||
|
return gUint64SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
|
||||||
|
} else {
|
||||||
|
return gUint64UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t filterCompareGroupCtx(const void *pLeft, const void *pRight) {
|
static FORCE_INLINE int32_t filterCompareGroupCtx(const void *pLeft, const void *pRight) {
|
||||||
SFilterGroupCtx *left = *((SFilterGroupCtx**)pLeft), *right = *((SFilterGroupCtx**)pRight);
|
SFilterGroupCtx *left = *((SFilterGroupCtx**)pLeft), *right = *((SFilterGroupCtx**)pRight);
|
||||||
|
|
|
@ -909,11 +909,11 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t*
|
||||||
int8_t gConvertTypes[TSDB_DATA_TYPE_BLOB+1][TSDB_DATA_TYPE_BLOB+1] = {
|
int8_t gConvertTypes[TSDB_DATA_TYPE_BLOB+1][TSDB_DATA_TYPE_BLOB+1] = {
|
||||||
/* NULL BOOL TINY SMAL INT BIG FLOA DOUB VARC TIME NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB */
|
/* NULL BOOL TINY SMAL INT BIG FLOA DOUB VARC TIME NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB */
|
||||||
/*NULL*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/*NULL*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
/*BOOL*/ 0, 0, 0, 3, 4, 5, 6, 7, 7, 9, 7, 0, 12, 13, 14, 0, 7, 0, 0,
|
/*BOOL*/ 0, 0, 2, 3, 4, 5, 6, 7, 7, 9, 7, 11, 12, 13, 14, 0, 7, 0, 0,
|
||||||
/*TINY*/ 0, 0, 0, 3, 4, 5, 6, 7, 7, 9, 7, 3, 4, 5, 7, 0, 7, 0, 0,
|
/*TINY*/ 0, 0, 0, 3, 4, 5, 6, 7, 7, 9, 7, 3, 4, 5, 7, 0, 7, 0, 0,
|
||||||
/*SMAL*/ 0, 0, 0, 0, 4, 5, 6, 7, 7, 9, 7, 3, 4, 5, 7, 0, 7, 0, 0,
|
/*SMAL*/ 0, 0, 0, 0, 4, 5, 6, 7, 7, 9, 7, 3, 4, 5, 7, 0, 7, 0, 0,
|
||||||
/*INT */ 0, 0, 0, 0, 0, 5, 6, 7, 7, 9, 7, 4, 4, 5, 7, 0, 7, 0, 0,
|
/*INT */ 0, 0, 0, 0, 0, 5, 6, 7, 7, 9, 7, 4, 4, 5, 7, 0, 7, 0, 0,
|
||||||
/*BIGI*/ 0, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 5, 5, 5, 7, 0, 7, 0, 0,
|
/*BIGI*/ 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 7, 5, 5, 5, 7, 0, 7, 0, 0,
|
||||||
/*FLOA*/ 0, 0, 0, 0, 0, 0, 0, 7, 7, 6, 7, 6, 6, 6, 6, 0, 7, 0, 0,
|
/*FLOA*/ 0, 0, 0, 0, 0, 0, 0, 7, 7, 6, 7, 6, 6, 6, 6, 0, 7, 0, 0,
|
||||||
/*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 0,
|
/*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 0,
|
||||||
/*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 7, 7, 7, 0, 0, 0, 0,
|
/*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 7, 7, 7, 0, 0, 0, 0,
|
||||||
|
@ -1681,10 +1681,14 @@ void vectorBitOr(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut,
|
||||||
void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord, int32_t optr) {
|
void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord, int32_t optr) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
int32_t lType = GET_PARAM_TYPE(pLeft);
|
||||||
__compar_fn_t fp = filterGetCompFunc(GET_PARAM_TYPE(pLeft), optr);
|
int32_t rType = GET_PARAM_TYPE(pRight);
|
||||||
if(terrno != TSDB_CODE_SUCCESS){
|
__compar_fn_t fp = NULL;
|
||||||
return;
|
|
||||||
|
if (lType == rType) {
|
||||||
|
fp = filterGetCompFunc(lType, optr);
|
||||||
|
} else {
|
||||||
|
fp = filterGetCompFuncEx(lType, rType, optr);
|
||||||
}
|
}
|
||||||
|
|
||||||
pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
|
pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
|
||||||
|
@ -1716,22 +1720,26 @@ void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *
|
||||||
void vectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord, int32_t optr) {
|
void vectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord, int32_t optr) {
|
||||||
SScalarParam pLeftOut = {0};
|
SScalarParam pLeftOut = {0};
|
||||||
SScalarParam pRightOut = {0};
|
SScalarParam pRightOut = {0};
|
||||||
|
|
||||||
vectorConvert(pLeft, pRight, &pLeftOut, &pRightOut);
|
|
||||||
|
|
||||||
SScalarParam *param1 = NULL;
|
SScalarParam *param1 = NULL;
|
||||||
SScalarParam *param2 = NULL;
|
SScalarParam *param2 = NULL;
|
||||||
|
|
||||||
if (pLeftOut.columnData != NULL) {
|
if (SCL_NO_NEED_CONVERT_COMPARISION(GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight), optr)) {
|
||||||
param1 = &pLeftOut;
|
|
||||||
} else {
|
|
||||||
param1 = pLeft;
|
param1 = pLeft;
|
||||||
}
|
|
||||||
|
|
||||||
if (pRightOut.columnData != NULL) {
|
|
||||||
param2 = &pRightOut;
|
|
||||||
} else {
|
|
||||||
param2 = pRight;
|
param2 = pRight;
|
||||||
|
} else {
|
||||||
|
vectorConvert(pLeft, pRight, &pLeftOut, &pRightOut);
|
||||||
|
|
||||||
|
if (pLeftOut.columnData != NULL) {
|
||||||
|
param1 = &pLeftOut;
|
||||||
|
} else {
|
||||||
|
param1 = pLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRightOut.columnData != NULL) {
|
||||||
|
param2 = &pRightOut;
|
||||||
|
} else {
|
||||||
|
param2 = pRight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vectorCompareImpl(param1, param2, pOut, _ord, optr);
|
vectorCompareImpl(param1, param2, pOut, _ord, optr);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -247,6 +247,756 @@ int32_t compareJsonVal(const void *pLeft, const void *pRight) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Int16(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Int32(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Int64(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Float(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Double(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Uint8(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Uint16(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Uint32(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt8Uint64(const void *pLeft, const void *pRight) {
|
||||||
|
int8_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Int8(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Int32(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Int64(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Float(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Double(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Uint8(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Uint16(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Uint32(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt16Uint64(const void *pLeft, const void *pRight) {
|
||||||
|
int16_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t compareInt32Int8(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Int16(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Int64(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Float(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Double(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Uint8(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Uint16(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Uint32(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt32Uint64(const void *pLeft, const void *pRight) {
|
||||||
|
int32_t left = GET_INT32_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Int8(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Int16(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Int32(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Float(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Double(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Uint8(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Uint16(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Uint32(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareInt64Uint64(const void *pLeft, const void *pRight) {
|
||||||
|
int64_t left = GET_INT64_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatInt8(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatInt16(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatInt32(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatInt64(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatDouble(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
|
||||||
|
if (isnan(left) && isnan(right)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(left)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(right)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FLT_EQUAL(left, right)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return FLT_GREATER(left, right) ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatUint8(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatUint16(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatUint32(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareFloatUint64(const void *pLeft, const void *pRight) {
|
||||||
|
float left = GET_FLOAT_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleInt8(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleInt16(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleInt32(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleInt64(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleFloat(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
|
||||||
|
if (isnan(left) && isnan(right)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(left)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isnan(right)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FLT_EQUAL(left, right)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return FLT_GREATER(left, right) ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleUint8(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleUint16(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleUint32(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareDoubleUint64(const void *pLeft, const void *pRight) {
|
||||||
|
double left = GET_DOUBLE_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Int8(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Int16(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Int32(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Int64(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Float(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Double(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Uint16(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Uint32(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint8Uint64(const void *pLeft, const void *pRight) {
|
||||||
|
uint8_t left = GET_UINT8_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Int8(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Int16(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Int32(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Int64(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Float(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Double(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Uint8(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Uint32(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint16Uint64(const void *pLeft, const void *pRight) {
|
||||||
|
uint16_t left = GET_UINT16_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Int8(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Int16(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Int32(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Int64(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Float(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Double(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Uint8(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Uint16(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint32Uint64(const void *pLeft, const void *pRight) {
|
||||||
|
uint32_t left = GET_UINT32_VAL(pLeft);
|
||||||
|
uint64_t right = GET_UINT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Int8(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
int8_t right = GET_INT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Int16(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
int16_t right = GET_INT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Int32(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
int32_t right = GET_INT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Int64(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
int64_t right = GET_INT64_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Float(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
float right = GET_FLOAT_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Double(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
double right = GET_DOUBLE_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Uint8(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
uint8_t right = GET_UINT8_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Uint16(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
uint16_t right = GET_UINT16_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t compareUint64Uint32(const void *pLeft, const void *pRight) {
|
||||||
|
uint64_t left = GET_UINT64_VAL(pLeft);
|
||||||
|
uint32_t right = GET_UINT32_VAL(pRight);
|
||||||
|
if (left > right) return 1;
|
||||||
|
if (left < right) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t compareJsonValDesc(const void *pLeft, const void *pRight) {
|
int32_t compareJsonValDesc(const void *pLeft, const void *pRight) {
|
||||||
return compareJsonVal(pRight, pLeft);
|
return compareJsonVal(pRight, pLeft);
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,9 @@ class TDTestCase:
|
||||||
|
|
||||||
tdSql.query("select * from macylr")
|
tdSql.query("select * from macylr")
|
||||||
tdSql.checkRows(2)
|
tdSql.checkRows(2)
|
||||||
|
|
||||||
|
tdSql.query("desc macylr")
|
||||||
|
tdSql.checkRows(25)
|
||||||
return
|
return
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
|
|
@ -250,14 +250,14 @@ class TDTestCase:
|
||||||
tdLog.printNoPrefix("=============================================")
|
tdLog.printNoPrefix("=============================================")
|
||||||
tdLog.printNoPrefix("======== snapshot is 0: only consume from wal")
|
tdLog.printNoPrefix("======== snapshot is 0: only consume from wal")
|
||||||
self.tmqCase1()
|
self.tmqCase1()
|
||||||
self.tmqCase2()
|
# self.tmqCase2()
|
||||||
|
|
||||||
self.prepareTestEnv()
|
self.prepareTestEnv()
|
||||||
tdLog.printNoPrefix("====================================================================")
|
tdLog.printNoPrefix("====================================================================")
|
||||||
tdLog.printNoPrefix("======== snapshot is 1: firstly consume from tsbs, and then from wal")
|
tdLog.printNoPrefix("======== snapshot is 1: firstly consume from tsbs, and then from wal")
|
||||||
self.snapshot = 1
|
self.snapshot = 1
|
||||||
self.tmqCase1()
|
self.tmqCase1()
|
||||||
self.tmqCase2()
|
# self.tmqCase2()
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
|
|
@ -99,8 +99,8 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
||||||
|
|
||||||
if not ((totalConsumeRows >= expectrowcnt * 3/4) and (totalConsumeRows < expectrowcnt)):
|
# if not ((totalConsumeRows >= expectrowcnt * 3/4) and (totalConsumeRows < expectrowcnt)):
|
||||||
tdLog.exit("tmq consume rows error with snapshot = 0!")
|
# tdLog.exit("tmq consume rows error with snapshot = 0!")
|
||||||
|
|
||||||
tdLog.info("wait subscriptions exit ....")
|
tdLog.info("wait subscriptions exit ....")
|
||||||
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
||||||
|
@ -192,8 +192,8 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
||||||
|
|
||||||
if not ((totalConsumeRows >= expectrowcnt / 2 * (1 + 3/4)) and (totalConsumeRows < expectrowcnt)):
|
# if not ((totalConsumeRows >= expectrowcnt / 2 * (1 + 3/4)) and (totalConsumeRows < expectrowcnt)):
|
||||||
tdLog.exit("tmq consume rows error with snapshot = 0!")
|
# tdLog.exit("tmq consume rows error with snapshot = 0!")
|
||||||
|
|
||||||
tdLog.info("wait subscriptions exit ....")
|
tdLog.info("wait subscriptions exit ....")
|
||||||
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
||||||
|
|
|
@ -155,8 +155,9 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
||||||
|
|
||||||
if not ((totalConsumeRows > expectrowcnt / 2) and (totalConsumeRows < expectrowcnt)):
|
if self.snapshot == 0:
|
||||||
tdLog.exit("tmq consume rows error with snapshot = 0!")
|
if not ((totalConsumeRows > expectrowcnt / 2) and (totalConsumeRows < expectrowcnt)):
|
||||||
|
tdLog.exit("tmq consume rows error with snapshot = 0!")
|
||||||
|
|
||||||
tdLog.info("wait subscriptions exit ....")
|
tdLog.info("wait subscriptions exit ....")
|
||||||
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
||||||
|
@ -246,8 +247,9 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
tdLog.info("act consume rows: %d, expect consume rows: %d"%(totalConsumeRows, expectrowcnt))
|
||||||
|
|
||||||
if not ((totalConsumeRows > expectrowcnt / 2) and (totalConsumeRows < expectrowcnt)):
|
if self.snapshot == 0:
|
||||||
tdLog.exit("tmq consume rows error with snapshot = 0!")
|
if not ((totalConsumeRows > expectrowcnt / 2) and (totalConsumeRows < expectrowcnt)):
|
||||||
|
tdLog.exit("tmq consume rows error with snapshot = 0!")
|
||||||
|
|
||||||
tdLog.info("wait subscriptions exit ....")
|
tdLog.info("wait subscriptions exit ....")
|
||||||
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
||||||
|
|
|
@ -52,6 +52,148 @@ class TDTestCase:
|
||||||
tdSql.checkData(1, 1, 23)
|
tdSql.checkData(1, 1, 23)
|
||||||
tdSql.checkData(1, 4, None)
|
tdSql.checkData(1, 4, None)
|
||||||
|
|
||||||
|
tdSql.query("select * from st1 order by ts")
|
||||||
|
tdSql.checkRows(8)
|
||||||
|
tdSql.checkData(0, 1, 1)
|
||||||
|
tdSql.checkData(1, 1, 3)
|
||||||
|
tdSql.checkData(4, 1, 4)
|
||||||
|
tdSql.checkData(6, 1, 23)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 2, 2)
|
||||||
|
tdSql.checkData(1, 2, 4)
|
||||||
|
tdSql.checkData(4, 2, 3)
|
||||||
|
tdSql.checkData(6, 2, 32)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 3, 'a')
|
||||||
|
tdSql.checkData(1, 3, 'b')
|
||||||
|
tdSql.checkData(4, 3, 'hwj')
|
||||||
|
tdSql.checkData(6, 3, 's21ds')
|
||||||
|
|
||||||
|
tdSql.checkData(0, 4, None)
|
||||||
|
tdSql.checkData(1, 4, None)
|
||||||
|
tdSql.checkData(5, 4, 940)
|
||||||
|
tdSql.checkData(6, 4, None)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 5, 1000)
|
||||||
|
tdSql.checkData(1, 5, 2000)
|
||||||
|
tdSql.checkData(4, 5, 1000)
|
||||||
|
tdSql.checkData(6, 5, 5000)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 6, 'ttt')
|
||||||
|
tdSql.checkData(1, 6, None)
|
||||||
|
tdSql.checkData(4, 6, 'ttt')
|
||||||
|
tdSql.checkData(6, 6, None)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 7, True)
|
||||||
|
tdSql.checkData(1, 7, None)
|
||||||
|
tdSql.checkData(4, 7, True)
|
||||||
|
tdSql.checkData(6, 7, None)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 8, None)
|
||||||
|
tdSql.checkData(1, 8, None)
|
||||||
|
tdSql.checkData(4, 8, None)
|
||||||
|
tdSql.checkData(6, 8, None)
|
||||||
|
|
||||||
|
tdSql.query("select * from ct1")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
tdSql.query("select * from ct2")
|
||||||
|
tdSql.checkRows(0)
|
||||||
|
|
||||||
|
tdSql.query("select * from ct0 order by c1")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.checkData(0, 3, "a")
|
||||||
|
tdSql.checkData(1, 4, None)
|
||||||
|
|
||||||
|
tdSql.query("select * from n1 order by cc3 desc")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.checkData(0, 1, "eeee")
|
||||||
|
tdSql.checkData(1, 2, 940)
|
||||||
|
|
||||||
|
tdSql.query("select * from jt order by i desc")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.checkData(0, 1, 11)
|
||||||
|
tdSql.checkData(0, 2, None)
|
||||||
|
tdSql.checkData(1, 1, 1)
|
||||||
|
tdSql.checkData(1, 2, '{"k1":1,"k2":"hello"}')
|
||||||
|
|
||||||
|
tdSql.execute('drop topic if exists topic_ctb_column')
|
||||||
|
return
|
||||||
|
|
||||||
|
def checkFileContentSnapshot(self):
|
||||||
|
buildPath = tdCom.getBuildPath()
|
||||||
|
cfgPath = tdCom.getClientCfgPath()
|
||||||
|
cmdStr = '%s/build/bin/tmq_taosx_snapshot_ci -c %s'%(buildPath, cfgPath)
|
||||||
|
tdLog.info(cmdStr)
|
||||||
|
os.system(cmdStr)
|
||||||
|
|
||||||
|
srcFile = '%s/../log/tmq_taosx_tmp_snapshot.source'%(cfgPath)
|
||||||
|
dstFile = '%s/../log/tmq_taosx_tmp_snapshot.result'%(cfgPath)
|
||||||
|
tdLog.info("compare file: %s, %s"%(srcFile, dstFile))
|
||||||
|
|
||||||
|
consumeFile = open(srcFile, mode='r')
|
||||||
|
queryFile = open(dstFile, mode='r')
|
||||||
|
|
||||||
|
while True:
|
||||||
|
dst = queryFile.readline()
|
||||||
|
src = consumeFile.readline()
|
||||||
|
|
||||||
|
if dst:
|
||||||
|
if dst != src:
|
||||||
|
tdLog.exit("compare error: %s != %s"%src, dst)
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
tdSql.execute('use db_taosx')
|
||||||
|
tdSql.query("select * from ct3 order by c1 desc")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.checkData(0, 1, 51)
|
||||||
|
tdSql.checkData(0, 4, 940)
|
||||||
|
tdSql.checkData(1, 1, 23)
|
||||||
|
tdSql.checkData(1, 4, None)
|
||||||
|
|
||||||
|
tdSql.query("select * from st1 order by ts")
|
||||||
|
tdSql.checkRows(8)
|
||||||
|
tdSql.checkData(0, 1, 1)
|
||||||
|
tdSql.checkData(1, 1, 3)
|
||||||
|
tdSql.checkData(4, 1, 4)
|
||||||
|
tdSql.checkData(6, 1, 23)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 2, 2)
|
||||||
|
tdSql.checkData(1, 2, 4)
|
||||||
|
tdSql.checkData(4, 2, 3)
|
||||||
|
tdSql.checkData(6, 2, 32)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 3, 'a')
|
||||||
|
tdSql.checkData(1, 3, 'b')
|
||||||
|
tdSql.checkData(4, 3, 'hwj')
|
||||||
|
tdSql.checkData(6, 3, 's21ds')
|
||||||
|
|
||||||
|
tdSql.checkData(0, 4, None)
|
||||||
|
tdSql.checkData(1, 4, None)
|
||||||
|
tdSql.checkData(5, 4, 940)
|
||||||
|
tdSql.checkData(6, 4, None)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 5, 1000)
|
||||||
|
tdSql.checkData(1, 5, 2000)
|
||||||
|
tdSql.checkData(4, 5, 1000)
|
||||||
|
tdSql.checkData(6, 5, 5000)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 6, 'ttt')
|
||||||
|
tdSql.checkData(1, 6, None)
|
||||||
|
tdSql.checkData(4, 6, 'ttt')
|
||||||
|
tdSql.checkData(6, 6, None)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 7, True)
|
||||||
|
tdSql.checkData(1, 7, None)
|
||||||
|
tdSql.checkData(4, 7, True)
|
||||||
|
tdSql.checkData(6, 7, None)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 8, None)
|
||||||
|
tdSql.checkData(1, 8, None)
|
||||||
|
tdSql.checkData(4, 8, None)
|
||||||
|
tdSql.checkData(6, 8, None)
|
||||||
|
|
||||||
tdSql.query("select * from ct1")
|
tdSql.query("select * from ct1")
|
||||||
tdSql.checkRows(4)
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
@ -80,6 +222,7 @@ class TDTestCase:
|
||||||
def run(self):
|
def run(self):
|
||||||
tdSql.prepare()
|
tdSql.prepare()
|
||||||
self.checkFileContent()
|
self.checkFileContent()
|
||||||
|
self.checkFileContentSnapshot()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
|
@ -2,6 +2,7 @@ add_executable(tmq_demo tmqDemo.c)
|
||||||
add_executable(tmq_sim tmqSim.c)
|
add_executable(tmq_sim tmqSim.c)
|
||||||
add_executable(create_table createTable.c)
|
add_executable(create_table createTable.c)
|
||||||
add_executable(tmq_taosx_ci tmq_taosx_ci.c)
|
add_executable(tmq_taosx_ci tmq_taosx_ci.c)
|
||||||
|
add_executable(tmq_taosx_snapshot_ci tmq_taosx_snapshot_ci.c)
|
||||||
add_executable(sml_test sml_test.c)
|
add_executable(sml_test sml_test.c)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
create_table
|
create_table
|
||||||
|
@ -31,6 +32,13 @@ target_link_libraries(
|
||||||
PUBLIC common
|
PUBLIC common
|
||||||
PUBLIC os
|
PUBLIC os
|
||||||
)
|
)
|
||||||
|
target_link_libraries(
|
||||||
|
tmq_taosx_snapshot_ci
|
||||||
|
PUBLIC taos_static
|
||||||
|
PUBLIC util
|
||||||
|
PUBLIC common
|
||||||
|
PUBLIC os
|
||||||
|
)
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
sml_test
|
sml_test
|
||||||
|
|
|
@ -1089,7 +1089,7 @@ int sml_add_tag_col_Test() {
|
||||||
if (code) return code;
|
if (code) return code;
|
||||||
|
|
||||||
const char *sql1[] = {
|
const char *sql1[] = {
|
||||||
"macylr,id=macylr_17875_1804,t0=f,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\",t11=127i8,t10=L\"ncharTagValue\" c0=f,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64,c11=L\"ncharColValue\",c10=f 1626006833639000000"
|
"macylr,id=macylr_17875_1804,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\",t11=127i8,t10=L\"ncharTagValue\" c0=f,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c8=L\"ncharColValue\",c9=7u64,c11=L\"ncharColValue\",c10=f 1626006833639000000"
|
||||||
};
|
};
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_LINE_PROTOCOL, 0);
|
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_LINE_PROTOCOL, 0);
|
||||||
|
|
|
@ -501,7 +501,8 @@ int main(int argc, char* argv[]) {
|
||||||
if(argc == 3 && strcmp(argv[1], "-c") == 0) {
|
if(argc == 3 && strcmp(argv[1], "-c") == 0) {
|
||||||
strcpy(dir, argv[2]);
|
strcpy(dir, argv[2]);
|
||||||
}else{
|
}else{
|
||||||
strcpy(dir, "../../../sim/psim/cfg");
|
// strcpy(dir, "../../../sim/psim/cfg");
|
||||||
|
strcpy(dir, "/var/log");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("env init\n");
|
printf("env init\n");
|
||||||
|
|
|
@ -0,0 +1,512 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "taos.h"
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
static int running = 1;
|
||||||
|
TdFilePtr g_fp = NULL;
|
||||||
|
char dir[64]={0};
|
||||||
|
|
||||||
|
static TAOS* use_db(){
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
if (pConn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(pConn, "use db_taosx");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in use db_taosx, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
return pConn;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void msg_process(TAOS_RES* msg) {
|
||||||
|
/*memset(buf, 0, 1024);*/
|
||||||
|
printf("-----------topic-------------: %s\n", tmq_get_topic_name(msg));
|
||||||
|
printf("db: %s\n", tmq_get_db_name(msg));
|
||||||
|
printf("vg: %d\n", tmq_get_vgroup_id(msg));
|
||||||
|
TAOS *pConn = use_db();
|
||||||
|
if (tmq_get_res_type(msg) == TMQ_RES_TABLE_META) {
|
||||||
|
char* result = tmq_get_json_meta(msg);
|
||||||
|
if (result) {
|
||||||
|
printf("meta result: %s\n", result);
|
||||||
|
}
|
||||||
|
taosFprintfFile(g_fp, result);
|
||||||
|
taosFprintfFile(g_fp, "\n");
|
||||||
|
tmq_free_json_meta(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmq_raw_data raw = {0};
|
||||||
|
tmq_get_raw(msg, &raw);
|
||||||
|
int32_t ret = tmq_write_raw(pConn, raw);
|
||||||
|
printf("write raw data: %s\n", tmq_err2str(ret));
|
||||||
|
|
||||||
|
// else{
|
||||||
|
// while(1){
|
||||||
|
// int numOfRows = 0;
|
||||||
|
// void *pData = NULL;
|
||||||
|
// taos_fetch_raw_block(msg, &numOfRows, &pData);
|
||||||
|
// if(numOfRows == 0) break;
|
||||||
|
// printf("write data: tbname:%s, numOfRows:%d\n", tmq_get_table_name(msg), numOfRows);
|
||||||
|
// int ret = taos_write_raw_block(pConn, numOfRows, pData, tmq_get_table_name(msg));
|
||||||
|
// printf("write raw data: %s\n", tmq_err2str(ret));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
taos_close(pConn);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t init_env() {
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
if (pConn == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(pConn, "drop database if exists db_taosx");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in drop db_taosx, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create database if not exists db_taosx vgroups 1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in create db_taosx, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "drop database if exists abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in drop db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create database if not exists abc1 vgroups 1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "use abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn,
|
||||||
|
"create stable if not exists st1 (ts timestamp, c1 int, c2 float, c3 binary(16)) tags(t1 int, t3 "
|
||||||
|
"nchar(8), t4 bool)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists ct0 using st1 tags(1000, \"ttt\", true)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create child table tu1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into ct0 values(1626006833600, 1, 2, 'a')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert into ct0, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists ct1 using st1(t1) tags(2000)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create child table ct1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists ct2 using st1(t1) tags(NULL)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create child table ct2, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into ct1 values(1626006833600, 3, 4, 'b')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert into ct1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists ct3 using st1(t1) tags(3000)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create child table ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into ct3 values(1626006833600, 5, 6, 'c') ct1 values(1626006833601, 2, 3, 'sds') (1626006833602, 4, 5, 'ddd') ct0 values(1626006833602, 4, 3, 'hwj') ct1 values(now+5s, 23, 32, 's21ds')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table st1 add column c4 bigint");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to alter super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table st1 modify column c3 binary(64)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to alter super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into ct3 values(1626006833605, 53, 63, 'cffffffffffffffffffffffffffff', 8989898899999) (1626006833609, 51, 62, 'c333', 940)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into ct3 select * from ct1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table st1 add tag t2 binary(64)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to alter super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table ct3 set tag t1=5000");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to slter child table ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "delete from abc1 .ct3 where ts < 1626006833606");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert into ct3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists n1(ts timestamp, c1 int, c2 nchar(4))");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create normal table n1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table n1 add column c3 bigint");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to alter normal table n1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table n1 modify column c2 nchar(8)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to alter normal table n1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table n1 rename column c3 cc3");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to alter normal table n1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table n1 comment 'hello'");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to alter normal table n1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "alter table n1 drop column c1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to alter normal table n1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into n1 values(now, 'eeee', 8989898899999) (now+9s, 'c333', 940)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert into n1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table jt(ts timestamp, i int) tags(t json)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create super table jt, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table jt1 using jt tags('{\"k1\":1, \"k2\":\"hello\"}')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create super table jt, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table jt2 using jt tags('')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create super table jt2, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into jt1 values(now, 1)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create super table jt1, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "insert into jt2 values(now, 11)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create super table jt2, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
taos_close(pConn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t create_topic() {
|
||||||
|
printf("create topic\n");
|
||||||
|
TAOS_RES* pRes;
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
if (pConn == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "use abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create topic topic_ctb_column with meta as database abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create topic topic_ctb_column, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
taos_close(pConn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tmq_commit_cb_print(tmq_t* tmq, int32_t code, void* param) {
|
||||||
|
printf("commit %d tmq %p param %p\n", code, tmq, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmq_t* build_consumer() {
|
||||||
|
#if 0
|
||||||
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
assert(pConn != NULL);
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
tmq_conf_t* conf = tmq_conf_new();
|
||||||
|
tmq_conf_set(conf, "group.id", "tg2");
|
||||||
|
tmq_conf_set(conf, "client.id", "my app 1");
|
||||||
|
tmq_conf_set(conf, "td.connect.user", "root");
|
||||||
|
tmq_conf_set(conf, "td.connect.pass", "taosdata");
|
||||||
|
tmq_conf_set(conf, "msg.with.table.name", "true");
|
||||||
|
tmq_conf_set(conf, "enable.auto.commit", "true");
|
||||||
|
tmq_conf_set(conf, "enable.heartbeat.background", "true");
|
||||||
|
tmq_conf_set(conf, "experimental.snapshot.enable", "true");
|
||||||
|
/*tmq_conf_set(conf, "experimental.snapshot.enable", "true");*/
|
||||||
|
|
||||||
|
tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL);
|
||||||
|
tmq_t* tmq = tmq_consumer_new(conf, NULL, 0);
|
||||||
|
assert(tmq);
|
||||||
|
tmq_conf_destroy(conf);
|
||||||
|
return tmq;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmq_list_t* build_topic_list() {
|
||||||
|
tmq_list_t* topic_list = tmq_list_new();
|
||||||
|
tmq_list_append(topic_list, "topic_ctb_column");
|
||||||
|
/*tmq_list_append(topic_list, "tmq_test_db_multi_insert_topic");*/
|
||||||
|
return topic_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void basic_consume_loop(tmq_t* tmq, tmq_list_t* topics) {
|
||||||
|
int32_t code;
|
||||||
|
|
||||||
|
if ((code = tmq_subscribe(tmq, topics))) {
|
||||||
|
fprintf(stderr, "%% Failed to start consuming topics: %s\n", tmq_err2str(code));
|
||||||
|
printf("subscribe err\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int32_t cnt = 0;
|
||||||
|
while (running) {
|
||||||
|
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 1000);
|
||||||
|
if (tmqmessage) {
|
||||||
|
cnt++;
|
||||||
|
msg_process(tmqmessage);
|
||||||
|
/*if (cnt >= 2) break;*/
|
||||||
|
/*printf("get data\n");*/
|
||||||
|
taos_free_result(tmqmessage);
|
||||||
|
/*} else {*/
|
||||||
|
/*break;*/
|
||||||
|
/*tmq_commit_sync(tmq, NULL);*/
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tmq_consumer_close(tmq);
|
||||||
|
if (code)
|
||||||
|
fprintf(stderr, "%% Failed to close consumer: %s\n", tmq_err2str(code));
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%% Consumer closed\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void sync_consume_loop(tmq_t* tmq, tmq_list_t* topics) {
|
||||||
|
static const int MIN_COMMIT_COUNT = 1;
|
||||||
|
|
||||||
|
int msg_count = 0;
|
||||||
|
int32_t code;
|
||||||
|
|
||||||
|
if ((code = tmq_subscribe(tmq, topics))) {
|
||||||
|
fprintf(stderr, "%% Failed to start consuming topics: %s\n", tmq_err2str(code));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmq_list_t* subList = NULL;
|
||||||
|
tmq_subscription(tmq, &subList);
|
||||||
|
char** subTopics = tmq_list_to_c_array(subList);
|
||||||
|
int32_t sz = tmq_list_get_size(subList);
|
||||||
|
printf("subscribed topics: ");
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
printf("%s, ", subTopics[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
tmq_list_destroy(subList);
|
||||||
|
|
||||||
|
while (running) {
|
||||||
|
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 1000);
|
||||||
|
if (tmqmessage) {
|
||||||
|
msg_process(tmqmessage);
|
||||||
|
taos_free_result(tmqmessage);
|
||||||
|
|
||||||
|
/*tmq_commit_sync(tmq, NULL);*/
|
||||||
|
/*if ((++msg_count % MIN_COMMIT_COUNT) == 0) tmq_commit(tmq, NULL, 0);*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tmq_consumer_close(tmq);
|
||||||
|
if (code)
|
||||||
|
fprintf(stderr, "%% Failed to close consumer: %s\n", tmq_err2str(code));
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%% Consumer closed\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void initLogFile() {
|
||||||
|
char f1[256] = {0};
|
||||||
|
char f2[256] = {0};
|
||||||
|
|
||||||
|
sprintf(f1, "%s/../log/tmq_taosx_tmp_snapshot.source", dir);
|
||||||
|
sprintf(f2, "%s/../log/tmq_taosx_tmp_snapshot.result", dir);
|
||||||
|
TdFilePtr pFile = taosOpenFile(f1, TD_FILE_TEXT | TD_FILE_TRUNC | TD_FILE_STREAM);
|
||||||
|
if (NULL == pFile) {
|
||||||
|
fprintf(stderr, "Failed to open %s for save result\n", f1);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
g_fp = pFile;
|
||||||
|
|
||||||
|
TdFilePtr pFile2 = taosOpenFile(f2, TD_FILE_TEXT | TD_FILE_TRUNC | TD_FILE_STREAM);
|
||||||
|
if (NULL == pFile2) {
|
||||||
|
fprintf(stderr, "Failed to open %s for save result\n", f2);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
char *result[] = {
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"st1\",\"tableType\":\"super\",\"columns\":[{\"name\":\"ts\",\"type\":9},{\"name\":\"c1\",\"type\":4},{\"name\":\"c2\",\"type\":6},{\"name\":\"c3\",\"type\":8,\"length\":64},{\"name\":\"c4\",\"type\":5}],\"tags\":[{\"name\":\"t1\",\"type\":4},{\"name\":\"t3\",\"type\":10,\"length\":8},{\"name\":\"t4\",\"type\":1},{\"name\":\"t2\",\"type\":8,\"length\":64}]}",
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"ct0\",\"tableType\":\"child\",\"using\":\"st1\",\"tagNum\":4,\"tags\":[{\"name\":\"t1\",\"type\":4,\"value\":1000},{\"name\":\"t3\",\"type\":10,\"value\":\"\\\"ttt\\\"\"},{\"name\":\"t4\",\"type\":1,\"value\":1}]}",
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"ct1\",\"tableType\":\"child\",\"using\":\"st1\",\"tagNum\":4,\"tags\":[{\"name\":\"t1\",\"type\":4,\"value\":2000}]}",
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"ct2\",\"tableType\":\"child\",\"using\":\"st1\",\"tagNum\":4,\"tags\":[]}",
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"ct3\",\"tableType\":\"child\",\"using\":\"st1\",\"tagNum\":4,\"tags\":[{\"name\":\"t1\",\"type\":4,\"value\":5000}]}",
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"n1\",\"tableType\":\"normal\",\"columns\":[{\"name\":\"ts\",\"type\":9},{\"name\":\"c2\",\"type\":10,\"length\":8},{\"name\":\"cc3\",\"type\":5}],\"tags\":[]}",
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"jt\",\"tableType\":\"super\",\"columns\":[{\"name\":\"ts\",\"type\":9},{\"name\":\"i\",\"type\":4}],\"tags\":[{\"name\":\"t\",\"type\":15}]}",
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"jt1\",\"tableType\":\"child\",\"using\":\"jt\",\"tagNum\":1,\"tags\":[{\"name\":\"t\",\"type\":15,\"value\":\"{\\\"k1\\\":1,\\\"k2\\\":\\\"hello\\\"}\"}]}",
|
||||||
|
"{\"type\":\"create\",\"tableName\":\"jt2\",\"tableType\":\"child\",\"using\":\"jt\",\"tagNum\":1,\"tags\":[]}",
|
||||||
|
};
|
||||||
|
|
||||||
|
for(int i = 0; i < sizeof(result)/sizeof(result[0]); i++){
|
||||||
|
taosFprintfFile(pFile2, result[i]);
|
||||||
|
taosFprintfFile(pFile2, "\n");
|
||||||
|
}
|
||||||
|
taosCloseFile(&pFile2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
if(argc == 3 && strcmp(argv[1], "-c") == 0) {
|
||||||
|
strcpy(dir, argv[2]);
|
||||||
|
}else{
|
||||||
|
// strcpy(dir, "../../../sim/psim/cfg");
|
||||||
|
strcpy(dir, "/var/log");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("env init\n");
|
||||||
|
initLogFile();
|
||||||
|
|
||||||
|
if (init_env() < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
create_topic();
|
||||||
|
|
||||||
|
tmq_t* tmq = build_consumer();
|
||||||
|
tmq_list_t* topic_list = build_topic_list();
|
||||||
|
basic_consume_loop(tmq, topic_list);
|
||||||
|
/*sync_consume_loop(tmq, topic_list);*/
|
||||||
|
taosCloseFile(&g_fp);
|
||||||
|
}
|
|
@ -82,6 +82,7 @@ ELSE ()
|
||||||
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter
|
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter
|
||||||
)
|
)
|
||||||
EXECUTE_PROCESS(
|
EXECUTE_PROCESS(
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/taosadapter
|
||||||
COMMAND git rev-parse --short HEAD
|
COMMAND git rev-parse --short HEAD
|
||||||
RESULT_VARIABLE commit_sha1
|
RESULT_VARIABLE commit_sha1
|
||||||
OUTPUT_VARIABLE taosadapter_commit_sha1
|
OUTPUT_VARIABLE taosadapter_commit_sha1
|
||||||
|
@ -118,8 +119,8 @@ ELSE ()
|
||||||
PATCH_COMMAND
|
PATCH_COMMAND
|
||||||
COMMAND git clean -f -d
|
COMMAND git clean -f -d
|
||||||
BUILD_COMMAND
|
BUILD_COMMAND
|
||||||
COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -ldflags "-s -w -X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}"
|
COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -ldflags "-s -w -X github.com/taosdata/taosadapter/v3/version.Version=${taos_version} -X github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}"
|
||||||
COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -o taosadapter-debug -ldflags "-X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}"
|
COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -o taosadapter-debug -ldflags "-X github.com/taosdata/taosadapter/v3/version.Version=${taos_version} -X github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}"
|
||||||
INSTALL_COMMAND
|
INSTALL_COMMAND
|
||||||
COMMAND ${_upx_prefix}/src/upx/upx taosadapter
|
COMMAND ${_upx_prefix}/src/upx/upx taosadapter
|
||||||
COMMAND cmake -E copy taosadapter ${CMAKE_BINARY_DIR}/build/bin
|
COMMAND cmake -E copy taosadapter ${CMAKE_BINARY_DIR}/build/bin
|
||||||
|
@ -141,8 +142,8 @@ ELSE ()
|
||||||
PATCH_COMMAND
|
PATCH_COMMAND
|
||||||
COMMAND git clean -f -d
|
COMMAND git clean -f -d
|
||||||
BUILD_COMMAND
|
BUILD_COMMAND
|
||||||
COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -ldflags "-s -w -X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}"
|
COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -ldflags "-s -w -X github.com/taosdata/taosadapter/v3/version.Version=${taos_version} -X github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}"
|
||||||
COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -o taosadapter-debug -ldflags "-X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}"
|
COMMAND CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib go build -a -o taosadapter-debug -ldflags "-X github.com/taosdata/taosadapter/v3/version.Version=${taos_version} -X github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}"
|
||||||
INSTALL_COMMAND
|
INSTALL_COMMAND
|
||||||
COMMAND cmake -E copy taosadapter ${CMAKE_BINARY_DIR}/build/bin
|
COMMAND cmake -E copy taosadapter ${CMAKE_BINARY_DIR}/build/bin
|
||||||
COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/test/cfg/
|
COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/test/cfg/
|
||||||
|
@ -174,8 +175,8 @@ ELSE ()
|
||||||
BUILD_COMMAND
|
BUILD_COMMAND
|
||||||
COMMAND set CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client
|
COMMAND set CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client
|
||||||
COMMAND set CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib
|
COMMAND set CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib
|
||||||
COMMAND go build -a -o taosadapter.exe -ldflags "-s -w -X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}"
|
COMMAND go build -a -o taosadapter.exe -ldflags "-s -w -X github.com/taosdata/taosadapter/v3/version.Version=${taos_version} -X github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}"
|
||||||
COMMAND go build -a -o taosadapter-debug.exe -ldflags "-X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}"
|
COMMAND go build -a -o taosadapter-debug.exe -ldflags "-X github.com/taosdata/taosadapter/v3/version.Version=${taos_version} -X github.com/taosdata/taosadapter/v3/version.CommitID=${taosadapter_commit_sha1}"
|
||||||
INSTALL_COMMAND
|
INSTALL_COMMAND
|
||||||
COMMAND ${_upx_prefix}/src/upx/upx taosadapter.exe
|
COMMAND ${_upx_prefix}/src/upx/upx taosadapter.exe
|
||||||
COMMAND cmake -E copy taosadapter.exe ${CMAKE_BINARY_DIR}/build/bin
|
COMMAND cmake -E copy taosadapter.exe ${CMAKE_BINARY_DIR}/build/bin
|
||||||
|
|
Loading…
Reference in New Issue