diff --git a/docs/en/10-cluster/02-cluster-mgmt.md b/docs/en/10-cluster/02-cluster-mgmt.md
index 674c92e276..bd3386c411 100644
--- a/docs/en/10-cluster/02-cluster-mgmt.md
+++ b/docs/en/10-cluster/02-cluster-mgmt.md
@@ -54,14 +54,14 @@ Database changed.
taos> show vgroups;
vgId | tables | status | onlines | v1_dnode | v1_status | compacting |
==========================================================================================
- 14 | 38000 | ready | 1 | 1 | master | 0 |
- 15 | 38000 | ready | 1 | 1 | master | 0 |
- 16 | 38000 | ready | 1 | 1 | master | 0 |
- 17 | 38000 | ready | 1 | 1 | master | 0 |
- 18 | 37001 | ready | 1 | 1 | master | 0 |
- 19 | 37000 | ready | 1 | 1 | master | 0 |
- 20 | 37000 | ready | 1 | 1 | master | 0 |
- 21 | 37000 | ready | 1 | 1 | master | 0 |
+ 14 | 38000 | ready | 1 | 1 | leader | 0 |
+ 15 | 38000 | ready | 1 | 1 | leader | 0 |
+ 16 | 38000 | ready | 1 | 1 | leader | 0 |
+ 17 | 38000 | ready | 1 | 1 | leader | 0 |
+ 18 | 37001 | ready | 1 | 1 | leader | 0 |
+ 19 | 37000 | ready | 1 | 1 | leader | 0 |
+ 20 | 37000 | ready | 1 | 1 | leader | 0 |
+ 21 | 37000 | ready | 1 | 1 | leader | 0 |
Query OK, 8 row(s) in set (0.001154s)
```
@@ -161,14 +161,14 @@ First `show vgroups` is executed to show the vgroup distribution.
taos> show vgroups;
vgId | tables | status | onlines | v1_dnode | v1_status | compacting |
==========================================================================================
- 14 | 38000 | ready | 1 | 3 | master | 0 |
- 15 | 38000 | ready | 1 | 3 | master | 0 |
- 16 | 38000 | ready | 1 | 3 | master | 0 |
- 17 | 38000 | ready | 1 | 3 | master | 0 |
- 18 | 37001 | ready | 1 | 3 | master | 0 |
- 19 | 37000 | ready | 1 | 1 | master | 0 |
- 20 | 37000 | ready | 1 | 1 | master | 0 |
- 21 | 37000 | ready | 1 | 1 | master | 0 |
+ 14 | 38000 | ready | 1 | 3 | leader | 0 |
+ 15 | 38000 | ready | 1 | 3 | leader | 0 |
+ 16 | 38000 | ready | 1 | 3 | leader | 0 |
+ 17 | 38000 | ready | 1 | 3 | leader | 0 |
+ 18 | 37001 | ready | 1 | 3 | leader | 0 |
+ 19 | 37000 | ready | 1 | 1 | leader | 0 |
+ 20 | 37000 | ready | 1 | 1 | leader | 0 |
+ 21 | 37000 | ready | 1 | 1 | leader | 0 |
Query OK, 8 row(s) in set (0.001314s)
```
@@ -191,14 +191,14 @@ Query OK, 0 row(s) in set (0.000575s)
taos> show vgroups;
vgId | tables | status | onlines | v1_dnode | v1_status | v2_dnode | v2_status | compacting |
=================================================================================================================
- 14 | 38000 | ready | 1 | 3 | master | 0 | NULL | 0 |
- 15 | 38000 | ready | 1 | 3 | master | 0 | NULL | 0 |
- 16 | 38000 | ready | 1 | 3 | master | 0 | NULL | 0 |
- 17 | 38000 | ready | 1 | 3 | master | 0 | NULL | 0 |
- 18 | 37001 | ready | 2 | 1 | slave | 3 | master | 0 |
- 19 | 37000 | ready | 1 | 1 | master | 0 | NULL | 0 |
- 20 | 37000 | ready | 1 | 1 | master | 0 | NULL | 0 |
- 21 | 37000 | ready | 1 | 1 | master | 0 | NULL | 0 |
+ 14 | 38000 | ready | 1 | 3 | leader | 0 | NULL | 0 |
+ 15 | 38000 | ready | 1 | 3 | leader | 0 | NULL | 0 |
+ 16 | 38000 | ready | 1 | 3 | leader | 0 | NULL | 0 |
+ 17 | 38000 | ready | 1 | 3 | leader | 0 | NULL | 0 |
+ 18 | 37001 | ready | 2 | 1 | follower | 3 | leader | 0 |
+ 19 | 37000 | ready | 1 | 1 | leader | 0 | NULL | 0 |
+ 20 | 37000 | ready | 1 | 1 | leader | 0 | NULL | 0 |
+ 21 | 37000 | ready | 1 | 1 | leader | 0 | NULL | 0 |
Query OK, 8 row(s) in set (0.001242s)
```
@@ -207,7 +207,7 @@ It can be seen from above output that vgId 18 has been moved from dnode 3 to dno
:::note
- Manual load balancing can only be performed when the automatic load balancing is disabled, i.e. `balance` is set to 0.
-- Only a vnode in normal state, i.e. master or slave, can be moved. vnode can't be moved when its in status offline, unsynced or syncing.
+- Only a vnode in normal state, i.e. leader or follower, can be moved. vnode can't be moved when its in status offline, unsynced or syncing.
- Before moving a vnode, it's necessary to make sure the target dnode has enough resources: CPU, memory and disk.
:::
diff --git a/docs/en/10-cluster/03-ha-and-lb.md b/docs/en/10-cluster/03-ha-and-lb.md
index bd718eef9f..9780e8f6c6 100644
--- a/docs/en/10-cluster/03-ha-and-lb.md
+++ b/docs/en/10-cluster/03-ha-and-lb.md
@@ -27,7 +27,7 @@ There may be multiple dnodes in a cluster, but only one mnode can be started in
SHOW MNODES;
```
-The end point and role/status (master, slave, unsynced, or offline) of all mnodes can be shown by the above command. When the first dnode is started in a cluster, there must be one mnode in this dnode. Without at least one mnode, the cluster cannot work. If `numOfMNodes` is configured to 2, another mnode will be started when the second dnode is launched.
+The end point and role/status (leader, follower, unsynced, or offline) of all mnodes can be shown by the above command. When the first dnode is started in a cluster, there must be one mnode in this dnode. Without at least one mnode, the cluster cannot work. If `numOfMNodes` is configured to 2, another mnode will be started when the second dnode is launched.
For the high availability of mnode, `numOfMnodes` needs to be configured to 2 or a higher value. Because the data consistency between mnodes must be guaranteed, the replica confirmation parameter `quorum` is set to 2 automatically if `numOfMNodes` is set to 2 or higher.
@@ -58,13 +58,13 @@ When a dnode is offline, it can be detected by the TDengine cluster. There are t
- If the dnode has been offline over the threshold configured in `offlineThreshold` in `taos.cfg`, the dnode will be removed from the cluster automatically. A system alert will be generated and automatic load balancing will be triggered if `balance` is set to 1. When the removed dnode is restarted and becomes online, it will not join the cluster automatically. The system administrator has to manually join the dnode to the cluster.
:::note
-If all the vnodes in a vgroup (or mnodes in mnode group) are in offline or unsynced status, the master node can only be voted on, after all the vnodes or mnodes in the group become online and can exchange status. Following this, the vgroup (or mnode group) is able to provide service.
+If all the vnodes in a vgroup (or mnodes in mnode group) are in offline or unsynced status, the leader node can only be voted on, after all the vnodes or mnodes in the group become online and can exchange status. Following this, the vgroup (or mnode group) is able to provide service.
:::
## Arbitrator
-The "arbitrator" component is used to address the special case when the number of replicas is set to an even number like 2,4 etc. If half of the vnodes in a vgroup don't work, it is impossible to vote and select a master node. This situation also applies to mnodes if the number of mnodes is set to an even number like 2,4 etc.
+The "arbitrator" component is used to address the special case when the number of replicas is set to an even number like 2,4 etc. If half of the vnodes in a vgroup don't work, it is impossible to vote and select a leader node. This situation also applies to mnodes if the number of mnodes is set to an even number like 2,4 etc.
To resolve this problem, a new arbitrator component named `tarbitrator`, an abbreviation of TDengine Arbitrator, was introduced. The `tarbitrator` simulates a vnode or mnode but it's only responsible for network communication and doesn't handle any actual data access. As long as more than half of the vnode or mnode, including Arbitrator, are available the vnode group or mnode group can provide data insertion or query services normally.
diff --git a/docs/en/14-reference/07-tdinsight/assets/15146-tdengine-monitor-dashboard.json b/docs/en/14-reference/07-tdinsight/assets/15146-tdengine-monitor-dashboard.json
index f651983528..54dc1062d6 100644
--- a/docs/en/14-reference/07-tdinsight/assets/15146-tdengine-monitor-dashboard.json
+++ b/docs/en/14-reference/07-tdinsight/assets/15146-tdengine-monitor-dashboard.json
@@ -211,7 +211,7 @@
],
"timeFrom": null,
"timeShift": null,
- "title": "Master MNode",
+ "title": "Leader MNode",
"transformations": [
{
"id": "filterByValue",
@@ -221,7 +221,7 @@
"config": {
"id": "regex",
"options": {
- "value": "master"
+ "value": "leader"
}
},
"fieldName": "role"
@@ -300,7 +300,7 @@
],
"timeFrom": null,
"timeShift": null,
- "title": "Master MNode Create Time",
+ "title": "Leader MNode Create Time",
"transformations": [
{
"id": "filterByValue",
@@ -310,7 +310,7 @@
"config": {
"id": "regex",
"options": {
- "value": "master"
+ "value": "leader"
}
},
"fieldName": "role"
diff --git a/docs/en/14-reference/07-tdinsight/assets/tdengine-grafana-7.x.json b/docs/en/14-reference/07-tdinsight/assets/tdengine-grafana-7.x.json
index b4254c428b..1add8522a7 100644
--- a/docs/en/14-reference/07-tdinsight/assets/tdengine-grafana-7.x.json
+++ b/docs/en/14-reference/07-tdinsight/assets/tdengine-grafana-7.x.json
@@ -153,7 +153,7 @@
],
"timeFrom": null,
"timeShift": null,
- "title": "Master MNode",
+ "title": "Leader MNode",
"transformations": [
{
"id": "filterByValue",
@@ -163,7 +163,7 @@
"config": {
"id": "regex",
"options": {
- "value": "master"
+ "value": "leader"
}
},
"fieldName": "role"
@@ -246,7 +246,7 @@
],
"timeFrom": null,
"timeShift": null,
- "title": "Master MNode Create Time",
+ "title": "Leader MNode Create Time",
"transformations": [
{
"id": "filterByValue",
@@ -256,7 +256,7 @@
"config": {
"id": "regex",
"options": {
- "value": "master"
+ "value": "leader"
}
},
"fieldName": "role"
diff --git a/docs/en/14-reference/07-tdinsight/index.md b/docs/en/14-reference/07-tdinsight/index.md
index cebfafa225..e74c9de7b2 100644
--- a/docs/en/14-reference/07-tdinsight/index.md
+++ b/docs/en/14-reference/07-tdinsight/index.md
@@ -274,8 +274,8 @@ Details of the metrics are as follows.
This section contains the current information and status of the cluster, the alert information is also here (from left to right, top to bottom).
- **First EP**: the `firstEp` setting in the current TDengine cluster.
-- **Version**: TDengine server version (master mnode).
-- **Master Uptime**: The time elapsed since the current Master MNode was elected as Master.
+- **Version**: TDengine server version (leader mnode).
+- **Leader Uptime**: The time elapsed since the current Leader MNode was elected as Leader.
- **Expire Time** - Enterprise version expiration time.
- **Used Measuring Points** - The number of measuring points used by the Enterprise Edition.
- **Databases** - The number of databases.
@@ -333,7 +333,7 @@ Data node resource usage display with repeated multiple rows for the variable `$
2. **Has MNodes?**: whether the current dnode is a mnode.
3. **CPU Cores**: the number of CPU cores.
4. **VNodes Number**: the number of VNodes in the current dnode.
-5. **VNodes Masters**: the number of vnodes in the master role.
+5. **VNodes Masters**: the number of vnodes in the leader role.
6. **Current CPU Usage of taosd**: CPU usage rate of taosd processes.
7. **Current Memory Usage of taosd**: memory usage of taosd processes.
8. **Disk Used**: The total disk usage percentage of the taosd data directory.
diff --git a/docs/en/21-tdinternal/01-arch.md b/docs/en/21-tdinternal/01-arch.md
index 4d8bed4d2d..d7d472eb98 100644
--- a/docs/en/21-tdinternal/01-arch.md
+++ b/docs/en/21-tdinternal/01-arch.md
@@ -22,9 +22,9 @@ A complete TDengine system runs on one or more physical nodes. Logically, it inc
**Virtual node (vnode)**: To better support data sharding, load balancing and prevent data from overheating or skewing, data nodes are virtualized into multiple virtual nodes (vnode, V2, V3, V4, etc. in the figure). Each vnode is a relatively independent work unit, which is the basic unit of time-series data storage and has independent running threads, memory space and persistent storage path. A vnode contains a certain number of tables (data collection points). When a new table is created, the system checks whether a new vnode needs to be created. The number of vnodes that can be created on a data node depends on the capacity of the hardware of the physical node where the data node is located. A vnode belongs to only one DB, but a DB can have multiple vnodes. In addition to the stored time-series data, a vnode also stores the schema and tag values of the included tables. A virtual node is uniquely identified in the system by the EP of the data node and the VGroup ID to which it belongs and is created and managed by the management node.
-**Management node (mnode)**: A virtual logical unit responsible for monitoring and maintaining the running status of all data nodes and load balancing among nodes (M in the figure). At the same time, the management node is also responsible for the storage and management of metadata (including users, databases, tables, static tags, etc.), so it is also called Meta Node. Multiple (up to 5) mnodes can be configured in a TDengine cluster, and they are automatically constructed into a virtual management node group (M0, M1, M2 in the figure). The master/slave mechanism is adopted for the mnode group and the data synchronization is carried out in a strongly consistent way. Any data update operation can only be executed on the master. The creation of mnode cluster is completed automatically by the system without manual intervention. There is at most one mnode on each dnode, which is uniquely identified by the EP of the data node to which it belongs. Each dnode automatically obtains the EP of the dnode where all mnodes in the whole cluster are located, through internal messaging interaction.
+**Management node (mnode)**: A virtual logical unit responsible for monitoring and maintaining the running status of all data nodes and load balancing among nodes (M in the figure). At the same time, the management node is also responsible for the storage and management of metadata (including users, databases, tables, static tags, etc.), so it is also called Meta Node. Multiple (up to 5) mnodes can be configured in a TDengine cluster, and they are automatically constructed into a virtual management node group (M0, M1, M2 in the figure). The leader/follower mechanism is adopted for the mnode group and the data synchronization is carried out in a strongly consistent way. Any data update operation can only be executed on the leader. The creation of mnode cluster is completed automatically by the system without manual intervention. There is at most one mnode on each dnode, which is uniquely identified by the EP of the data node to which it belongs. Each dnode automatically obtains the EP of the dnode where all mnodes in the whole cluster are located, through internal messaging interaction.
-**Virtual node group (VGroup)**: Vnodes on different data nodes can form a virtual node group to ensure the high availability of the system. The virtual node group is managed in a master/slave mechanism. Write operations can only be performed on the master vnode, and then replicated to slave vnodes, thus ensuring that one single replica of data is copied on multiple physical nodes. The number of virtual nodes in a vgroup equals the number of data replicas. If the number of replicas of a DB is N, the system must have at least N data nodes. The number of replicas can be specified by the parameter `“replica”` when creating a DB, and the default is 1. Using the multi-replication feature of TDengine, the same high data reliability can be achieved without the need for expensive storage devices such as disk arrays. Virtual node groups are created and managed by the management node, and the management node assigns a system unique ID, aka VGroup ID. If two virtual nodes have the same vnode group ID, it means that they belong to the same group and the data is backed up to each other. The number of virtual nodes in a virtual node group can be dynamically changed, allowing only one, that is, no data replication. VGroup ID is never changed. Even if a virtual node group is deleted, its ID will not be reused.
+**Virtual node group (VGroup)**: Vnodes on different data nodes can form a virtual node group to ensure the high availability of the system. The virtual node group is managed in a leader/follower mechanism. Write operations can only be performed on the leader vnode, and then replicated to follower vnodes, thus ensuring that one single replica of data is copied on multiple physical nodes. The number of virtual nodes in a vgroup equals the number of data replicas. If the number of replicas of a DB is N, the system must have at least N data nodes. The number of replicas can be specified by the parameter `“replica”` when creating a DB, and the default is 1. Using the multi-replication feature of TDengine, the same high data reliability can be achieved without the need for expensive storage devices such as disk arrays. Virtual node groups are created and managed by the management node, and the management node assigns a system unique ID, aka VGroup ID. If two virtual nodes have the same vnode group ID, it means that they belong to the same group and the data is backed up to each other. The number of virtual nodes in a virtual node group can be dynamically changed, allowing only one, that is, no data replication. VGroup ID is never changed. Even if a virtual node group is deleted, its ID will not be reused.
**TAOSC**: TAOSC is the driver provided by TDengine to applications. It is responsible for dealing with the interaction between application and cluster, and provides the native interface for the C/C++ language. It is also embedded in the JDBC, C #, Python, Go, Node.js language connection libraries. Applications interact with the whole cluster through TAOSC instead of directly connecting to data nodes in the cluster. This module is responsible for obtaining and caching metadata; forwarding requests for insertion, query, etc. to the correct data node; when returning the results to the application, TAOSC also needs to be responsible for the final level of aggregation, sorting, filtering and other operations. For JDBC, C/C++/C#/Python/Go/Node.js interfaces, this module runs on the physical node where the application is located. At the same time, in order to support the fully distributed RESTful interface, TAOSC has a running instance on each dnode of TDengine cluster.
@@ -62,13 +62,13 @@ To explain the relationship between vnode, mnode, TAOSC and application and thei
1. Application initiates a request to insert data through JDBC, ODBC, or other APIs.
2. TAOSC checks the cache to see if meta data exists for the table. If it does, it goes straight to Step 4. If not, TAOSC sends a get meta-data request to mnode.
3. Mnode returns the meta-data of the table to TAOSC. Meta-data contains the schema of the table, and also the vgroup information to which the table belongs (the vnode ID and the End Point of the dnode where the table belongs. If the number of replicas is N, there will be N groups of End Points). If TAOSC does not receive a response from the mnode for a long time, and there are multiple mnodes, TAOSC will send a request to the next mnode.
-4. TAOSC initiates an insert request to master vnode.
+4. TAOSC initiates an insert request to leader vnode.
5. After vnode inserts the data, it gives a reply to TAOSC, indicating that the insertion is successful. If TAOSC doesn't get a response from vnode for a long time, TAOSC will treat this node as offline. In this case, if there are multiple replicas of the inserted database, TAOSC will issue an insert request to the next vnode in vgroup.
6. TAOSC notifies APP that writing is successful.
For Step 2 and 3, when TAOSC starts, it does not know the End Point of mnode, so it will directly initiate a request to the configured serving End Point of the cluster. If the dnode that receives the request does not have a mnode configured, it will reply with the mnode EP list, so that TAOSC will re-issue a request to obtain meta-data to the EP of another mnode.
-For Step 4 and 5, without caching, TAOSC can't recognize the master in the virtual node group, so assumes that the first vnode is the master and sends a request to it. If this vnode is not the master, it will reply to the actual master as a new target to which TAOSC shall send a request. Once a response of successful insertion is obtained, TAOSC will cache the information of master node.
+For Step 4 and 5, without caching, TAOSC can't recognize the leader in the virtual node group, so assumes that the first vnode is the leader and sends a request to it. If this vnode is not the leader, it will reply to the actual leader as a new target to which TAOSC shall send a request. Once a response of successful insertion is obtained, TAOSC will cache the information of leader node.
The above describes the process of inserting data. The processes of querying and computing are the same. TAOSC encapsulates and hides all these complicated processes, and it is transparent to applications.
@@ -119,65 +119,65 @@ The load balancing process does not require any manual intervention, and it is t
## Data Writing and Replication Process
-If a database has N replicas, a virtual node group has N virtual nodes. But only one is the Master and all others are slaves. When the application writes a new record to system, only the Master vnode can accept the writing request. If a slave vnode receives a writing request, the system will notifies TAOSC to redirect.
+If a database has N replicas, a virtual node group has N virtual nodes. But only one is the Leader and all others are slaves. When the application writes a new record to system, only the Leader vnode can accept the writing request. If a follower vnode receives a writing request, the system will notifies TAOSC to redirect.
-### Master vnode Writing Process
+### Leader vnode Writing Process
-Master Vnode uses a writing process as follows:
+Leader Vnode uses a writing process as follows:
-
-
Figure 3: TDengine Master writing process
+
+ Figure 3: TDengine Leader writing process
-1. Master vnode receives the application data insertion request, verifies, and moves to next step;
+1. Leader vnode receives the application data insertion request, verifies, and moves to next step;
2. If the system configuration parameter `“walLevel”` is greater than 0, vnode will write the original request packet into database log file WAL. If walLevel is set to 2 and fsync is set to 0, TDengine will make WAL data written immediately to ensure that even system goes down, all data can be recovered from database log file;
-3. If there are multiple replicas, vnode will forward data packet to slave vnodes in the same virtual node group, and the forwarded packet has a version number with data;
+3. If there are multiple replicas, vnode will forward data packet to follower vnodes in the same virtual node group, and the forwarded packet has a version number with data;
4. Write into memory and add the record to “skip list”;
-5. Master vnode returns a confirmation message to the application, indicating a successful write.
+5. Leader vnode returns a confirmation message to the application, indicating a successful write.
6. If any of Step 2, 3 or 4 fails, the error will directly return to the application.
-### Slave vnode Writing Process
+### Follower vnode Writing Process
-For a slave vnode, the write process as follows:
+For a follower vnode, the write process as follows:
-
- Figure 4: TDengine Slave Writing Process
+
+ Figure 4: TDengine Follower Writing Process
-1. Slave vnode receives a data insertion request forwarded by Master vnode;
+1. Follower vnode receives a data insertion request forwarded by Leader vnode;
2. If the system configuration parameter `“walLevel”` is greater than 0, vnode will write the original request packet into database log file WAL. If walLevel is set to 2 and fsync is set to 0, TDengine will make WAL data written immediately to ensure that even system goes down, all data can be recovered from database log file;
3. Write into memory and add the record to “skip list”.
-Compared with Master vnode, slave vnode has no forwarding or reply confirmation step, means two steps less. But writing into memory and WAL is exactly the same.
+Compared with Leader vnode, follower vnode has no forwarding or reply confirmation step, means two steps less. But writing into memory and WAL is exactly the same.
### Remote Disaster Recovery and IDC (Internet Data Center) Migration
-As discussed above, TDengine writes using Master and Slave processes. TDengine adopts asynchronous replication for data synchronization. This method can greatly improve write performance, with no obvious impact from network delay. By configuring IDC and rack number for each physical node, it can be ensured that for a virtual node group, virtual nodes are composed of physical nodes from different IDC and different racks, thus implementing remote disaster recovery without other tools.
+As discussed above, TDengine writes using Leader and Follower processes. TDengine adopts asynchronous replication for data synchronization. This method can greatly improve write performance, with no obvious impact from network delay. By configuring IDC and rack number for each physical node, it can be ensured that for a virtual node group, virtual nodes are composed of physical nodes from different IDC and different racks, thus implementing remote disaster recovery without other tools.
-On the other hand, TDengine supports dynamic modification of the replica number. Once the number of replicas increases, the newly added virtual nodes will immediately enter the data synchronization process. After synchronization is complete, added virtual nodes can provide services. In the synchronization process, master and other synchronized virtual nodes keep serving. With this feature, TDengine can provide IDC migration without service interruption. It is only necessary to add new physical nodes to the existing IDC cluster, and then remove old physical nodes after the data synchronization is completed.
+On the other hand, TDengine supports dynamic modification of the replica number. Once the number of replicas increases, the newly added virtual nodes will immediately enter the data synchronization process. After synchronization is complete, added virtual nodes can provide services. In the synchronization process, leader and other synchronized virtual nodes keep serving. With this feature, TDengine can provide IDC migration without service interruption. It is only necessary to add new physical nodes to the existing IDC cluster, and then remove old physical nodes after the data synchronization is completed.
However, the asynchronous replication has a very low probability scenario where data may be lost. The specific scenario is as follows:
-1. Master vnode has finished its 5-step operations, confirmed the success of writing to APP, and then goes down;
-2. Slave vnode receives the write request, then processing fails before writing to the log in Step 2;
-3. Slave vnode will become the new master, thus losing one record.
+1. Leader vnode has finished its 5-step operations, confirmed the success of writing to APP, and then goes down;
+2. Follower vnode receives the write request, then processing fails before writing to the log in Step 2;
+3. Follower vnode will become the new leader, thus losing one record.
In theory, for asynchronous replication, there is no guarantee to prevent data loss. However, this is an extremely low probability scenario as described above.
Note: Remote disaster recovery and no-downtime IDC migration are only supported by Enterprise Edition. **Hint: This function is not available yet**
-### Master/slave Selection
+### Leader/follower Selection
Vnode maintains a version number. When memory data is persisted, the version number will also be persisted. For each data update operation, whether it is time-series data or metadata, this version number will be increased by one.
-When a vnode starts, the roles (master, slave) are uncertain, and the data is in an unsynchronized state. It’s necessary to establish TCP connections with other nodes in the virtual node group and exchange status, including version and its own roles. Through the exchange, the system implements a master-selection process. The rules are as follows:
+When a vnode starts, the roles (leader, follower) are uncertain, and the data is in an unsynchronized state. It’s necessary to establish TCP connections with other nodes in the virtual node group and exchange status, including version and its own roles. Through the exchange, the system implements a leader-selection process. The rules are as follows:
-1. If there’s only one replica, it’s always master
-2. When all replicas are online, the one with latest version is master
-3. Over half of online nodes are virtual nodes, and some virtual node is slave, it will automatically become master
-4. For 2 and 3, if multiple virtual nodes meet the requirement, the first vnode in virtual node group list will be selected as master.
+1. If there’s only one replica, it’s always leader
+2. When all replicas are online, the one with latest version is leader
+3. Over half of online nodes are virtual nodes, and some virtual node is follower, it will automatically become leader
+4. For 2 and 3, if multiple virtual nodes meet the requirement, the first vnode in virtual node group list will be selected as leader.
### Synchronous Replication
-For scenarios with strong data consistency requirements, asynchronous data replication is not applicable, because there is a small probability of data loss. So, TDengine provides a synchronous replication mechanism for users. When creating a database, in addition to specifying the number of replicas, user also needs to specify a new parameter “quorum”. If quorum is greater than one, it means that every time the Master forwards a message to the replica, it needs to wait for “quorum-1” reply confirms before informing the application that data has been successfully written in slave. If “quorum-1” reply confirms are not received within a certain period of time, the master vnode will return an error to the application.
+For scenarios with strong data consistency requirements, asynchronous data replication is not applicable, because there is a small probability of data loss. So, TDengine provides a synchronous replication mechanism for users. When creating a database, in addition to specifying the number of replicas, user also needs to specify a new parameter “quorum”. If quorum is greater than one, it means that every time the Leader forwards a message to the replica, it needs to wait for “quorum-1” reply confirms before informing the application that data has been successfully written in follower. If “quorum-1” reply confirms are not received within a certain period of time, the leader vnode will return an error to the application.
With synchronous replication, performance of system will decrease and latency will increase. Because metadata needs strong consistency, the default for data synchronization between mnodes is synchronous replication.
diff --git a/examples/c/stream_demo.c b/examples/c/stream_demo.c
index 5f6e3b2aeb..961eb6c93a 100644
--- a/examples/c/stream_demo.c
+++ b/examples/c/stream_demo.c
@@ -90,9 +90,10 @@ int32_t create_stream() {
/*const char* sql = "select min(k), max(k), sum(k) as sum_of_k from st1";*/
/*const char* sql = "select sum(k) from tu1 interval(10m)";*/
/*pRes = tmq_create_stream(pConn, "stream1", "out1", sql);*/
- pRes = taos_query(pConn,
- "create stream stream1 trigger window_close into outstb as select _wstartts, sum(k) from st1 "
- "interval(10s) ");
+ pRes = taos_query(
+ pConn,
+ "create stream stream1 trigger window_close watermark 10s into outstb as select _wstartts, sum(k) from st1 "
+ "interval(10s) ");
if (taos_errno(pRes) != 0) {
printf("failed to create stream stream1, reason:%s\n", taos_errstr(pRes));
return -1;
diff --git a/include/common/tcommon.h b/include/common/tcommon.h
index 1eb73b503c..a6b32ee239 100644
--- a/include/common/tcommon.h
+++ b/include/common/tcommon.h
@@ -45,6 +45,7 @@ typedef enum EStreamType {
STREAM_REPROCESS,
STREAM_INVALID,
STREAM_GET_ALL,
+ STREAM_DELETE,
} EStreamType;
typedef struct {
diff --git a/include/common/tmsg.h b/include/common/tmsg.h
index 340cb9893f..50ccae512d 100644
--- a/include/common/tmsg.h
+++ b/include/common/tmsg.h
@@ -168,7 +168,7 @@ typedef struct {
int32_t vgId;
char* dbFName;
char* tbName;
-} SBuildTableMetaInput;
+} SBuildTableInput;
typedef struct {
char db[TSDB_DB_FNAME_LEN];
@@ -444,6 +444,7 @@ typedef struct {
char* comment;
char* pAst1;
char* pAst2;
+ SArray* pFuncs;
} SMCreateStbReq;
int32_t tSerializeSMCreateStbReq(void* buf, int32_t bufLen, SMCreateStbReq* pReq);
@@ -667,6 +668,41 @@ int32_t tSerializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp
int32_t tDeserializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp);
+typedef struct {
+ SMsgHead header;
+ char dbFName[TSDB_DB_FNAME_LEN];
+ char tbName[TSDB_TABLE_NAME_LEN];
+} STableCfgReq;
+
+typedef struct {
+ char tbName[TSDB_TABLE_NAME_LEN];
+ char stbName[TSDB_TABLE_NAME_LEN];
+ char dbFName[TSDB_DB_FNAME_LEN];
+ int32_t numOfTags;
+ int32_t numOfColumns;
+ int8_t tableType;
+ int64_t delay1;
+ int64_t delay2;
+ int64_t watermark1;
+ int64_t watermark2;
+ int32_t ttl;
+ SArray* pFuncs;
+ int32_t commentLen;
+ char* pComment;
+ SSchema* pSchemas;
+ int32_t tagsLen;
+ char* pTags;
+} STableCfg;
+
+typedef STableCfg STableCfgRsp;
+
+int32_t tSerializeSTableCfgReq(void *buf, int32_t bufLen, STableCfgReq *pReq);
+int32_t tDeserializeSTableCfgReq(void *buf, int32_t bufLen, STableCfgReq *pReq);
+
+int32_t tSerializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp);
+int32_t tDeserializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp);
+void tFreeSTableCfgRsp(STableCfgRsp *pRsp);
+
typedef struct {
char db[TSDB_DB_FNAME_LEN];
int32_t numOfVgroups;
diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h
index 907798d19d..bb5e903d1e 100644
--- a/include/common/tmsgdef.h
+++ b/include/common/tmsgdef.h
@@ -131,6 +131,7 @@ enum {
TD_DEF_MSG_TYPE(TDMT_MND_DROP_INDEX, "drop-index", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_GET_INDEX, "get-index", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_GET_TABLE_INDEX, "get-table-index", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_MND_TABLE_CFG, "table-cfg", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_CREATE_TOPIC, "create-topic", SMCreateTopicReq, SMCreateTopicRsp)
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_TOPIC, "alter-topic", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_DROP_TOPIC, "drop-topic", NULL, NULL)
@@ -171,6 +172,7 @@ enum {
TD_DEF_MSG_TYPE(TDMT_VND_UPDATE_TAG_VAL, "update-tag-val", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_VND_TABLE_META, "vnode-table-meta", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_VND_TABLES_META, "vnode-tables-meta", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_VND_TABLE_CFG, "vnode-table-cfg", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_VND_CREATE_STB, "vnode-create-stb", SVCreateStbReq, NULL)
TD_DEF_MSG_TYPE(TDMT_VND_ALTER_STB, "vnode-alter-stb", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_VND_DROP_STB, "vnode-drop-stb", SVDropStbReq, NULL)
diff --git a/include/common/tname.h b/include/common/tname.h
index 28f97d1028..c691c2f7b2 100644
--- a/include/common/tname.h
+++ b/include/common/tname.h
@@ -63,6 +63,8 @@ int32_t tNameSetAcctId(SName* dst, int32_t acctId);
bool tNameDBNameEqual(SName* left, SName* right);
+bool tNameTbNameEqual(SName* left, SName* right);
+
typedef struct {
// input
SArray* tags; // element is SSmlKv
diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h
index 0c720138bd..20f4765190 100644
--- a/include/libs/catalog/catalog.h
+++ b/include/libs/catalog/catalog.h
@@ -68,6 +68,7 @@ typedef struct SCatalogReq {
SArray* pIndex; // element is index name
SArray* pUser; // element is SUserAuthInfo
SArray* pTableIndex; // element is SNAME
+ SArray* pTableCfg; // element is SNAME
bool qNodeRequired; // valid qnode
bool dNodeRequired; // valid dnode
bool forceUpdate;
@@ -89,6 +90,7 @@ typedef struct SMetaData {
SArray* pIndex; // pRes = SIndexInfo*
SArray* pUser; // pRes = bool*
SArray* pQnodeList; // pRes = SArray*
+ SArray* pTableCfg; // pRes = STableCfg*
SArray* pDnodeList; // pRes = SArray*
} SMetaData;
@@ -284,6 +286,8 @@ int32_t catalogGetIndexMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const char*
int32_t catalogGetTableIndex(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes);
+int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg** pCfg);
+
int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp *pRsp);
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo);
diff --git a/include/libs/function/functionMgt.h b/include/libs/function/functionMgt.h
index cbaff29cb2..1f314d19e7 100644
--- a/include/libs/function/functionMgt.h
+++ b/include/libs/function/functionMgt.h
@@ -190,6 +190,7 @@ bool fmIsForbidWindowFunc(int32_t funcId);
bool fmIsForbidGroupByFunc(int32_t funcId);
bool fmIsIntervalInterpoFunc(int32_t funcId);
bool fmIsInterpFunc(int32_t funcId);
+bool fmIsLastRowFunc(int32_t funcId);
int32_t fmGetDistMethod(const SFunctionNode* pFunc, SFunctionNode** pPartialFunc, SFunctionNode** pMergeFunc);
diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h
index 4578087164..10c3f313a2 100644
--- a/include/libs/nodes/cmdnodes.h
+++ b/include/libs/nodes/cmdnodes.h
@@ -28,6 +28,15 @@ extern "C" {
#define DESCRIBE_RESULT_TYPE_LEN (20 + VARSTR_HEADER_SIZE)
#define DESCRIBE_RESULT_NOTE_LEN (8 + VARSTR_HEADER_SIZE)
+#define SHOW_CREATE_DB_RESULT_COLS 2
+#define SHOW_CREATE_DB_RESULT_FIELD1_LEN (TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE)
+#define SHOW_CREATE_DB_RESULT_FIELD2_LEN (TSDB_MAX_BINARY_LEN + VARSTR_HEADER_SIZE)
+
+#define SHOW_CREATE_TB_RESULT_COLS 2
+#define SHOW_CREATE_TB_RESULT_FIELD1_LEN (TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE)
+#define SHOW_CREATE_TB_RESULT_FIELD2_LEN (TSDB_MAX_BINARY_LEN + VARSTR_HEADER_SIZE)
+
+
#define PRIVILEGE_TYPE_MASK(n) (1 << n)
#define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0)
@@ -221,7 +230,7 @@ typedef struct SShowCreateTableStmt {
ENodeType type;
char dbName[TSDB_DB_NAME_LEN];
char tableName[TSDB_TABLE_NAME_LEN];
- STableMeta* pMeta;
+ void* pCfg; // STableCfg
} SShowCreateTableStmt;
typedef struct SShowTableDistributedStmt {
diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h
index 58e2393970..26a100bb1b 100644
--- a/include/libs/nodes/nodes.h
+++ b/include/libs/nodes/nodes.h
@@ -59,10 +59,10 @@ extern "C" {
for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); \
(NULL != cell ? (node = &(cell->pNode), true) : (node = NULL, false)); cell = cell->pNext)
-#define DESTORY_LIST(list) \
- do { \
- nodesDestroyList((list)); \
- (list) = NULL; \
+#define NODES_DESTORY_LIST(list) \
+ do { \
+ nodesDestroyList((list)); \
+ (list) = NULL; \
} while (0)
#define NODES_CLEAR_LIST(list) \
@@ -219,6 +219,7 @@ typedef enum ENodeType {
QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN,
QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN,
QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN,
+ QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN,
QUERY_NODE_PHYSICAL_PLAN_PROJECT,
QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN,
QUERY_NODE_PHYSICAL_PLAN_HASH_AGG,
@@ -227,6 +228,7 @@ typedef enum ENodeType {
QUERY_NODE_PHYSICAL_PLAN_SORT,
QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL,
QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL,
+ QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL,
QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL,
QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL,
QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL,
diff --git a/include/libs/nodes/plannodes.h b/include/libs/nodes/plannodes.h
index aeaeb12bc3..86b663ca45 100644
--- a/include/libs/nodes/plannodes.h
+++ b/include/libs/nodes/plannodes.h
@@ -40,7 +40,8 @@ typedef enum EScanType {
SCAN_TYPE_SYSTEM_TABLE,
SCAN_TYPE_STREAM,
SCAN_TYPE_TABLE_MERGE,
- SCAN_TYPE_BLOCK_INFO
+ SCAN_TYPE_BLOCK_INFO,
+ SCAN_TYPE_LAST_ROW
} EScanType;
typedef struct SScanLogicNode {
@@ -261,6 +262,7 @@ typedef struct SScanPhysiNode {
typedef SScanPhysiNode STagScanPhysiNode;
typedef SScanPhysiNode SBlockDistScanPhysiNode;
+typedef SScanPhysiNode SLastRowScanPhysiNode;
typedef struct SSystemTableScanPhysiNode {
SScanPhysiNode scan;
@@ -376,7 +378,8 @@ typedef struct SIntervalPhysiNode {
int8_t slidingUnit;
} SIntervalPhysiNode;
-typedef SIntervalPhysiNode SMergeIntervalPhysiNode;
+typedef SIntervalPhysiNode SMergeIntervalPhysiNode;
+typedef SIntervalPhysiNode SMergeAlignedIntervalPhysiNode;
typedef SIntervalPhysiNode SStreamIntervalPhysiNode;
typedef SIntervalPhysiNode SStreamFinalIntervalPhysiNode;
typedef SIntervalPhysiNode SStreamSemiIntervalPhysiNode;
diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h
index 3191d0c8eb..f58ccde335 100644
--- a/include/libs/nodes/querynodes.h
+++ b/include/libs/nodes/querynodes.h
@@ -52,7 +52,7 @@ typedef struct SExprNode {
SArray* pAssociation;
} SExprNode;
-typedef enum EColumnType { COLUMN_TYPE_COLUMN = 1, COLUMN_TYPE_TAG } EColumnType;
+typedef enum EColumnType { COLUMN_TYPE_COLUMN = 1, COLUMN_TYPE_TAG, COLUMN_TYPE_TBNAME } EColumnType;
typedef struct SColumnNode {
SExprNode node; // QUERY_NODE_COLUMN
@@ -258,6 +258,7 @@ typedef struct SSelectStmt {
bool hasUniqueFunc;
bool hasTailFunc;
bool hasInterpFunc;
+ bool hasLastRowFunc;
} SSelectStmt;
typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType;
diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h
index d562d07d77..26f2758033 100644
--- a/include/libs/qcom/query.h
+++ b/include/libs/qcom/query.h
@@ -207,6 +207,10 @@ char* jobTaskStatusStr(int32_t status);
SSchema createSchema(int8_t type, int32_t bytes, col_id_t colId, const char* name);
void destroyQueryExecRes(SQueryExecRes* pRes);
+int32_t dataConverToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *len);
+char* parseTagDatatoJson(void* p);
+int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst);
+int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
extern int32_t (*queryBuildMsg[TDMT_MAX])(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallocFp)(int32_t));
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h
index e963f25616..2cb0c65d35 100644
--- a/include/libs/sync/sync.h
+++ b/include/libs/sync/sync.h
@@ -162,7 +162,7 @@ typedef struct SSyncLogStore {
SyncIndex (*syncLogEndIndex)(struct SSyncLogStore* pLogStore);
bool (*syncLogIsEmpty)(struct SSyncLogStore* pLogStore);
int32_t (*syncLogEntryCount)(struct SSyncLogStore* pLogStore);
- bool (*syncLogInRange)(struct SSyncLogStore* pLogStore, SyncIndex index);
+ // bool (*syncLogInRange)(struct SSyncLogStore* pLogStore, SyncIndex index);
SyncIndex (*syncLogWriteIndex)(struct SSyncLogStore* pLogStore);
SyncIndex (*syncLogLastIndex)(struct SSyncLogStore* pLogStore);
diff --git a/include/os/osTime.h b/include/os/osTime.h
index 949c15ed0d..965ec61671 100644
--- a/include/os/osTime.h
+++ b/include/os/osTime.h
@@ -38,7 +38,7 @@ extern "C" {
#define MILLISECOND_PER_SECOND (1000i64)
#else
-#define MILLISECOND_PER_SECOND ((int64_t)1000L)
+#define MILLISECOND_PER_SECOND ((int64_t)1000LL)
#endif
#define MILLISECOND_PER_MINUTE (MILLISECOND_PER_SECOND * 60)
@@ -46,9 +46,9 @@ extern "C" {
#define MILLISECOND_PER_DAY (MILLISECOND_PER_HOUR * 24)
#define MILLISECOND_PER_WEEK (MILLISECOND_PER_DAY * 7)
-#define NANOSECOND_PER_USEC (1000L)
-#define NANOSECOND_PER_MSEC (1000000L)
-#define NANOSECOND_PER_SEC (1000000000L)
+#define NANOSECOND_PER_USEC (1000LL)
+#define NANOSECOND_PER_MSEC (1000000LL)
+#define NANOSECOND_PER_SEC (1000000000LL)
#define NANOSECOND_PER_MINUTE (NANOSECOND_PER_SEC * 60)
#define NANOSECOND_PER_HOUR (NANOSECOND_PER_MINUTE * 60)
#define NANOSECOND_PER_DAY (NANOSECOND_PER_HOUR * 24)
@@ -65,21 +65,21 @@ int32_t taosGetTimestampSec();
static FORCE_INLINE int64_t taosGetTimestampMs() {
struct timeval systemTime;
taosGetTimeOfDay(&systemTime);
- return (int64_t)systemTime.tv_sec * 1000L + (int64_t)systemTime.tv_usec / 1000;
+ return (int64_t)systemTime.tv_sec * 1000LL + (int64_t)systemTime.tv_usec / 1000;
}
//@return timestamp in microsecond
static FORCE_INLINE int64_t taosGetTimestampUs() {
struct timeval systemTime;
taosGetTimeOfDay(&systemTime);
- return (int64_t)systemTime.tv_sec * 1000000L + (int64_t)systemTime.tv_usec;
+ return (int64_t)systemTime.tv_sec * 1000000LL + (int64_t)systemTime.tv_usec;
}
//@return timestamp in nanosecond
static FORCE_INLINE int64_t taosGetTimestampNs() {
struct timespec systemTime = {0};
taosClockGetTime(CLOCK_REALTIME, &systemTime);
- return (int64_t)systemTime.tv_sec * 1000000000L + (int64_t)systemTime.tv_nsec;
+ return (int64_t)systemTime.tv_sec * 1000000000LL + (int64_t)systemTime.tv_nsec;
}
char * taosStrpTime(const char *buf, const char *fmt, struct tm *tm);
diff --git a/include/util/taoserror.h b/include/util/taoserror.h
index e695a9e282..eb68f52a40 100644
--- a/include/util/taoserror.h
+++ b/include/util/taoserror.h
@@ -129,6 +129,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_TSC_STMT_CLAUSE_ERROR TAOS_DEF_ERROR_CODE(0, 0X0227)
#define TSDB_CODE_TSC_QUERY_KILLED TAOS_DEF_ERROR_CODE(0, 0X0228)
#define TSDB_CODE_TSC_NO_EXEC_NODE TAOS_DEF_ERROR_CODE(0, 0X0229)
+#define TSDB_CODE_TSC_NOT_STABLE_ERROR TAOS_DEF_ERROR_CODE(0, 0X022a)
// mnode-common
#define TSDB_CODE_MND_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0300)
diff --git a/include/util/tdef.h b/include/util/tdef.h
index c5a8b95a08..5304dba741 100644
--- a/include/util/tdef.h
+++ b/include/util/tdef.h
@@ -49,12 +49,12 @@ extern const int32_t TYPE_BYTES[16];
#define TSDB_DATA_BOOL_NULL 0x02
#define TSDB_DATA_TINYINT_NULL 0x80
#define TSDB_DATA_SMALLINT_NULL 0x8000
-#define TSDB_DATA_INT_NULL 0x80000000L
-#define TSDB_DATA_BIGINT_NULL 0x8000000000000000L
+#define TSDB_DATA_INT_NULL 0x80000000LL
+#define TSDB_DATA_BIGINT_NULL 0x8000000000000000LL
#define TSDB_DATA_TIMESTAMP_NULL TSDB_DATA_BIGINT_NULL
#define TSDB_DATA_FLOAT_NULL 0x7FF00000 // it is an NAN
-#define TSDB_DATA_DOUBLE_NULL 0x7FFFFF0000000000L // an NAN
+#define TSDB_DATA_DOUBLE_NULL 0x7FFFFF0000000000LL // an NAN
#define TSDB_DATA_NCHAR_NULL 0xFFFFFFFF
#define TSDB_DATA_BINARY_NULL 0xFF
@@ -108,8 +108,8 @@ extern const int32_t TYPE_BYTES[16];
#define TSDB_INS_USER_STABLES_DBNAME_COLID 2
#define TSDB_TICK_PER_SECOND(precision) \
- ((int64_t)((precision) == TSDB_TIME_PRECISION_MILLI ? 1e3L \
- : ((precision) == TSDB_TIME_PRECISION_MICRO ? 1e6L : 1e9L)))
+ ((int64_t)((precision) == TSDB_TIME_PRECISION_MILLI ? 1000LL \
+ : ((precision) == TSDB_TIME_PRECISION_MICRO ? 1000000LL : 1000000000LL)))
#define T_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
#define T_APPEND_MEMBER(dst, ptr, type, member) \
diff --git a/include/util/tpagedbuf.h b/include/util/tpagedbuf.h
index af82e29ec5..ef266068cb 100644
--- a/include/util/tpagedbuf.h
+++ b/include/util/tpagedbuf.h
@@ -28,7 +28,7 @@ typedef struct SArray* SIDList;
typedef struct SPageInfo SPageInfo;
typedef struct SDiskbasedBuf SDiskbasedBuf;
-#define DEFAULT_INTERN_BUF_PAGE_SIZE (1024L) // in bytes
+#define DEFAULT_INTERN_BUF_PAGE_SIZE (1024LL) // in bytes
typedef struct SFilePage {
int32_t num;
diff --git a/include/util/types.h b/include/util/types.h
index d48995418e..ded9dc37d7 100644
--- a/include/util/types.h
+++ b/include/util/types.h
@@ -32,7 +32,7 @@ extern "C" {
#define GET_UINT64_VAL(x) (*(uint64_t *)(x))
static FORCE_INLINE float taos_align_get_float(const char *pBuf) {
-#if __STDC_VERSION__ >= 201112L
+#if __STDC_VERSION__ >= 201112LL
static_assert(sizeof(float) == sizeof(uint32_t), "sizeof(float) must equal to sizeof(uint32_t)");
#else
assert(sizeof(float) == sizeof(uint32_t));
@@ -43,7 +43,7 @@ static FORCE_INLINE float taos_align_get_float(const char *pBuf) {
}
static FORCE_INLINE double taos_align_get_double(const char *pBuf) {
-#if __STDC_VERSION__ >= 201112L
+#if __STDC_VERSION__ >= 201112LL
static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) must equal to sizeof(uint64_t)");
#else
assert(sizeof(double) == sizeof(uint64_t));
diff --git a/packaging/tools/install.sh b/packaging/tools/install.sh
index f07705ff44..d730cc0d8a 100755
--- a/packaging/tools/install.sh
+++ b/packaging/tools/install.sh
@@ -196,7 +196,6 @@ function install_bin() {
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
${csudo}rm -f ${bin_link_dir}/tarbitrator || :
${csudo}rm -f ${bin_link_dir}/set_core || :
- ${csudo}rm -f ${bin_link_dir}/run_${serverName}_and_${adapterName}.sh || :
${csudo}rm -f ${bin_link_dir}/TDinsight.sh || :
${csudo}cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo}chmod 0555 ${install_main_dir}/bin/*
@@ -211,7 +210,6 @@ function install_bin() {
[ -x ${install_main_dir}/bin/TDinsight.sh ] && ${csudo}ln -s ${install_main_dir}/bin/TDinsight.sh ${bin_link_dir}/TDinsight.sh || :
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
[ -x ${install_main_dir}/bin/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
- [ -x ${install_main_dir}/bin/run_${serverName}_and_${adapterName}.sh ] && ${csudo}ln -s ${install_main_dir}/bin/run_${serverName}_and_${adapterName}.sh ${bin_link_dir}/run_${serverName}_and_${adapterName}.sh || :
[ -x ${install_main_dir}/bin/tarbitrator ] && ${csudo}ln -s ${install_main_dir}/bin/tarbitrator ${bin_link_dir}/tarbitrator || :
if [ "$verMode" == "cluster" ]; then
diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh
index 31cb5e87b9..6726b3fe2d 100755
--- a/packaging/tools/make_install.sh
+++ b/packaging/tools/make_install.sh
@@ -176,7 +176,6 @@ function install_bin() {
if [ "$osType" != "Darwin" ]; then
${csudo}rm -f ${bin_link_dir}/perfMonitor || :
${csudo}rm -f ${bin_link_dir}/set_core || :
- ${csudo}rm -f ${bin_link_dir}/run_taosd_and_taosadapter.sh || :
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
${csudo}cp -r ${binary_dir}/build/bin/${clientName} ${install_main_dir}/bin || :
@@ -191,7 +190,6 @@ function install_bin() {
${csudo}cp -r ${script_dir}/taosd-dump-cfg.gdb ${install_main_dir}/bin || :
${csudo}cp -r ${script_dir}/remove.sh ${install_main_dir}/bin || :
${csudo}cp -r ${script_dir}/set_core.sh ${install_main_dir}/bin || :
- ${csudo}cp -r ${script_dir}/run_taosd_and_taosadapter.sh ${install_main_dir}/bin || :
${csudo}cp -r ${script_dir}/startPre.sh ${install_main_dir}/bin || :
${csudo}chmod 0555 ${install_main_dir}/bin/*
@@ -204,7 +202,6 @@ function install_bin() {
[ -x ${install_main_dir}/bin/taosdemo ] && ${csudo}ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || :
[ -x ${install_main_dir}/bin/perfMonitor ] && ${csudo}ln -s ${install_main_dir}/bin/perfMonitor ${bin_link_dir}/perfMonitor || :
[ -x ${install_main_dir}/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
- [ -x ${install_main_dir}/run_taosd_and_taosadapter.sh ] && ${csudo}ln -s ${install_main_dir}/bin/run_taosd_and_taosadapter.sh ${bin_link_dir}/run_taosd_and_taosadapter.sh || :
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
else
diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c
index 6a75613fa4..191bfe088a 100644
--- a/source/client/src/clientImpl.c
+++ b/source/client/src/clientImpl.c
@@ -244,10 +244,10 @@ void asyncExecLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
}
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
+ pRequest->code = code;
if (pRequest->code != TSDB_CODE_SUCCESS) {
pResultInfo->numOfRows = 0;
- pRequest->code = code;
tscError("0x%" PRIx64 " fetch results failed, code:%s, reqId:0x%" PRIx64, pRequest->self, tstrerror(code),
pRequest->requestId);
} else {
@@ -256,7 +256,7 @@ void asyncExecLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
pRequest->requestId);
}
- pRequest->body.queryFp(pRequest->body.param, pRequest, 0);
+ pRequest->body.queryFp(pRequest->body.param, pRequest, code);
// pRequest->body.fetchFp(pRequest->body.param, pRequest, pResultInfo->numOfRows);
}
@@ -1444,80 +1444,6 @@ static int32_t doPrepareResPtr(SReqResultInfo* pResInfo) {
return TSDB_CODE_SUCCESS;
}
-static char* parseTagDatatoJson(void* p) {
- char* string = NULL;
- cJSON* json = cJSON_CreateObject();
- if (json == NULL) {
- goto end;
- }
-
- SArray* pTagVals = NULL;
- if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
- goto end;
- }
-
- int16_t nCols = taosArrayGetSize(pTagVals);
- char tagJsonKey[256] = {0};
- for (int j = 0; j < nCols; ++j) {
- STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
- // json key encode by binary
- memset(tagJsonKey, 0, sizeof(tagJsonKey));
- memcpy(tagJsonKey, pTagVal->pKey, strlen(pTagVal->pKey));
- // json value
- char type = pTagVal->type;
- if (type == TSDB_DATA_TYPE_NULL) {
- cJSON* value = cJSON_CreateNull();
- if (value == NULL) {
- goto end;
- }
- cJSON_AddItemToObject(json, tagJsonKey, value);
- } else if (type == TSDB_DATA_TYPE_NCHAR) {
- cJSON* value = NULL;
- if (pTagVal->nData > 0) {
- char* tagJsonValue = taosMemoryCalloc(pTagVal->nData, 1);
- int32_t length = taosUcs4ToMbs((TdUcs4*)pTagVal->pData, pTagVal->nData, tagJsonValue);
- if (length < 0) {
- tscError("charset:%s to %s. val:%s convert json value failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
- pTagVal->pData);
- taosMemoryFree(tagJsonValue);
- goto end;
- }
- value = cJSON_CreateString(tagJsonValue);
- taosMemoryFree(tagJsonValue);
- if (value == NULL) {
- goto end;
- }
- } else if (pTagVal->nData == 0) {
- value = cJSON_CreateString("");
- } else {
- ASSERT(0);
- }
-
- cJSON_AddItemToObject(json, tagJsonKey, value);
- } else if (type == TSDB_DATA_TYPE_DOUBLE) {
- double jsonVd = *(double*)(&pTagVal->i64);
- cJSON* value = cJSON_CreateNumber(jsonVd);
- if (value == NULL) {
- goto end;
- }
- cJSON_AddItemToObject(json, tagJsonKey, value);
- } else if (type == TSDB_DATA_TYPE_BOOL) {
- char jsonVd = *(char*)(&pTagVal->i64);
- cJSON* value = cJSON_CreateBool(jsonVd);
- if (value == NULL) {
- goto end;
- }
- cJSON_AddItemToObject(json, tagJsonKey, value);
- } else {
- ASSERT(0);
- }
- }
- string = cJSON_PrintUnformatted(json);
-end:
- cJSON_Delete(json);
- return string;
-}
-
static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int32_t numOfCols, int32_t* colLength) {
for (int32_t i = 0; i < numOfCols; ++i) {
int32_t type = pResultInfo->fields[i].type;
diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c
index 6fa4e6bffb..7d2bf019d2 100644
--- a/source/client/src/clientSml.c
+++ b/source/client/src/clientSml.c
@@ -2389,17 +2389,19 @@ static int32_t isSchemalessDb(STscObj *taos, SRequestObj *request) {
static void smlInsertCallback(void *param, void *res, int32_t code) {
SRequestObj *pRequest = (SRequestObj *)res;
SSmlHandle *info = (SSmlHandle *)param;
+ int32_t rows = taos_affected_rows(pRequest);
uDebug("SML:0x%" PRIx64 " result. code:%d, msg:%s", info->id, pRequest->code, pRequest->msgBuf);
// lock
+ taosThreadSpinLock(&info->params->lock);
+ info->params->request->body.resInfo.numOfRows += rows;
if (code != TSDB_CODE_SUCCESS) {
- taosThreadSpinLock(&info->params->lock);
info->params->request->code = code;
- taosThreadSpinUnlock(&info->params->lock);
}
+ taosThreadSpinUnlock(&info->params->lock);
// unlock
- printf("SML:0x%" PRIx64 " insert finished, code: %d, total: %d\n", info->id, code, info->affectedRows);
+ uDebug("SML:0x%" PRIx64 " insert finished, code: %d, rows: %d, total: %d", info->id, code, rows, info->affectedRows);
Params *pParam = info->params;
bool isLast = info->isLast;
info->cost.endTime = taosGetTimestampUs();
diff --git a/source/client/test/smlTest.cpp b/source/client/test/smlTest.cpp
index fffb03d9a5..832564e0db 100644
--- a/source/client/test/smlTest.cpp
+++ b/source/client/test/smlTest.cpp
@@ -1272,10 +1272,10 @@ TEST(testCase, sml_dup_time_Test) {
const char *sql[] = {
//"test_ms,t0=t c0=f 1626006833641",
"ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=false,c1=1i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"xcxvwjvf\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
- "ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=T,c1=2i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"fixrzcuq\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
- "ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=3i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"iupzdqub\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
- "ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=4i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"yvvtzzof\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000",
- "ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=5i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"vbxpilkj\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000"
+ "ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=T,c1=2i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"fixrzcuq\",c8=L\"ncharColValue\",c9=7u64 1626006834639000000",
+ "ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=3i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"iupzdqub\",c8=L\"ncharColValue\",c9=7u64 1626006835639000000",
+ "ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=4i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"yvvtzzof\",c8=L\"ncharColValue\",c9=7u64 1626006836639000000",
+ "ubzlsr,id=qmtcvgd,t0=t,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=t,c1=5i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"vbxpilkj\",c8=L\"ncharColValue\",c9=7u64 1626006837639000000"
};
pRes = taos_query(taos, "use dup_time");
taos_free_result(pRes);
diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c
index bc46da14e5..d5843f699f 100644
--- a/source/common/src/tdatablock.c
+++ b/source/common/src/tdatablock.c
@@ -263,6 +263,7 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, in
pColumnInfoData->varmeta.length = len + oldLen;
} else {
if (finalNumOfRows > *capacity) {
+ ASSERT(finalNumOfRows*pColumnInfoData->info.bytes);
char* tmp = taosMemoryRealloc(pColumnInfoData->pData, finalNumOfRows * pColumnInfoData->info.bytes);
if (tmp == NULL) {
return TSDB_CODE_VND_OUT_OF_MEMORY;
@@ -1126,6 +1127,7 @@ void blockDataCleanup(SSDataBlock* pDataBlock) {
}
int32_t colInfoDataEnsureCapacity(SColumnInfoData* pColumn, size_t existRows, uint32_t numOfRows) {
+ ASSERT(numOfRows);
if (0 == numOfRows || numOfRows <= existRows) {
return TSDB_CODE_SUCCESS;
}
@@ -1178,6 +1180,8 @@ void colInfoDataCleanup(SColumnInfoData* pColumn, uint32_t numOfRows) {
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows) {
int32_t code = 0;
+ ASSERT(numOfRows > 0);
+
if (numOfRows == 0) {
return TSDB_CODE_SUCCESS;
}
diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c
index 7e9ce34f9f..a8f8ad00e1 100644
--- a/source/common/src/tmsg.c
+++ b/source/common/src/tmsg.c
@@ -127,7 +127,7 @@ int32_t tEncodeSEpSet(SEncoder *pEncoder, const SEpSet *pEp) {
if (tEncodeI8(pEncoder, pEp->numOfEps) < 0) return -1;
for (int32_t i = 0; i < TSDB_MAX_REPLICA; i++) {
if (tEncodeU16(pEncoder, pEp->eps[i].port) < 0) return -1;
- if (tEncodeCStr(pEncoder, pEp->eps[i].fqdn) < 0) return -1;
+ if (tEncodeCStrWithLen(pEncoder, pEp->eps[i].fqdn, TSDB_FQDN_LEN) < 0) return -1;
}
return 0;
}
@@ -532,6 +532,14 @@ int32_t tSerializeSMCreateStbReq(void *buf, int32_t bufLen, SMCreateStbReq *pReq
if (pReq->ast2Len > 0) {
if (tEncodeBinary(&encoder, pReq->pAst2, pReq->ast2Len) < 0) return -1;
}
+
+ int32_t numOfFuncs = taosArrayGetSize(pReq->pFuncs);
+ if (tEncodeI32(&encoder, numOfFuncs) < 0) return -1;
+ for (int32_t i = 0; i < numOfFuncs; ++i) {
+ const char *pFunc = taosArrayGet(pReq->pFuncs, i);
+ if (tEncodeCStr(&encoder, pFunc) < 0) return -1;
+ }
+
tEndEncode(&encoder);
int32_t tlen = encoder.pos;
@@ -606,6 +614,21 @@ int32_t tDeserializeSMCreateStbReq(void *buf, int32_t bufLen, SMCreateStbReq *pR
if (tDecodeCStrTo(&decoder, pReq->pAst2) < 0) return -1;
}
+ int32_t numOfFuncs = 0;
+ if (tDecodeI32(&decoder, &numOfFuncs) < 0) return -1;
+ if (numOfFuncs > 0) {
+ pReq->pFuncs = taosArrayInit(numOfFuncs, TSDB_FUNC_NAME_LEN);
+ if (NULL == pReq->pFuncs) return -1;
+ }
+ for (int32_t i = 0; i < numOfFuncs; ++i) {
+ char* pFunc = NULL;
+ if (tDecodeCStrAlloc(&decoder, &pFunc) < 0) return -1;
+ if (taosArrayPush(pReq->pFuncs, pFunc) == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
+ }
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
@@ -618,8 +641,7 @@ void tFreeSMCreateStbReq(SMCreateStbReq *pReq) {
taosMemoryFreeClear(pReq->comment);
taosMemoryFreeClear(pReq->pAst1);
taosMemoryFreeClear(pReq->pAst2);
- pReq->pColumns = NULL;
- pReq->pTags = NULL;
+ taosArrayDestroy(pReq->pFuncs);
}
int32_t tSerializeSMDropStbReq(void *buf, int32_t bufLen, SMDropStbReq *pReq) {
@@ -1757,6 +1779,165 @@ void tFreeSRetrieveFuncRsp(SRetrieveFuncRsp *pRsp) {
taosArrayDestroy(pRsp->pFuncInfos);
}
+int32_t tSerializeSTableCfgReq(void *buf, int32_t bufLen, STableCfgReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+ if (buf != NULL) {
+ buf = (char *)buf + headLen;
+ bufLen -= headLen;
+ }
+
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+
+ if (tStartEncode(&encoder) < 0) return -1;
+ if (tEncodeCStr(&encoder, pReq->dbFName) < 0) return -1;
+ if (tEncodeCStr(&encoder, pReq->tbName) < 0) return -1;
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ if (buf != NULL) {
+ SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
+ pHead->vgId = htonl(pReq->header.vgId);
+ pHead->contLen = htonl(tlen + headLen);
+ }
+
+ return tlen + headLen;
+}
+
+int32_t tDeserializeSTableCfgReq(void *buf, int32_t bufLen, STableCfgReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+
+ SMsgHead *pHead = buf;
+ pHead->vgId = pReq->header.vgId;
+ pHead->contLen = pReq->header.contLen;
+
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf + headLen, bufLen - headLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pReq->dbFName) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pReq->tbName) < 0) return -1;
+
+ tEndDecode(&decoder);
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+int32_t tSerializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+
+ if (tStartEncode(&encoder) < 0) return -1;
+ if (tEncodeCStr(&encoder, pRsp->tbName) < 0) return -1;
+ if (tEncodeCStr(&encoder, pRsp->stbName) < 0) return -1;
+ if (tEncodeCStr(&encoder, pRsp->dbFName) < 0) return -1;
+ if (tEncodeI32(&encoder, pRsp->numOfTags) < 0) return -1;
+ if (tEncodeI32(&encoder, pRsp->numOfColumns) < 0) return -1;
+ if (tEncodeI8(&encoder, pRsp->tableType) < 0) return -1;
+ if (tEncodeI64(&encoder, pRsp->delay1) < 0) return -1;
+ if (tEncodeI64(&encoder, pRsp->delay2) < 0) return -1;
+ if (tEncodeI64(&encoder, pRsp->watermark1) < 0) return -1;
+ if (tEncodeI64(&encoder, pRsp->watermark2) < 0) return -1;
+ if (tEncodeI32(&encoder, pRsp->ttl) < 0) return -1;
+
+ int32_t numOfFuncs = taosArrayGetSize(pRsp->pFuncs);
+ if (tEncodeI32(&encoder, numOfFuncs) < 0) return -1;
+ for (int32_t i = 0; i < numOfFuncs; ++i) {
+ const char *pFunc = taosArrayGet(pRsp->pFuncs, i);
+ if (tEncodeCStr(&encoder, pFunc) < 0) return -1;
+ }
+
+ if (tEncodeI32(&encoder, pRsp->commentLen) < 0) return -1;
+ if (pRsp->commentLen > 0) {
+ if (tEncodeCStr(&encoder, pRsp->pComment) < 0) return -1;
+ }
+
+ for (int32_t i = 0; i < pRsp->numOfColumns + pRsp->numOfTags; ++i) {
+ SSchema *pSchema = &pRsp->pSchemas[i];
+ if (tEncodeSSchema(&encoder, pSchema) < 0) return -1;
+ }
+
+ if (tEncodeI32(&encoder, pRsp->tagsLen) < 0) return -1;
+ if (tEncodeBinary(&encoder, pRsp->pTags, pRsp->tagsLen) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+ return tlen;
+}
+
+int32_t tDeserializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pRsp->tbName) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pRsp->stbName) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pRsp->dbFName) < 0) return -1;
+ if (tDecodeI32(&decoder, &pRsp->numOfTags) < 0) return -1;
+ if (tDecodeI32(&decoder, &pRsp->numOfColumns) < 0) return -1;
+ if (tDecodeI8(&decoder, &pRsp->tableType) < 0) return -1;
+ if (tDecodeI64(&decoder, &pRsp->delay1) < 0) return -1;
+ if (tDecodeI64(&decoder, &pRsp->delay2) < 0) return -1;
+ if (tDecodeI64(&decoder, &pRsp->watermark1) < 0) return -1;
+ if (tDecodeI64(&decoder, &pRsp->watermark2) < 0) return -1;
+ if (tDecodeI32(&decoder, &pRsp->ttl) < 0) return -1;
+
+ int32_t numOfFuncs = 0;
+ if (tDecodeI32(&decoder, &numOfFuncs) < 0) return -1;
+ if (numOfFuncs > 0) {
+ pRsp->pFuncs = taosArrayInit(numOfFuncs, TSDB_FUNC_NAME_LEN);
+ if (NULL == pRsp->pFuncs) return -1;
+ }
+ for (int32_t i = 0; i < numOfFuncs; ++i) {
+ char pFunc[TSDB_FUNC_NAME_LEN];
+ if (tDecodeCStrTo(&decoder, pFunc) < 0) return -1;
+ if (taosArrayPush(pRsp->pFuncs, pFunc) == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
+ }
+
+ if (tDecodeI32(&decoder, &pRsp->commentLen) < 0) return -1;
+ if (pRsp->commentLen > 0) {
+ if (tDecodeCStrAlloc(&decoder, &pRsp->pComment) < 0) return -1;
+ } else {
+ pRsp->pComment = NULL;
+ }
+
+ int32_t totalCols = pRsp->numOfTags + pRsp->numOfColumns;
+ pRsp->pSchemas = taosMemoryMalloc(sizeof(SSchema) * totalCols);
+ if (pRsp->pSchemas == NULL) return -1;
+
+ for (int32_t i = 0; i < totalCols; ++i) {
+ SSchema *pSchema = &pRsp->pSchemas[i];
+ if (tDecodeSSchema(&decoder, pSchema) < 0) return -1;
+ }
+
+ if (tDecodeI32(&decoder, &pRsp->tagsLen) < 0) return -1;
+ if (tDecodeBinaryAlloc(&decoder, (void**)&pRsp->pTags, NULL) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+void tFreeSTableCfgRsp(STableCfgRsp *pRsp) {
+ if (NULL == pRsp) {
+ return;
+ }
+
+ taosMemoryFreeClear(pRsp->pComment);
+ taosMemoryFreeClear(pRsp->pSchemas);
+ taosMemoryFreeClear(pRsp->pTags);
+
+ taosArrayDestroy(pRsp->pFuncs);
+}
+
int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
SEncoder encoder = {0};
tEncoderInit(&encoder, buf, bufLen);
@@ -3054,7 +3235,7 @@ int32_t tSerializeSConnectReq(void *buf, int32_t bufLen, SConnectReq *pReq) {
if (tEncodeCStr(&encoder, pReq->app) < 0) return -1;
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
if (tEncodeCStr(&encoder, pReq->user) < 0) return -1;
- if (tEncodeCStr(&encoder, pReq->passwd) < 0) return -1;
+ if (tEncodeCStrWithLen(&encoder, pReq->passwd, TSDB_PASSWORD_LEN) < 0) return -1;
if (tEncodeI64(&encoder, pReq->startTime) < 0) return -1;
tEndEncode(&encoder);
diff --git a/source/common/src/tname.c b/source/common/src/tname.c
index fd05513579..ce454d439d 100644
--- a/source/common/src/tname.c
+++ b/source/common/src/tname.c
@@ -240,6 +240,15 @@ bool tNameDBNameEqual(SName* left, SName* right) {
return (0 == strcmp(left->dbname, right->dbname));
}
+bool tNameTbNameEqual(SName* left, SName* right) {
+ bool equal = tNameDBNameEqual(left, right);
+ if (equal) {
+ return (0 == strcmp(left->tname, right->tname));
+ }
+
+ return equal;
+}
+
int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
assert(dst != NULL && str != NULL && strlen(str) > 0);
@@ -312,8 +321,10 @@ void buildChildTableName(RandTableName* rName) {
taosStringBuilderAppendStringLen(&sb, rName->sTableName, rName->sTableNameLen);
taosArraySort(rName->tags, compareKv);
for (int j = 0; j < taosArrayGetSize(rName->tags); ++j) {
+ taosStringBuilderAppendChar(&sb, ',');
SSmlKv* tagKv = taosArrayGetP(rName->tags, j);
taosStringBuilderAppendStringLen(&sb, tagKv->key, tagKv->keyLen);
+ taosStringBuilderAppendChar(&sb, '=');
if (IS_VAR_DATA_TYPE(tagKv->type)) {
taosStringBuilderAppendStringLen(&sb, tagKv->value, tagKv->length);
} else {
@@ -326,9 +337,14 @@ void buildChildTableName(RandTableName* rName) {
tMD5Init(&context);
tMD5Update(&context, (uint8_t*)keyJoined, (uint32_t)len);
tMD5Final(&context);
- uint64_t digest1 = *(uint64_t*)(context.digest);
- uint64_t digest2 = *(uint64_t*)(context.digest + 8);
- snprintf(rName->childTableName, TSDB_TABLE_NAME_LEN, "t_%016" PRIx64 "%016" PRIx64, digest1, digest2);
+
+ char temp[8] = {0};
+ rName->childTableName[0] = 't';
+ rName->childTableName[1] = '_';
+ for(int i = 0; i < 16; i++){
+ sprintf(temp, "%02x", context.digest[i]);
+ strcat(rName->childTableName, temp);
+ }
taosStringBuilderDestroy(&sb);
- rName->uid = digest1;
+ rName->uid = *(uint64_t*)(context.digest);
}
diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
index 89349d2de9..474e6ab378 100644
--- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
+++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
@@ -73,6 +73,7 @@ int32_t mmProcessGetLoadsReq(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
}
int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
+ const STraceId *trace = &pMsg->info.traceId;
SDCreateMnodeReq createReq = {0};
if (tDeserializeSDCreateMnodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
@@ -81,7 +82,7 @@ int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
if (createReq.replica != 1) {
terrno = TSDB_CODE_INVALID_OPTION;
- dError("failed to create mnode since %s", terrstr());
+ dGError("failed to create mnode since %s", terrstr());
return -1;
}
@@ -91,7 +92,7 @@ int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
mgmt.path = pInput->path;
mgmt.name = pInput->name;
if (mmWriteFile(&mgmt, &createReq.replicas[0], deployed) != 0) {
- dError("failed to write mnode file since %s", terrstr());
+ dGError("failed to write mnode file since %s", terrstr());
return -1;
}
@@ -99,7 +100,8 @@ int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
}
int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
- SDDropMnodeReq dropReq = {0};
+ const STraceId *trace = &pMsg->info.traceId;
+ SDDropMnodeReq dropReq = {0};
if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
return -1;
@@ -107,7 +109,7 @@ int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
if (pInput->pData->dnodeId != 0 && dropReq.dnodeId != pInput->pData->dnodeId) {
terrno = TSDB_CODE_INVALID_OPTION;
- dError("failed to drop mnode since %s", terrstr());
+ dGError("failed to drop mnode since %s", terrstr());
return -1;
}
@@ -117,7 +119,7 @@ int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
mgmt.path = pInput->path;
mgmt.name = pInput->name;
if (mmWriteFile(&mgmt, NULL, deployed) != 0) {
- dError("failed to write mnode file since %s", terrstr());
+ dGError("failed to write mnode file since %s", terrstr());
return -1;
}
@@ -180,6 +182,7 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_TABLE_META, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
+ if (dmSetMgmtHandle(pArray, TDMT_MND_TABLE_CFG, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_SMA, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_SMA, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_STREAM, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
index 32477febeb..7f3f76b4b6 100644
--- a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
+++ b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
@@ -18,7 +18,6 @@
static inline int32_t mmAcquire(SMnodeMgmt *pMgmt) {
int32_t code = 0;
-
taosThreadRwlockRdlock(&pMgmt->lock);
if (pMgmt->stopped) {
code = -1;
@@ -48,7 +47,8 @@ static inline void mmSendRsp(SRpcMsg *pMsg, int32_t code) {
static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
SMnodeMgmt *pMgmt = pInfo->ahandle;
int32_t code = -1;
- STraceId * trace = &pMsg->info.traceId;
+
+ const STraceId *trace = &pMsg->info.traceId;
dGTrace("msg:%p, get from mnode queue", pMsg);
switch (pMsg->msgType) {
@@ -72,7 +72,7 @@ static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
mndPostProcessQueryMsg(pMsg);
}
- dTrace("msg:%p, is freed, code:0x%x", pMsg, code);
+ dGTrace("msg:%p, is freed, code:0x%x", pMsg, code);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
}
@@ -80,7 +80,9 @@ static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
static void mmProcessSyncMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
SMnodeMgmt *pMgmt = pInfo->ahandle;
pMsg->info.node = pMgmt->pMnode;
- dTrace("msg:%p, get from mnode-sync queue", pMsg);
+
+ const STraceId *trace = &pMsg->info.traceId;
+ dGTrace("msg:%p, get from mnode-sync queue", pMsg);
SMsgHead *pHead = pMsg->pCont;
pHead->contLen = ntohl(pHead->contLen);
@@ -88,20 +90,22 @@ static void mmProcessSyncMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
int32_t code = mndProcessSyncMsg(pMsg);
- dTrace("msg:%p, is freed, code:0x%x", pMsg, code);
+ dGTrace("msg:%p, is freed, code:0x%x", pMsg, code);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
}
static inline int32_t mmPutMsgToWorker(SMnodeMgmt *pMgmt, SSingleWorker *pWorker, SRpcMsg *pMsg) {
+ const STraceId *trace = &pMsg->info.traceId;
+
if (mmAcquire(pMgmt) == 0) {
- dTrace("msg:%p, put into %s queue, type:%s", pMsg, pWorker->name, TMSG_INFO(pMsg->msgType));
+ dGTrace("msg:%p, put into %s queue, type:%s", pMsg, pWorker->name, TMSG_INFO(pMsg->msgType));
taosWriteQitem(pWorker->queue, pMsg);
mmRelease(pMgmt);
return 0;
} else {
- dTrace("msg:%p, failed to put into %s queue since %s, type:%s", pMsg, pWorker->name, terrstr(),
- TMSG_INFO(pMsg->msgType));
+ dGTrace("msg:%p, failed to put into %s queue since %s, type:%s", pMsg, pWorker->name, terrstr(),
+ TMSG_INFO(pMsg->msgType));
return -1;
}
}
@@ -121,19 +125,17 @@ int32_t mmPutMsgToReadQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
int32_t mmPutMsgToQueryQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
pMsg->info.node = pMgmt->pMnode;
if (mndPreProcessQueryMsg(pMsg) != 0) {
- dError("msg:%p, failed to pre-process in mnode since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pMsg->msgType));
+ const STraceId *trace = &pMsg->info.traceId;
+ dGError("msg:%p, failed to pre-process in mnode since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pMsg->msgType));
return -1;
}
return mmPutMsgToWorker(pMgmt, &pMgmt->queryWorker, pMsg);
}
int32_t mmPutMsgToFetchQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- pMsg->info.node = pMgmt->pMnode;
-
return mmPutMsgToWorker(pMgmt, &pMgmt->fetchWorker, pMsg);
}
-
int32_t mmPutMsgToMonitorQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
return mmPutMsgToWorker(pMgmt, &pMgmt->monitorWorker, pMsg);
}
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
index c2821669f0..d9502ec8f3 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
@@ -330,6 +330,7 @@ SArray *vmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_TABLE, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_VND_UPDATE_TAG_VAL, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_VND_TABLE_META, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
+ if (dmSetMgmtHandle(pArray, TDMT_VND_TABLE_CFG, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_VND_TABLES_META, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_VND_CANCEL_TASK, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_VND_DROP_TASK, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
index 71bbc8ddd4..5e1ef23f1c 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
@@ -28,10 +28,10 @@ static inline void vmSendRsp(SRpcMsg *pMsg, int32_t code) {
}
static void vmProcessMgmtQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
- SVnodeMgmt *pMgmt = pInfo->ahandle;
- int32_t code = -1;
+ SVnodeMgmt *pMgmt = pInfo->ahandle;
+ int32_t code = -1;
+ const STraceId *trace = &pMsg->info.traceId;
- STraceId *trace = &pMsg->info.traceId;
dGTrace("msg:%p, get from vnode-mgmt queue", pMsg);
switch (pMsg->msgType) {
case TDMT_MON_VM_INFO:
@@ -48,50 +48,52 @@ static void vmProcessMgmtQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
break;
default:
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
- dError("msg:%p, not processed in vnode-mgmt queue", pMsg);
+ dGError("msg:%p, not processed in vnode-mgmt queue", pMsg);
}
if (IsReq(pMsg)) {
if (code != 0) {
if (terrno != 0) code = terrno;
- dError("msg:%p, failed to process since %s", pMsg, terrstr());
+ dGError("msg:%p, failed to process since %s", pMsg, terrstr());
}
vmSendRsp(pMsg, code);
}
- dTrace("msg:%p, is freed, code:0x%x", pMsg, code);
+ dGTrace("msg:%p, is freed, code:0x%x", pMsg, code);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
}
static void vmProcessQueryQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
- SVnodeObj *pVnode = pInfo->ahandle;
+ SVnodeObj *pVnode = pInfo->ahandle;
+ const STraceId *trace = &pMsg->info.traceId;
- dTrace("vgId:%d, msg:%p get from vnode-query queue", pVnode->vgId, pMsg);
+ dGTrace("vgId:%d, msg:%p get from vnode-query queue", pVnode->vgId, pMsg);
int32_t code = vnodeProcessQueryMsg(pVnode->pImpl, pMsg);
if (code != 0) {
if (terrno != 0) code = terrno;
- dError("vgId:%d, msg:%p failed to query since %s", pVnode->vgId, pMsg, terrstr());
+ dGError("vgId:%d, msg:%p failed to query since %s", pVnode->vgId, pMsg, terrstr());
vmSendRsp(pMsg, code);
}
- dTrace("vgId:%d, msg:%p is freed, code:0x%x", pVnode->vgId, pMsg, code);
+ dGTrace("vgId:%d, msg:%p is freed, code:0x%x", pVnode->vgId, pMsg, code);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
}
static void vmProcessFetchQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
- SVnodeObj *pVnode = pInfo->ahandle;
+ SVnodeObj *pVnode = pInfo->ahandle;
+ const STraceId *trace = &pMsg->info.traceId;
- dTrace("vgId:%d, msg:%p get from vnode-fetch queue", pVnode->vgId, pMsg);
+ dGTrace("vgId:%d, msg:%p get from vnode-fetch queue", pVnode->vgId, pMsg);
int32_t code = vnodeProcessFetchMsg(pVnode->pImpl, pMsg, pInfo);
if (code != 0) {
if (terrno != 0) code = terrno;
- dError("vgId:%d, msg:%p failed to fetch since %s", pVnode->vgId, pMsg, terrstr());
+ dGError("vgId:%d, msg:%p failed to fetch since %s", pVnode->vgId, pMsg, terrstr());
vmSendRsp(pMsg, code);
}
- dTrace("vgId:%d, msg:%p is freed, code:0x%x", pVnode->vgId, pMsg, code);
+ dGTrace("vgId:%d, msg:%p is freed, code:0x%x", pVnode->vgId, pMsg, code);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
}
@@ -102,16 +104,17 @@ static void vmProcessSyncQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOf
for (int32_t i = 0; i < numOfMsgs; ++i) {
if (taosGetQitem(qall, (void **)&pMsg) == 0) continue;
- dTrace("vgId:%d, msg:%p get from vnode-sync queue", pVnode->vgId, pMsg);
+ const STraceId *trace = &pMsg->info.traceId;
+ dGTrace("vgId:%d, msg:%p get from vnode-sync queue", pVnode->vgId, pMsg);
int32_t code = vnodeProcessSyncReq(pVnode->pImpl, pMsg, NULL);
if (code != 0) {
if (terrno != 0) code = terrno;
- dError("vgId:%d, msg:%p failed to sync since %s", pVnode->vgId, pMsg, terrstr());
+ dGError("vgId:%d, msg:%p failed to sync since %s", pVnode->vgId, pMsg, terrstr());
vmSendRsp(pMsg, code);
}
- dTrace("vgId:%d, msg:%p is freed, code:0x%x", pVnode->vgId, pMsg, code);
+ dGTrace("vgId:%d, msg:%p is freed, code:0x%x", pVnode->vgId, pMsg, code);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
}
@@ -123,55 +126,57 @@ static void vmProcessMergeQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numO
for (int32_t i = 0; i < numOfMsgs; ++i) {
if (taosGetQitem(qall, (void **)&pMsg) == 0) continue;
- dTrace("vgId:%d, msg:%p get from vnode-merge queue", pVnode->vgId, pMsg);
+ const STraceId *trace = &pMsg->info.traceId;
+ dGTrace("vgId:%d, msg:%p get from vnode-merge queue", pVnode->vgId, pMsg);
int32_t code = vnodeProcessFetchMsg(pVnode->pImpl, pMsg, pInfo);
if (code != 0) {
if (terrno != 0) code = terrno;
- dError("vgId:%d, msg:%p failed to merge since %s", pVnode->vgId, pMsg, terrstr());
+ dGError("vgId:%d, msg:%p failed to merge since %s", pVnode->vgId, pMsg, terrstr());
vmSendRsp(pMsg, code);
}
- dTrace("msg:%p, is freed, code:0x%x", pMsg, code);
+ dGTrace("msg:%p, is freed, code:0x%x", pMsg, code);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
}
}
static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtype) {
- SMsgHead *pHead = pMsg->pCont;
- int32_t code = 0;
+ const STraceId *trace = &pMsg->info.traceId;
+ SMsgHead *pHead = pMsg->pCont;
+ int32_t code = 0;
pHead->contLen = ntohl(pHead->contLen);
pHead->vgId = ntohl(pHead->vgId);
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, pHead->vgId);
if (pVnode == NULL) {
- dError("vgId:%d, msg:%p failed to put into vnode queue since %s, type:%s", pHead->vgId, pMsg, terrstr(),
- TMSG_INFO(pMsg->msgType));
+ dGError("vgId:%d, msg:%p failed to put into vnode queue since %s, type:%s", pHead->vgId, pMsg, terrstr(),
+ TMSG_INFO(pMsg->msgType));
return terrno != 0 ? terrno : -1;
}
switch (qtype) {
case QUERY_QUEUE:
vnodePreprocessQueryMsg(pVnode->pImpl, pMsg);
- dTrace("vgId:%d, msg:%p put into vnode-query queue", pVnode->vgId, pMsg);
+ dGTrace("vgId:%d, msg:%p put into vnode-query queue", pVnode->vgId, pMsg);
taosWriteQitem(pVnode->pQueryQ, pMsg);
break;
case FETCH_QUEUE:
- dTrace("vgId:%d, msg:%p put into vnode-fetch queue", pVnode->vgId, pMsg);
+ dGTrace("vgId:%d, msg:%p put into vnode-fetch queue", pVnode->vgId, pMsg);
taosWriteQitem(pVnode->pFetchQ, pMsg);
break;
case WRITE_QUEUE:
- dTrace("vgId:%d, msg:%p put into vnode-write queue", pVnode->vgId, pMsg);
+ dGTrace("vgId:%d, msg:%p put into vnode-write queue", pVnode->vgId, pMsg);
taosWriteQitem(pVnode->pWriteQ, pMsg);
break;
case SYNC_QUEUE:
- dTrace("vgId:%d, msg:%p put into vnode-sync queue", pVnode->vgId, pMsg);
+ dGTrace("vgId:%d, msg:%p put into vnode-sync queue", pVnode->vgId, pMsg);
taosWriteQitem(pVnode->pSyncQ, pMsg);
break;
case APPLY_QUEUE:
- dTrace("vgId:%d, msg:%p put into vnode-apply queue", pVnode->vgId, pMsg);
+ dGTrace("vgId:%d, msg:%p put into vnode-apply queue", pVnode->vgId, pMsg);
taosWriteQitem(pVnode->pApplyQ, pMsg);
break;
default:
@@ -193,13 +198,15 @@ int32_t vmPutMsgToQueryQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return vmPutMsg
int32_t vmPutMsgToFetchQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return vmPutMsgToQueue(pMgmt, pMsg, FETCH_QUEUE); }
int32_t vmPutMsgToMgmtQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- dTrace("msg:%p, put into vnode-mgmt queue", pMsg);
+ const STraceId *trace = &pMsg->info.traceId;
+ dGTrace("msg:%p, put into vnode-mgmt queue", pMsg);
taosWriteQitem(pMgmt->mgmtWorker.queue, pMsg);
return 0;
}
int32_t vmPutMsgToMonitorQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- dTrace("msg:%p, put into vnode-monitor queue", pMsg);
+ const STraceId *trace = &pMsg->info.traceId;
+ dGTrace("msg:%p, put into vnode-monitor queue", pMsg);
taosWriteQitem(pMgmt->monitorWorker.queue, pMsg);
return 0;
}
diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c
index 660f512fc5..4761e3dc36 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c
@@ -17,9 +17,44 @@
#include "dmMgmt.h"
#include "qworker.h"
-static void dmSendRedirectRsp(SRpcMsg *pMsg, const SEpSet *pNewEpSet);
-static void dmSendRsp(SRpcMsg *pMsg);
-static void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg);
+static inline void dmSendRsp(SRpcMsg *pMsg) {
+ SMgmtWrapper *pWrapper = pMsg->info.wrapper;
+ if (InChildProc(pWrapper)) {
+ dmPutToProcPQueue(&pWrapper->proc, pMsg, DND_FUNC_RSP);
+ } else {
+ rpcSendResponse(pMsg);
+ }
+}
+
+static inline void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg) {
+ SEpSet epSet = {0};
+ dmGetMnodeEpSetForRedirect(&pDnode->data, pMsg, &epSet);
+
+ const int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
+ pMsg->pCont = rpcMallocCont(contLen);
+ if (pMsg->pCont == NULL) {
+ pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
+ } else {
+ tSerializeSEpSet(pMsg->pCont, contLen, &epSet);
+ pMsg->contLen = contLen;
+ }
+}
+
+static inline void dmSendRedirectRsp(SRpcMsg *pMsg, const SEpSet *pNewEpSet) {
+ SRpcMsg rsp = {.code = TSDB_CODE_RPC_REDIRECT, .info = pMsg->info};
+ int32_t contLen = tSerializeSEpSet(NULL, 0, pNewEpSet);
+
+ rsp.pCont = rpcMallocCont(contLen);
+ if (rsp.pCont == NULL) {
+ pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
+ } else {
+ tSerializeSEpSet(rsp.pCont, contLen, pNewEpSet);
+ rsp.contLen = contLen;
+ }
+ dmSendRsp(&rsp);
+ rpcFreeCont(pMsg->pCont);
+ pMsg->pCont = NULL;
+}
int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pMsg->msgType)];
@@ -28,31 +63,38 @@ int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
return -1;
}
- dTrace("msg:%p, will be processed by %s", pMsg, pWrapper->name);
+ const STraceId *trace = &pMsg->info.traceId;
+ dGTrace("msg:%p, will be processed by %s", pMsg, pWrapper->name);
pMsg->info.wrapper = pWrapper;
return (*msgFp)(pWrapper->pMgmt, pMsg);
}
static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
- SDnodeTrans * pTrans = &pDnode->trans;
+ SDnodeTrans *pTrans = &pDnode->trans;
int32_t code = -1;
- SRpcMsg * pMsg = NULL;
+ SRpcMsg *pMsg = NULL;
SMgmtWrapper *pWrapper = NULL;
SDnodeHandle *pHandle = &pTrans->msgHandles[TMSG_INDEX(pRpc->msgType)];
- STraceId *trace = &pRpc->info.traceId;
+ const STraceId *trace = &pRpc->info.traceId;
dGTrace("msg:%s is received, handle:%p len:%d code:0x%x app:%p refId:%" PRId64, TMSG_INFO(pRpc->msgType),
pRpc->info.handle, pRpc->contLen, pRpc->code, pRpc->info.ahandle, pRpc->info.refId);
- if (pRpc->msgType == TDMT_DND_NET_TEST) {
- dmProcessNetTestReq(pDnode, pRpc);
- return;
- } else if (pRpc->msgType == TDMT_MND_SYSTABLE_RETRIEVE_RSP || pRpc->msgType == TDMT_VND_FETCH_RSP) {
- qWorkerProcessFetchRsp(NULL, NULL, pRpc, 0);
- return;
- } else if (pRpc->msgType == TDMT_MND_STATUS_RSP && pEpSet != NULL) {
- dmSetMnodeEpSet(&pDnode->data, pEpSet);
- } else {
+ switch (pRpc->msgType) {
+ case TDMT_DND_NET_TEST:
+ dmProcessNetTestReq(pDnode, pRpc);
+ return;
+ case TDMT_MND_SYSTABLE_RETRIEVE_RSP:
+ case TDMT_VND_FETCH_RSP:
+ qWorkerProcessFetchRsp(NULL, NULL, pRpc, 0);
+ return;
+ case TDMT_MND_STATUS_RSP:
+ if (pEpSet != NULL) {
+ dmSetMnodeEpSet(&pDnode->data, pEpSet);
+ }
+ break;
+ default:
+ break;
}
if (pDnode->status != DND_STAT_RUNNING) {
@@ -73,39 +115,43 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
if (pHandle->defaultNtype == NODE_END) {
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
goto _OVER;
- } else {
- pWrapper = &pDnode->wrappers[pHandle->defaultNtype];
- if (pHandle->needCheckVgId) {
- if (pRpc->contLen > 0) {
- SMsgHead *pHead = pRpc->pCont;
- int32_t vgId = ntohl(pHead->vgId);
- if (vgId == QNODE_HANDLE) {
+ }
+
+ pWrapper = &pDnode->wrappers[pHandle->defaultNtype];
+ if (pHandle->needCheckVgId) {
+ if (pRpc->contLen > 0) {
+ const SMsgHead *pHead = pRpc->pCont;
+ const int32_t vgId = ntohl(pHead->vgId);
+ switch (vgId) {
+ case QNODE_HANDLE:
pWrapper = &pDnode->wrappers[QNODE];
- } else if (vgId == SNODE_HANDLE) {
+ break;
+ case SNODE_HANDLE:
pWrapper = &pDnode->wrappers[SNODE];
- } else if (vgId == MNODE_HANDLE) {
+ break;
+ case MNODE_HANDLE:
pWrapper = &pDnode->wrappers[MNODE];
- } else {
- }
- } else {
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- goto _OVER;
+ break;
+ default:
+ break;
}
+ } else {
+ terrno = TSDB_CODE_INVALID_MSG_LEN;
+ goto _OVER;
}
}
if (dmMarkWrapper(pWrapper) != 0) {
pWrapper = NULL;
goto _OVER;
- } else {
- pRpc->info.wrapper = pWrapper;
}
+ pRpc->info.wrapper = pWrapper;
pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
if (pMsg == NULL) goto _OVER;
- memcpy(pMsg, pRpc, sizeof(SRpcMsg));
- dTrace("msg:%p, is created, type:%s handle:%p", pMsg, TMSG_INFO(pRpc->msgType), pMsg->info.handle);
+ memcpy(pMsg, pRpc, sizeof(SRpcMsg));
+ dGTrace("msg:%p, is created, type:%s handle:%p", pMsg, TMSG_INFO(pRpc->msgType), pMsg->info.handle);
if (InParentProc(pWrapper)) {
code = dmPutToProcCQueue(&pWrapper->proc, pMsg, DND_FUNC_REQ);
@@ -115,13 +161,11 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
_OVER:
if (code != 0) {
- dTrace("failed to process msg:%p since %s, handle:%p", pMsg, terrstr(), pRpc->info.handle);
-
if (terrno != 0) code = terrno;
+ dGTrace("msg:%p, failed to process since %s", pMsg, terrstr());
if (IsReq(pRpc)) {
SRpcMsg rsp = {.code = code, .info = pRpc->info};
-
if ((code == TSDB_CODE_NODE_NOT_DEPLOYED || code == TSDB_CODE_APP_NOT_READY) && pRpc->msgType > TDMT_MND_MSG &&
pRpc->msgType < TDMT_VND_MSG) {
dmBuildMnodeRedirectRsp(pDnode, &rsp);
@@ -135,7 +179,7 @@ _OVER:
}
if (pMsg != NULL) {
- dTrace("msg:%p, is freed", pMsg);
+ dGTrace("msg:%p, is freed", pMsg);
taosFreeQitem(pMsg);
}
rpcFreeCont(pRpc->pCont);
@@ -149,11 +193,11 @@ int32_t dmInitMsgHandle(SDnode *pDnode) {
for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
- SArray * pArray = (*pWrapper->func.getHandlesFp)();
+ SArray *pArray = (*pWrapper->func.getHandlesFp)();
if (pArray == NULL) return -1;
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
- SMgmtHandle * pMgmt = taosArrayGet(pArray, i);
+ SMgmtHandle *pMgmt = taosArrayGet(pArray, i);
SDnodeHandle *pHandle = &pTrans->msgHandles[TMSG_INDEX(pMgmt->msgType)];
if (pMgmt->needCheckVgId) {
pHandle->needCheckVgId = pMgmt->needCheckVgId;
@@ -184,45 +228,6 @@ static inline int32_t dmSendReq(const SEpSet *pEpSet, SRpcMsg *pMsg) {
}
}
-static inline void dmSendRsp(SRpcMsg *pMsg) {
- SMgmtWrapper *pWrapper = pMsg->info.wrapper;
- if (InChildProc(pWrapper)) {
- dmPutToProcPQueue(&pWrapper->proc, pMsg, DND_FUNC_RSP);
- } else {
- rpcSendResponse(pMsg);
- }
-}
-
-static void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg) {
- SEpSet epSet = {0};
- dmGetMnodeEpSetForRedirect(&pDnode->data, pMsg, &epSet);
-
- int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
- pMsg->pCont = rpcMallocCont(contLen);
- if (pMsg->pCont == NULL) {
- pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
- } else {
- tSerializeSEpSet(pMsg->pCont, contLen, &epSet);
- pMsg->contLen = contLen;
- }
-}
-
-static inline void dmSendRedirectRsp(SRpcMsg *pMsg, const SEpSet *pNewEpSet) {
- SRpcMsg rsp = {.code = TSDB_CODE_RPC_REDIRECT, .info = pMsg->info};
- int32_t contLen = tSerializeSEpSet(NULL, 0, pNewEpSet);
-
- rsp.pCont = rpcMallocCont(contLen);
- if (rsp.pCont == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- } else {
- tSerializeSEpSet(rsp.pCont, contLen, pNewEpSet);
- rsp.contLen = contLen;
- }
- dmSendRsp(&rsp);
- rpcFreeCont(pMsg->pCont);
- pMsg->pCont = NULL;
-}
-
static inline void dmRegisterBrokenLinkArg(SRpcMsg *pMsg) {
SMgmtWrapper *pWrapper = pMsg->info.wrapper;
if (InChildProc(pWrapper)) {
diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h
index 7897f62f62..01958aa053 100644
--- a/source/dnode/mgmt/node_util/inc/dmUtil.h
+++ b/source/dnode/mgmt/node_util/inc/dmUtil.h
@@ -40,18 +40,28 @@
#include "wal.h"
#include "libs/function/function.h"
-// clang-format off
#ifdef __cplusplus
extern "C" {
#endif
-#define dFatal(...) { if (dDebugFlag & DEBUG_FATAL) { taosPrintLog("DND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
-#define dError(...) { if (dDebugFlag & DEBUG_ERROR) { taosPrintLog("DND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
-#define dWarn(...) { if (dDebugFlag & DEBUG_WARN) { taosPrintLog("DND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
-#define dInfo(...) { if (dDebugFlag & DEBUG_INFO) { taosPrintLog("DND ", DEBUG_INFO, 255, __VA_ARGS__); }}
-#define dDebug(...) { if (dDebugFlag & DEBUG_DEBUG) { taosPrintLog("DND ", DEBUG_DEBUG, dDebugFlag, __VA_ARGS__); }}
-#define dTrace(...) { if (dDebugFlag & DEBUG_TRACE) { taosPrintLog("DND ", DEBUG_TRACE, dDebugFlag, __VA_ARGS__); }}
-#define dGTrace(param, ...) do { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dTrace(param ",GTID: %s", __VA_ARGS__, buf);} while(0)
+
+// clang-format off
+
+#define dFatal(...) { if (dDebugFlag & DEBUG_FATAL) { taosPrintLog("DND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
+#define dError(...) { if (dDebugFlag & DEBUG_ERROR) { taosPrintLog("DND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
+#define dWarn(...) { if (dDebugFlag & DEBUG_WARN) { taosPrintLog("DND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
+#define dInfo(...) { if (dDebugFlag & DEBUG_INFO) { taosPrintLog("DND ", DEBUG_INFO, 255, __VA_ARGS__); }}
+#define dDebug(...) { if (dDebugFlag & DEBUG_DEBUG) { taosPrintLog("DND ", DEBUG_DEBUG, dDebugFlag, __VA_ARGS__); }}
+#define dTrace(...) { if (dDebugFlag & DEBUG_TRACE) { taosPrintLog("DND ", DEBUG_TRACE, dDebugFlag, __VA_ARGS__); }}
+
+#define dGFatal(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dFatal(param ", gtid:%s", __VA_ARGS__, buf);}
+#define dGError(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dError(param ", gtid:%s", __VA_ARGS__, buf);}
+#define dGWarn(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dWarn (param ", gtid:%s", __VA_ARGS__, buf);}
+#define dGInfo(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dInfo (param ", gtid:%s", __VA_ARGS__, buf);}
+#define dGDebug(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dDebug(param ", gtid:%s", __VA_ARGS__, buf);}
+#define dGTrace(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); dTrace(param ", gtid:%s", __VA_ARGS__, buf);}
+
+// clang-format on
typedef enum {
DNODE = 0,
@@ -185,4 +195,3 @@ void dmSetMnodeEpSet(SDnodeData *pData, SEpSet *pEpSet);
#endif
#endif /*_TD_DM_INT_H_*/
-// clang-format on
diff --git a/source/dnode/mgmt/test/sut/src/sut.cpp b/source/dnode/mgmt/test/sut/src/sut.cpp
index 6ef94481ea..21d9351ceb 100644
--- a/source/dnode/mgmt/test/sut/src/sut.cpp
+++ b/source/dnode/mgmt/test/sut/src/sut.cpp
@@ -102,6 +102,7 @@ int32_t Testbase::SendShowReq(int8_t showType, const char* tb, const char* db) {
ASSERT(pRsp->pCont != nullptr);
if (pRsp->contLen == 0) return -1;
+ if (pRsp->code != 0) return -1;
showRsp = (SRetrieveMetaTableRsp*)pRsp->pCont;
showRsp->handle = htobe64(showRsp->handle); // show Id
diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h
index 3e4cb6a64d..0605e3a69e 100644
--- a/source/dnode/mnode/impl/inc/mndDef.h
+++ b/source/dnode/mnode/impl/inc/mndDef.h
@@ -349,6 +349,7 @@ typedef struct {
int32_t commentLen;
int32_t ast1Len;
int32_t ast2Len;
+ SArray* pFuncs;
SSchema* pColumns;
SSchema* pTags;
char* comment;
diff --git a/source/dnode/mnode/impl/inc/mndInfoSchema.h b/source/dnode/mnode/impl/inc/mndInfoSchema.h
index 43d934c431..b10d92ee3d 100644
--- a/source/dnode/mnode/impl/inc/mndInfoSchema.h
+++ b/source/dnode/mnode/impl/inc/mndInfoSchema.h
@@ -25,6 +25,7 @@ extern "C" {
int32_t mndInitInfos(SMnode *pMnode);
void mndCleanupInfos(SMnode *pMnode);
int32_t mndBuildInsTableSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp);
+int32_t mndBuildInsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp);
#ifdef __cplusplus
}
diff --git a/source/dnode/mnode/impl/inc/mndInt.h b/source/dnode/mnode/impl/inc/mndInt.h
index c810a0cbc7..58266724a5 100644
--- a/source/dnode/mnode/impl/inc/mndInt.h
+++ b/source/dnode/mnode/impl/inc/mndInt.h
@@ -34,13 +34,21 @@ extern "C" {
#endif
// clang-format off
-#define mFatal(...) { if (mDebugFlag & DEBUG_FATAL) { taosPrintLog("MND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
-#define mError(...) { if (mDebugFlag & DEBUG_ERROR) { taosPrintLog("MND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
-#define mWarn(...) { if (mDebugFlag & DEBUG_WARN) { taosPrintLog("MND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
-#define mInfo(...) { if (mDebugFlag & DEBUG_INFO) { taosPrintLog("MND ", DEBUG_INFO, 255, __VA_ARGS__); }}
-#define mDebug(...) { if (mDebugFlag & DEBUG_DEBUG) { taosPrintLog("MND ", DEBUG_DEBUG, mDebugFlag, __VA_ARGS__); }}
-#define mTrace(...) { if (mDebugFlag & DEBUG_TRACE) { taosPrintLog("MND ", DEBUG_TRACE, mDebugFlag, __VA_ARGS__); }}
-#define mGTrace(param, ...) do { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mTrace(param ", GTID: %s", __VA_ARGS__, buf);} while(0)
+
+
+#define mFatal(...) { if (mDebugFlag & DEBUG_FATAL) { taosPrintLog("MND FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
+#define mError(...) { if (mDebugFlag & DEBUG_ERROR) { taosPrintLog("MND ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
+#define mWarn(...) { if (mDebugFlag & DEBUG_WARN) { taosPrintLog("MND WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
+#define mInfo(...) { if (mDebugFlag & DEBUG_INFO) { taosPrintLog("MND ", DEBUG_INFO, 255, __VA_ARGS__); }}
+#define mDebug(...) { if (mDebugFlag & DEBUG_DEBUG) { taosPrintLog("MND ", DEBUG_DEBUG, mDebugFlag, __VA_ARGS__); }}
+#define mTrace(...) { if (mDebugFlag & DEBUG_TRACE) { taosPrintLog("MND ", DEBUG_TRACE, mDebugFlag, __VA_ARGS__); }}
+
+#define mGFatal(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mFatal(param ", gtid:%s", __VA_ARGS__, buf);}
+#define mGError(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mError(param ", gtid:%s", __VA_ARGS__, buf);}
+#define mGWarn(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mWarn (param ", gtid:%s", __VA_ARGS__, buf);}
+#define mGInfo(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mInfo (param ", gtid:%s", __VA_ARGS__, buf);}
+#define mGDebug(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mDebug(param ", gtid:%s", __VA_ARGS__, buf);}
+#define mGTrace(param, ...) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); mTrace(param ", gtid:%s", __VA_ARGS__, buf);}
// clang-format on
@@ -70,7 +78,7 @@ typedef struct {
typedef struct {
SCacheObj *connCache;
- SCacheObj *appCache;
+ SCacheObj *appCache;
} SProfileMgmt;
typedef struct {
diff --git a/source/dnode/mnode/impl/inc/mndPerfSchema.h b/source/dnode/mnode/impl/inc/mndPerfSchema.h
index 19f60229f9..87b4626e83 100644
--- a/source/dnode/mnode/impl/inc/mndPerfSchema.h
+++ b/source/dnode/mnode/impl/inc/mndPerfSchema.h
@@ -23,6 +23,7 @@ extern "C" {
#endif
int32_t mndBuildPerfsTableSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp);
+int32_t mndBuildPerfsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp);
int32_t mndInitPerfs(SMnode *pMnode);
void mndCleanupPerfs(SMnode *pMnode);
diff --git a/source/dnode/mnode/impl/inc/mndQnode.h b/source/dnode/mnode/impl/inc/mndQnode.h
index 3e38565a4f..17615500c4 100644
--- a/source/dnode/mnode/impl/inc/mndQnode.h
+++ b/source/dnode/mnode/impl/inc/mndQnode.h
@@ -24,12 +24,12 @@ extern "C" {
#define QNODE_LOAD_VALUE(pQnode) (pQnode ? (pQnode->load.numOfQueryInQueue + pQnode->load.numOfFetchInQueue) : 0)
-int32_t mndInitQnode(SMnode *pMnode);
-void mndCleanupQnode(SMnode *pMnode);
-
+int32_t mndInitQnode(SMnode *pMnode);
+void mndCleanupQnode(SMnode *pMnode);
SQnodeObj *mndAcquireQnode(SMnode *pMnode, int32_t qnodeId);
-void mndReleaseQnode(SMnode *pMnode, SQnodeObj *pObj);
-int32_t mndCreateQnodeList(SMnode *pMnode, SArray** pList, int32_t limit);
+void mndReleaseQnode(SMnode *pMnode, SQnodeObj *pObj);
+int32_t mndCreateQnodeList(SMnode *pMnode, SArray **pList, int32_t limit);
+int32_t mndSetDropQnodeInfoToTrans(SMnode *pMnode, STrans *pTrans, SQnodeObj *pObj);
#ifdef __cplusplus
}
diff --git a/source/dnode/mnode/impl/inc/mndSnode.h b/source/dnode/mnode/impl/inc/mndSnode.h
index 180f18a6dd..ec7bb02ca7 100644
--- a/source/dnode/mnode/impl/inc/mndSnode.h
+++ b/source/dnode/mnode/impl/inc/mndSnode.h
@@ -22,9 +22,12 @@
extern "C" {
#endif
-int32_t mndInitSnode(SMnode *pMnode);
-void mndCleanupSnode(SMnode *pMnode);
-SEpSet mndAcquireEpFromSnode(SMnode *pMnode, const SSnodeObj *pSnode);
+int32_t mndInitSnode(SMnode *pMnode);
+void mndCleanupSnode(SMnode *pMnode);
+SSnodeObj *mndAcquireSnode(SMnode *pMnode, int32_t qnodeId);
+void mndReleaseSnode(SMnode *pMnode, SSnodeObj *pObj);
+SEpSet mndAcquireEpFromSnode(SMnode *pMnode, const SSnodeObj *pSnode);
+int32_t mndSetDropSnodeInfoToTrans(SMnode *pMnode, STrans *pTrans, SSnodeObj *pObj);
#ifdef __cplusplus
}
diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c
index 58c3570c36..8d06868955 100644
--- a/source/dnode/mnode/impl/src/mndDnode.c
+++ b/source/dnode/mnode/impl/src/mndDnode.c
@@ -19,6 +19,7 @@
#include "mndMnode.h"
#include "mndQnode.h"
#include "mndShow.h"
+#include "mndSnode.h"
#include "mndTrans.h"
#include "mndUser.h"
#include "mndVgroup.h"
@@ -370,7 +371,8 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
SMnodeObj *pObj = mndAcquireMnode(pMnode, pDnode->id);
if (pObj != NULL) {
if (pObj->state != statusReq.mload.syncState) {
- mInfo("dnode:%d, mnode syncstate from %s to %s", pObj->id, syncStr(pObj->state), syncStr(statusReq.mload.syncState));
+ mInfo("dnode:%d, mnode syncstate from %s to %s", pObj->id, syncStr(pObj->state),
+ syncStr(statusReq.mload.syncState));
pObj->state = statusReq.mload.syncState;
pObj->stateStartTime = taosGetTimestampMs();
}
@@ -508,7 +510,7 @@ static int32_t mndProcessCreateDnodeReq(SRpcMsg *pReq) {
goto _OVER;
}
- mDebug("dnode:%s:%d, start to create", createReq.fqdn, createReq.port);
+ mInfo("dnode:%s:%d, start to create", createReq.fqdn, createReq.port);
if (createReq.fqdn[0] == 0 || createReq.port <= 0 || createReq.port > UINT16_MAX) {
terrno = TSDB_CODE_MND_INVALID_DNODE_EP;
@@ -538,7 +540,8 @@ _OVER:
return code;
}
-static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMnodeObj *pMObj, int32_t numOfVnodes) {
+static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMnodeObj *pMObj, SQnodeObj *pQObj,
+ SSnodeObj *pSObj, int32_t numOfVnodes) {
int32_t code = -1;
SSdbRaw *pRaw = NULL;
STrans *pTrans = NULL;
@@ -546,7 +549,7 @@ static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SM
pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq);
if (pTrans == NULL) goto _OVER;
mndTransSetSerial(pTrans);
- mDebug("trans:%d, used to drop dnode:%d", pTrans->id, pDnode->id);
+ mInfo("trans:%d, used to drop dnode:%d", pTrans->id, pDnode->id);
pRaw = mndDnodeActionEncode(pDnode);
if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) goto _OVER;
@@ -559,11 +562,22 @@ static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SM
pRaw = NULL;
if (pMObj != NULL) {
- mDebug("trans:%d, mnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
+ mInfo("trans:%d, mnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
if (mndSetDropMnodeInfoToTrans(pMnode, pTrans, pMObj) != 0) goto _OVER;
}
+
+ if (pQObj != NULL) {
+ mInfo("trans:%d, qnode on dnode:%d will be dropped", pTrans->id, pDnode->id);
+ if (mndSetDropQnodeInfoToTrans(pMnode, pTrans, pQObj) != 0) goto _OVER;
+ }
+
+ if (pSObj != NULL) {
+ mInfo("trans:%d, snode on dnode:%d will be dropped", pTrans->id, pDnode->id);
+ if (mndSetDropSnodeInfoToTrans(pMnode, pTrans, pSObj) != 0) goto _OVER;
+ }
+
if (numOfVnodes > 0) {
- mDebug("trans:%d, %d vnodes on dnode:%d will be dropped", pTrans->id, numOfVnodes, pDnode->id);
+ mInfo("trans:%d, %d vnodes on dnode:%d will be dropped", pTrans->id, numOfVnodes, pDnode->id);
if (mndSetMoveVgroupsInfoToTrans(pMnode, pTrans, pDnode->id) != 0) goto _OVER;
}
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
@@ -581,6 +595,8 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
int32_t code = -1;
SDnodeObj *pDnode = NULL;
SMnodeObj *pMObj = NULL;
+ SQnodeObj *pQObj = NULL;
+ SSnodeObj *pSObj = NULL;
SMDropMnodeReq dropReq = {0};
if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
@@ -588,7 +604,7 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
goto _OVER;
}
- mDebug("dnode:%d, start to drop", dropReq.dnodeId);
+ mInfo("dnode:%d, start to drop", dropReq.dnodeId);
if (dropReq.dnodeId <= 0) {
terrno = TSDB_CODE_MND_INVALID_DNODE_ID;
@@ -601,6 +617,8 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
goto _OVER;
}
+ pQObj = mndAcquireQnode(pMnode, dropReq.dnodeId);
+ pSObj = mndAcquireSnode(pMnode, dropReq.dnodeId);
pMObj = mndAcquireMnode(pMnode, dropReq.dnodeId);
if (pMObj != NULL) {
if (sdbGetSize(pMnode->pSdb, SDB_MNODE) <= 1) {
@@ -627,7 +645,7 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
goto _OVER;
}
- code = mndDropDnode(pMnode, pReq, pDnode, pMObj, numOfVnodes);
+ code = mndDropDnode(pMnode, pReq, pDnode, pMObj, pQObj, pSObj, numOfVnodes);
if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
_OVER:
@@ -637,6 +655,8 @@ _OVER:
mndReleaseDnode(pMnode, pDnode);
mndReleaseMnode(pMnode, pMObj);
+ mndReleaseQnode(pMnode, pQObj);
+ mndReleaseSnode(pMnode, pSObj);
return code;
}
diff --git a/source/dnode/mnode/impl/src/mndInfoSchema.c b/source/dnode/mnode/impl/src/mndInfoSchema.c
index c9bccaf1d0..45fefaf870 100644
--- a/source/dnode/mnode/impl/src/mndInfoSchema.c
+++ b/source/dnode/mnode/impl/src/mndInfoSchema.c
@@ -90,6 +90,38 @@ int32_t mndBuildInsTableSchema(SMnode *pMnode, const char *dbFName, const char *
return 0;
}
+int32_t mndBuildInsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
+ if (NULL == pMnode->infosMeta) {
+ terrno = TSDB_CODE_MND_NOT_READY;
+ return -1;
+ }
+
+ STableMetaRsp *pMeta = taosHashGet(pMnode->infosMeta, tbName, strlen(tbName));
+ if (NULL == pMeta) {
+ mError("invalid information schema table name:%s", tbName);
+ terrno = TSDB_CODE_MND_INVALID_SYS_TABLENAME;
+ return -1;
+ }
+
+ strcpy(pRsp->tbName, pMeta->tbName);
+ strcpy(pRsp->stbName, pMeta->stbName);
+ strcpy(pRsp->dbFName, pMeta->dbFName);
+ pRsp->numOfTags = pMeta->numOfTags;
+ pRsp->numOfColumns = pMeta->numOfColumns;
+ pRsp->tableType = pMeta->tableType;
+
+ pRsp->pSchemas = taosMemoryCalloc(pMeta->numOfColumns, sizeof(SSchema));
+ if (pRsp->pSchemas == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ pRsp->pSchemas = NULL;
+ return -1;
+ }
+
+ memcpy(pRsp->pSchemas, pMeta->pSchemas, pMeta->numOfColumns * sizeof(SSchema));
+ return 0;
+}
+
+
int32_t mndInitInfos(SMnode *pMnode) {
pMnode->infosMeta = taosHashInit(20, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), false, HASH_NO_LOCK);
if (pMnode->infosMeta == NULL) {
diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c
index ef82d1131c..675a3aa03f 100644
--- a/source/dnode/mnode/impl/src/mndMain.c
+++ b/source/dnode/mnode/impl/src/mndMain.c
@@ -59,22 +59,28 @@ static void *mndBuildTimerMsg(int32_t *pContLen) {
static void mndPullupTrans(SMnode *pMnode) {
int32_t contLen = 0;
void *pReq = mndBuildTimerMsg(&contLen);
- SRpcMsg rpcMsg = {.msgType = TDMT_MND_TRANS_TIMER, .pCont = pReq, .contLen = contLen};
- tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg);
+ if (pReq != NULL) {
+ SRpcMsg rpcMsg = {.msgType = TDMT_MND_TRANS_TIMER, .pCont = pReq, .contLen = contLen};
+ tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg);
+ }
}
static void mndCalMqRebalance(SMnode *pMnode) {
int32_t contLen = 0;
void *pReq = mndBuildTimerMsg(&contLen);
- SRpcMsg rpcMsg = {.msgType = TDMT_MND_MQ_TIMER, .pCont = pReq, .contLen = contLen};
- tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
+ if (pReq != NULL) {
+ SRpcMsg rpcMsg = {.msgType = TDMT_MND_MQ_TIMER, .pCont = pReq, .contLen = contLen};
+ tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
+ }
}
static void mndPullupTelem(SMnode *pMnode) {
int32_t contLen = 0;
void *pReq = mndBuildTimerMsg(&contLen);
- SRpcMsg rpcMsg = {.msgType = TDMT_MND_TELEM_TIMER, .pCont = pReq, .contLen = contLen};
- tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
+ if (pReq != NULL) {
+ SRpcMsg rpcMsg = {.msgType = TDMT_MND_TELEM_TIMER, .pCont = pReq, .contLen = contLen};
+ tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
+ }
}
static void mndPushTtlTime(SMnode *pMnode) {
@@ -89,10 +95,11 @@ static void mndPushTtlTime(SMnode *pMnode) {
int32_t contLen = sizeof(SMsgHead) + sizeof(int32_t);
SMsgHead *pHead = rpcMallocCont(contLen);
if (pHead == NULL) {
- mError("ttl time malloc err. contLen:%d", contLen);
+ sdbCancelFetch(pSdb, pIter);
sdbRelease(pSdb, pVgroup);
continue;
}
+
pHead->contLen = htonl(contLen);
pHead->vgId = htonl(pVgroup->vgId);
@@ -100,13 +107,13 @@ static void mndPushTtlTime(SMnode *pMnode) {
*(int32_t *)(POINTER_SHIFT(pHead, sizeof(SMsgHead))) = htonl(t);
SRpcMsg rpcMsg = {.msgType = TDMT_VND_DROP_TTL_TABLE, .pCont = pHead, .contLen = contLen};
-
SEpSet epSet = mndGetVgroupEpset(pMnode, pVgroup);
int32_t code = tmsgSendReq(&epSet, &rpcMsg);
if (code != 0) {
- mError("ttl time seed err. code:%d", code);
+ mError("failed to send ttl time seed msg, code:0x%x", code);
+ } else {
+ mInfo("send ttl time seed msg, time:%d", t);
}
- mError("ttl time seed succ. time:%d", t);
sdbRelease(pSdb, pVgroup);
}
}
@@ -117,11 +124,12 @@ static void *mndThreadFp(void *param) {
setThreadName("mnode-timer");
while (1) {
- if (lastTime % (864000) == 0) { // sleep 1 day for ttl
+ lastTime++;
+
+ if (lastTime % (864000) == 0) { // sleep 1 day for ttl
mndPushTtlTime(pMnode);
}
- lastTime++;
taosMsleep(100);
if (mndGetStop(pMnode)) break;
@@ -549,23 +557,25 @@ int32_t mndProcessSyncMsg(SRpcMsg *pMsg) {
static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
if (!IsReq(pMsg)) return 0;
if (mndAcquireRpcRef(pMsg->info.node) == 0) return 0;
+ if (pMsg->msgType == TDMT_MND_MQ_TIMER || pMsg->msgType == TDMT_MND_TELEM_TIMER ||
+ pMsg->msgType == TDMT_MND_TRANS_TIMER) {
+ return -1;
+ }
- if (pMsg->msgType != TDMT_MND_MQ_TIMER && pMsg->msgType != TDMT_MND_TELEM_TIMER &&
- pMsg->msgType != TDMT_MND_TRANS_TIMER) {
- mError("msg:%p, failed to check mnode state since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pMsg->msgType));
+ const STraceId *trace = &pMsg->info.traceId;
+ mGError("msg:%p, failed to check mnode state since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pMsg->msgType));
- SEpSet epSet = {0};
- mndGetMnodeEpSet(pMsg->info.node, &epSet);
+ SEpSet epSet = {0};
+ mndGetMnodeEpSet(pMsg->info.node, &epSet);
- int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
- pMsg->info.rsp = rpcMallocCont(contLen);
- if (pMsg->info.rsp != NULL) {
- tSerializeSEpSet(pMsg->info.rsp, contLen, &epSet);
- pMsg->info.rspLen = contLen;
- terrno = TSDB_CODE_RPC_REDIRECT;
- } else {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- }
+ int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
+ pMsg->info.rsp = rpcMallocCont(contLen);
+ if (pMsg->info.rsp != NULL) {
+ tSerializeSEpSet(pMsg->info.rsp, contLen, &epSet);
+ pMsg->info.rspLen = contLen;
+ terrno = TSDB_CODE_RPC_REDIRECT;
+ } else {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
}
return -1;
@@ -575,17 +585,20 @@ static int32_t mndCheckMsgContent(SRpcMsg *pMsg) {
if (!IsReq(pMsg)) return 0;
if (pMsg->contLen != 0 && pMsg->pCont != NULL) return 0;
- mError("msg:%p, failed to check msg, cont:%p contLen:%d, app:%p type:%s", pMsg, pMsg->pCont, pMsg->contLen,
+ const STraceId *trace = &pMsg->info.traceId;
+ mGError("msg:%p, failed to check msg, cont:%p contLen:%d, app:%p type:%s", pMsg, pMsg->pCont, pMsg->contLen,
pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
terrno = TSDB_CODE_INVALID_MSG_LEN;
return -1;
}
int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
- SMnode *pMnode = pMsg->info.node;
+ SMnode *pMnode = pMsg->info.node;
+ const STraceId *trace = &pMsg->info.traceId;
+
MndMsgFp fp = pMnode->msgFp[TMSG_INDEX(pMsg->msgType)];
if (fp == NULL) {
- mError("msg:%p, failed to get msg handle, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
+ mGError("msg:%p, failed to get msg handle, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
return -1;
}
@@ -593,18 +606,17 @@ int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
if (mndCheckMsgContent(pMsg) != 0) return -1;
if (mndCheckMnodeState(pMsg) != 0) return -1;
- STraceId *trace = &pMsg->info.traceId;
mGTrace("msg:%p, start to process in mnode, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
int32_t code = (*fp)(pMsg);
mndReleaseRpcRef(pMnode);
if (code == TSDB_CODE_ACTION_IN_PROGRESS) {
- mTrace("msg:%p, won't response immediately since in progress", pMsg);
+ mGTrace("msg:%p, won't response immediately since in progress", pMsg);
} else if (code == 0) {
- mTrace("msg:%p, successfully processed", pMsg);
+ mGTrace("msg:%p, successfully processed", pMsg);
} else {
- mError("msg:%p, failed to process since %s, app:%p type:%s", pMsg, terrstr(), pMsg->info.ahandle,
- TMSG_INFO(pMsg->msgType));
+ mGError("msg:%p, failed to process since %s, app:%p type:%s", pMsg, terrstr(), pMsg->info.ahandle,
+ TMSG_INFO(pMsg->msgType));
}
return code;
@@ -620,7 +632,6 @@ void mndSetMsgHandle(SMnode *pMnode, tmsg_t msgType, MndMsgFp fp) {
// Note: uid 0 is reserved
int64_t mndGenerateUid(char *name, int32_t len) {
int32_t hashval = MurmurHash3_32(name, len);
-
do {
int64_t us = taosGetTimestampUs();
int64_t x = (us & 0x000000FFFFFFFFFF) << 24;
diff --git a/source/dnode/mnode/impl/src/mndPerfSchema.c b/source/dnode/mnode/impl/src/mndPerfSchema.c
index d7b2e3ec24..7056337c8d 100644
--- a/source/dnode/mnode/impl/src/mndPerfSchema.c
+++ b/source/dnode/mnode/impl/src/mndPerfSchema.c
@@ -92,6 +92,37 @@ int32_t mndBuildPerfsTableSchema(SMnode *pMnode, const char *dbFName, const char
return 0;
}
+int32_t mndBuildPerfsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
+ if (NULL == pMnode->perfsMeta) {
+ terrno = TSDB_CODE_MND_NOT_READY;
+ return -1;
+ }
+
+ STableMetaRsp *pMeta = taosHashGet(pMnode->perfsMeta, tbName, strlen(tbName));
+ if (NULL == pMeta) {
+ mError("invalid performance schema table name:%s", tbName);
+ terrno = TSDB_CODE_MND_INVALID_SYS_TABLENAME;
+ return -1;
+ }
+
+ strcpy(pRsp->tbName, pMeta->tbName);
+ strcpy(pRsp->stbName, pMeta->stbName);
+ strcpy(pRsp->dbFName, pMeta->dbFName);
+ pRsp->numOfTags = pMeta->numOfTags;
+ pRsp->numOfColumns = pMeta->numOfColumns;
+ pRsp->tableType = pMeta->tableType;
+
+ pRsp->pSchemas = taosMemoryCalloc(pMeta->numOfColumns, sizeof(SSchema));
+ if (pRsp->pSchemas == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ pRsp->pSchemas = NULL;
+ return -1;
+ }
+
+ memcpy(pRsp->pSchemas, pMeta->pSchemas, pMeta->numOfColumns * sizeof(SSchema));
+ return 0;
+}
+
int32_t mndInitPerfs(SMnode *pMnode) {
pMnode->perfsMeta = taosHashInit(20, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
if (pMnode->perfsMeta == NULL) {
diff --git a/source/dnode/mnode/impl/src/mndProfile.c b/source/dnode/mnode/impl/src/mndProfile.c
index fd80679316..832e328d96 100644
--- a/source/dnode/mnode/impl/src/mndProfile.c
+++ b/source/dnode/mnode/impl/src/mndProfile.c
@@ -122,30 +122,33 @@ static SConnObj *mndCreateConn(SMnode *pMnode, const char *user, int8_t connType
int32_t pid, const char *app, int64_t startTime) {
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
- char connStr[255] = {0};
- int32_t len = snprintf(connStr, sizeof(connStr), "%s%d%d%d%s", user, ip, port, pid, app);
+ char connStr[255] = {0};
+ int32_t len = snprintf(connStr, sizeof(connStr), "%s%d%d%d%s", user, ip, port, pid, app);
uint32_t connId = mndGenerateUid(connStr, len);
if (startTime == 0) startTime = taosGetTimestampMs();
- SConnObj connObj = {.id = connId,
- .connType = connType,
- .appStartTimeMs = startTime,
- .pid = pid,
- .ip = ip,
- .port = port,
- .killed = 0,
- .loginTimeMs = taosGetTimestampMs(),
- .lastAccessTimeMs = 0,
- .killId = 0,
- .numOfQueries = 0,
- .pQueries = NULL};
+ SConnObj connObj = {
+ .id = connId,
+ .connType = connType,
+ .appStartTimeMs = startTime,
+ .pid = pid,
+ .ip = ip,
+ .port = port,
+ .killed = 0,
+ .loginTimeMs = taosGetTimestampMs(),
+ .lastAccessTimeMs = 0,
+ .killId = 0,
+ .numOfQueries = 0,
+ .pQueries = NULL,
+ };
connObj.lastAccessTimeMs = connObj.loginTimeMs;
tstrncpy(connObj.user, user, TSDB_USER_LEN);
tstrncpy(connObj.app, app, TSDB_APP_NAME_LEN);
int32_t keepTime = tsShellActivityTimer * 3;
- SConnObj *pConn = taosCachePut(pMgmt->connCache, &connId, sizeof(uint32_t), &connObj, sizeof(connObj), keepTime * 1000);
+ SConnObj *pConn =
+ taosCachePut(pMgmt->connCache, &connId, sizeof(uint32_t), &connObj, sizeof(connObj), keepTime * 1000);
if (pConn == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
mError("conn:%d, failed to put into cache since %s, user:%s", connId, user, terrstr());
@@ -174,7 +177,6 @@ static SConnObj *mndAcquireConn(SMnode *pMnode, uint32_t connId) {
}
pConn->lastAccessTimeMs = taosGetTimestampMs();
-
mTrace("conn:%u, acquired from cache, data:%p", pConn->id, pConn);
return pConn;
}
@@ -207,13 +209,14 @@ static void mndCancelGetNextConn(SMnode *pMnode, void *pIter) {
}
static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
- SMnode *pMnode = pReq->info.node;
- SUserObj *pUser = NULL;
- SDbObj *pDb = NULL;
- SConnObj *pConn = NULL;
- int32_t code = -1;
- SConnectReq connReq = {0};
- char ip[30] = {0};
+ SMnode *pMnode = pReq->info.node;
+ SUserObj *pUser = NULL;
+ SDbObj *pDb = NULL;
+ SConnObj *pConn = NULL;
+ int32_t code = -1;
+ SConnectReq connReq = {0};
+ char ip[30] = {0};
+ const STraceId *trace = &pReq->info.traceId;
if (tDeserializeSConnectReq(pReq->pCont, pReq->contLen, &connReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
@@ -224,11 +227,11 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
if (pUser == NULL) {
- mError("user:%s, failed to login while acquire user since %s", pReq->info.conn.user, terrstr());
+ mGError("user:%s, failed to login while acquire user since %s", pReq->info.conn.user, terrstr());
goto CONN_OVER;
}
if (0 != strncmp(connReq.passwd, pUser->pass, TSDB_PASSWORD_LEN - 1)) {
- mError("user:%s, failed to auth while acquire user, input:%s", pReq->info.conn.user, connReq.passwd);
+ mGError("user:%s, failed to auth while acquire user, input:%s", pReq->info.conn.user, connReq.passwd);
code = TSDB_CODE_RPC_AUTH_FAILURE;
goto CONN_OVER;
}
@@ -239,8 +242,8 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
pDb = mndAcquireDb(pMnode, db);
if (pDb == NULL) {
terrno = TSDB_CODE_MND_INVALID_DB;
- mError("user:%s, failed to login from %s while use db:%s since %s", pReq->info.conn.user, ip, connReq.db,
- terrstr());
+ mGError("user:%s, failed to login from %s while use db:%s since %s", pReq->info.conn.user, ip, connReq.db,
+ terrstr());
goto CONN_OVER;
}
}
@@ -248,7 +251,7 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
pConn = mndCreateConn(pMnode, pReq->info.conn.user, connReq.connType, pReq->info.conn.clientIp,
pReq->info.conn.clientPort, connReq.pid, connReq.app, connReq.startTime);
if (pConn == NULL) {
- mError("user:%s, failed to login from %s while create connection since %s", pReq->info.conn.user, ip, terrstr());
+ mGError("user:%s, failed to login from %s while create connection since %s", pReq->info.conn.user, ip, terrstr());
goto CONN_OVER;
}
@@ -273,7 +276,7 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
pReq->info.rspLen = contLen;
pReq->info.rsp = pRsp;
- mDebug("user:%s, login from %s:%d, conn:%u, app:%s", pReq->info.conn.user, ip, pConn->port, pConn->id, connReq.app);
+ mGDebug("user:%s, login from %s:%d, conn:%u, app:%s", pReq->info.conn.user, ip, pConn->port, pConn->id, connReq.app);
code = 0;
@@ -302,7 +305,7 @@ static int32_t mndSaveQueryList(SConnObj *pConn, SQueryHbReqBasic *pBasic) {
return TSDB_CODE_SUCCESS;
}
-static SAppObj *mndCreateApp(SMnode *pMnode, uint32_t clientIp, SAppHbReq* pReq) {
+static SAppObj *mndCreateApp(SMnode *pMnode, uint32_t clientIp, SAppHbReq *pReq) {
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
SAppObj app;
@@ -314,22 +317,19 @@ static SAppObj *mndCreateApp(SMnode *pMnode, uint32_t clientIp, SAppHbReq* pReq)
memcpy(&app.summary, &pReq->summary, sizeof(pReq->summary));
app.lastAccessTimeMs = taosGetTimestampMs();
- int32_t keepTime = tsShellActivityTimer * 3;
+ const int32_t keepTime = tsShellActivityTimer * 3;
SAppObj *pApp = taosCachePut(pMgmt->appCache, &pReq->appId, sizeof(pReq->appId), &app, sizeof(app), keepTime * 1000);
if (pApp == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
mError("failed to app %" PRIx64 " into cache since %s", pReq->appId, terrstr());
return NULL;
}
-
+
mTrace("app %" PRIx64 " is put into cache", pReq->appId);
return pApp;
}
-static void mndFreeApp(SAppObj *pApp) {
- mTrace("app %" PRIx64 " is destroyed", pApp->appId);
-}
-
+static void mndFreeApp(SAppObj *pApp) { mTrace("app %" PRIx64 " is destroyed", pApp->appId); }
static SAppObj *mndAcquireApp(SMnode *pMnode, int64_t appId) {
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
@@ -356,7 +356,7 @@ static void mndReleaseApp(SMnode *pMnode, SAppObj *pApp) {
void *mndGetNextApp(SMnode *pMnode, SCacheIter *pIter) {
SAppObj *pApp = NULL;
- bool hasNext = taosCacheIterNext(pIter);
+ bool hasNext = taosCacheIterNext(pIter);
if (hasNext) {
size_t dataLen = 0;
pApp = taosCacheIterGetData(pIter, &dataLen);
@@ -439,16 +439,16 @@ static SClientHbRsp *mndMqHbBuildRsp(SMnode *pMnode, SClientHbReq *pReq) {
}
static int32_t mndUpdateAppInfo(SMnode *pMnode, SClientHbReq *pHbReq, SRpcConnInfo *connInfo) {
- SAppHbReq* pReq = &pHbReq->app;
- SAppObj *pApp = mndAcquireApp(pMnode, pReq->appId);
+ SAppHbReq *pReq = &pHbReq->app;
+ SAppObj *pApp = mndAcquireApp(pMnode, pReq->appId);
if (pApp == NULL) {
pApp = mndCreateApp(pMnode, connInfo->clientIp, pReq);
if (pApp == NULL) {
mError("failed to create new app %" PRIx64 " since %s", pReq->appId, terrstr());
return -1;
} else {
- mDebug("a new app %" PRIx64 "created", pReq->appId);
- mndReleaseApp(pMnode, pApp);
+ mDebug("a new app %" PRIx64 " is created", pReq->appId);
+ mndReleaseApp(pMnode, pApp);
return TSDB_CODE_SUCCESS;
}
}
@@ -464,7 +464,7 @@ static int32_t mndProcessQueryHeartBeat(SMnode *pMnode, SRpcMsg *pMsg, SClientHb
SClientHbBatchRsp *pBatchRsp) {
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
SClientHbRsp hbRsp = {.connKey = pHbReq->connKey, .status = 0, .info = NULL, .query = NULL};
- SRpcConnInfo connInfo = pMsg->info.conn;
+ SRpcConnInfo connInfo = pMsg->info.conn;
mndUpdateAppInfo(pMnode, pHbReq, &connInfo);
@@ -637,9 +637,9 @@ static int32_t mndProcessKillQueryReq(SRpcMsg *pReq) {
}
mInfo("kill query msg is received, queryId:%s", killReq.queryStrId);
- int32_t connId = 0;
+ int32_t connId = 0;
uint64_t queryId = 0;
- char* p = strchr(killReq.queryStrId, ':');
+ char *p = strchr(killReq.queryStrId, ':');
if (NULL == p) {
mError("invalid query id %s", killReq.queryStrId);
terrno = TSDB_CODE_MND_INVALID_QUERY_ID;
@@ -853,12 +853,12 @@ static int32_t mndRetrieveQueries(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
}
static int32_t mndRetrieveApps(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
- SMnode *pMnode = pReq->info.node;
- SSdb *pSdb = pMnode->pSdb;
- int32_t numOfRows = 0;
- int32_t cols = 0;
- SAppObj *pApp = NULL;
-
+ SMnode *pMnode = pReq->info.node;
+ SSdb *pSdb = pMnode->pSdb;
+ int32_t numOfRows = 0;
+ int32_t cols = 0;
+ SAppObj *pApp = NULL;
+
if (pShow->pIter == NULL) {
SProfileMgmt *pMgmt = &pMnode->profileMgmt;
pShow->pIter = taosCacheCreateIter(pMgmt->appCache);
@@ -931,7 +931,6 @@ static int32_t mndRetrieveApps(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo
return numOfRows;
}
-
static void mndCancelGetNextQuery(SMnode *pMnode, void *pIter) {
if (pIter != NULL) {
taosCacheDestroyIter(pIter);
diff --git a/source/dnode/mnode/impl/src/mndQnode.c b/source/dnode/mnode/impl/src/mndQnode.c
index f5625f32d5..0a6c97e63c 100644
--- a/source/dnode/mnode/impl/src/mndQnode.c
+++ b/source/dnode/mnode/impl/src/mndQnode.c
@@ -354,6 +354,14 @@ static int32_t mndSetDropQnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SQn
return 0;
}
+int32_t mndSetDropQnodeInfoToTrans(SMnode *pMnode, STrans *pTrans, SQnodeObj *pObj) {
+ if (pObj == NULL) return 0;
+ if (mndSetDropQnodeRedoLogs(pTrans, pObj) != 0) return -1;
+ if (mndSetDropQnodeCommitLogs(pTrans, pObj) != 0) return -1;
+ if (mndSetDropQnodeRedoActions(pTrans, pObj->pDnode, pObj) != 0) return -1;
+ return 0;
+}
+
static int32_t mndDropQnode(SMnode *pMnode, SRpcMsg *pReq, SQnodeObj *pObj) {
int32_t code = -1;
@@ -361,9 +369,7 @@ static int32_t mndDropQnode(SMnode *pMnode, SRpcMsg *pReq, SQnodeObj *pObj) {
if (pTrans == NULL) goto _OVER;
mDebug("trans:%d, used to drop qnode:%d", pTrans->id, pObj->id);
- if (mndSetDropQnodeRedoLogs(pTrans, pObj) != 0) goto _OVER;
- if (mndSetDropQnodeCommitLogs(pTrans, pObj) != 0) goto _OVER;
- if (mndSetDropQnodeRedoActions(pTrans, pObj->pDnode, pObj) != 0) goto _OVER;
+ if (mndSetDropQnodeInfoToTrans(pMnode, pTrans, pObj) != 0) goto _OVER;
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
code = 0;
diff --git a/source/dnode/mnode/impl/src/mndSnode.c b/source/dnode/mnode/impl/src/mndSnode.c
index 12188a3b3a..df1330197a 100644
--- a/source/dnode/mnode/impl/src/mndSnode.c
+++ b/source/dnode/mnode/impl/src/mndSnode.c
@@ -65,7 +65,7 @@ SEpSet mndAcquireEpFromSnode(SMnode *pMnode, const SSnodeObj *pSnode) {
return epSet;
}
-static SSnodeObj *mndAcquireSnode(SMnode *pMnode, int32_t snodeId) {
+SSnodeObj *mndAcquireSnode(SMnode *pMnode, int32_t snodeId) {
SSnodeObj *pObj = sdbAcquire(pMnode->pSdb, SDB_SNODE, &snodeId);
if (pObj == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
terrno = TSDB_CODE_MND_SNODE_NOT_EXIST;
@@ -73,7 +73,7 @@ static SSnodeObj *mndAcquireSnode(SMnode *pMnode, int32_t snodeId) {
return pObj;
}
-static void mndReleaseSnode(SMnode *pMnode, SSnodeObj *pObj) {
+void mndReleaseSnode(SMnode *pMnode, SSnodeObj *pObj) {
SSdb *pSdb = pMnode->pSdb;
sdbRelease(pSdb, pObj);
}
@@ -361,6 +361,14 @@ static int32_t mndSetDropSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SSn
return 0;
}
+int32_t mndSetDropSnodeInfoToTrans(SMnode *pMnode, STrans *pTrans, SSnodeObj *pObj) {
+ if (pObj == NULL) return 0;
+ if (mndSetDropSnodeRedoLogs(pTrans, pObj) != 0) return -1;
+ if (mndSetDropSnodeCommitLogs(pTrans, pObj) != 0) return -1;
+ if (mndSetDropSnodeRedoActions(pTrans, pObj->pDnode, pObj) != 0) return -1;
+ return 0;
+}
+
static int32_t mndDropSnode(SMnode *pMnode, SRpcMsg *pReq, SSnodeObj *pObj) {
int32_t code = -1;
@@ -368,10 +376,7 @@ static int32_t mndDropSnode(SMnode *pMnode, SRpcMsg *pReq, SSnodeObj *pObj) {
if (pTrans == NULL) goto _OVER;
mDebug("trans:%d, used to drop snode:%d", pTrans->id, pObj->id);
-
- if (mndSetDropSnodeRedoLogs(pTrans, pObj) != 0) goto _OVER;
- if (mndSetDropSnodeCommitLogs(pTrans, pObj) != 0) goto _OVER;
- if (mndSetDropSnodeRedoActions(pTrans, pObj->pDnode, pObj) != 0) goto _OVER;
+ if (mndSetDropSnodeInfoToTrans(pMnode, pTrans, pObj) != 0) goto _OVER;
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
code = 0;
diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c
index 3e50ea8262..e04662d22b 100644
--- a/source/dnode/mnode/impl/src/mndStb.c
+++ b/source/dnode/mnode/impl/src/mndStb.c
@@ -43,6 +43,7 @@ static int32_t mndProcessDropStbReq(SRpcMsg *pReq);
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq);
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter);
+static int32_t mndProcessTableCfgReq(SRpcMsg *pReq);
int32_t mndInitStb(SMnode *pMnode) {
SSdbTable table = {
@@ -62,6 +63,7 @@ int32_t mndInitStb(SMnode *pMnode) {
mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
+ mndSetMsgHandle(pMnode, TDMT_MND_TABLE_CFG, mndProcessTableCfgReq);
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
@@ -75,7 +77,7 @@ SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
int32_t size = sizeof(SStbObj) + (pStb->numOfColumns + pStb->numOfTags) * sizeof(SSchema) + +pStb->commentLen +
- pStb->ast1Len + pStb->ast2Len + STB_RESERVE_SIZE;
+ pStb->ast1Len + pStb->ast2Len + STB_RESERVE_SIZE + taosArrayGetSize(pStb->pFuncs) * TSDB_FUNC_NAME_LEN;
SSdbRaw *pRaw = sdbAllocRaw(SDB_STB, STB_VER_NUMBER, size);
if (pRaw == NULL) goto _OVER;
@@ -100,6 +102,13 @@ SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
SDB_SET_INT32(pRaw, dataPos, pStb->ast1Len, _OVER)
SDB_SET_INT32(pRaw, dataPos, pStb->ast2Len, _OVER)
+ int32_t funcNum = taosArrayGetSize(pStb->pFuncs);
+ SDB_SET_INT32(pRaw, dataPos, funcNum, _OVER)
+ for (int32_t i = 0; i < funcNum; ++i) {
+ char* func = taosArrayGet(pStb->pFuncs, i);
+ SDB_SET_BINARY(pRaw, dataPos, func, TSDB_FUNC_NAME_LEN, _OVER)
+ }
+
for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
SSchema *pSchema = &pStb->pColumns[i];
SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
@@ -181,6 +190,20 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
SDB_GET_INT32(pRaw, dataPos, &pStb->ast1Len, _OVER)
SDB_GET_INT32(pRaw, dataPos, &pStb->ast2Len, _OVER)
+ int32_t funcNum = 0;
+ SDB_GET_INT32(pRaw, dataPos, &funcNum, _OVER)
+ if (funcNum > 0) {
+ pStb->pFuncs = taosArrayInit(funcNum, TSDB_FUNC_NAME_LEN);
+ if (NULL == pStb->pFuncs) {
+ goto _OVER;
+ }
+ char funcName[TSDB_FUNC_NAME_LEN];
+ for (int32_t i = 0; i < funcNum; ++i) {
+ SDB_GET_BINARY(pRaw, dataPos, funcName, TSDB_FUNC_NAME_LEN, _OVER)
+ taosArrayPush(pStb->pFuncs, funcName);
+ }
+ }
+
pStb->pColumns = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchema));
pStb->pTags = taosMemoryCalloc(pStb->numOfTags, sizeof(SSchema));
if (pStb->pColumns == NULL || pStb->pTags == NULL) {
@@ -250,6 +273,7 @@ static int32_t mndStbActionDelete(SSdb *pSdb, SStbObj *pStb) {
taosMemoryFreeClear(pStb->comment);
taosMemoryFreeClear(pStb->pAst1);
taosMemoryFreeClear(pStb->pAst2);
+ taosArrayDestroy(pStb->pFuncs);
return 0;
}
@@ -680,6 +704,9 @@ int32_t mndBuildStbFromReq(SMnode *pMnode, SStbObj *pDst, SMCreateStbReq *pCreat
pDst->numOfColumns = pCreate->numOfColumns;
pDst->numOfTags = pCreate->numOfTags;
pDst->commentLen = pCreate->commentLen;
+ pDst->pFuncs = pCreate->pFuncs;
+ pCreate->pFuncs = NULL;
+
if (pDst->commentLen > 0) {
pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
if (pDst->comment == NULL) {
@@ -1277,6 +1304,60 @@ static int32_t mndBuildStbSchemaImp(SDbObj *pDb, SStbObj *pStb, const char *tbNa
return 0;
}
+static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
+ taosRLockLatch(&pStb->lock);
+
+ int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
+ pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
+ if (pRsp->pSchemas == NULL) {
+ taosRUnLockLatch(&pStb->lock);
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
+
+ strcpy(pRsp->dbFName, pStb->db);
+ strcpy(pRsp->tbName, tbName);
+ strcpy(pRsp->stbName, tbName);
+ pRsp->numOfTags = pStb->numOfTags;
+ pRsp->numOfColumns = pStb->numOfColumns;
+ pRsp->tableType = TSDB_SUPER_TABLE;
+ pRsp->delay1 = pStb->maxdelay[0];
+ pRsp->delay2 = pStb->maxdelay[1];
+ pRsp->watermark1 = pStb->watermark[0];
+ pRsp->watermark2 = pStb->watermark[1];
+ pRsp->ttl = pStb->ttl;
+ pRsp->commentLen = pStb->commentLen;
+ if (pStb->commentLen > 0) {
+ pRsp->pComment = strdup(pStb->comment);
+ }
+
+ for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
+ SSchema *pSchema = &pRsp->pSchemas[i];
+ SSchema *pSrcSchema = &pStb->pColumns[i];
+ memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
+ pSchema->type = pSrcSchema->type;
+ pSchema->colId = pSrcSchema->colId;
+ pSchema->bytes = pSrcSchema->bytes;
+ }
+
+ for (int32_t i = 0; i < pStb->numOfTags; ++i) {
+ SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
+ SSchema *pSrcSchema = &pStb->pTags[i];
+ memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
+ pSchema->type = pSrcSchema->type;
+ pSchema->colId = pSrcSchema->colId;
+ pSchema->bytes = pSrcSchema->bytes;
+ }
+
+ if (pStb->pFuncs) {
+ pRsp->pFuncs = taosArrayDup(pStb->pFuncs);
+ }
+
+ taosRUnLockLatch(&pStb->lock);
+ return 0;
+}
+
+
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp,
int32_t *smaVer) {
char tbFName[TSDB_TABLE_FNAME_LEN] = {0};
@@ -1305,6 +1386,32 @@ static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char
return code;
}
+static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
+ char tbFName[TSDB_TABLE_FNAME_LEN] = {0};
+ snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
+
+ SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
+ if (pDb == NULL) {
+ terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
+ return -1;
+ }
+
+ SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
+ if (pStb == NULL) {
+ mndReleaseDb(pMnode, pDb);
+ terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
+ return -1;
+ }
+
+ int32_t code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
+
+ mndReleaseDb(pMnode, pDb);
+ mndReleaseStb(pMnode, pStb);
+ return code;
+}
+
+
+
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, const SMAlterStbReq *pAlter, SStbObj *pObj, void **pCont,
int32_t *pLen) {
int32_t ret;
@@ -1664,6 +1771,63 @@ _OVER:
return code;
}
+static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
+ SMnode *pMnode = pReq->info.node;
+ int32_t code = -1;
+ STableCfgReq cfgReq = {0};
+ STableCfgRsp cfgRsp = {0};
+
+ if (tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq) != 0) {
+ terrno = TSDB_CODE_INVALID_MSG;
+ goto _OVER;
+ }
+
+ if (0 == strcmp(cfgReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
+ mDebug("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
+ if (mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp) != 0) {
+ goto _OVER;
+ }
+ } else if (0 == strcmp(cfgReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
+ mDebug("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
+ if (mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp) != 0) {
+ goto _OVER;
+ }
+ } else {
+ mDebug("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
+ if (mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp) != 0) {
+ goto _OVER;
+ }
+ }
+
+ int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
+ if (rspLen < 0) {
+ terrno = TSDB_CODE_INVALID_MSG;
+ goto _OVER;
+ }
+
+ void *pRsp = rpcMallocCont(rspLen);
+ if (pRsp == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ goto _OVER;
+ }
+
+ tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp);
+ pReq->info.rsp = pRsp;
+ pReq->info.rspLen = rspLen;
+ code = 0;
+
+ mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
+
+_OVER:
+ if (code != 0) {
+ mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, terrstr());
+ }
+
+ tFreeSTableCfgRsp(&cfgRsp);
+ return code;
+}
+
+
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
int32_t *pRspLen) {
SSTbHbRsp hbRsp = {0};
diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c
index 8666739dab..e3358b41df 100644
--- a/source/dnode/mnode/impl/src/mndSync.c
+++ b/source/dnode/mnode/impl/src/mndSync.c
@@ -75,7 +75,7 @@ void mndSyncCommitMsg(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbM
}
int32_t mndSyncGetSnapshot(struct SSyncFSM *pFsm, SSnapshot *pSnapshot, void *pReaderParam, void **ppReader) {
- mInfo("start to read snapshot from sdb in atomic way");
+ mDebug("start to read snapshot from sdb in atomic way");
SMnode *pMnode = pFsm->data;
return sdbStartRead(pMnode->pSdb, (SSdbIter **)ppReader, &pSnapshot->lastApplyIndex, &pSnapshot->lastApplyTerm,
&pSnapshot->lastConfigIndex);
@@ -96,7 +96,7 @@ void mndRestoreFinish(struct SSyncFSM *pFsm) {
mndTransPullup(pMnode);
mndSetRestore(pMnode, true);
} else {
- mInfo("mnode sync restore finished, and will set ready after first deploy");
+ mInfo("mnode sync restore finished");
}
}
@@ -118,13 +118,13 @@ void mndReConfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta cbM
}
int32_t mndSnapshotStartRead(struct SSyncFSM *pFsm, void **ppReader) {
- mInfo("start to read snapshot from sdb");
+ mDebug("start to read snapshot from sdb");
SMnode *pMnode = pFsm->data;
return sdbStartRead(pMnode->pSdb, (SSdbIter **)ppReader, NULL, NULL, NULL);
}
int32_t mndSnapshotStopRead(struct SSyncFSM *pFsm, void *pReader) {
- mInfo("stop to read snapshot from sdb");
+ mDebug("stop to read snapshot from sdb");
SMnode *pMnode = pFsm->data;
return sdbStopRead(pMnode->pSdb, pReader);
}
diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c
index de6a44d456..eec108414e 100644
--- a/source/dnode/mnode/impl/src/mndTrans.c
+++ b/source/dnode/mnode/impl/src/mndTrans.c
@@ -432,11 +432,11 @@ static const char *mndTransStr(ETrnStage stage) {
}
static void mndTransTestStartFunc(SMnode *pMnode, void *param, int32_t paramLen) {
- mInfo("test trans start, param:%s, len:%d", (char *)param, paramLen);
+ mDebug("test trans start, param:%s, len:%d", (char *)param, paramLen);
}
static void mndTransTestStopFunc(SMnode *pMnode, void *param, int32_t paramLen) {
- mInfo("test trans stop, param:%s, len:%d", (char *)param, paramLen);
+ mDebug("test trans stop, param:%s, len:%d", (char *)param, paramLen);
}
static TransCbFp mndTransGetCbFp(ETrnFunc ftype) {
diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c
index 94ddbcd409..696e714a8c 100644
--- a/source/dnode/mnode/impl/src/mndVgroup.c
+++ b/source/dnode/mnode/impl/src/mndVgroup.c
@@ -1017,6 +1017,11 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb,
if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg, &del, true) != 0) return -1;
if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg) != 0) return -1;
+ SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
+ if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) return -1;
+ sdbSetRawStatus(pRaw, SDB_STATUS_READY);
+ pRaw = NULL;
+
mInfo("vgId:%d, vgroup info after move, replica:%d", newVg.vgId, newVg.replica);
for (int32_t i = 0; i < newVg.replica; ++i) {
mInfo("vgId:%d, vnode:%d dnode:%d", newVg.vgId, i, newVg.vnodeGid[i].dnodeId);
@@ -1025,6 +1030,7 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb,
}
int32_t mndSetMoveVgroupsInfoToTrans(SMnode *pMnode, STrans *pTrans, int32_t delDnodeId) {
+ int32_t code = 0;
SArray *pArray = mndBuildDnodesArray(pMnode, delDnodeId);
if (pArray == NULL) return -1;
@@ -1042,18 +1048,24 @@ int32_t mndSetMoveVgroupsInfoToTrans(SMnode *pMnode, STrans *pTrans, int32_t del
}
}
+ code = 0;
if (vnIndex != -1) {
mInfo("vgId:%d, vnode:%d will be removed from dnode:%d", pVgroup->vgId, vnIndex, delDnodeId);
SDbObj *pDb = mndAcquireDb(pMnode, pVgroup->dbName);
- mndSetMoveVgroupInfoToTrans(pMnode, pTrans, pDb, pVgroup, vnIndex, pArray);
+ code = mndSetMoveVgroupInfoToTrans(pMnode, pTrans, pDb, pVgroup, vnIndex, pArray);
mndReleaseDb(pMnode, pDb);
}
sdbRelease(pMnode->pSdb, pVgroup);
+
+ if (code != 0) {
+ sdbCancelFetch(pMnode->pSdb, pIter);
+ break;
+ }
}
taosArrayDestroy(pArray);
- return 0;
+ return code;
}
static int32_t mndAddIncVgroupReplicaToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup,
diff --git a/source/dnode/mnode/sdb/src/sdbFile.c b/source/dnode/mnode/sdb/src/sdbFile.c
index 47c4a4ed0f..ff4a9e4ead 100644
--- a/source/dnode/mnode/sdb/src/sdbFile.c
+++ b/source/dnode/mnode/sdb/src/sdbFile.c
@@ -519,7 +519,7 @@ static void sdbCloseIter(SSdbIter *pIter) {
pIter->name = NULL;
}
- mInfo("sdbiter:%p, is closed, total:%" PRId64, pIter, pIter->total);
+ mDebug("sdbiter:%p, is closed, total:%" PRId64, pIter, pIter->total);
taosMemoryFree(pIter);
}
@@ -556,7 +556,7 @@ int32_t sdbStartRead(SSdb *pSdb, SSdbIter **ppIter, int64_t *index, int64_t *ter
if (term != NULL) *term = commitTerm;
if (config != NULL) *config = commitConfig;
- mInfo("sdbiter:%p, is created to read snapshot, commit index:%" PRId64 " term:%" PRId64 " config:%" PRId64 " file:%s",
+ mDebug("sdbiter:%p, is created to read snapshot, commit index:%" PRId64 " term:%" PRId64 " config:%" PRId64 " file:%s",
pIter, commitIndex, commitTerm, commitConfig, pIter->name);
return 0;
}
@@ -583,14 +583,14 @@ int32_t sdbDoRead(SSdb *pSdb, SSdbIter *pIter, void **ppBuf, int32_t *len) {
taosMemoryFree(pBuf);
return -1;
} else if (readlen == 0) {
- mInfo("sdbiter:%p, read snapshot to the end, total:%" PRId64, pIter, pIter->total);
+ mDebug("sdbiter:%p, read snapshot to the end, total:%" PRId64, pIter, pIter->total);
*ppBuf = NULL;
*len = 0;
taosMemoryFree(pBuf);
return 0;
} else { // (readlen <= maxlen)
pIter->total += readlen;
- mInfo("sdbiter:%p, read:%d bytes from snapshot, total:%" PRId64, pIter, readlen, pIter->total);
+ mDebug("sdbiter:%p, read:%d bytes from snapshot, total:%" PRId64, pIter, readlen, pIter->total);
*ppBuf = pBuf;
*len = readlen;
return 0;
@@ -609,7 +609,7 @@ int32_t sdbStartWrite(SSdb *pSdb, SSdbIter **ppIter) {
}
*ppIter = pIter;
- mInfo("sdbiter:%p, is created to write snapshot, file:%s", pIter, pIter->name);
+ mDebug("sdbiter:%p, is created to write snapshot, file:%s", pIter, pIter->name);
return 0;
}
@@ -618,7 +618,7 @@ int32_t sdbStopWrite(SSdb *pSdb, SSdbIter *pIter, bool isApply) {
if (!isApply) {
sdbCloseIter(pIter);
- mInfo("sdbiter:%p, not apply to sdb", pIter);
+ mDebug("sdbiter:%p, not apply to sdb", pIter);
return 0;
}
@@ -641,7 +641,7 @@ int32_t sdbStopWrite(SSdb *pSdb, SSdbIter *pIter, bool isApply) {
return -1;
}
- mInfo("sdbiter:%p, successfully applyed to sdb", pIter);
+ mDebug("sdbiter:%p, successfully applyed to sdb", pIter);
return 0;
}
@@ -654,6 +654,6 @@ int32_t sdbDoWrite(SSdb *pSdb, SSdbIter *pIter, void *pBuf, int32_t len) {
}
pIter->total += writelen;
- mInfo("sdbiter:%p, write:%d bytes to snapshot, total:%" PRId64, pIter, writelen, pIter->total);
+ mDebug("sdbiter:%p, write:%d bytes to snapshot, total:%" PRId64, pIter, writelen, pIter->total);
return 0;
}
\ No newline at end of file
diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h
index 9339402d43..32be479116 100644
--- a/source/dnode/vnode/src/inc/vnd.h
+++ b/source/dnode/vnode/src/inc/vnd.h
@@ -32,7 +32,14 @@ extern "C" {
#define vInfo(...) do { if (vDebugFlag & DEBUG_INFO) { taosPrintLog("VND ", DEBUG_INFO, 255, __VA_ARGS__); }} while(0)
#define vDebug(...) do { if (vDebugFlag & DEBUG_DEBUG) { taosPrintLog("VND ", DEBUG_DEBUG, vDebugFlag, __VA_ARGS__); }} while(0)
#define vTrace(...) do { if (vDebugFlag & DEBUG_TRACE) { taosPrintLog("VND ", DEBUG_TRACE, vDebugFlag, __VA_ARGS__); }} while(0)
-#define vGTrace(param, ...) do { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vTrace(param " GTID: %s", __VA_ARGS__, buf);} while(0)//#define vDye(...) do
+
+#define vGTrace(param, ...) do { if (vDebugFlag & DEBUG_TRACE) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vTrace(param ", gtid:%s", __VA_ARGS__, buf);}} while(0)
+#define vGFatal(param, ...) do { if (vDebugFlag & DEBUG_FATAL) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vFatal(param ", gtid:%s", __VA_ARGS__, buf);}} while(0)
+#define vGError(param, ...) do { if (vDebugFlag & DEBUG_ERROR) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vError(param ", gtid:%s", __VA_ARGS__, buf);}} while(0)
+#define vGWarn(param, ...) do { if (vDebugFlag & DEBUG_WARN) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vWarn(param ", gtid:%s", __VA_ARGS__, buf);}} while(0)
+#define vGInfo(param, ...) do { if (vDebugFlag & DEBUG_INFO) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vInfo(param ", gtid:%s", __VA_ARGS__, buf);}} while(0)
+#define vGDebug(param, ...) do { if (vDebugFlag & DEBUG_DEBUG) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); vDebug(param ", gtid:%s", __VA_ARGS__, buf);}} while(0)
+
// clang-format on
// vnodeCfg.c
@@ -71,6 +78,7 @@ void vnodeBufPoolReset(SVBufPool* pPool);
int32_t vnodeQueryOpen(SVnode* pVnode);
void vnodeQueryClose(SVnode* pVnode);
int32_t vnodeGetTableMeta(SVnode* pVnode, SRpcMsg* pMsg);
+int vnodeGetTableCfg(SVnode *pVnode, SRpcMsg *pMsg);
// vnodeCommit.c
int32_t vnodeBegin(SVnode* pVnode);
diff --git a/source/dnode/vnode/src/tq/tqSink.c b/source/dnode/vnode/src/tq/tqSink.c
index b628f0dde5..ece66d30fb 100644
--- a/source/dnode/vnode/src/tq/tqSink.c
+++ b/source/dnode/vnode/src/tq/tqSink.c
@@ -16,7 +16,7 @@
#include "tq.h"
SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, bool createTb, int64_t suid,
- const char* stbFullName, int32_t vgId) {
+ const char* stbFullName, int32_t vgId) {
SSubmitReq* ret = NULL;
SArray* tagArray = taosArrayInit(1, sizeof(STagVal));
if (!tagArray) {
@@ -80,11 +80,10 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
ret->length = sizeof(SSubmitReq);
ret->numOfBlocks = htonl(sz);
- void* submitBlk = POINTER_SHIFT(ret, sizeof(SSubmitReq));
+ SSubmitBlk* blkHead = POINTER_SHIFT(ret, sizeof(SSubmitReq));
for (int32_t i = 0; i < sz; i++) {
SSDataBlock* pDataBlock = taosArrayGet(pBlocks, i);
- SSubmitBlk* blkHead = submitBlk;
blkHead->numOfRows = htons(pDataBlock->info.rows);
blkHead->sversion = htonl(pTSchema->version);
// TODO
@@ -93,11 +92,10 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
blkHead->uid = 0;
int32_t rows = pDataBlock->info.rows;
- /*int32_t maxLen = TD_ROW_MAX_BYTES_FROM_SCHEMA(pTSchema);*/
- /*blkHead->dataLen = htonl(rows * maxLen);*/
- blkHead->dataLen = 0;
- void* blockData = POINTER_SHIFT(submitBlk, sizeof(SSubmitBlk));
+ int32_t dataLen = 0;
+
+ void* blkSchema = POINTER_SHIFT(blkHead, sizeof(SSubmitBlk));
int32_t schemaLen = 0;
if (createTb) {
@@ -135,7 +133,7 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
}
SEncoder encoder = {0};
- tEncoderInit(&encoder, blockData, schemaLen);
+ tEncoderInit(&encoder, blkSchema, schemaLen);
code = tEncodeSVCreateTbReq(&encoder, &createTbReq);
tEncoderClear(&encoder);
tdDestroySVCreateTbReq(&createTbReq);
@@ -148,7 +146,7 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
}
blkHead->schemaLen = htonl(schemaLen);
- STSRow* rowData = POINTER_SHIFT(blockData, schemaLen);
+ STSRow* rowData = POINTER_SHIFT(blkSchema, schemaLen);
for (int32_t j = 0; j < rows; j++) {
SRowBuilder rb = {0};
@@ -168,14 +166,12 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
}
int32_t rowLen = TD_ROW_LEN(rowData);
rowData = POINTER_SHIFT(rowData, rowLen);
- blkHead->dataLen += rowLen;
+ dataLen += rowLen;
}
- int32_t dataLen = blkHead->dataLen;
blkHead->dataLen = htonl(dataLen);
ret->length += sizeof(SSubmitBlk) + schemaLen + dataLen;
- blkHead = POINTER_SHIFT(blkHead, schemaLen + dataLen);
- /*submitBlk = blkHead;*/
+ blkHead = POINTER_SHIFT(blkHead, sizeof(SSubmitBlk) + schemaLen + dataLen);
}
ret->length = htonl(ret->length);
diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c
index ce73246e51..19d7c2b03d 100644
--- a/source/dnode/vnode/src/tsdb/tsdbRead.c
+++ b/source/dnode/vnode/src/tsdb/tsdbRead.c
@@ -1066,11 +1066,11 @@ static int32_t getFileIdFromKey(TSKEY key, int32_t daysPerFile, int32_t precisio
}
int64_t fid = (int64_t)(key / (daysPerFile * tsTickPerMin[precision])); // set the starting fileId
- if (fid < 0L && llabs(fid) > INT32_MAX) { // data value overflow for INT32
+ if (fid < 0LL && llabs(fid) > INT32_MAX) { // data value overflow for INT32
fid = INT32_MIN;
}
- if (fid > 0L && fid > INT32_MAX) {
+ if (fid > 0LL && fid > INT32_MAX) {
fid = INT32_MAX;
}
diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c
index 2333a93ce0..32d183ca0a 100644
--- a/source/dnode/vnode/src/vnd/vnodeQuery.c
+++ b/source/dnode/vnode/src/vnd/vnodeQuery.c
@@ -124,6 +124,115 @@ _exit:
return TSDB_CODE_SUCCESS;
}
+int vnodeGetTableCfg(SVnode *pVnode, SRpcMsg *pMsg) {
+ STableCfgReq cfgReq = {0};
+ STableCfgRsp cfgRsp = {0};
+ SMetaReader mer1 = {0};
+ SMetaReader mer2 = {0};
+ char tableFName[TSDB_TABLE_FNAME_LEN];
+ SRpcMsg rpcMsg;
+ int32_t code = 0;
+ int32_t rspLen = 0;
+ void *pRsp = NULL;
+ SSchemaWrapper schema = {0};
+ SSchemaWrapper schemaTag = {0};
+
+ // decode req
+ if (tDeserializeSTableCfgReq(pMsg->pCont, pMsg->contLen, &cfgReq) != 0) {
+ code = TSDB_CODE_INVALID_MSG;
+ goto _exit;
+ }
+
+ strcpy(cfgRsp.tbName, cfgReq.tbName);
+ memcpy(cfgRsp.dbFName, cfgReq.dbFName, sizeof(cfgRsp.dbFName));
+
+ sprintf(tableFName, "%s.%s", cfgReq.dbFName, cfgReq.tbName);
+ code = vnodeValidateTableHash(pVnode, tableFName);
+ if (code) {
+ goto _exit;
+ }
+
+ // query meta
+ metaReaderInit(&mer1, pVnode->pMeta, 0);
+
+ if (metaGetTableEntryByName(&mer1, cfgReq.tbName) < 0) {
+ code = terrno;
+ goto _exit;
+ }
+
+ cfgRsp.tableType = mer1.me.type;
+
+ if (mer1.me.type == TSDB_SUPER_TABLE) {
+ code = TSDB_CODE_VND_HASH_MISMATCH;
+ goto _exit;
+ } else if (mer1.me.type == TSDB_CHILD_TABLE) {
+ metaReaderInit(&mer2, pVnode->pMeta, 0);
+ if (metaGetTableEntryByUid(&mer2, mer1.me.ctbEntry.suid) < 0) goto _exit;
+
+ strcpy(cfgRsp.stbName, mer2.me.name);
+ schema = mer2.me.stbEntry.schemaRow;
+ schemaTag = mer2.me.stbEntry.schemaTag;
+ cfgRsp.ttl = mer1.me.ctbEntry.ttlDays;
+ cfgRsp.commentLen = mer1.me.ctbEntry.commentLen;
+ if (mer1.me.ctbEntry.commentLen > 0) {
+ cfgRsp.pComment = strdup(mer1.me.ctbEntry.comment);
+ }
+ STag *pTag = (STag *)mer1.me.ctbEntry.pTags;
+ cfgRsp.tagsLen = pTag->len;
+ cfgRsp.pTags = taosMemoryMalloc(cfgRsp.tagsLen);
+ memcpy(cfgRsp.pTags, pTag, cfgRsp.tagsLen);
+ } else if (mer1.me.type == TSDB_NORMAL_TABLE) {
+ schema = mer1.me.ntbEntry.schemaRow;
+ cfgRsp.ttl = mer1.me.ntbEntry.ttlDays;
+ cfgRsp.commentLen = mer1.me.ntbEntry.commentLen;
+ if (mer1.me.ntbEntry.commentLen > 0) {
+ cfgRsp.pComment = strdup(mer1.me.ntbEntry.comment);
+ }
+ } else {
+ ASSERT(0);
+ }
+
+ cfgRsp.numOfTags = schemaTag.nCols;
+ cfgRsp.numOfColumns = schema.nCols;
+ cfgRsp.pSchemas = (SSchema *)taosMemoryMalloc(sizeof(SSchema) * (cfgRsp.numOfColumns + cfgRsp.numOfTags));
+
+ memcpy(cfgRsp.pSchemas, schema.pSchema, sizeof(SSchema) * schema.nCols);
+ if (schemaTag.nCols) {
+ memcpy(cfgRsp.pSchemas + schema.nCols, schemaTag.pSchema, sizeof(SSchema) * schemaTag.nCols);
+ }
+
+ // encode and send response
+ rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
+ if (rspLen < 0) {
+ code = TSDB_CODE_INVALID_MSG;
+ goto _exit;
+ }
+
+ pRsp = rpcMallocCont(rspLen);
+ if (pRsp == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+ tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp);
+
+_exit:
+ rpcMsg.info = pMsg->info;
+ rpcMsg.pCont = pRsp;
+ rpcMsg.contLen = rspLen;
+ rpcMsg.code = code;
+
+ if (code) {
+ qError("get table %s cfg failed cause of %s", cfgReq.tbName, tstrerror(code));
+ }
+
+ tmsgSendRsp(&rpcMsg);
+
+ tFreeSTableCfgRsp(&cfgRsp);
+ metaReaderClear(&mer2);
+ metaReaderClear(&mer1);
+ return TSDB_CODE_SUCCESS;
+}
+
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
pLoad->vgId = TD_VID(pVnode);
pLoad->syncState = syncGetMyRole(pVnode->sync);
@@ -157,4 +266,4 @@ tsdbReaderT tsdbQueryCacheLast(SVnode *pVnode, SQueryTableDataCond *pCond, STabl
return tsdbQueryCacheLastT(pVnode->pTsdb, pCond, groupList, qId, pMemRef);
#endif
return 0;
-}
\ No newline at end of file
+}
diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c
index b5a2da091f..e764aba48e 100644
--- a/source/dnode/vnode/src/vnd/vnodeSvr.c
+++ b/source/dnode/vnode/src/vnd/vnodeSvr.c
@@ -255,6 +255,8 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) {
return qWorkerProcessHbMsg(pVnode, pVnode->pQuery, pMsg, 0);
case TDMT_VND_TABLE_META:
return vnodeGetTableMeta(pVnode, pMsg);
+ case TDMT_VND_TABLE_CFG:
+ return vnodeGetTableCfg(pVnode, pMsg);
case TDMT_VND_CONSUME:
return tqProcessPollReq(pVnode->pTq, pMsg, pInfo->workerId);
case TDMT_STREAM_TASK_RUN:
diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h
index 7c90c3538c..98a03aa39b 100644
--- a/source/libs/catalog/inc/catalogInt.h
+++ b/source/libs/catalog/inc/catalogInt.h
@@ -71,11 +71,18 @@ typedef enum {
CTG_TASK_GET_TB_META,
CTG_TASK_GET_TB_HASH,
CTG_TASK_GET_TB_INDEX,
+ CTG_TASK_GET_TB_CFG,
CTG_TASK_GET_INDEX,
CTG_TASK_GET_UDF,
CTG_TASK_GET_USER,
} CTG_TASK_TYPE;
+typedef enum {
+ CTG_TASK_LAUNCHED = 1,
+ CTG_TASK_DONE,
+} CTG_TASK_STATUS;
+
+
typedef struct SCtgDebug {
bool lockEnable;
bool cacheEnable;
@@ -102,6 +109,12 @@ typedef struct SCtgTbIndexCtx {
SName* pName;
} SCtgTbIndexCtx;
+typedef struct SCtgTbCfgCtx {
+ SName* pName;
+ int32_t tbType;
+ SVgroupInfo* pVgInfo;
+} SCtgTbCfgCtx;
+
typedef struct SCtgDbVgCtx {
char dbFName[TSDB_DB_FNAME_LEN];
} SCtgDbVgCtx;
@@ -190,7 +203,9 @@ typedef struct SCtgJob {
SArray* pTasks;
int32_t taskDone;
SMetaData jobRes;
-
+ int32_t taskIdx;
+ SRWLatch taskLock;
+
uint64_t queryId;
SCatalog* pCtg;
SRequestConnInfo conn;
@@ -206,6 +221,7 @@ typedef struct SCtgJob {
int32_t userNum;
int32_t dbInfoNum;
int32_t tbIndexNum;
+ int32_t tbCfgNum;
} SCtgJob;
typedef struct SCtgMsgCtx {
@@ -215,24 +231,44 @@ typedef struct SCtgMsgCtx {
char* target;
} SCtgMsgCtx;
+typedef struct SCtgTask SCtgTask;
+typedef int32_t (*ctgSubTaskCbFp)(SCtgTask*);
+
+typedef struct SCtgSubRes {
+ CTG_TASK_TYPE type;
+ int32_t code;
+ void* res;
+ ctgSubTaskCbFp fp;
+} SCtgSubRes;
+
typedef struct SCtgTask {
- CTG_TASK_TYPE type;
- int32_t taskId;
- SCtgJob* pJob;
- void* taskCtx;
- SCtgMsgCtx msgCtx;
- int32_t code;
- void* res;
+ CTG_TASK_TYPE type;
+ int32_t taskId;
+ SCtgJob* pJob;
+ void* taskCtx;
+ SCtgMsgCtx msgCtx;
+ int32_t code;
+ void* res;
+ CTG_TASK_STATUS status;
+ SRWLatch lock;
+ SArray* pParents;
+ SCtgSubRes subRes;
} SCtgTask;
+typedef int32_t (*ctgInitTaskFp)(SCtgJob*, int32_t, void*);
typedef int32_t (*ctgLanchTaskFp)(SCtgTask*);
typedef int32_t (*ctgHandleTaskMsgRspFp)(SCtgTask*, int32_t, const SDataBuf *, int32_t);
typedef int32_t (*ctgDumpTaskResFp)(SCtgTask*);
+typedef int32_t (*ctgCloneTaskResFp)(SCtgTask*, void**);
+typedef int32_t (*ctgCompTaskFp)(SCtgTask*, void*, bool*);
typedef struct SCtgAsyncFps {
- ctgLanchTaskFp launchFp;
+ ctgInitTaskFp initFp;
+ ctgLanchTaskFp launchFp;
ctgHandleTaskMsgRspFp handleRspFp;
- ctgDumpTaskResFp dumpResFp;
+ ctgDumpTaskResFp dumpResFp;
+ ctgCompTaskFp compFp;
+ ctgCloneTaskResFp cloneFp;
} SCtgAsyncFps;
typedef struct SCtgApiStat {
@@ -520,6 +556,8 @@ int32_t ctgDropTbIndexEnqueue(SCatalog* pCtg, SName* pName, bool syncOp);
int32_t ctgOpDropTbIndex(SCtgCacheOperation *operation);
int32_t ctgOpUpdateTbIndex(SCtgCacheOperation *operation);
int32_t ctgOpClearCache(SCtgCacheOperation *operation);
+int32_t ctgReadTbTypeFromCache(SCatalog* pCtg, char* dbFName, char *tableName, int32_t *tbType);
+int32_t ctgGetTbHashVgroupFromCache(SCatalog *pCtg, const SName *pTableName, SVgroupInfo **pVgroup);
@@ -535,10 +573,14 @@ int32_t ctgGetUserDbAuthFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const
int32_t ctgGetTbMetaFromMnodeImpl(SCatalog* pCtg, SRequestConnInfo *pConn, char *dbFName, char* tbName, STableMetaOutput* out, SCtgTask* pTask);
int32_t ctgGetTbMetaFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableMetaOutput* out, SCtgTask* pTask);
int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SVgroupInfo *vgroupInfo, STableMetaOutput* out, SCtgTask* pTask);
+int32_t ctgGetTableCfgFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SVgroupInfo *vgroupInfo, STableCfg **out, SCtgTask* pTask);
+int32_t ctgGetTableCfgFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg **out, SCtgTask* pTask);
int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint64_t reqId, const SCatalogReq* pReq, catalogCallback fp, void* param, int32_t* taskNum);
int32_t ctgLaunchJob(SCtgJob *pJob);
int32_t ctgMakeAsyncRes(SCtgJob *pJob);
+int32_t ctgLaunchSubTask(SCtgTask *pTask, CTG_TASK_TYPE type, ctgSubTaskCbFp fp, void* param);
+int32_t ctgGetTbCfgCb(SCtgTask *pTask);
int32_t ctgCloneVgInfo(SDBVgInfo *src, SDBVgInfo **dst);
int32_t ctgCloneMetaOutput(STableMetaOutput *output, STableMetaOutput **pOutput);
@@ -559,6 +601,7 @@ char * ctgTaskTypeStr(CTG_TASK_TYPE type);
int32_t ctgUpdateSendTargetInfo(SMsgSendInfo *pMsgSendInfo, int32_t msgType, SCtgTask* pTask);
int32_t ctgCloneTableIndex(SArray* pIndex, SArray** pRes);
void ctgFreeSTableIndex(void *info);
+void ctgClearSubTaskRes(SCtgSubRes *pRes);
extern SCatalogMgmt gCtgMgmt;
diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c
index ce2456d8c3..44730cd3b5 100644
--- a/source/libs/catalog/src/catalog.c
+++ b/source/libs/catalog/src/catalog.c
@@ -22,36 +22,6 @@
SCatalogMgmt gCtgMgmt = {0};
-int32_t ctgRemoveTbMetaFromCache(SCatalog* pCtg, SName* pTableName, bool syncReq) {
- int32_t code = 0;
- STableMeta* tblMeta = NULL;
- SCtgTbMetaCtx tbCtx = {0};
- tbCtx.flag = CTG_FLAG_UNKNOWN_STB;
- tbCtx.pName = pTableName;
-
- CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &tbCtx, &tblMeta));
-
- if (NULL == tblMeta) {
- ctgDebug("table already not in cache, db:%s, tblName:%s", pTableName->dbname, pTableName->tname);
- return TSDB_CODE_SUCCESS;
- }
-
- char dbFName[TSDB_DB_FNAME_LEN];
- tNameGetFullDbName(pTableName, dbFName);
-
- if (TSDB_SUPER_TABLE == tblMeta->tableType) {
- CTG_ERR_JRET(ctgDropStbMetaEnqueue(pCtg, dbFName, tbCtx.tbInfo.dbId, pTableName->tname, tblMeta->suid, syncReq));
- } else {
- CTG_ERR_JRET(ctgDropTbMetaEnqueue(pCtg, dbFName, tbCtx.tbInfo.dbId, pTableName->tname, syncReq));
- }
-
-_return:
-
- taosMemoryFreeClear(tblMeta);
-
- CTG_RET(code);
-}
-
int32_t ctgGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* dbFName, SCtgDBCache** dbCache, SDBVgInfo **pInfo) {
int32_t code = 0;
@@ -212,29 +182,6 @@ _return:
CTG_RET(code);
}
-int32_t ctgGetTbMetaFromCache(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
- if (CTG_IS_SYS_DBNAME(ctx->pName->dbname)) {
- CTG_FLAG_SET_SYS_DB(ctx->flag);
- }
-
- CTG_ERR_RET(ctgReadTbMetaFromCache(pCtg, ctx, pTableMeta));
-
- if (*pTableMeta) {
- if (CTG_FLAG_MATCH_STB(ctx->flag, (*pTableMeta)->tableType) &&
- ((!CTG_FLAG_IS_FORCE_UPDATE(ctx->flag)) || (CTG_FLAG_IS_SYS_DB(ctx->flag)))) {
- return TSDB_CODE_SUCCESS;
- }
-
- taosMemoryFreeClear(*pTableMeta);
- }
-
- if (CTG_FLAG_IS_UNKNOWN_STB(ctx->flag)) {
- CTG_FLAG_SET_STB(ctx->flag, ctx->tbInfo.tbType);
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
int32_t code = 0;
STableMetaOutput *output = NULL;
@@ -381,6 +328,23 @@ _return:
return TSDB_CODE_SUCCESS;
}
+int32_t ctgGetTbType(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, int32_t *tbType) {
+ char dbFName[TSDB_DB_FNAME_LEN];
+ tNameGetFullDbName(pTableName, dbFName);
+ CTG_ERR_RET(ctgReadTbTypeFromCache(pCtg, dbFName, pTableName->tname, tbType));
+ if (*tbType > 0) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ STableMeta* pMeta = NULL;
+ CTG_ERR_RET(catalogGetTableMeta(pCtg, pConn, pTableName, &pMeta));
+
+ *tbType = pMeta->tableType;
+ taosMemoryFree(pMeta);
+
+ return TSDB_CODE_SUCCESS;
+}
+
int32_t ctgGetTbIndex(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, SArray** pRes) {
CTG_ERR_RET(ctgReadTbIndexFromCache(pCtg, pTableName, pRes));
if (*pRes) {
@@ -419,6 +383,20 @@ _return:
CTG_RET(code);
}
+int32_t ctgGetTbCfg(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, STableCfg** pCfg) {
+ int32_t tbType = 0;
+ CTG_ERR_RET(ctgGetTbType(pCtg, pConn, pTableName, &tbType));
+
+ if (TSDB_SUPER_TABLE == tbType) {
+ CTG_ERR_RET(ctgGetTableCfgFromMnode(pCtg, pConn, pTableName, pCfg, NULL));
+ } else {
+ SVgroupInfo vgroupInfo = {0};
+ CTG_ERR_RET(catalogGetTableHashVgroup(pCtg, pConn, pTableName, &vgroupInfo));
+ CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, pCfg, NULL));
+ }
+
+ CTG_RET(TSDB_CODE_SUCCESS);
+}
int32_t ctgGetTbDistVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, SArray** pVgList) {
STableMeta *tbMeta = NULL;
@@ -1211,6 +1189,23 @@ _return:
CTG_API_LEAVE(code);
}
+int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg** pCfg) {
+ CTG_API_ENTER();
+
+ if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pCfg) {
+ CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
+ }
+
+ int32_t code = 0;
+ CTG_ERR_JRET(catalogRemoveTableMeta(pCtg, (SName*)pTableName));
+
+ CTG_ERR_JRET(ctgGetTbCfg(pCtg, pConn, (SName*)pTableName, pCfg));
+
+_return:
+
+ CTG_API_LEAVE(code);
+}
+
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* funcName, SFuncInfo* pInfo) {
CTG_API_ENTER();
diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c
index 6adadf5045..df986fd4d6 100644
--- a/source/libs/catalog/src/ctgAsync.c
+++ b/source/libs/catalog/src/ctgAsync.c
@@ -20,7 +20,8 @@
#include "systable.h"
#include "tref.h"
-int32_t ctgInitGetTbMetaTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
+int32_t ctgInitGetTbMetaTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ SName *name = (SName*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_TB_META;
@@ -44,12 +45,13 @@ int32_t ctgInitGetTbMetaTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetDbVgTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
+int32_t ctgInitGetDbVgTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ char *dbFName = (char*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_DB_VGROUP;
@@ -67,12 +69,13 @@ int32_t ctgInitGetDbVgTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetDbCfgTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
+int32_t ctgInitGetDbCfgTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ char *dbFName = (char*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_DB_CFG;
@@ -90,12 +93,13 @@ int32_t ctgInitGetDbCfgTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetDbInfoTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
+int32_t ctgInitGetDbInfoTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ char *dbFName = (char*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_DB_INFO;
@@ -113,13 +117,14 @@ int32_t ctgInitGetDbInfoTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetTbHashTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
+int32_t ctgInitGetTbHashTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ SName *name = (SName*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_TB_HASH;
@@ -143,12 +148,12 @@ int32_t ctgInitGetTbHashTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, tableName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tableName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetQnodeTask(SCtgJob *pJob, int32_t taskIdx) {
+int32_t ctgInitGetQnodeTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
SCtgTask task = {0};
task.type = CTG_TASK_GET_QNODE;
@@ -163,7 +168,8 @@ int32_t ctgInitGetQnodeTask(SCtgJob *pJob, int32_t taskIdx) {
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetIndexTask(SCtgJob *pJob, int32_t taskIdx, char *name) {
+int32_t ctgInitGetIndexTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ char *name = (char*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_INDEX;
@@ -181,12 +187,13 @@ int32_t ctgInitGetIndexTask(SCtgJob *pJob, int32_t taskIdx, char *name) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, indexFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, indexFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name);
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetUdfTask(SCtgJob *pJob, int32_t taskIdx, char *name) {
+int32_t ctgInitGetUdfTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ char *name = (char*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_UDF;
@@ -204,12 +211,13 @@ int32_t ctgInitGetUdfTask(SCtgJob *pJob, int32_t taskIdx, char *name) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, udfName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, udfName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name);
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetUserTask(SCtgJob *pJob, int32_t taskIdx, SUserAuthInfo *user) {
+int32_t ctgInitGetUserTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ SUserAuthInfo *user = (SUserAuthInfo*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_USER;
@@ -227,12 +235,13 @@ int32_t ctgInitGetUserTask(SCtgJob *pJob, int32_t taskIdx, SUserAuthInfo *user)
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, user:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), user->user);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, user:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), user->user);
return TSDB_CODE_SUCCESS;
}
-int32_t ctgInitGetTbIndexTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
+int32_t ctgInitGetTbIndexTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ SName *name = (SName*)param;
SCtgTask task = {0};
task.type = CTG_TASK_GET_TB_INDEX;
@@ -255,11 +264,41 @@ int32_t ctgInitGetTbIndexTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
return TSDB_CODE_SUCCESS;
}
+int32_t ctgInitGetTbCfgTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
+ SName *name = (SName*)param;
+ SCtgTask task = {0};
+
+ task.type = CTG_TASK_GET_TB_CFG;
+ task.taskId = taskIdx;
+ task.pJob = pJob;
+
+ task.taskCtx = taosMemoryCalloc(1, sizeof(SCtgTbCfgCtx));
+ if (NULL == task.taskCtx) {
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+
+ SCtgTbCfgCtx* ctx = task.taskCtx;
+ ctx->pName = taosMemoryMalloc(sizeof(*name));
+ if (NULL == ctx->pName) {
+ taosMemoryFree(task.taskCtx);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+
+ memcpy(ctx->pName, name, sizeof(*name));
+
+ taosArrayPush(pJob->pTasks, &task);
+
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
+
+ return TSDB_CODE_SUCCESS;
+}
+
+
int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, const SCatalogReq* pReq) {
SHashObj* pDb = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
@@ -296,6 +335,13 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
}
+ for (int32_t i = 0; i < pJob->tbCfgNum; ++i) {
+ SName* name = taosArrayGet(pReq->pTableCfg, i);
+ char dbFName[TSDB_DB_FNAME_LEN];
+ tNameGetFullDbName(name, dbFName);
+ taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
+ }
+
char* dbFName = taosHashIterate(pDb, NULL);
while (dbFName) {
ctgDropDbVgroupEnqueue(pCtg, dbFName, true);
@@ -304,39 +350,31 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con
taosHashCleanup(pDb);
- int32_t tbNum = pJob->tbMetaNum + pJob->tbHashNum;
- if (tbNum > 0) {
- if (tbNum > pJob->tbMetaNum && tbNum > pJob->tbHashNum) {
- SHashObj* pTb = taosHashInit(tbNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
- for (int32_t i = 0; i < pJob->tbMetaNum; ++i) {
- SName* name = taosArrayGet(pReq->pTableMeta, i);
- taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
- }
-
- for (int32_t i = 0; i < pJob->tbHashNum; ++i) {
- SName* name = taosArrayGet(pReq->pTableHash, i);
- taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
- }
-
- SName* name = taosHashIterate(pTb, NULL);
- while (name) {
- catalogRemoveTableMeta(pCtg, name);
- name = taosHashIterate(pTb, name);
- }
-
- taosHashCleanup(pTb);
- } else {
- for (int32_t i = 0; i < pJob->tbMetaNum; ++i) {
- SName* name = taosArrayGet(pReq->pTableMeta, i);
- catalogRemoveTableMeta(pCtg, name);
- }
-
- for (int32_t i = 0; i < pJob->tbHashNum; ++i) {
- SName* name = taosArrayGet(pReq->pTableHash, i);
- catalogRemoveTableMeta(pCtg, name);
- }
- }
+ // REFRESH TABLE META
+ SHashObj* pTb = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
+ for (int32_t i = 0; i < pJob->tbMetaNum; ++i) {
+ SName* name = taosArrayGet(pReq->pTableMeta, i);
+ taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
}
+
+ for (int32_t i = 0; i < pJob->tbHashNum; ++i) {
+ SName* name = taosArrayGet(pReq->pTableHash, i);
+ taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
+ }
+
+ for (int32_t i = 0; i < pJob->tbCfgNum; ++i) {
+ SName* name = taosArrayGet(pReq->pTableCfg, i);
+ taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
+ }
+
+ SName* name = taosHashIterate(pTb, NULL);
+ while (name) {
+ catalogRemoveTableMeta(pCtg, name);
+ name = taosHashIterate(pTb, name);
+ }
+
+ taosHashCleanup(pTb);
+
for (int32_t i = 0; i < pJob->tbIndexNum; ++i) {
SName* name = taosArrayGet(pReq->pTableIndex, i);
@@ -346,6 +384,20 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con
return TSDB_CODE_SUCCESS;
}
+int32_t ctgInitTask(SCtgJob *pJob, CTG_TASK_TYPE type, void* param, int32_t *taskId) {
+ int32_t tid = atomic_fetch_add_32(&pJob->taskIdx, 1);
+
+ CTG_LOCK(CTG_WRITE, &pJob->taskLock);
+ CTG_ERR_RET((*gCtgAsyncFps[type].initFp)(pJob, tid, param));
+ CTG_UNLOCK(CTG_WRITE, &pJob->taskLock);
+
+ if (taskId) {
+ *taskId = tid;
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint64_t reqId, const SCatalogReq* pReq, catalogCallback fp, void* param, int32_t* taskNum) {
int32_t code = 0;
int32_t tbMetaNum = (int32_t)taosArrayGetSize(pReq->pTableMeta);
@@ -358,8 +410,9 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint6
int32_t userNum = (int32_t)taosArrayGetSize(pReq->pUser);
int32_t dbInfoNum = (int32_t)taosArrayGetSize(pReq->pDbInfo);
int32_t tbIndexNum = (int32_t)taosArrayGetSize(pReq->pTableIndex);
+ int32_t tbCfgNum = (int32_t)taosArrayGetSize(pReq->pTableCfg);
- *taskNum = tbMetaNum + dbVgNum + udfNum + tbHashNum + qnodeNum + dbCfgNum + indexNum + userNum + dbInfoNum + tbIndexNum;
+ *taskNum = tbMetaNum + dbVgNum + udfNum + tbHashNum + qnodeNum + dbCfgNum + indexNum + userNum + dbInfoNum + tbIndexNum + tbCfgNum;
if (*taskNum <= 0) {
ctgDebug("Empty input for job, no need to retrieve meta, reqId:0x%" PRIx64, reqId);
return TSDB_CODE_SUCCESS;
@@ -389,6 +442,7 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint6
pJob->userNum = userNum;
pJob->dbInfoNum = dbInfoNum;
pJob->tbIndexNum = tbIndexNum;
+ pJob->tbCfgNum = tbCfgNum;
pJob->pTasks = taosArrayInit(*taskNum, sizeof(SCtgTask));
@@ -401,54 +455,58 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint6
CTG_ERR_JRET(ctgHandleForceUpdate(pCtg, *taskNum, pJob, pReq));
}
- int32_t taskIdx = 0;
for (int32_t i = 0; i < dbVgNum; ++i) {
char* dbFName = taosArrayGet(pReq->pDbVgroup, i);
- CTG_ERR_JRET(ctgInitGetDbVgTask(pJob, taskIdx++, dbFName));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_DB_VGROUP, dbFName, NULL));
}
for (int32_t i = 0; i < dbCfgNum; ++i) {
char* dbFName = taosArrayGet(pReq->pDbCfg, i);
- CTG_ERR_JRET(ctgInitGetDbCfgTask(pJob, taskIdx++, dbFName));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_DB_CFG, dbFName, NULL));
}
for (int32_t i = 0; i < dbInfoNum; ++i) {
char* dbFName = taosArrayGet(pReq->pDbInfo, i);
- CTG_ERR_JRET(ctgInitGetDbInfoTask(pJob, taskIdx++, dbFName));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_DB_INFO, dbFName, NULL));
}
for (int32_t i = 0; i < tbMetaNum; ++i) {
SName* name = taosArrayGet(pReq->pTableMeta, i);
- CTG_ERR_JRET(ctgInitGetTbMetaTask(pJob, taskIdx++, name));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_META, name, NULL));
}
for (int32_t i = 0; i < tbHashNum; ++i) {
SName* name = taosArrayGet(pReq->pTableHash, i);
- CTG_ERR_JRET(ctgInitGetTbHashTask(pJob, taskIdx++, name));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_HASH, name, NULL));
}
for (int32_t i = 0; i < tbIndexNum; ++i) {
SName* name = taosArrayGet(pReq->pTableIndex, i);
- CTG_ERR_JRET(ctgInitGetTbIndexTask(pJob, taskIdx++, name));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_INDEX, name, NULL));
+ }
+
+ for (int32_t i = 0; i < tbCfgNum; ++i) {
+ SName* name = taosArrayGet(pReq->pTableCfg, i);
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_CFG, name, NULL));
}
for (int32_t i = 0; i < indexNum; ++i) {
char* indexName = taosArrayGet(pReq->pIndex, i);
- CTG_ERR_JRET(ctgInitGetIndexTask(pJob, taskIdx++, indexName));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_INDEX, indexName, NULL));
}
for (int32_t i = 0; i < udfNum; ++i) {
char* udfName = taosArrayGet(pReq->pUdf, i);
- CTG_ERR_JRET(ctgInitGetUdfTask(pJob, taskIdx++, udfName));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_UDF, udfName, NULL));
}
for (int32_t i = 0; i < userNum; ++i) {
SUserAuthInfo* user = taosArrayGet(pReq->pUser, i);
- CTG_ERR_JRET(ctgInitGetUserTask(pJob, taskIdx++, user));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_USER, user, NULL));
}
if (qnodeNum) {
- CTG_ERR_JRET(ctgInitGetQnodeTask(pJob, taskIdx++));
+ CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_QNODE, NULL, NULL));
}
pJob->refId = taosAddRef(gCtgMgmt.jobPool, pJob);
@@ -528,6 +586,21 @@ int32_t ctgDumpTbIndexRes(SCtgTask* pTask) {
return TSDB_CODE_SUCCESS;
}
+int32_t ctgDumpTbCfgRes(SCtgTask* pTask) {
+ SCtgJob* pJob = pTask->pJob;
+ if (NULL == pJob->jobRes.pTableCfg) {
+ pJob->jobRes.pTableCfg = taosArrayInit(pJob->tbCfgNum, sizeof(SMetaRes));
+ if (NULL == pJob->jobRes.pTableCfg) {
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+ }
+
+ SMetaRes res = {.code = pTask->code, .pRes = pTask->res};
+ taosArrayPush(pJob->jobRes.pTableCfg, &res);
+
+ return TSDB_CODE_SUCCESS;
+}
+
int32_t ctgDumpIndexRes(SCtgTask* pTask) {
SCtgJob* pJob = pTask->pJob;
if (NULL == pJob->jobRes.pIndex) {
@@ -618,13 +691,48 @@ int32_t ctgDumpUserRes(SCtgTask* pTask) {
return TSDB_CODE_SUCCESS;
}
+int32_t ctgInvokeSubCb(SCtgTask *pTask) {
+ int32_t code = 0;
+
+ CTG_LOCK(CTG_WRITE, &pTask->lock);
+
+ int32_t parentNum = taosArrayGetSize(pTask->pParents);
+ for (int32_t i = 0; i < parentNum; ++i) {
+ SCtgTask* pParent = taosArrayGetP(pTask->pParents, i);
+
+ pParent->subRes.code = pTask->code;
+ if (TSDB_CODE_SUCCESS == pTask->code) {
+ code = (*gCtgAsyncFps[pTask->type].cloneFp)(pTask, &pParent->subRes.res);
+ if (code) {
+ pParent->subRes.code = code;
+ }
+ }
+
+ CTG_ERR_JRET(pParent->subRes.fp(pParent));
+ }
+
+_return:
+
+ CTG_UNLOCK(CTG_WRITE, &pTask->lock);
+
+ CTG_RET(code);
+}
+
+
int32_t ctgHandleTaskEnd(SCtgTask* pTask, int32_t rspCode) {
SCtgJob* pJob = pTask->pJob;
int32_t code = 0;
+ if (CTG_TASK_DONE == pTask->status) {
+ return TSDB_CODE_SUCCESS;
+ }
+
qDebug("QID:0x%" PRIx64 " task %d end with res %s", pJob->queryId, pTask->taskId, tstrerror(rspCode));
pTask->code = rspCode;
+ pTask->status = CTG_TASK_DONE;
+
+ ctgInvokeSubCb(pTask);
int32_t taskDone = atomic_add_fetch_32(&pJob->taskDone, 1);
if (taskDone < taosArrayGetSize(pJob->pTasks)) {
@@ -636,7 +744,7 @@ int32_t ctgHandleTaskEnd(SCtgTask* pTask, int32_t rspCode) {
_return:
- qDebug("QID:0x%" PRIx64 " user callback with rsp %s", pJob->queryId, tstrerror(code));
+ qDebug("QID:0x%" PRIx64 " ctg call user callback with rsp %s", pJob->queryId, tstrerror(code));
(*pJob->userFp)(&pJob->jobRes, pJob->userParam, code);
@@ -802,11 +910,12 @@ int32_t ctgHandleGetDbVgRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pM
switch (reqType) {
case TDMT_MND_USE_DB: {
SUseDbOutput* pOut = (SUseDbOutput*)pTask->msgCtx.out;
-
- CTG_ERR_JRET(ctgGenerateVgList(pCtg, pOut->dbVgroup->vgHash, (SArray**)&pTask->res));
+ SDBVgInfo* pDb = NULL;
- CTG_ERR_JRET(ctgUpdateVgroupEnqueue(pCtg, ctx->dbFName, pOut->dbId, pOut->dbVgroup, false));
- pOut->dbVgroup = NULL;
+ CTG_ERR_JRET(ctgGenerateVgList(pCtg, pOut->dbVgroup->vgHash, (SArray**)&pTask->res));
+
+ CTG_ERR_JRET(cloneDbVgInfo(pOut->dbVgroup, &pDb));
+ CTG_ERR_JRET(ctgUpdateVgroupEnqueue(pCtg, ctx->dbFName, pOut->dbId, pDb, false));
break;
}
@@ -874,6 +983,7 @@ int32_t ctgHandleGetTbIndexRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf
CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pTask->pJob->pCtg, (STableIndex**)&pTask->msgCtx.out, false));
_return:
+
if (TSDB_CODE_MND_DB_INDEX_NOT_EXIST == code) {
code = TSDB_CODE_SUCCESS;
}
@@ -882,6 +992,18 @@ _return:
CTG_RET(code);
}
+int32_t ctgHandleGetTbCfgRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
+ int32_t code = 0;
+ CTG_ERR_JRET(ctgProcessRspMsg(&pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target));
+
+ TSWAP(pTask->res, pTask->msgCtx.out);
+
+_return:
+
+ ctgHandleTaskEnd(pTask, code);
+
+ CTG_RET(code);
+}
int32_t ctgHandleGetDbCfgRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
int32_t code = 0;
@@ -1138,6 +1260,48 @@ int32_t ctgLaunchGetTbIndexTask(SCtgTask *pTask) {
return TSDB_CODE_SUCCESS;
}
+int32_t ctgLaunchGetTbCfgTask(SCtgTask *pTask) {
+ int32_t code = 0;
+ SCatalog* pCtg = pTask->pJob->pCtg;
+ SRequestConnInfo* pConn = &pTask->pJob->conn;
+ SCtgTbCfgCtx* pCtx = (SCtgTbCfgCtx*)pTask->taskCtx;
+ SArray* pRes = NULL;
+ char dbFName[TSDB_DB_FNAME_LEN];
+ tNameGetFullDbName(pCtx->pName, dbFName);
+
+ if (pCtx->tbType <= 0) {
+ CTG_ERR_JRET(ctgReadTbTypeFromCache(pCtg, dbFName, pCtx->pName->tname, &pCtx->tbType));
+ if (pCtx->tbType <= 0) {
+ CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_TB_META, ctgGetTbCfgCb, pCtx->pName));
+ return TSDB_CODE_SUCCESS;
+ }
+ }
+
+ if (TSDB_SUPER_TABLE == pCtx->tbType) {
+ CTG_ERR_JRET(ctgGetTableCfgFromMnode(pCtg, pConn, pCtx->pName, NULL, pTask));
+ } else {
+ if (NULL == pCtx->pVgInfo) {
+ CTG_ERR_JRET(ctgGetTbHashVgroupFromCache(pCtg, pCtx->pName, &pCtx->pVgInfo));
+ if (NULL == pCtx->pVgInfo) {
+ CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_DB_VGROUP, ctgGetTbCfgCb, dbFName));
+ return TSDB_CODE_SUCCESS;
+ }
+ }
+
+ CTG_ERR_JRET(ctgGetTableCfgFromVnode(pCtg, pConn, pCtx->pName, pCtx->pVgInfo, NULL, pTask));
+ }
+
+ return TSDB_CODE_SUCCESS;
+
+_return:
+
+ if (CTG_TASK_LAUNCHED == pTask->status) {
+ ctgHandleTaskEnd(pTask, code);
+ }
+
+ CTG_RET(code);
+}
+
int32_t ctgLaunchGetQnodeTask(SCtgTask *pTask) {
SCatalog* pCtg = pTask->pJob->pCtg;
@@ -1244,17 +1408,70 @@ int32_t ctgRelaunchGetTbMetaTask(SCtgTask *pTask) {
return TSDB_CODE_SUCCESS;
}
+int32_t ctgGetTbCfgCb(SCtgTask *pTask) {
+ int32_t code = 0;
+
+ CTG_ERR_JRET(pTask->subRes.code);
+
+ SCtgTbCfgCtx* pCtx = (SCtgTbCfgCtx*)pTask->taskCtx;
+ if (CTG_TASK_GET_TB_META == pTask->subRes.type) {
+ pCtx->tbType = ((STableMeta*)pTask->subRes.res)->tableType;
+ } else if (CTG_TASK_GET_DB_VGROUP == pTask->subRes.type) {
+ SDBVgInfo* pDb = (SDBVgInfo*)pTask->subRes.res;
+
+ pCtx->pVgInfo = taosMemoryCalloc(1, sizeof(SVgroupInfo));
+ CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pTask->pJob->pCtg, pDb, pCtx->pName, pCtx->pVgInfo));
+ }
+
+ CTG_RET(ctgLaunchGetTbCfgTask(pTask));
+
+_return:
+
+ CTG_RET(ctgHandleTaskEnd(pTask, pTask->subRes.code));
+}
+
+int32_t ctgCompDbVgTasks(SCtgTask* pTask, void* param, bool* equal) {
+ SCtgDbVgCtx* ctx = pTask->taskCtx;
+
+ *equal = (0 == strcmp(ctx->dbFName, param));
+
+ return TSDB_CODE_SUCCESS;
+}
+
+
+int32_t ctgCompTbMetaTasks(SCtgTask* pTask, void* param, bool* equal) {
+ SCtgTbMetaCtx* ctx = pTask->taskCtx;
+
+ *equal = tNameTbNameEqual(ctx->pName, (SName*)param);
+
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t ctgCloneTbMeta(SCtgTask* pTask, void** pRes) {
+ STableMeta* pMeta = (STableMeta*)pTask->res;
+
+ CTG_RET(cloneTableMeta(pMeta, (STableMeta**)pRes));
+}
+
+int32_t ctgCloneDbVg(SCtgTask* pTask, void** pRes) {
+ SUseDbOutput* pOut = (SUseDbOutput*)pTask->msgCtx.out;
+
+ CTG_RET(cloneDbVgInfo(pOut->dbVgroup, (SDBVgInfo**)pRes));
+}
+
+
SCtgAsyncFps gCtgAsyncFps[] = {
- {ctgLaunchGetQnodeTask, ctgHandleGetQnodeRsp, ctgDumpQnodeRes},
- {ctgLaunchGetDbVgTask, ctgHandleGetDbVgRsp, ctgDumpDbVgRes},
- {ctgLaunchGetDbCfgTask, ctgHandleGetDbCfgRsp, ctgDumpDbCfgRes},
- {ctgLaunchGetDbInfoTask, ctgHandleGetDbInfoRsp, ctgDumpDbInfoRes},
- {ctgLaunchGetTbMetaTask, ctgHandleGetTbMetaRsp, ctgDumpTbMetaRes},
- {ctgLaunchGetTbHashTask, ctgHandleGetTbHashRsp, ctgDumpTbHashRes},
- {ctgLaunchGetTbIndexTask, ctgHandleGetTbIndexRsp, ctgDumpTbIndexRes},
- {ctgLaunchGetIndexTask, ctgHandleGetIndexRsp, ctgDumpIndexRes},
- {ctgLaunchGetUdfTask, ctgHandleGetUdfRsp, ctgDumpUdfRes},
- {ctgLaunchGetUserTask, ctgHandleGetUserRsp, ctgDumpUserRes},
+ {ctgInitGetQnodeTask, ctgLaunchGetQnodeTask, ctgHandleGetQnodeRsp, ctgDumpQnodeRes, NULL, NULL},
+ {ctgInitGetDbVgTask, ctgLaunchGetDbVgTask, ctgHandleGetDbVgRsp, ctgDumpDbVgRes, ctgCompDbVgTasks, ctgCloneDbVg},
+ {ctgInitGetDbCfgTask, ctgLaunchGetDbCfgTask, ctgHandleGetDbCfgRsp, ctgDumpDbCfgRes, NULL, NULL},
+ {ctgInitGetDbInfoTask, ctgLaunchGetDbInfoTask, ctgHandleGetDbInfoRsp, ctgDumpDbInfoRes, NULL, NULL},
+ {ctgInitGetTbMetaTask, ctgLaunchGetTbMetaTask, ctgHandleGetTbMetaRsp, ctgDumpTbMetaRes, ctgCompTbMetaTasks, ctgCloneTbMeta},
+ {ctgInitGetTbHashTask, ctgLaunchGetTbHashTask, ctgHandleGetTbHashRsp, ctgDumpTbHashRes, NULL, NULL},
+ {ctgInitGetTbIndexTask, ctgLaunchGetTbIndexTask, ctgHandleGetTbIndexRsp, ctgDumpTbIndexRes, NULL, NULL},
+ {ctgInitGetTbCfgTask, ctgLaunchGetTbCfgTask, ctgHandleGetTbCfgRsp, ctgDumpTbCfgRes, NULL, NULL},
+ {ctgInitGetIndexTask, ctgLaunchGetIndexTask, ctgHandleGetIndexRsp, ctgDumpIndexRes, NULL, NULL},
+ {ctgInitGetUdfTask, ctgLaunchGetUdfTask, ctgHandleGetUdfRsp, ctgDumpUdfRes, NULL, NULL},
+ {ctgInitGetUserTask, ctgLaunchGetUserTask, ctgHandleGetUserRsp, ctgDumpUserRes, NULL, NULL},
};
int32_t ctgMakeAsyncRes(SCtgJob *pJob) {
@@ -1269,6 +1486,86 @@ int32_t ctgMakeAsyncRes(SCtgJob *pJob) {
return TSDB_CODE_SUCCESS;
}
+int32_t ctgSearchExistingTask(SCtgJob *pJob, CTG_TASK_TYPE type, void* param, int32_t* taskId) {
+ bool equal = false;
+ SCtgTask* pTask = NULL;
+ int32_t code = 0;
+
+ CTG_LOCK(CTG_READ, &pJob->taskLock);
+
+ int32_t taskNum = taosArrayGetSize(pJob->pTasks);
+ for (int32_t i = 0; i < taskNum; ++i) {
+ pTask = taosArrayGet(pJob->pTasks, i);
+ if (type != pTask->type) {
+ continue;
+ }
+
+ CTG_ERR_JRET((*gCtgAsyncFps[type].compFp)(pTask, param, &equal));
+ if (equal) {
+ break;
+ }
+ }
+
+_return:
+
+ CTG_UNLOCK(CTG_READ, &pJob->taskLock);
+ if (equal) {
+ *taskId = pTask->taskId;
+ }
+
+ CTG_RET(code);
+}
+
+int32_t ctgSetSubTaskCb(SCtgTask *pSub, SCtgTask *pTask) {
+ int32_t code = 0;
+
+ CTG_LOCK(CTG_WRITE, &pSub->lock);
+ if (CTG_TASK_DONE == pSub->status) {
+ pTask->subRes.code = pSub->code;
+ CTG_ERR_JRET((*gCtgAsyncFps[pTask->type].cloneFp)(pSub, &pTask->subRes.res));
+ CTG_ERR_JRET(pTask->subRes.fp(pTask));
+ } else {
+ if (NULL == pSub->pParents) {
+ pSub->pParents = taosArrayInit(4, POINTER_BYTES);
+ }
+
+ taosArrayPush(pSub->pParents, &pTask);
+ }
+
+_return:
+
+ CTG_UNLOCK(CTG_WRITE, &pSub->lock);
+
+ CTG_RET(code);
+}
+
+
+int32_t ctgLaunchSubTask(SCtgTask *pTask, CTG_TASK_TYPE type, ctgSubTaskCbFp fp, void* param) {
+ SCtgJob* pJob = pTask->pJob;
+ int32_t subTaskId = -1;
+ bool newTask = false;
+
+ ctgClearSubTaskRes(&pTask->subRes);
+ pTask->subRes.type = type;
+ pTask->subRes.fp = fp;
+
+ CTG_ERR_RET(ctgSearchExistingTask(pJob, type, param, &subTaskId));
+ if (subTaskId < 0) {
+ CTG_ERR_RET(ctgInitTask(pJob, type, param, &subTaskId));
+ newTask = true;
+ }
+
+ SCtgTask* pSub = taosArrayGet(pJob->pTasks, subTaskId);
+
+ CTG_ERR_RET(ctgSetSubTaskCb(pSub, pTask));
+
+ if (newTask) {
+ CTG_ERR_RET((*gCtgAsyncFps[pSub->type].launchFp)(pSub));
+ pSub->status = CTG_TASK_LAUNCHED;
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
int32_t ctgLaunchJob(SCtgJob *pJob) {
int32_t taskNum = taosArrayGetSize(pJob->pTasks);
@@ -1278,6 +1575,7 @@ int32_t ctgLaunchJob(SCtgJob *pJob) {
qDebug("QID:0x%" PRIx64 " ctg start to launch task %d", pJob->queryId, pTask->taskId);
CTG_ERR_RET((*gCtgAsyncFps[pTask->type].launchFp)(pTask));
+ pTask->status = CTG_TASK_LAUNCHED;
}
return TSDB_CODE_SUCCESS;
diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c
index 1de5ee3d7d..eeb627624b 100644
--- a/source/libs/catalog/src/ctgCache.c
+++ b/source/libs/catalog/src/ctgCache.c
@@ -326,6 +326,7 @@ _return:
int32_t ctgAcquireTbIndexFromCache(SCatalog* pCtg, char *dbFName, char* tbName, SCtgDBCache **pDb, SCtgTbCache** pTb) {
SCtgDBCache *dbCache = NULL;
+ SCtgTbCache* pCache = NULL;
ctgAcquireDBCache(pCtg, dbFName, &dbCache);
if (NULL == dbCache) {
ctgDebug("db %s not in cache", dbFName);
@@ -333,7 +334,7 @@ int32_t ctgAcquireTbIndexFromCache(SCatalog* pCtg, char *dbFName, char* tbName,
}
int32_t sz = 0;
- SCtgTbCache* pCache = taosHashAcquire(dbCache->tbCache, tbName, strlen(tbName));
+ pCache = taosHashAcquire(dbCache->tbCache, tbName, strlen(tbName));
if (NULL == pCache) {
ctgDebug("tb %s not in cache, dbFName:%s", tbName, dbFName);
goto _return;
@@ -540,10 +541,10 @@ int32_t ctgReadTbVerFromCache(SCatalog *pCtg, SName *pTableName, int32_t *sver,
}
-int32_t ctgReadTbTypeFromCache(SCatalog* pCtg, char* dbFName, char *tableName, int32_t *tbType) {
+int32_t ctgReadTbTypeFromCache(SCatalog* pCtg, char* dbFName, char *tbName, int32_t *tbType) {
SCtgDBCache *dbCache = NULL;
SCtgTbCache *tbCache = NULL;
- CTG_ERR_RET(ctgAcquireTbMetaFromCache(pCtg, dbFName, tableName, &dbCache, &tbCache));
+ CTG_ERR_RET(ctgAcquireTbMetaFromCache(pCtg, dbFName, tbName, &dbCache, &tbCache));
if (NULL == tbCache) {
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
return TSDB_CODE_SUCCESS;
@@ -552,7 +553,7 @@ int32_t ctgReadTbTypeFromCache(SCatalog* pCtg, char* dbFName, char *tableName, i
*tbType = tbCache->pMeta->tableType;
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
- ctgDebug("Got tb %s tbType %d from cache, dbFName:%s", tableName, *tbType, dbFName);
+ ctgDebug("Got tb %s tbType %d from cache, dbFName:%s", tbName, *tbType, dbFName);
return TSDB_CODE_SUCCESS;
}
@@ -1394,7 +1395,7 @@ int32_t ctgWriteTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNam
if (orig) {
origType = orig->tableType;
- if (origType == meta->tableType && orig->uid == meta->uid && orig->sversion >= meta->sversion && orig->tversion >= meta->tversion) {
+ if (origType == meta->tableType && orig->uid == meta->uid && (origType == TSDB_CHILD_TABLE || (orig->sversion >= meta->sversion && orig->tversion >= meta->tversion))) {
taosMemoryFree(meta);
ctgDebug("ignore table %s meta update", tbName);
return TSDB_CODE_SUCCESS;
@@ -2060,4 +2061,92 @@ int32_t ctgStartUpdateThread() {
}
+int32_t ctgGetTbMetaFromCache(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
+ if (CTG_IS_SYS_DBNAME(ctx->pName->dbname)) {
+ CTG_FLAG_SET_SYS_DB(ctx->flag);
+ }
+
+ CTG_ERR_RET(ctgReadTbMetaFromCache(pCtg, ctx, pTableMeta));
+
+ if (*pTableMeta) {
+ if (CTG_FLAG_MATCH_STB(ctx->flag, (*pTableMeta)->tableType) &&
+ ((!CTG_FLAG_IS_FORCE_UPDATE(ctx->flag)) || (CTG_FLAG_IS_SYS_DB(ctx->flag)))) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ taosMemoryFreeClear(*pTableMeta);
+ }
+
+ if (CTG_FLAG_IS_UNKNOWN_STB(ctx->flag)) {
+ CTG_FLAG_SET_STB(ctx->flag, ctx->tbInfo.tbType);
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+
+int32_t ctgRemoveTbMetaFromCache(SCatalog* pCtg, SName* pTableName, bool syncReq) {
+ int32_t code = 0;
+ STableMeta* tblMeta = NULL;
+ SCtgTbMetaCtx tbCtx = {0};
+ tbCtx.flag = CTG_FLAG_UNKNOWN_STB;
+ tbCtx.pName = pTableName;
+
+ CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &tbCtx, &tblMeta));
+
+ if (NULL == tblMeta) {
+ ctgDebug("table already not in cache, db:%s, tblName:%s", pTableName->dbname, pTableName->tname);
+ return TSDB_CODE_SUCCESS;
+ }
+
+ char dbFName[TSDB_DB_FNAME_LEN];
+ tNameGetFullDbName(pTableName, dbFName);
+
+ if (TSDB_SUPER_TABLE == tblMeta->tableType) {
+ CTG_ERR_JRET(ctgDropStbMetaEnqueue(pCtg, dbFName, tbCtx.tbInfo.dbId, pTableName->tname, tblMeta->suid, syncReq));
+ } else {
+ CTG_ERR_JRET(ctgDropTbMetaEnqueue(pCtg, dbFName, tbCtx.tbInfo.dbId, pTableName->tname, syncReq));
+ }
+
+_return:
+
+ taosMemoryFreeClear(tblMeta);
+
+ CTG_RET(code);
+}
+
+int32_t ctgGetTbHashVgroupFromCache(SCatalog *pCtg, const SName *pTableName, SVgroupInfo **pVgroup) {
+ if (CTG_IS_SYS_DBNAME(pTableName->dbname)) {
+ ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
+ CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
+ }
+
+ SCtgDBCache* dbCache = NULL;
+ int32_t code = 0;
+ char dbFName[TSDB_DB_FNAME_LEN] = {0};
+ tNameGetFullDbName(pTableName, dbFName);
+
+ CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
+
+ if (NULL == dbCache) {
+ *pVgroup = NULL;
+ return TSDB_CODE_SUCCESS;
+ }
+
+ *pVgroup = taosMemoryCalloc(1, sizeof(SVgroupInfo));
+ CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pTableName, *pVgroup));
+
+_return:
+
+ if (dbCache) {
+ ctgReleaseVgInfoToCache(pCtg, dbCache);
+ }
+
+ if (code) {
+ taosMemoryFreeClear(*pVgroup);
+ }
+
+ CTG_RET(code);
+}
+
diff --git a/source/libs/catalog/src/ctgRemote.c b/source/libs/catalog/src/ctgRemote.c
index fa1a262832..81dabffb4e 100644
--- a/source/libs/catalog/src/ctgRemote.c
+++ b/source/libs/catalog/src/ctgRemote.c
@@ -172,6 +172,39 @@ int32_t ctgProcessRspMsg(void* out, int32_t reqType, char* msg, int32_t msgSize,
qDebug("Got table meta from vnode, tbFName:%s", target);
break;
}
+ case TDMT_VND_TABLE_CFG: {
+ if (TSDB_CODE_SUCCESS != rspCode) {
+ qError("error rsp for table cfg from vnode, code:%s, tbFName:%s", tstrerror(rspCode), target);
+ CTG_ERR_RET(rspCode);
+ }
+
+ code = queryProcessMsgRsp[TMSG_INDEX(reqType)](out, msg, msgSize);
+ if (code) {
+ qError("Process vnode tb cfg rsp failed, code:%s, tbFName:%s", tstrerror(code), target);
+ CTG_ERR_RET(code);
+ }
+
+ qDebug("Got table cfg from vnode, tbFName:%s", target);
+ break;
+ }
+ case TDMT_MND_TABLE_CFG: {
+ if (TSDB_CODE_SUCCESS != rspCode) {
+ qError("error rsp for stb cfg from mnode, error:%s, tbFName:%s", tstrerror(rspCode), target);
+ CTG_ERR_RET(rspCode);
+ }
+
+ code = queryProcessMsgRsp[TMSG_INDEX(reqType)](out, msg, msgSize);
+ if (code) {
+ qError("Process mnode stb cfg rsp failed, error:%s, tbFName:%s", tstrerror(code), target);
+ CTG_ERR_RET(code);
+ }
+
+ qDebug("Got stb cfg from mnode, tbFName:%s", target);
+ break;
+ }
+ default:
+ qError("invalid req type %s", TMSG_INFO(reqType));
+ return TSDB_CODE_APP_ERROR;
}
return TSDB_CODE_SUCCESS;
@@ -550,7 +583,7 @@ int32_t ctgGetUserDbAuthFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const
int32_t ctgGetTbMetaFromMnodeImpl(SCatalog* pCtg, SRequestConnInfo *pConn, char *dbFName, char* tbName, STableMetaOutput* out, SCtgTask* pTask) {
- SBuildTableMetaInput bInput = {.vgId = 0, .dbFName = dbFName, .tbName = tbName};
+ SBuildTableInput bInput = {.vgId = 0, .dbFName = dbFName, .tbName = tbName};
char *msg = NULL;
SEpSet *pVnodeEpSet = NULL;
int32_t msgLen = 0;
@@ -606,9 +639,11 @@ int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SNa
sprintf(tbFName, "%s.%s", dbFName, pTableName->tname);
void*(*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
- ctgDebug("try to get table meta from vnode, vgId:%d, tbFName:%s", vgroupInfo->vgId, tbFName);
+ SEp* pEp = &vgroupInfo->epSet.eps[vgroupInfo->epSet.inUse];
+ ctgDebug("try to get table meta from vnode, vgId:%d, ep num:%d, ep %s:%d, tbFName:%s",
+ vgroupInfo->vgId, vgroupInfo->epSet.numOfEps, pEp->fqdn, pEp->port, tbFName);
- SBuildTableMetaInput bInput = {.vgId = vgroupInfo->vgId, .dbFName = dbFName, .tbName = (char *)tNameGetTableName(pTableName)};
+ SBuildTableInput bInput = {.vgId = vgroupInfo->vgId, .dbFName = dbFName, .tbName = (char *)tNameGetTableName(pTableName)};
char *msg = NULL;
int32_t msgLen = 0;
@@ -646,4 +681,89 @@ int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SNa
return TSDB_CODE_SUCCESS;
}
+int32_t ctgGetTableCfgFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SVgroupInfo *vgroupInfo, STableCfg **out, SCtgTask* pTask) {
+ char *msg = NULL;
+ int32_t msgLen = 0;
+ int32_t reqType = TDMT_VND_TABLE_CFG;
+ char tbFName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(pTableName, tbFName);
+ void*(*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
+ char dbFName[TSDB_DB_FNAME_LEN];
+ tNameGetFullDbName(pTableName, dbFName);
+ SBuildTableInput bInput = {.vgId = vgroupInfo->vgId, .dbFName = dbFName, .tbName = (char*)pTableName->tname};
+
+ SEp* pEp = &vgroupInfo->epSet.eps[vgroupInfo->epSet.inUse];
+ ctgDebug("try to get table cfg from vnode, vgId:%d, ep num:%d, ep %s:%d, tbFName:%s",
+ vgroupInfo->vgId, vgroupInfo->epSet.numOfEps, pEp->fqdn, pEp->port, tbFName);
+
+ int32_t code = queryBuildMsg[TMSG_INDEX(reqType)](&bInput, &msg, 0, &msgLen, mallocFp);
+ if (code) {
+ ctgError("Build get tb cfg msg failed, code:%s, tbFName:%s", tstrerror(code), tbFName);
+ CTG_ERR_RET(code);
+ }
+
+ if (pTask) {
+ CTG_ERR_RET(ctgUpdateMsgCtx(&pTask->msgCtx, reqType, NULL, (char*)tbFName));
+
+ SRequestConnInfo vConn = {.pTrans = pConn->pTrans,
+ .requestId = pConn->requestId,
+ .requestObjRefId = pConn->requestObjRefId,
+ .mgmtEps = vgroupInfo->epSet};
+ CTG_RET(ctgAsyncSendMsg(pCtg, &vConn, pTask, reqType, msg, msgLen));
+ }
+
+ SRpcMsg rpcMsg = {
+ .msgType = reqType,
+ .pCont = msg,
+ .contLen = msgLen,
+ };
+
+ SRpcMsg rpcRsp = {0};
+ rpcSendRecv(pConn->pTrans, &vgroupInfo->epSet, &rpcMsg, &rpcRsp);
+
+ CTG_ERR_RET(ctgProcessRspMsg(out, reqType, rpcRsp.pCont, rpcRsp.contLen, rpcRsp.code, (char*)tbFName));
+
+ return TSDB_CODE_SUCCESS;
+}
+
+
+int32_t ctgGetTableCfgFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg **out, SCtgTask* pTask) {
+ char *msg = NULL;
+ int32_t msgLen = 0;
+ int32_t reqType = TDMT_MND_TABLE_CFG;
+ char tbFName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(pTableName, tbFName);
+ void*(*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
+ char dbFName[TSDB_DB_FNAME_LEN];
+ tNameGetFullDbName(pTableName, dbFName);
+ SBuildTableInput bInput = {.vgId = 0, .dbFName = dbFName, .tbName = (char*)pTableName->tname};
+
+ ctgDebug("try to get table cfg from mnode, tbFName:%s", tbFName);
+
+ int32_t code = queryBuildMsg[TMSG_INDEX(reqType)](&bInput, &msg, 0, &msgLen, mallocFp);
+ if (code) {
+ ctgError("Build get tb cfg msg failed, code:%s, tbFName:%s", tstrerror(code), tbFName);
+ CTG_ERR_RET(code);
+ }
+
+ if (pTask) {
+ CTG_ERR_RET(ctgUpdateMsgCtx(&pTask->msgCtx, reqType, NULL, (char*)tbFName));
+
+ CTG_RET(ctgAsyncSendMsg(pCtg, pConn, pTask, reqType, msg, msgLen));
+ }
+
+ SRpcMsg rpcMsg = {
+ .msgType = reqType,
+ .pCont = msg,
+ .contLen = msgLen,
+ };
+
+ SRpcMsg rpcRsp = {0};
+ rpcSendRecv(pConn->pTrans, &pConn->mgmtEps, &rpcMsg, &rpcRsp);
+
+ CTG_ERR_RET(ctgProcessRspMsg(out, reqType, rpcRsp.pCont, rpcRsp.contLen, rpcRsp.code, (char*)tbFName));
+
+ return TSDB_CODE_SUCCESS;
+}
+
diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c
index 476eb371b0..8635457dfe 100644
--- a/source/libs/catalog/src/ctgUtil.c
+++ b/source/libs/catalog/src/ctgUtil.c
@@ -33,6 +33,10 @@ char *ctgTaskTypeStr(CTG_TASK_TYPE type) {
return "[get table meta]";
case CTG_TASK_GET_TB_HASH:
return "[get table hash]";
+ case CTG_TASK_GET_TB_INDEX:
+ return "[get table index]";
+ case CTG_TASK_GET_TB_CFG:
+ return "[get table cfg]";
case CTG_TASK_GET_INDEX:
return "[get index]";
case CTG_TASK_GET_UDF:
@@ -96,6 +100,9 @@ void ctgFreeSMetaData(SMetaData* pData) {
taosArrayDestroy(pData->pQnodeList);
pData->pQnodeList = NULL;
+
+ taosArrayDestroy(pData->pTableCfg);
+ pData->pTableCfg = NULL;
}
void ctgFreeSCtgUserAuth(SCtgUserAuth *userCache) {
@@ -280,6 +287,13 @@ void ctgFreeMsgCtx(SCtgMsgCtx* pCtx) {
}
break;
}
+ case TDMT_VND_TABLE_CFG:
+ case TDMT_MND_TABLE_CFG: {
+ STableCfgRsp* pOut = (STableCfgRsp*)pCtx->out;
+ tFreeSTableCfgRsp(pOut);
+ taosMemoryFreeClear(pCtx->out);
+ break;
+ }
case TDMT_MND_RETRIEVE_FUNC: {
SFuncInfo* pOut = (SFuncInfo*)pCtx->out;
taosMemoryFree(pOut->pCode);
@@ -328,14 +342,151 @@ void ctgResetTbMetaTask(SCtgTask* pTask) {
taosMemoryFreeClear(pTask->res);
}
-void ctgFreeTask(SCtgTask* pTask) {
- ctgFreeMsgCtx(&pTask->msgCtx);
-
+void ctgFreeTaskRes(CTG_TASK_TYPE type, void **pRes) {
+ switch (type) {
+ case CTG_TASK_GET_QNODE: {
+ taosArrayDestroy((SArray*)*pRes);
+ *pRes = NULL;
+ break;
+ }
+ case CTG_TASK_GET_TB_META: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_DB_VGROUP: {
+ taosArrayDestroy((SArray*)*pRes);
+ *pRes = NULL;
+ break;
+ }
+ case CTG_TASK_GET_DB_CFG: {
+ if (*pRes) {
+ SDbCfgInfo* pInfo = (SDbCfgInfo*)*pRes;
+ taosArrayDestroy(pInfo->pRetensions);
+ taosMemoryFreeClear(*pRes);
+ }
+ break;
+ }
+ case CTG_TASK_GET_DB_INFO: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_TB_HASH: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_TB_INDEX: {
+ taosArrayDestroyEx(*pRes, tFreeSTableIndexInfo);
+ *pRes = NULL;
+ break;
+ }
+ case CTG_TASK_GET_TB_CFG: {
+ if (*pRes) {
+ STableCfg* pInfo = (STableCfg*)*pRes;
+ tFreeSTableCfgRsp(pInfo);
+ taosMemoryFreeClear(*pRes);
+ }
+ break;
+ }
+ case CTG_TASK_GET_INDEX: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_UDF: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_USER: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ default:
+ qError("invalid task type %d", type);
+ break;
+ }
+}
+
+
+void ctgFreeSubTaskRes(CTG_TASK_TYPE type, void **pRes) {
+ switch (type) {
+ case CTG_TASK_GET_QNODE: {
+ taosArrayDestroy((SArray*)*pRes);
+ *pRes = NULL;
+ break;
+ }
+ case CTG_TASK_GET_TB_META: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_DB_VGROUP: {
+ if (*pRes) {
+ SDBVgInfo* pInfo = (SDBVgInfo*)*pRes;
+ taosHashCleanup(pInfo->vgHash);
+ taosMemoryFreeClear(*pRes);
+ }
+ break;
+ }
+ case CTG_TASK_GET_DB_CFG: {
+ if (*pRes) {
+ SDbCfgInfo* pInfo = (SDbCfgInfo*)*pRes;
+ taosArrayDestroy(pInfo->pRetensions);
+ taosMemoryFreeClear(*pRes);
+ }
+ break;
+ }
+ case CTG_TASK_GET_DB_INFO: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_TB_HASH: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_TB_INDEX: {
+ taosArrayDestroyEx(*pRes, tFreeSTableIndexInfo);
+ *pRes = NULL;
+ break;
+ }
+ case CTG_TASK_GET_TB_CFG: {
+ if (*pRes) {
+ STableCfg* pInfo = (STableCfg*)*pRes;
+ tFreeSTableCfgRsp(pInfo);
+ taosMemoryFreeClear(*pRes);
+ }
+ break;
+ }
+ case CTG_TASK_GET_INDEX: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_UDF: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ case CTG_TASK_GET_USER: {
+ taosMemoryFreeClear(*pRes);
+ break;
+ }
+ default:
+ qError("invalid task type %d", type);
+ break;
+ }
+}
+
+
+void ctgClearSubTaskRes(SCtgSubRes *pRes) {
+ pRes->code = 0;
+
+ if (NULL == pRes->res) {
+ return;
+ }
+
+ ctgFreeSubTaskRes(pRes->type, &pRes->res);
+}
+
+void ctgFreeTaskCtx(SCtgTask* pTask) {
switch (pTask->type) {
case CTG_TASK_GET_QNODE: {
- taosArrayDestroy((SArray*)pTask->res);
taosMemoryFreeClear(pTask->taskCtx);
- pTask->res = NULL;
break;
}
case CTG_TASK_GET_TB_META: {
@@ -346,56 +497,49 @@ void ctgFreeTask(SCtgTask* pTask) {
pTask->msgCtx.lastOut = NULL;
}
taosMemoryFreeClear(pTask->taskCtx);
- taosMemoryFreeClear(pTask->res);
break;
}
case CTG_TASK_GET_DB_VGROUP: {
- taosArrayDestroy((SArray*)pTask->res);
taosMemoryFreeClear(pTask->taskCtx);
- pTask->res = NULL;
break;
}
case CTG_TASK_GET_DB_CFG: {
taosMemoryFreeClear(pTask->taskCtx);
- if (pTask->res) {
- SDbCfgInfo* pInfo = (SDbCfgInfo*)pTask->res;
- taosArrayDestroy(pInfo->pRetensions);
- taosMemoryFreeClear(pTask->res);
- }
break;
}
case CTG_TASK_GET_DB_INFO: {
taosMemoryFreeClear(pTask->taskCtx);
- taosMemoryFreeClear(pTask->res);
break;
}
case CTG_TASK_GET_TB_HASH: {
SCtgTbHashCtx* taskCtx = (SCtgTbHashCtx*)pTask->taskCtx;
taosMemoryFreeClear(taskCtx->pName);
taosMemoryFreeClear(pTask->taskCtx);
- taosMemoryFreeClear(pTask->res);
break;
}
case CTG_TASK_GET_TB_INDEX: {
SCtgTbIndexCtx* taskCtx = (SCtgTbIndexCtx*)pTask->taskCtx;
taosMemoryFreeClear(taskCtx->pName);
taosMemoryFreeClear(pTask->taskCtx);
- taosArrayDestroyEx(pTask->res, tFreeSTableIndexInfo);
+ break;
+ }
+ case CTG_TASK_GET_TB_CFG: {
+ SCtgTbCfgCtx* taskCtx = (SCtgTbCfgCtx*)pTask->taskCtx;
+ taosMemoryFreeClear(taskCtx->pName);
+ taosMemoryFreeClear(taskCtx->pVgInfo);
+ taosMemoryFreeClear(pTask->taskCtx);
break;
}
case CTG_TASK_GET_INDEX: {
taosMemoryFreeClear(pTask->taskCtx);
- taosMemoryFreeClear(pTask->res);
break;
}
case CTG_TASK_GET_UDF: {
taosMemoryFreeClear(pTask->taskCtx);
- taosMemoryFreeClear(pTask->res);
break;
}
case CTG_TASK_GET_USER: {
taosMemoryFreeClear(pTask->taskCtx);
- taosMemoryFreeClear(pTask->res);
break;
}
default:
@@ -404,6 +548,16 @@ void ctgFreeTask(SCtgTask* pTask) {
}
}
+
+void ctgFreeTask(SCtgTask* pTask) {
+ ctgFreeMsgCtx(&pTask->msgCtx);
+ ctgFreeTaskRes(pTask->type, &pTask->res);
+ ctgFreeTaskCtx(pTask);
+
+ taosArrayDestroy(pTask->pParents);
+ ctgClearSubTaskRes(&pTask->subRes);
+}
+
void ctgFreeTasks(SArray* pArray) {
if (NULL == pArray) {
return;
diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c
index 6a3852abbc..778742b0fa 100644
--- a/source/libs/command/src/command.c
+++ b/source/libs/command/src/command.c
@@ -16,6 +16,7 @@
#include "command.h"
#include "catalog.h"
#include "tdatablock.h"
+#include "tglobal.h"
static int32_t getSchemaBytes(const SSchema* pSchema) {
switch (pSchema->type) {
@@ -123,11 +124,430 @@ static int32_t execDescribe(SNode* pStmt, SRetrieveTableRsp** pRsp) {
static int32_t execResetQueryCache() { return catalogClearCache(); }
-static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt) { return TSDB_CODE_FAILED; }
-static int32_t execShowCreateTable(SShowCreateTableStmt* pStmt) { return TSDB_CODE_FAILED; }
+static SSDataBlock* buildCreateDBResultDataBlock() {
+ SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
+ pBlock->info.numOfCols = SHOW_CREATE_DB_RESULT_COLS;
+ pBlock->info.hasVarCol = true;
-static int32_t execShowCreateSTable(SShowCreateTableStmt* pStmt) { return TSDB_CODE_FAILED; }
+ pBlock->pDataBlock = taosArrayInit(pBlock->info.numOfCols, sizeof(SColumnInfoData));
+
+ SColumnInfoData infoData = {0};
+ infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
+ infoData.info.bytes = SHOW_CREATE_DB_RESULT_FIELD1_LEN;
+
+ taosArrayPush(pBlock->pDataBlock, &infoData);
+
+ infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
+ infoData.info.bytes = SHOW_CREATE_DB_RESULT_FIELD2_LEN;
+ taosArrayPush(pBlock->pDataBlock, &infoData);
+
+ return pBlock;
+}
+
+int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
+ int64_t v = 0;
+ switch (unit) {
+ case 's':
+ v = val / 1000;
+ break;
+ case 'm':
+ v = val / tsTickPerMin[TSDB_TIME_PRECISION_MILLI];
+ break;
+ case 'h':
+ v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 60);
+ break;
+ case 'd':
+ v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60);
+ break;
+ case 'w':
+ v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60 * 7);
+ break;
+ default:
+ break;
+ }
+
+ return v;
+}
+
+char *buildRetension(SArray *pRetension) {
+ size_t size = taosArrayGetSize(pRetension);
+ if (size == 0) {
+ return NULL;
+ }
+
+ char *p1 = taosMemoryCalloc(1, 100);
+ SRetention *p = taosArrayGet(pRetension, 0);
+
+ int32_t len = 0;
+
+ int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
+ int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
+ len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
+
+ if (size > 1) {
+ len += sprintf(p1 + len, ",");
+ p = taosArrayGet(pRetension, 1);
+
+ v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
+ v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
+ len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
+ }
+
+ if (size > 2) {
+ len += sprintf(p1 + len, ",");
+ p = taosArrayGet(pRetension, 2);
+
+ v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
+ v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
+ len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
+ }
+
+ return p1;
+}
+
+
+static void setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char *dbFName, SDbCfgInfo* pCfg) {
+ blockDataEnsureCapacity(pBlock, 1);
+ pBlock->info.rows = 1;
+
+ SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
+ char buf1[SHOW_CREATE_DB_RESULT_FIELD1_LEN] = {0};
+ STR_TO_VARSTR(buf1, dbFName);
+ colDataAppend(pCol1, 0, buf1, false);
+
+ SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
+ char buf2[SHOW_CREATE_DB_RESULT_FIELD2_LEN] = {0};
+ int32_t len = 0;
+ char *prec = NULL;
+ switch (pCfg->precision) {
+ case TSDB_TIME_PRECISION_MILLI:
+ prec = TSDB_TIME_PRECISION_MILLI_STR;
+ break;
+ case TSDB_TIME_PRECISION_MICRO:
+ prec = TSDB_TIME_PRECISION_MICRO_STR;
+ break;
+ case TSDB_TIME_PRECISION_NANO:
+ prec = TSDB_TIME_PRECISION_NANO_STR;
+ break;
+ default:
+ prec = "none";
+ break;
+ }
+
+ char *retentions = buildRetension(pCfg->pRetensions);
+
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE DATABASE `%s` BUFFER %d CACHELAST %d COMP %d DURATION %dm "
+ "FSYNC %d MAXROWS %d MINROWS %d KEEP %dm,%dm,%dm PAGES %d PAGESIZE %d PRECISION '%s' REPLICA %d "
+ "STRICT %d WAL %d VGROUPS %d SINGLE_STABLE %d",
+ dbFName, pCfg->buffer, pCfg->cacheLastRow, pCfg->compression, pCfg->daysPerFile,
+ pCfg->fsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->daysToKeep0, pCfg->daysToKeep1, pCfg->daysToKeep2,
+ pCfg->pages, pCfg->pageSize, prec, pCfg->replications, pCfg->strict, pCfg->walLevel, pCfg->numOfVgroups,
+ 1 == pCfg->numOfStables);
+
+ if (retentions) {
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, " RETENTIONS %s", retentions);
+ taosMemoryFree(retentions);
+ }
+
+ (varDataLen(buf2)) = len;
+
+ colDataAppend(pCol2, 0, buf2, false);
+}
+
+
+static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt, SRetrieveTableRsp** pRsp) {
+ SSDataBlock* pBlock = buildCreateDBResultDataBlock();
+ setCreateDBResultIntoDataBlock(pBlock, pStmt->dbName, pStmt->pCfg);
+
+ size_t rspSize = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock);
+ *pRsp = taosMemoryCalloc(1, rspSize);
+ if (NULL == *pRsp) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
+ (*pRsp)->useconds = 0;
+ (*pRsp)->completed = 1;
+ (*pRsp)->precision = 0;
+ (*pRsp)->compressed = 0;
+ (*pRsp)->compLen = 0;
+ (*pRsp)->numOfRows = htonl(1);
+ (*pRsp)->numOfCols = htonl(SHOW_CREATE_DB_RESULT_COLS);
+
+ int32_t len = 0;
+ blockCompressEncode(pBlock, (*pRsp)->data, &len, SHOW_CREATE_DB_RESULT_COLS, false);
+ ASSERT(len == rspSize - sizeof(SRetrieveTableRsp));
+
+ blockDataDestroy(pBlock);
+ return TSDB_CODE_SUCCESS;
+}
+
+static SSDataBlock* buildCreateTbResultDataBlock() {
+ SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
+ pBlock->info.numOfCols = SHOW_CREATE_TB_RESULT_COLS;
+ pBlock->info.hasVarCol = true;
+
+ pBlock->pDataBlock = taosArrayInit(pBlock->info.numOfCols, sizeof(SColumnInfoData));
+
+ SColumnInfoData infoData = {0};
+ infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
+ infoData.info.bytes = SHOW_CREATE_TB_RESULT_FIELD1_LEN;
+
+ taosArrayPush(pBlock->pDataBlock, &infoData);
+
+ infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
+ infoData.info.bytes = SHOW_CREATE_TB_RESULT_FIELD2_LEN;
+ taosArrayPush(pBlock->pDataBlock, &infoData);
+
+ return pBlock;
+}
+
+void appendColumnFields(char* buf, int32_t* len, STableCfg* pCfg) {
+ for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
+ SSchema* pSchema = pCfg->pSchemas + i;
+ char type[32];
+ sprintf(type, "%s", tDataTypes[pSchema->type].name);
+ if (TSDB_DATA_TYPE_VARCHAR == pSchema->type) {
+ sprintf(type + strlen(type), "(%d)", (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
+ } else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
+ sprintf(type + strlen(type), "(%d)", (int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE)/TSDB_NCHAR_SIZE));
+ }
+
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
+ }
+}
+
+void appendTagFields(char* buf, int32_t* len, STableCfg* pCfg) {
+ for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
+ SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
+ char type[32];
+ sprintf(type, "%s", tDataTypes[pSchema->type].name);
+ if (TSDB_DATA_TYPE_VARCHAR == pSchema->type) {
+ sprintf(type + strlen(type), "(%d)", (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
+ } else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
+ sprintf(type + strlen(type), "(%d)", (int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE)/TSDB_NCHAR_SIZE));
+ }
+
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
+ }
+}
+
+
+void appendTagNameFields(char* buf, int32_t* len, STableCfg* pCfg) {
+ for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
+ SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s`%s`", ((i > 0) ? ", " : ""), pSchema->name);
+ }
+}
+
+
+int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
+ SArray *pTagVals = NULL;
+ STag *pTag = (STag*)pCfg->pTags;
+
+ if (pCfg->pTags && pTag->flags & TD_TAG_JSON) {
+ char *pJson = parseTagDatatoJson(pTag);
+ if (pJson) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s", pJson);
+ taosMemoryFree(pJson);
+ }
+
+ return TSDB_CODE_SUCCESS;
+ }
+
+ int32_t code = tTagToValArray((const STag *)pCfg->pTags, &pTagVals);
+ if (code) {
+ return code;
+ }
+
+ int16_t valueNum = taosArrayGetSize(pTagVals);
+ int32_t num = 0;
+ int32_t j = 0;
+ for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
+ SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
+ if (i > 0) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", ");
+ }
+
+ if (j >= valueNum) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "NULL");
+ continue;
+ }
+
+ STagVal *pTagVal = (STagVal *)taosArrayGet(pTagVals, j);
+ if (pSchema->colId > pTagVal->cid) {
+ qError("tag value and column mismatch, schemaId:%d, valId:%d", pSchema->colId, pTagVal->cid);
+ taosArrayDestroy(pTagVals);
+ return TSDB_CODE_APP_ERROR;
+ } else if (pSchema->colId == pTagVal->cid) {
+ char type = pTagVal->type;
+ int32_t tlen = 0;
+
+ if (IS_VAR_DATA_TYPE(type)) {
+ dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, type, pTagVal->pData, pTagVal->nData, &tlen);
+ } else {
+ dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, type, &pTagVal->i64, tDataTypes[type].bytes, &tlen);
+ }
+ *len += tlen;
+ j++;
+ } else {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "NULL");
+ }
+
+
+ /*
+ if (type == TSDB_DATA_TYPE_BINARY) {
+ if (pTagVal->nData > 0) {
+ if (num) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", ");
+ }
+
+ memcpy(buf + VARSTR_HEADER_SIZE + *len, pTagVal->pData, pTagVal->nData);
+ *len += pTagVal->nData;
+ }
+ } else if (type == TSDB_DATA_TYPE_NCHAR) {
+ if (pTagVal->nData > 0) {
+ if (num) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", ");
+ }
+ int32_t tlen = taosUcs4ToMbs((TdUcs4 *)pTagVal->pData, pTagVal->nData, buf + VARSTR_HEADER_SIZE + *len);
+ }
+ } else if (type == TSDB_DATA_TYPE_DOUBLE) {
+ double val = *(double *)(&pTagVal->i64);
+ int len = 0;
+ term = indexTermCreate(suid, ADD_VALUE, type, key, nKey, (const char *)&val, len);
+ } else if (type == TSDB_DATA_TYPE_BOOL) {
+ int val = *(int *)(&pTagVal->i64);
+ int len = 0;
+ term = indexTermCreate(suid, ADD_VALUE, TSDB_DATA_TYPE_INT, key, nKey, (const char *)&val, len);
+ }
+ */
+ }
+
+ taosArrayDestroy(pTagVals);
+
+ return TSDB_CODE_SUCCESS;
+}
+
+void appendTableOptions(char* buf, int32_t* len, STableCfg* pCfg) {
+ if (pCfg->commentLen > 0) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " COMMENT '%s'", pCfg->pComment);
+ } else if (0 == pCfg->commentLen) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " COMMENT ''");
+ }
+
+ if (pCfg->watermark1 > 0) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " WATERMARK %" PRId64 "a", pCfg->watermark1);
+ if (pCfg->watermark2 > 0) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", %" PRId64 "a", pCfg->watermark2);
+ }
+ }
+
+ if (pCfg->delay1 > 0) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " MAX_DELAY %" PRId64 "a", pCfg->delay1);
+ if (pCfg->delay2 > 0) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", %" PRId64 "a", pCfg->delay2);
+ }
+ }
+
+ int32_t funcNum = taosArrayGetSize(pCfg->pFuncs);
+ if (funcNum > 0) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " ROLLUP(");
+ for (int32_t i = 0; i < funcNum; ++i) {
+ char* pFunc = taosArrayGet(pCfg->pFuncs, i);
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s%s", ((i > 0) ? ", " : ""), pFunc);
+ }
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ")");
+ }
+
+ if (pCfg->ttl > 0) {
+ *len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " TTL %d", pCfg->ttl);
+ }
+}
+
+static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, char *tbName, STableCfg* pCfg) {
+ int32_t code = 0;
+ blockDataEnsureCapacity(pBlock, 1);
+ pBlock->info.rows = 1;
+
+ SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
+ char buf1[SHOW_CREATE_TB_RESULT_FIELD1_LEN] = {0};
+ STR_TO_VARSTR(buf1, tbName);
+ colDataAppend(pCol1, 0, buf1, false);
+
+ SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
+ char buf2[SHOW_CREATE_TB_RESULT_FIELD2_LEN] = {0};
+ int32_t len = 0;
+
+ if (TSDB_SUPER_TABLE == pCfg->tableType) {
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE STABLE `%s` (", tbName);
+ appendColumnFields(buf2, &len, pCfg);
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ") TAGS (");
+ appendTagFields(buf2, &len, pCfg);
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ")");
+ appendTableOptions(buf2, &len, pCfg);
+ } else if (TSDB_CHILD_TABLE == pCfg->tableType) {
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE TABLE `%s` USING `%s` (", tbName, pCfg->stbName);
+ appendTagNameFields(buf2, &len, pCfg);
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ") TAGS (");
+ code = appendTagValues(buf2, &len, pCfg);
+ if (code) {
+ return code;
+ }
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ")");
+ appendTableOptions(buf2, &len, pCfg);
+ } else {
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE TABLE `%s` (", tbName);
+ appendColumnFields(buf2, &len, pCfg);
+ len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ")");
+ }
+
+ varDataLen(buf2) = len;
+
+ colDataAppend(pCol2, 0, buf2, false);
+
+ return TSDB_CODE_SUCCESS;
+}
+
+
+static int32_t execShowCreateTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp) {
+ SSDataBlock* pBlock = buildCreateTbResultDataBlock();
+ int32_t code = setCreateTBResultIntoDataBlock(pBlock, pStmt->tableName, pStmt->pCfg);
+ if (code) {
+ return code;
+ }
+
+ size_t rspSize = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock);
+ *pRsp = taosMemoryCalloc(1, rspSize);
+ if (NULL == *pRsp) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
+ (*pRsp)->useconds = 0;
+ (*pRsp)->completed = 1;
+ (*pRsp)->precision = 0;
+ (*pRsp)->compressed = 0;
+ (*pRsp)->compLen = 0;
+ (*pRsp)->numOfRows = htonl(1);
+ (*pRsp)->numOfCols = htonl(SHOW_CREATE_TB_RESULT_COLS);
+
+ int32_t len = 0;
+ blockCompressEncode(pBlock, (*pRsp)->data, &len, SHOW_CREATE_TB_RESULT_COLS, false);
+ ASSERT(len == rspSize - sizeof(SRetrieveTableRsp));
+
+ blockDataDestroy(pBlock);
+ return TSDB_CODE_SUCCESS;
+}
+
+static int32_t execShowCreateSTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp) {
+ STableCfg* pCfg = (STableCfg*)pStmt->pCfg;
+ if (TSDB_SUPER_TABLE != pCfg->tableType) {
+ terrno = TSDB_CODE_TSC_NOT_STABLE_ERROR;
+ return terrno;
+ }
+
+ return execShowCreateTable(pStmt, pRsp);
+}
static int32_t execAlterLocal(SAlterLocalStmt* pStmt) { return TSDB_CODE_FAILED; }
@@ -140,11 +560,11 @@ int32_t qExecCommand(SNode* pStmt, SRetrieveTableRsp** pRsp) {
case QUERY_NODE_RESET_QUERY_CACHE_STMT:
return execResetQueryCache();
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
- return execShowCreateDatabase((SShowCreateDatabaseStmt*)pStmt);
+ return execShowCreateDatabase((SShowCreateDatabaseStmt*)pStmt, pRsp);
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
- return execShowCreateTable((SShowCreateTableStmt*)pStmt);
+ return execShowCreateTable((SShowCreateTableStmt*)pStmt, pRsp);
case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
- return execShowCreateSTable((SShowCreateTableStmt*)pStmt);
+ return execShowCreateSTable((SShowCreateTableStmt*)pStmt, pRsp);
case QUERY_NODE_ALTER_LOCAL_STMT:
return execAlterLocal((SAlterLocalStmt*)pStmt);
case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
diff --git a/source/libs/command/src/explain.c b/source/libs/command/src/explain.c
index ae0f669d65..2d55b06f06 100644
--- a/source/libs/command/src/explain.c
+++ b/source/libs/command/src/explain.c
@@ -184,8 +184,8 @@ int32_t qExplainGenerateResChildren(SPhysiNode *pNode, SExplainGroup *group, SNo
pPhysiChildren = indefPhysiNode->node.pChildren;
break;
}
- case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL: {
- SMergeIntervalPhysiNode *intPhysiNode = (SMergeIntervalPhysiNode *)pNode;
+ case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL: {
+ SMergeAlignedIntervalPhysiNode *intPhysiNode = (SMergeAlignedIntervalPhysiNode *)pNode;
pPhysiChildren = intPhysiNode->window.node.pChildren;
break;
}
@@ -841,8 +841,8 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
}
break;
}
- case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL: {
- SMergeIntervalPhysiNode *pIntNode = (SMergeIntervalPhysiNode *)pNode;
+ case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL: {
+ SMergeAlignedIntervalPhysiNode *pIntNode = (SMergeAlignedIntervalPhysiNode *)pNode;
EXPLAIN_ROW_NEW(level, EXPLAIN_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
if (pResNode->pExecInfo) {
diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h
index 0ceb2e8aa1..8fc4c262b7 100644
--- a/source/libs/executor/inc/executorimpl.h
+++ b/source/libs/executor/inc/executorimpl.h
@@ -234,6 +234,7 @@ typedef struct SColMatchInfo {
int32_t colId;
int32_t targetSlotId;
bool output;
+ bool reserved;
int32_t matchType; // determinate the source according to col id or slot id
} SColMatchInfo;
@@ -253,7 +254,6 @@ typedef struct STableScanInfo {
SFileBlockLoadRecorder readRecorder;
int64_t numOfRows;
-// int32_t prevGroupId; // previous table group id
SScanInfo scanInfo;
int32_t scanTimes;
SNode* pFilterNode; // filter info, which is push down by optimizer
@@ -732,6 +732,10 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SExprI
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
+ SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
+ SExecTaskInfo* pTaskInfo);
+
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild);
SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
diff --git a/source/libs/executor/inc/tsort.h b/source/libs/executor/inc/tsort.h
index 363f379ee4..35bdd4ee55 100644
--- a/source/libs/executor/inc/tsort.h
+++ b/source/libs/executor/inc/tsort.h
@@ -50,6 +50,7 @@ typedef struct SMsortComparParam {
void **pSources;
int32_t numOfSources;
SArray *orderInfo; // SArray
+ bool cmpGroupId;
} SMsortComparParam;
typedef struct SSortHandle SSortHandle;
@@ -99,6 +100,11 @@ int32_t tsortSetFetchRawDataFp(SSortHandle* pHandle, _sort_fetch_block_fn_t fetc
*/
int32_t tsortSetComparFp(SSortHandle* pHandle, _sort_merge_compar_fn_t fp);
+/**
+ *
+ */
+int32_t tsortSetCompareGroupId(SSortHandle* pHandle, bool compareGroupId);
+
/**
*
* @param pHandle
diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c
index 40e85613b2..cfad21eb08 100644
--- a/source/libs/executor/src/executil.c
+++ b/source/libs/executor/src/executil.c
@@ -396,7 +396,7 @@ SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNod
SColMatchInfo c = {0};
c.output = true;
- c.colId = pColNode->colId;
+ c.colId = pColNode->colId;
c.srcSlotId = pColNode->slotId;
c.matchType = type;
c.targetSlotId = pNode->slotId;
diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c
index 8d5c48f6cd..3a8a8653b5 100644
--- a/source/libs/executor/src/executorimpl.c
+++ b/source/libs/executor/src/executorimpl.c
@@ -609,7 +609,7 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc
}
int32_t startOffset = createNewColModel ? 0 : pResult->info.rows;
- colInfoDataEnsureCapacity(pResColData, startOffset, pResult->info.capacity);
+ ASSERT(pResult->info.capacity > 0);
colDataMergeCol(pResColData, startOffset, &pResult->info.capacity, &idata, dest.numOfRows);
numOfRows = dest.numOfRows;
@@ -649,7 +649,7 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc
}
int32_t startOffset = createNewColModel ? 0 : pResult->info.rows;
- colInfoDataEnsureCapacity(pResColData, startOffset, pResult->info.capacity);
+ ASSERT(pResult->info.capacity > 0);
colDataMergeCol(pResColData, startOffset, &pResult->info.capacity, &idata, dest.numOfRows);
numOfRows = dest.numOfRows;
@@ -1340,9 +1340,9 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR
}
if (rowRes != NULL) {
+ int32_t totalRows = pBlock->info.rows;
SSDataBlock* px = createOneDataBlock(pBlock, true);
- int32_t totalRows = pBlock->info.rows;
for (int32_t i = 0; i < pBlock->info.numOfCols; ++i) {
SColumnInfoData* pSrc = taosArrayGet(px->pDataBlock, i);
SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, i);
@@ -2765,7 +2765,7 @@ SOperatorInfo* createSortedMergeOperatorInfo(SOperatorInfo** downstream, int32_t
goto _error;
}
- size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
+ size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
code = doInitAggInfoSup(&pInfo->aggSup, pOperator->exprSupp.pCtx, num, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -2787,9 +2787,9 @@ SOperatorInfo* createSortedMergeOperatorInfo(SOperatorInfo** downstream, int32_t
pOperator->name = "SortedMerge";
// pOperator->operatorType = OP_SortedMerge;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ pOperator->blocking = true;
+ pOperator->status = OP_NOT_OPENED;
+ pOperator->info = pInfo;
pOperator->pTaskInfo = pTaskInfo;
pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doSortedMerge, NULL, NULL, destroySortedMergeOperatorInfo,
@@ -2844,8 +2844,8 @@ static int32_t doOpenAggregateOptr(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SAggOperatorInfo* pAggInfo = pOperator->info;
- SExprSupp* pSup = &pOperator->exprSupp;
- SOperatorInfo* downstream = pOperator->pDownstream[0];
+ SExprSupp* pSup = &pOperator->exprSupp;
+ SOperatorInfo* downstream = pOperator->pDownstream[0];
int64_t st = taosGetTimestampUs();
@@ -3736,9 +3736,9 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy
SExprInfo* pExprInfo = createExprInfo(pPhyNode->pFuncs, NULL, &numOfExpr);
if (pPhyNode->pExprs != NULL) {
- int32_t num = 0;
+ int32_t num = 0;
SExprInfo* pSExpr = createExprInfo(pPhyNode->pExprs, NULL, &num);
- int32_t code = initExprSupp(&pInfo->scalarSup, pSExpr, num);
+ int32_t code = initExprSupp(&pInfo->scalarSup, pSExpr, num);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -3761,14 +3761,14 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy
setFunctionResultOutput(pOperator, &pInfo->binfo, &pInfo->aggSup, MAIN_SCAN, numOfExpr);
- pInfo->binfo.pRes = pResBlock;
- pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pSup->pCtx, numOfExpr);
+ pInfo->binfo.pRes = pResBlock;
+ pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pSup->pCtx, numOfExpr);
pOperator->name = "IndefinitOperator";
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_PROJECT;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ pOperator->blocking = false;
+ pOperator->status = OP_NOT_OPENED;
+ pOperator->info = pInfo;
pOperator->exprSupp.numOfExprs = numOfExpr;
pOperator->pTaskInfo = pTaskInfo;
@@ -3838,10 +3838,10 @@ SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode*
pOperator->blocking = false;
pOperator->status = OP_NOT_OPENED;
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_FILL;
- pOperator->exprSupp.pExprInfo = pExprInfo;
- pOperator->exprSupp.numOfExprs = num;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
+ pOperator->exprSupp.pExprInfo = pExprInfo;
+ pOperator->exprSupp.numOfExprs = num;
+ pOperator->info = pInfo;
+ pOperator->pTaskInfo = pTaskInfo;
pOperator->fpSet =
createOperatorFpSet(operatorDummyOpenFn, doFill, NULL, NULL, destroySFillOperatorInfo, NULL, NULL, NULL);
@@ -4086,7 +4086,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
return createTagScanOperatorInfo(pHandle, pScanPhyNode, pTableListInfo, pTaskInfo);
} else if (QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN == type) {
- SBlockDistScanPhysiNode* pBlockNode = (SBlockDistScanPhysiNode*) pPhyNode;
+ SBlockDistScanPhysiNode* pBlockNode = (SBlockDistScanPhysiNode*)pPhyNode;
pTableListInfo->pTableList = taosArrayInit(4, sizeof(STableKeyInfo));
if (pBlockNode->tableType == TSDB_SUPER_TABLE) {
@@ -4189,6 +4189,21 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
pOptr =
createIntervalOperatorInfo(ops[0], pExprInfo, num, pResBlock, &interval, tsSlotId, &as, pTaskInfo, isStream);
+ } else if (QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == type) {
+ SMergeAlignedIntervalPhysiNode* pIntervalPhyNode = (SMergeAlignedIntervalPhysiNode*)pPhyNode;
+
+ SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &num);
+ SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
+
+ SInterval interval = {.interval = pIntervalPhyNode->interval,
+ .sliding = pIntervalPhyNode->sliding,
+ .intervalUnit = pIntervalPhyNode->intervalUnit,
+ .slidingUnit = pIntervalPhyNode->slidingUnit,
+ .offset = pIntervalPhyNode->offset,
+ .precision = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->node.resType.precision};
+
+ int32_t tsSlotId = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId;
+ pOptr = createMergeAlignedIntervalOperatorInfo(ops[0], pExprInfo, num, pResBlock, &interval, tsSlotId, pTaskInfo);
} else if (QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL == type) {
SMergeIntervalPhysiNode* pIntervalPhyNode = (SMergeIntervalPhysiNode*)pPhyNode;
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index 4f4fa33830..b363852725 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -112,12 +112,12 @@ static void getNextTimeWindow(SInterval* pInterval, STimeWindow* tw, int32_t ord
int mon = (int)(tm.tm_year * 12 + tm.tm_mon + interval * factor);
tm.tm_year = mon / 12;
tm.tm_mon = mon % 12;
- tw->skey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000L, TSDB_TIME_PRECISION_MILLI, pInterval->precision);
+ tw->skey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000LL, TSDB_TIME_PRECISION_MILLI, pInterval->precision);
mon = (int)(mon + interval);
tm.tm_year = mon / 12;
tm.tm_mon = mon % 12;
- tw->ekey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000L, TSDB_TIME_PRECISION_MILLI, pInterval->precision);
+ tw->ekey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000LL, TSDB_TIME_PRECISION_MILLI, pInterval->precision);
tw->ekey -= 1;
}
@@ -224,7 +224,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanInfo* pTableSca
pBlock->pBlockAgg = taosMemoryCalloc(numOfCols, POINTER_BYTES);
}
- for (int32_t i = 0; i < numOfCols; ++i) {
+ for (int32_t i = 0; i < taosArrayGetSize(pTableScanInfo->pColMatchInfo); ++i) {
SColMatchInfo* pColMatchInfo = taosArrayGet(pTableScanInfo->pColMatchInfo, i);
if (!pColMatchInfo->output) {
continue;
@@ -384,7 +384,14 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
continue;
}
- tsdbRetrieveDataBlockInfo(pTableScanInfo->dataReader, &pBlock->info);
+ blockDataCleanup(pBlock);
+
+ SDataBlockInfo binfo = pBlock->info;
+ tsdbRetrieveDataBlockInfo(pTableScanInfo->dataReader, &binfo);
+
+ binfo.capacity = binfo.rows;
+ blockDataEnsureCapacity(pBlock, binfo.rows);
+ pBlock->info = binfo;
uint32_t status = 0;
int32_t code = loadDataBlock(pOperator, pTableScanInfo, pBlock, &status);
@@ -530,7 +537,6 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
// taosSsleep(20);
SDataBlockDescNode* pDescNode = pTableScanNode->scan.node.pOutputDataBlockDesc;
-
int32_t numOfCols = 0;
SArray* pColList = extractColMatchInfo(pTableScanNode->scan.pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID);
@@ -903,7 +909,6 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
// NOTE: this operator does never check if current status is done or not
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SStreamBlockScanInfo* pInfo = pOperator->info;
- int32_t rows = 0;
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
if (pTaskInfo->code != TSDB_CODE_SUCCESS || pOperator->status == OP_EXEC_DONE) {
@@ -1023,9 +1028,6 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
pTaskInfo->code = terrno;
return NULL;
}
-
- rows = pBlockInfo->rows;
-
// currently only the tbname pseudo column
if (pInfo->numOfPseudoExpr > 0) {
addTagPseudoColumnData(&pInfo->readHandle, pInfo->pPseudoExpr, pInfo->numOfPseudoExpr, pInfo->pRes);
@@ -1033,14 +1035,16 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
doFilter(pInfo->pCondition, pInfo->pRes);
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
- break;
+ if (pBlockInfo->rows > 0) {
+ break;
+ }
}
// record the scan action.
pInfo->numOfExec++;
pOperator->resultInfo.totalRows += pBlockInfo->rows;
- if (rows == 0) {
+ if (pBlockInfo->rows == 0) {
pOperator->status = OP_EXEC_DONE;
} else if (pInfo->pUpdateInfo) {
pInfo->tsArrayIndex = 0;
@@ -1056,7 +1060,7 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
}
}
- return (rows == 0) ? NULL : pInfo->pRes;
+ return (pBlockInfo->rows == 0) ? NULL : pInfo->pRes;
}
}
diff --git a/source/libs/executor/src/sortoperator.c b/source/libs/executor/src/sortoperator.c
index 9d13276e6d..97be4645a8 100644
--- a/source/libs/executor/src/sortoperator.c
+++ b/source/libs/executor/src/sortoperator.c
@@ -22,10 +22,11 @@ static int32_t getExplainExecInfo(SOperatorInfo* pOptr, void** pOptrExplain
static void destroyOrderOperatorInfo(void* param, int32_t numOfOutput);
-SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode* pSortPhyNode, SExecTaskInfo* pTaskInfo) {
+SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode* pSortPhyNode,
+ SExecTaskInfo* pTaskInfo) {
SSortOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SSortOperatorInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- if (pInfo == NULL || pOperator == NULL/* || rowSize > 100 * 1024 * 1024*/) {
+ if (pInfo == NULL || pOperator == NULL /* || rowSize > 100 * 1024 * 1024*/) {
goto _error;
}
@@ -44,16 +45,17 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode*
initResultSizeInfo(pOperator, 1024);
- pInfo->pSortInfo = createSortInfo(pSortPhyNode->pSortKeys);;
- pInfo->pColMatchInfo = pColMatchColInfo;
- pOperator->name = "SortOperator";
+ pInfo->pSortInfo = createSortInfo(pSortPhyNode->pSortKeys);
+ ;
+ pInfo->pColMatchInfo = pColMatchColInfo;
+ pOperator->name = "SortOperator";
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_SORT;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->exprSupp.pExprInfo = pExprInfo;
- pOperator->exprSupp.numOfExprs = numOfCols;
- pOperator->pTaskInfo = pTaskInfo;
+ pOperator->blocking = true;
+ pOperator->status = OP_NOT_OPENED;
+ pOperator->info = pInfo;
+ pOperator->exprSupp.pExprInfo = pExprInfo;
+ pOperator->exprSupp.numOfExprs = numOfCols;
+ pOperator->pTaskInfo = pTaskInfo;
// lazy evaluation for the following parameter since the input datablock is not known till now.
// pInfo->bufPageSize = rowSize < 1024 ? 1024 * 2 : rowSize * 2;
@@ -146,8 +148,8 @@ void applyScalarFunction(SSDataBlock* pBlock, void* param) {
SOperatorInfo* pOperator = param;
SSortOperatorInfo* pSort = pOperator->info;
if (pOperator->exprSupp.pExprInfo != NULL) {
- int32_t code =
- projectApplyFunctions(pOperator->exprSupp.pExprInfo, pBlock, pBlock, pOperator->exprSupp.pCtx, pOperator->exprSupp.numOfExprs, NULL);
+ int32_t code = projectApplyFunctions(pOperator->exprSupp.pExprInfo, pBlock, pBlock, pOperator->exprSupp.pCtx,
+ pOperator->exprSupp.numOfExprs, NULL);
if (code != TSDB_CODE_SUCCESS) {
longjmp(pOperator->pTaskInfo->env, code);
}
@@ -165,8 +167,7 @@ int32_t doOpenSortOperator(SOperatorInfo* pOperator) {
pInfo->startTs = taosGetTimestampUs();
// pInfo->binfo.pRes is not equalled to the input datablock.
- pInfo->pSortHandle = tsortCreateSortHandle(pInfo->pSortInfo, SORT_SINGLESOURCE_SORT, -1, -1,
- NULL, pTaskInfo->id.str);
+ pInfo->pSortHandle = tsortCreateSortHandle(pInfo->pSortInfo, SORT_SINGLESOURCE_SORT, -1, -1, NULL, pTaskInfo->id.str);
tsortSetFetchRawDataFp(pInfo->pSortHandle, loadNextDataBlock, applyScalarFunction, pOperator);
@@ -232,6 +233,265 @@ int32_t getExplainExecInfo(SOperatorInfo* pOptr, void** pOptrExplain, uint32_t*
return TSDB_CODE_SUCCESS;
}
+//=====================================================================================
+// Group Sort Operator
+typedef enum EChildOperatorStatus { CHILD_OP_NEW_GROUP, CHILD_OP_SAME_GROUP, CHILD_OP_FINISHED } EChildOperatorStatus;
+
+typedef struct SGroupSortOperatorInfo {
+ SOptrBasicInfo binfo;
+ SArray* pSortInfo;
+ SArray* pColMatchInfo;
+
+ int64_t startTs;
+ uint64_t sortElapsed;
+ bool hasGroupId;
+ uint64_t currGroupId;
+
+ SSDataBlock* prefetchedSortInput;
+ SSortHandle* pCurrSortHandle;
+ EChildOperatorStatus childOpStatus;
+
+ SSortExecInfo sortExecInfo;
+} SGroupSortOperatorInfo;
+
+SSDataBlock* getGroupSortedBlockData(SSortHandle* pHandle, SSDataBlock* pDataBlock, int32_t capacity,
+ SArray* pColMatchInfo, SGroupSortOperatorInfo* pInfo) {
+ blockDataCleanup(pDataBlock);
+
+ SSDataBlock* p = tsortGetSortedDataBlock(pHandle);
+ if (p == NULL) {
+ return NULL;
+ }
+
+ blockDataEnsureCapacity(p, capacity);
+
+ while (1) {
+ STupleHandle* pTupleHandle = tsortNextTuple(pHandle);
+ if (pTupleHandle == NULL) {
+ break;
+ }
+
+ appendOneRowToDataBlock(p, pTupleHandle);
+ if (p->info.rows >= capacity) {
+ break;
+ }
+ }
+
+ if (p->info.rows > 0) {
+ int32_t numOfCols = taosArrayGetSize(pColMatchInfo);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColMatchInfo* pmInfo = taosArrayGet(pColMatchInfo, i);
+ ASSERT(pmInfo->matchType == COL_MATCH_FROM_SLOT_ID);
+
+ SColumnInfoData* pSrc = taosArrayGet(p->pDataBlock, pmInfo->srcSlotId);
+ SColumnInfoData* pDst = taosArrayGet(pDataBlock->pDataBlock, pmInfo->targetSlotId);
+ colDataAssign(pDst, pSrc, p->info.rows);
+ }
+
+ pDataBlock->info.rows = p->info.rows;
+ pDataBlock->info.capacity = p->info.rows;
+ }
+
+ blockDataDestroy(p);
+ return (pDataBlock->info.rows > 0) ? pDataBlock : NULL;
+}
+
+typedef struct SGroupSortSourceParam {
+ SOperatorInfo* childOpInfo;
+ SGroupSortOperatorInfo* grpSortOpInfo;
+} SGroupSortSourceParam;
+
+SSDataBlock* fetchNextGroupSortDataBlock(void* param) {
+ SGroupSortSourceParam* source = param;
+ SGroupSortOperatorInfo* grpSortOpInfo = source->grpSortOpInfo;
+ if (grpSortOpInfo->prefetchedSortInput) {
+ SSDataBlock* block = grpSortOpInfo->prefetchedSortInput;
+ grpSortOpInfo->prefetchedSortInput = NULL;
+ return block;
+ } else {
+ SOperatorInfo* childOp = source->childOpInfo;
+ SSDataBlock* block = childOp->fpSet.getNextFn(childOp);
+ if (block != NULL) {
+ if (block->info.groupId == grpSortOpInfo->currGroupId) {
+ grpSortOpInfo->childOpStatus = CHILD_OP_SAME_GROUP;
+ return block;
+ } else {
+ grpSortOpInfo->childOpStatus = CHILD_OP_NEW_GROUP;
+ grpSortOpInfo->prefetchedSortInput = block;
+ return NULL;
+ }
+ } else {
+ grpSortOpInfo->childOpStatus = CHILD_OP_FINISHED;
+ return NULL;
+ }
+ }
+}
+
+int32_t beginSortGroup(SOperatorInfo* pOperator) {
+ SGroupSortOperatorInfo* pInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ // pInfo->binfo.pRes is not equalled to the input datablock.
+ pInfo->pCurrSortHandle =
+ tsortCreateSortHandle(pInfo->pSortInfo, SORT_SINGLESOURCE_SORT, -1, -1, NULL, pTaskInfo->id.str);
+
+ tsortSetFetchRawDataFp(pInfo->pCurrSortHandle, fetchNextGroupSortDataBlock, applyScalarFunction, pOperator);
+
+ SSortSource* ps = taosMemoryCalloc(1, sizeof(SSortSource));
+ SGroupSortSourceParam* param = taosMemoryCalloc(1, sizeof(SGroupSortSourceParam));
+ param->childOpInfo = pOperator->pDownstream[0];
+ param->grpSortOpInfo = pInfo;
+ ps->param = param;
+ tsortAddSource(pInfo->pCurrSortHandle, ps);
+
+ int32_t code = tsortOpen(pInfo->pCurrSortHandle);
+ taosMemoryFreeClear(ps);
+
+ if (code != TSDB_CODE_SUCCESS) {
+ longjmp(pTaskInfo->env, terrno);
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t finishSortGroup(SOperatorInfo* pOperator) {
+ SGroupSortOperatorInfo* pInfo = pOperator->info;
+
+ SSortExecInfo sortExecInfo = tsortGetSortExecInfo(pInfo->pCurrSortHandle);
+ pInfo->sortExecInfo.sortMethod = sortExecInfo.sortMethod;
+ pInfo->sortExecInfo.sortBuffer = sortExecInfo.sortBuffer;
+ pInfo->sortExecInfo.loops += sortExecInfo.loops;
+ pInfo->sortExecInfo.readBytes += sortExecInfo.readBytes;
+ pInfo->sortExecInfo.writeBytes += sortExecInfo.writeBytes;
+ if (pInfo->pCurrSortHandle != NULL) {
+ tsortDestroySortHandle(pInfo->pCurrSortHandle);
+ }
+ pInfo->pCurrSortHandle = NULL;
+ return TSDB_CODE_SUCCESS;
+}
+
+SSDataBlock* doGroupSort(SOperatorInfo* pOperator) {
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
+
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SGroupSortOperatorInfo* pInfo = pOperator->info;
+
+ int32_t code = pOperator->fpSet._openFn(pOperator);
+ if (code != TSDB_CODE_SUCCESS) {
+ longjmp(pTaskInfo->env, code);
+ }
+
+ if (!pInfo->hasGroupId) {
+ pInfo->hasGroupId = true;
+
+ pInfo->prefetchedSortInput = pOperator->pDownstream[0]->fpSet.getNextFn(pOperator->pDownstream[0]);
+ pInfo->currGroupId = pInfo->prefetchedSortInput->info.groupId;
+ pInfo->childOpStatus = CHILD_OP_NEW_GROUP;
+ beginSortGroup(pOperator);
+ }
+
+ SSDataBlock* pBlock = NULL;
+ while (pInfo->pCurrSortHandle != NULL) {
+ // beginSortGroup would fetch all child blocks of pInfo->currGroupId;
+ ASSERT(pInfo->childOpStatus != CHILD_OP_SAME_GROUP);
+ pBlock = getGroupSortedBlockData(pInfo->pCurrSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity,
+ pInfo->pColMatchInfo, pInfo);
+ if (pBlock != NULL) {
+ pBlock->info.groupId = pInfo->currGroupId;
+ pOperator->resultInfo.totalRows += pBlock->info.rows;
+ return pBlock;
+ } else {
+ if (pInfo->childOpStatus == CHILD_OP_NEW_GROUP) {
+ finishSortGroup(pOperator);
+ pInfo->currGroupId = pInfo->prefetchedSortInput->info.groupId;
+ beginSortGroup(pOperator);
+ } else if (pInfo->childOpStatus == CHILD_OP_FINISHED) {
+ finishSortGroup(pOperator);
+ doSetOperatorCompleted(pOperator);
+ return NULL;
+ }
+ }
+ }
+ return NULL;
+}
+
+int32_t getGroupSortExplainExecInfo(SOperatorInfo* pOptr, void** pOptrExplain, uint32_t* len) {
+ SGroupSortOperatorInfo* pInfo = (SGroupSortOperatorInfo*)pOptr->info;
+ *pOptrExplain = &pInfo->sortExecInfo;
+ *len = sizeof(SSortExecInfo);
+ return TSDB_CODE_SUCCESS;
+}
+
+// TODO:
+SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode* pSortPhyNode,
+ SExecTaskInfo* pTaskInfo) {
+ SSortOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SSortOperatorInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ if (pInfo == NULL || pOperator == NULL /* || rowSize > 100 * 1024 * 1024*/) {
+ goto _error;
+ }
+
+ SDataBlockDescNode* pDescNode = pSortPhyNode->node.pOutputDataBlockDesc;
+
+ int32_t numOfCols = 0;
+ SSDataBlock* pResBlock = createResDataBlock(pDescNode);
+ SExprInfo* pExprInfo = createExprInfo(pSortPhyNode->pExprs, NULL, &numOfCols);
+
+ int32_t numOfOutputCols = 0;
+ SArray* pColMatchColInfo =
+ extractColMatchInfo(pSortPhyNode->pTargets, pDescNode, &numOfOutputCols, COL_MATCH_FROM_SLOT_ID);
+
+ pOperator->exprSupp.pCtx = createSqlFunctionCtx(pExprInfo, numOfCols, &pOperator->exprSupp.rowEntryInfoOffset);
+ pInfo->binfo.pRes = pResBlock;
+
+ initResultSizeInfo(pOperator, 1024);
+
+ pInfo->pSortInfo = createSortInfo(pSortPhyNode->pSortKeys);
+ ;
+ pInfo->pColMatchInfo = pColMatchColInfo;
+ pOperator->name = "GroupSortOperator";
+ // TODO
+ pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_SORT;
+ pOperator->blocking = true;
+ pOperator->status = OP_NOT_OPENED;
+ pOperator->info = pInfo;
+ pOperator->exprSupp.pExprInfo = pExprInfo;
+ pOperator->exprSupp.numOfExprs = numOfCols;
+ pOperator->pTaskInfo = pTaskInfo;
+
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doGroupSort, NULL, NULL, destroyOrderOperatorInfo, NULL,
+ NULL, getGroupSortExplainExecInfo);
+
+ int32_t code = appendDownstream(pOperator, &downstream, 1);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ return pOperator;
+
+_error:
+ pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
+ taosMemoryFree(pInfo);
+ taosMemoryFree(pOperator);
+ return NULL;
+}
+
+void destroyGroupSortOperatorInfo(void* param, int32_t numOfOutput) {
+ SGroupSortOperatorInfo* pInfo = (SGroupSortOperatorInfo*)param;
+ pInfo->binfo.pRes = blockDataDestroy(pInfo->binfo.pRes);
+
+ taosArrayDestroy(pInfo->pSortInfo);
+ taosArrayDestroy(pInfo->pColMatchInfo);
+}
+
+// TODO: sort group
+// TODO: msortCompare compare group id in multiway merge sort.
+// TODO: table merge scan, group first, then for each group, multiple readers
+
+//=====================================================================================
+// Multiway Sort Merge operator
typedef struct SMultiwaySortMergeOperatorInfo {
SOptrBasicInfo binfo;
@@ -259,11 +519,12 @@ int32_t doOpenMultiwaySortMergeOperator(SOperatorInfo* pOperator) {
int32_t numOfBufPage = pInfo->sortBufSize / pInfo->bufPageSize;
- pInfo->pSortHandle = tsortCreateSortHandle(pInfo->pSortInfo, SORT_MULTISOURCE_MERGE,
- pInfo->bufPageSize, numOfBufPage, pInfo->pInputBlock, pTaskInfo->id.str);
+ pInfo->pSortHandle = tsortCreateSortHandle(pInfo->pSortInfo, SORT_MULTISOURCE_MERGE, pInfo->bufPageSize, numOfBufPage,
+ pInfo->pInputBlock, pTaskInfo->id.str);
tsortSetFetchRawDataFp(pInfo->pSortHandle, loadNextDataBlock, NULL, NULL);
-
+ tsortSetCompareGroupId(pInfo->pSortHandle, true);
+
for (int32_t i = 0; i < pOperator->numOfDownstream; ++i) {
SSortSource* ps = taosMemoryCalloc(1, sizeof(SSortSource));
ps->param = pOperator->pDownstream[i];
@@ -286,7 +547,7 @@ int32_t doOpenMultiwaySortMergeOperator(SOperatorInfo* pOperator) {
SSDataBlock* getMultiwaySortedBlockData(SSortHandle* pHandle, SSDataBlock* pDataBlock, int32_t capacity,
SArray* pColMatchInfo, SOperatorInfo* pOperator) {
SMultiwaySortMergeOperatorInfo* pInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
blockDataCleanup(pDataBlock);
@@ -387,24 +648,23 @@ SOperatorInfo* createMultiwaySortMergeOperatorInfo(SOperatorInfo** downStreams,
goto _error;
}
-
initResultSizeInfo(pOperator, 1024);
- pInfo->binfo.pRes = pResBlock;
- pInfo->pSortInfo = pSortInfo;
+ pInfo->binfo.pRes = pResBlock;
+ pInfo->pSortInfo = pSortInfo;
pInfo->pColMatchInfo = pColMatchColInfo;
- pInfo->pInputBlock = pInputBlock;
- pOperator->name = "MultiwaySortMerge";
+ pInfo->pInputBlock = pInputBlock;
+ pOperator->name = "MultiwaySortMerge";
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ pOperator->blocking = false;
+ pOperator->status = OP_NOT_OPENED;
+ pOperator->info = pInfo;
pOperator->pTaskInfo = pTaskInfo;
- pInfo->bufPageSize = getProperSortPageSize(rowSize);
+ pInfo->bufPageSize = getProperSortPageSize(rowSize);
// one additional is reserved for merged result.
- pInfo->sortBufSize = pInfo->bufPageSize * (numStreams + 1);
+ pInfo->sortBufSize = pInfo->bufPageSize * (numStreams + 1);
pOperator->fpSet =
createOperatorFpSet(doOpenMultiwaySortMergeOperator, doMultiwaySortMerge, NULL, NULL,
@@ -421,4 +681,4 @@ _error:
taosMemoryFree(pInfo);
taosMemoryFree(pOperator);
return NULL;
-}
\ No newline at end of file
+}
diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c
index 63285daa3a..3ff45d7237 100644
--- a/source/libs/executor/src/timewindowoperator.c
+++ b/source/libs/executor/src/timewindowoperator.c
@@ -16,8 +16,8 @@
#include "function.h"
#include "functionMgt.h"
#include "tdatablock.h"
-#include "ttime.h"
#include "tfill.h"
+#include "ttime.h"
typedef enum SResultTsInterpType {
RESULT_ROW_START_INTERP = 1,
@@ -42,7 +42,7 @@ static void doCloseWindow(SResultRowInfo* pResultRowInfo, const SIntervalAggOper
// * merged during merge stage. In this case, we need the pTableQueryInfo->lastResRows to decide if there
// * is a previous result generated or not.
// */
-//static void setIntervalQueryRange(STableQueryInfo* pTableQueryInfo, TSKEY key, STimeWindow* pQRange) {
+// static void setIntervalQueryRange(STableQueryInfo* pTableQueryInfo, TSKEY key, STimeWindow* pQRange) {
// // do nothing
//}
@@ -314,18 +314,18 @@ static void getNextTimeWindow(SInterval* pInterval, int32_t precision, int32_t o
int mon = (int)(tm.tm_year * 12 + tm.tm_mon + interval * factor);
tm.tm_year = mon / 12;
tm.tm_mon = mon % 12;
- tw->skey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000L, TSDB_TIME_PRECISION_MILLI, precision);
+ tw->skey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000LL, TSDB_TIME_PRECISION_MILLI, precision);
mon = (int)(mon + interval);
tm.tm_year = mon / 12;
tm.tm_mon = mon % 12;
- tw->ekey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000L, TSDB_TIME_PRECISION_MILLI, precision);
+ tw->ekey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000LL, TSDB_TIME_PRECISION_MILLI, precision);
tw->ekey -= 1;
}
-void doTimeWindowInterpolation(SArray* pPrevValues, SArray* pDataBlock, TSKEY prevTs, int32_t prevRowIndex,
- TSKEY curTs, int32_t curRowIndex, TSKEY windowKey, int32_t type, SExprSupp* pSup) {
+void doTimeWindowInterpolation(SArray* pPrevValues, SArray* pDataBlock, TSKEY prevTs, int32_t prevRowIndex, TSKEY curTs,
+ int32_t curRowIndex, TSKEY windowKey, int32_t type, SExprSupp* pSup) {
SqlFunctionCtx* pCtx = pSup->pCtx;
int32_t index = 1;
@@ -405,8 +405,8 @@ static void setNotInterpoWindowKey(SqlFunctionCtx* pCtx, int32_t numOfOutput, in
}
}
-static bool setTimeWindowInterpolationStartTs(SIntervalAggOperatorInfo* pInfo, int32_t pos, SSDataBlock* pBlock, const TSKEY* tsCols,
- STimeWindow* win, SExprSupp* pSup) {
+static bool setTimeWindowInterpolationStartTs(SIntervalAggOperatorInfo* pInfo, int32_t pos, SSDataBlock* pBlock,
+ const TSKEY* tsCols, STimeWindow* win, SExprSupp* pSup) {
bool ascQuery = (pInfo->order == TSDB_ORDER_ASC);
TSKEY curTs = tsCols[pos];
@@ -434,9 +434,9 @@ static bool setTimeWindowInterpolationStartTs(SIntervalAggOperatorInfo* pInfo, i
return true;
}
-static bool setTimeWindowInterpolationEndTs(SIntervalAggOperatorInfo* pInfo, SExprSupp* pSup,
- int32_t endRowIndex, SArray* pDataBlock, const TSKEY* tsCols,
- TSKEY blockEkey, STimeWindow* win) {
+static bool setTimeWindowInterpolationEndTs(SIntervalAggOperatorInfo* pInfo, SExprSupp* pSup, int32_t endRowIndex,
+ SArray* pDataBlock, const TSKEY* tsCols, TSKEY blockEkey,
+ STimeWindow* win) {
int32_t order = pInfo->order;
TSKEY actualEndKey = tsCols[endRowIndex];
@@ -548,8 +548,8 @@ static void setResultRowInterpo(SResultRow* pResult, SResultTsInterpType type) {
}
}
-static void doWindowBorderInterpolation(SIntervalAggOperatorInfo* pInfo, SSDataBlock* pBlock, SResultRow* pResult, STimeWindow* win, int32_t startPos,
- int32_t forwardRows, SExprSupp* pSup) {
+static void doWindowBorderInterpolation(SIntervalAggOperatorInfo* pInfo, SSDataBlock* pBlock, SResultRow* pResult,
+ STimeWindow* win, int32_t startPos, int32_t forwardRows, SExprSupp* pSup) {
if (!pInfo->timeWindowInterpo) {
return;
}
@@ -628,7 +628,7 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num
SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo;
SIntervalAggOperatorInfo* pInfo = (SIntervalAggOperatorInfo*)pOperatorInfo->info;
- SExprSupp* pSup = &pOperatorInfo->exprSupp;
+ SExprSupp* pSup = &pOperatorInfo->exprSupp;
int32_t startPos = 0;
int32_t numOfOutput = pSup->numOfExprs;
@@ -655,9 +655,8 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num
}
STimeWindow w = pr->win;
- int32_t ret =
- setTimeWindowOutputBuf(pResultRowInfo, &w, (scanFlag == MAIN_SCAN), &pResult, groupId, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
+ int32_t ret = setTimeWindowOutputBuf(pResultRowInfo, &w, (scanFlag == MAIN_SCAN), &pResult, groupId, pSup->pCtx,
+ numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) {
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
@@ -672,8 +671,8 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num
setResultRowInterpo(pResult, RESULT_ROW_END_INTERP);
setNotInterpoWindowKey(pSup->pCtx, numOfExprs, RESULT_ROW_START_INTERP);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &w, &pInfo->twAggSup.timeWindowData, startPos, 0, tsCols,
- pBlock->info.rows, numOfExprs, pInfo->order);
+ doApplyFunctions(pTaskInfo, pSup->pCtx, &w, &pInfo->twAggSup.timeWindowData, startPos, 0, tsCols, pBlock->info.rows,
+ numOfExprs, pInfo->order);
if (isResultRowInterpolated(pResult, RESULT_ROW_END_INTERP)) {
closeResultRow(pr);
@@ -685,6 +684,7 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num
}
void printDataBlock(SSDataBlock* pBlock, const char* flag) {
+ if (pBlock == NULL) return;
SArray* blocks = taosArrayInit(1, sizeof(SSDataBlock));
taosArrayPush(blocks, pBlock);
blockDebugShowData(blocks, flag);
@@ -753,8 +753,7 @@ int64_t getReskey(void* data, int32_t index) {
return *(int64_t*)pos->key;
}
-static int32_t saveResult(int64_t ts, int32_t pageId, int32_t offset, uint64_t groupId,
- SArray* pUpdated) {
+static int32_t saveResult(int64_t ts, int32_t pageId, int32_t offset, uint64_t groupId, SArray* pUpdated) {
int32_t size = taosArrayGetSize(pUpdated);
int32_t index = binarySearch(pUpdated, size, ts, TSDB_ORDER_DESC, getReskey);
if (index == -1) {
@@ -806,7 +805,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
SIntervalAggOperatorInfo* pInfo = (SIntervalAggOperatorInfo*)pOperatorInfo->info;
SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo;
- SExprSupp* pSup = &pOperatorInfo->exprSupp;
+ SExprSupp* pSup = &pOperatorInfo->exprSupp;
int32_t startPos = 0;
int32_t numOfOutput = pSup->numOfExprs;
@@ -819,9 +818,8 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
STimeWindow win = getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval,
pInfo->interval.precision, &pInfo->win);
- int32_t ret =
- setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
+ int32_t ret = setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId,
+ pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
@@ -843,9 +841,8 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
doInterpUnclosedTimeWindow(pOperatorInfo, numOfOutput, pResultRowInfo, pBlock, scanFlag, tsCols, &pos);
// restore current time window
- ret =
- setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
+ ret = setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pSup->pCtx,
+ numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) {
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
@@ -870,8 +867,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
// null data, failed to allocate more memory buffer
int32_t code = setTimeWindowOutputBuf(pResultRowInfo, &nextWin, (scanFlag == MAIN_SCAN), &pResult, tableGroupId,
- pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset,
- &pInfo->aggSup, pTaskInfo);
+ pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
@@ -890,8 +886,8 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
doWindowBorderInterpolation(pInfo, pBlock, pResult, &nextWin, startPos, forwardRows, pSup);
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &nextWin, &pInfo->twAggSup.timeWindowData, startPos, forwardRows,
- tsCols, pBlock->info.rows, numOfOutput, pInfo->order);
+ doApplyFunctions(pTaskInfo, pSup->pCtx, &nextWin, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, tsCols,
+ pBlock->info.rows, numOfOutput, pInfo->order);
doCloseWindow(pResultRowInfo, pInfo, pResult);
}
@@ -1002,7 +998,7 @@ static bool compareVal(const char* v, const SStateKeys* pKey) {
static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorInfo* pInfo, SSDataBlock* pBlock) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
SColumnInfoData* pStateColInfoData = taosArrayGet(pBlock->pDataBlock, pInfo->stateCol.slotId);
int64_t gid = pBlock->info.groupId;
@@ -1050,9 +1046,8 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
STimeWindow window = pRowSup->win;
pRowSup->win.ekey = pRowSup->win.skey;
- int32_t ret =
- setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &window, masterScan, &pResult, gid, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
+ int32_t ret = setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &window, masterScan, &pResult, gid, pSup->pCtx,
+ numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
longjmp(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
}
@@ -1076,9 +1071,8 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
SResultRow* pResult = NULL;
pRowSup->win.ekey = tsList[pBlock->info.rows - 1];
- int32_t ret =
- setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &pRowSup->win, masterScan, &pResult, gid, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
+ int32_t ret = setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &pRowSup->win, masterScan, &pResult, gid,
+ pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
longjmp(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
}
@@ -1095,8 +1089,8 @@ static SSDataBlock* doStateWindowAgg(SOperatorInfo* pOperator) {
SStateWindowOperatorInfo* pInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SExprSupp* pSup = &pOperator->exprSupp;
SOptrBasicInfo* pBInfo = &pInfo->binfo;
@@ -1207,7 +1201,7 @@ static void setInverFunction(SqlFunctionCtx* pCtx, int32_t num, EStreamType type
}
}
-void doClearWindowImpl(SResultRowPosition* p1, SDiskbasedBuf* pResultBuf, SExprSupp *pSup, int32_t numOfOutput) {
+void doClearWindowImpl(SResultRowPosition* p1, SDiskbasedBuf* pResultBuf, SExprSupp* pSup, int32_t numOfOutput) {
SResultRow* pResult = getResultRowByPos(pResultBuf, p1);
SqlFunctionCtx* pCtx = pSup->pCtx;
for (int32_t i = 0; i < numOfOutput; ++i) {
@@ -1223,7 +1217,7 @@ void doClearWindowImpl(SResultRowPosition* p1, SDiskbasedBuf* pResultBuf, SExprS
}
}
-void doClearWindow(SAggSupporter* pAggSup, SExprSupp *pSup, char* pData, int16_t bytes, uint64_t groupId,
+void doClearWindow(SAggSupporter* pAggSup, SExprSupp* pSup, char* pData, int16_t bytes, uint64_t groupId,
int32_t numOfOutput) {
SET_RES_WINDOW_KEY(pAggSup->keyBuf, pData, bytes, groupId);
SResultRowPosition* p1 =
@@ -1259,9 +1253,9 @@ static int32_t getAllIntervalWindow(SHashObj* pHashMap, SArray* resWins) {
void* key = taosHashGetKey(pIte, &keyLen);
uint64_t groupId = *(uint64_t*)key;
ASSERT(keyLen == GET_RES_WINDOW_KEY_LEN(sizeof(TSKEY)));
- TSKEY ts = *(int64_t*)((char*)key + sizeof(uint64_t));
+ TSKEY ts = *(int64_t*)((char*)key + sizeof(uint64_t));
SResultRowPosition* pPos = (SResultRowPosition*)pIte;
- int32_t code = saveResult(ts, pPos->pageId, pPos->offset, groupId, resWins);
+ int32_t code = saveResult(ts, pPos->pageId, pPos->offset, groupId, resWins);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
@@ -1269,8 +1263,9 @@ static int32_t getAllIntervalWindow(SHashObj* pHashMap, SArray* resWins) {
return TSDB_CODE_SUCCESS;
}
-bool isCloseWindow(STimeWindow *pWin, STimeWindowAggSupp* pSup) {
- return pWin->ekey < pSup->maxTs - pSup->waterMark;
+bool isCloseWindow(STimeWindow* pWin, STimeWindowAggSupp* pSup) {
+ ASSERT(pSup->maxTs == INT64_MIN || pSup->maxTs > 0);
+ return pSup->maxTs != INT64_MIN && pWin->ekey < pSup->maxTs - pSup->waterMark;
}
static int32_t closeIntervalWindow(SHashObj* pHashMap, STimeWindowAggSupp* pSup, SInterval* pInterval,
@@ -1330,7 +1325,8 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
}
if (pBlock->info.type == STREAM_REPROCESS) {
- doClearWindows(&pInfo->aggSup, &pOperator->exprSupp, &pInfo->interval, 0, pOperator->exprSupp.numOfExprs, pBlock, NULL);
+ doClearWindows(&pInfo->aggSup, &pOperator->exprSupp, &pInfo->interval, 0, pOperator->exprSupp.numOfExprs, pBlock,
+ NULL);
qDebug("%s clear existed time window results for updates checked", GET_TASKID(pTaskInfo));
continue;
} else if (pBlock->info.type == STREAM_GET_ALL) {
@@ -1580,7 +1576,7 @@ _error:
// todo handle multiple tables cases.
static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperatorInfo* pInfo, SSDataBlock* pBlock) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, pInfo->tsSlotId);
@@ -1617,9 +1613,8 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperator
STimeWindow window = pRowSup->win;
pRowSup->win.ekey = pRowSup->win.skey;
- int32_t ret =
- setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &window, masterScan, &pResult, gid, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
+ int32_t ret = setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &window, masterScan, &pResult, gid, pSup->pCtx,
+ numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
longjmp(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
}
@@ -1637,9 +1632,8 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperator
SResultRow* pResult = NULL;
pRowSup->win.ekey = tsList[pBlock->info.rows - 1];
- int32_t ret =
- setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &pRowSup->win, masterScan, &pResult, gid, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
+ int32_t ret = setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &pRowSup->win, masterScan, &pResult, gid,
+ pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
longjmp(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
}
@@ -1656,7 +1650,7 @@ static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) {
SSessionAggOperatorInfo* pInfo = pOperator->info;
SOptrBasicInfo* pBInfo = &pInfo->binfo;
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
if (pOperator->status == OP_RES_TO_RETURN) {
doBuildResultDatablock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
@@ -1707,8 +1701,8 @@ static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) {
static void doKeepPrevRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex) {
int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- for(int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
// null data should not be kept since it can not be used to perform interpolation
if (!colDataIsNull_s(pColInfoData, i)) {
@@ -1844,22 +1838,22 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
STimeSliceOperatorInfo* pSliceInfo = pOperator->info;
- SSDataBlock* pResBlock = pSliceInfo->pRes;
- SExprSupp* pSup = &pOperator->exprSupp;
+ SSDataBlock* pResBlock = pSliceInfo->pRes;
+ SExprSupp* pSup = &pOperator->exprSupp;
blockDataEnsureCapacity(pResBlock, pOperator->resultInfo.capacity);
-// if (pOperator->status == OP_RES_TO_RETURN) {
-// // doBuildResultDatablock(&pRuntimeEnv->groupResInfo, pRuntimeEnv, pIntervalInfo->pRes);
-// if (pResBlock->info.rows == 0 || !hasDataInGroupInfo(&pSliceInfo->groupResInfo)) {
-// doSetOperatorCompleted(pOperator);
-// }
-//
-// return pResBlock;
-// }
+ // if (pOperator->status == OP_RES_TO_RETURN) {
+ // // doBuildResultDatablock(&pRuntimeEnv->groupResInfo, pRuntimeEnv, pIntervalInfo->pRes);
+ // if (pResBlock->info.rows == 0 || !hasDataInGroupInfo(&pSliceInfo->groupResInfo)) {
+ // doSetOperatorCompleted(pOperator);
+ // }
+ //
+ // return pResBlock;
+ // }
- int32_t order = TSDB_ORDER_ASC;
- SInterval* pInterval = &pSliceInfo->interval;
+ int32_t order = TSDB_ORDER_ASC;
+ SInterval* pInterval = &pSliceInfo->interval;
SOperatorInfo* downstream = pOperator->pDownstream[0];
int32_t numOfRows = 0;
@@ -1878,14 +1872,14 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
setInputDataBlock(pOperator, pSup->pCtx, pBlock, order, MAIN_SCAN, true);
SColumnInfoData* pTsCol = taosArrayGet(pBlock->pDataBlock, pSliceInfo->tsCol.slotId);
- for(int32_t i = 0; i < pBlock->info.rows; ++i) {
- int64_t ts = *(int64_t*) colDataGetData(pTsCol, i);
+ for (int32_t i = 0; i < pBlock->info.rows; ++i) {
+ int64_t ts = *(int64_t*)colDataGetData(pTsCol, i);
if (ts == pSliceInfo->current) {
- for(int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
+ for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j];
- int32_t dstSlot = pExprInfo->base.resSchema.slotId;
- int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
+ int32_t dstSlot = pExprInfo->base.resSchema.slotId;
+ int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
SColumnInfoData* pSrc = taosArrayGet(pBlock->pDataBlock, srcSlot);
SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot);
@@ -1897,7 +1891,8 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
pResBlock->info.rows += 1;
doKeepPrevRows(pSliceInfo, pBlock, i);
- pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
if (pSliceInfo->current > pSliceInfo->win.ekey) {
doSetOperatorCompleted(pOperator);
break;
@@ -1908,7 +1903,7 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
}
} else if (ts < pSliceInfo->current) {
if (i < pBlock->info.rows - 1) {
- int64_t nextTs = *(int64_t*) colDataGetData(pTsCol, i + 1);
+ int64_t nextTs = *(int64_t*)colDataGetData(pTsCol, i + 1);
if (nextTs > pSliceInfo->current) {
while (pSliceInfo->current < nextTs && pSliceInfo->current <= pSliceInfo->win.ekey) {
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pBlock, i, pResBlock);
@@ -1956,7 +1951,7 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
return pResBlock->info.rows == 0 ? NULL : pResBlock;
}
-SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode *pPhyNode, SExecTaskInfo* pTaskInfo) {
+SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo) {
STimeSliceOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(STimeSliceOperatorInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
if (pOperator == NULL || pInfo == NULL) {
@@ -1964,17 +1959,17 @@ SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode
}
SInterpFuncPhysiNode* pInterpPhyNode = (SInterpFuncPhysiNode*)pPhyNode;
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
- int32_t numOfExprs = 0;
+ int32_t numOfExprs = 0;
SExprInfo* pExprInfo = createExprInfo(pInterpPhyNode->pFuncs, NULL, &numOfExprs);
- int32_t code = initExprSupp(pSup, pExprInfo, numOfExprs);
+ int32_t code = initExprSupp(pSup, pExprInfo, numOfExprs);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
if (pInterpPhyNode->pExprs != NULL) {
- int32_t num = 0;
+ int32_t num = 0;
SExprInfo* pScalarExprInfo = createExprInfo(pInterpPhyNode->pExprs, NULL, &num);
code = initExprSupp(&pInfo->scalarSup, pScalarExprInfo, num);
if (code != TSDB_CODE_SUCCESS) {
@@ -1986,21 +1981,21 @@ SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode
pInfo->fillType = convertFillType(pInterpPhyNode->fillMode);
initResultSizeInfo(pOperator, 4096);
- pInfo->pFillColInfo = createFillColInfo(pExprInfo, numOfExprs, (SNodeListNode*)pInterpPhyNode->pFillValues);
- pInfo->pRes = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
- pInfo->win = pInterpPhyNode->timeRange;
+ pInfo->pFillColInfo = createFillColInfo(pExprInfo, numOfExprs, (SNodeListNode*)pInterpPhyNode->pFillValues);
+ pInfo->pRes = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
+ pInfo->win = pInterpPhyNode->timeRange;
pInfo->interval.interval = pInterpPhyNode->interval;
- pInfo->current = pInfo->win.skey;
+ pInfo->current = pInfo->win.skey;
- pOperator->name = "TimeSliceOperator";
+ pOperator->name = "TimeSliceOperator";
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
+ pOperator->blocking = false;
+ pOperator->status = OP_NOT_OPENED;
+ pOperator->info = pInfo;
+ pOperator->pTaskInfo = pTaskInfo;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTimeslice, NULL, NULL, destroyBasicOperatorInfo,
- NULL, NULL, NULL);
+ pOperator->fpSet =
+ createOperatorFpSet(operatorDummyOpenFn, doTimeslice, NULL, NULL, destroyBasicOperatorInfo, NULL, NULL, NULL);
code = appendDownstream(pOperator, &downstream, 1);
return pOperator;
@@ -2138,22 +2133,24 @@ void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx, int3
}
}
-static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExprSupp* pSup, SArray* pWinArray, int32_t groupId,
- int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
+static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExprSupp* pSup, SArray* pWinArray,
+ int32_t groupId, int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
int32_t size = taosArrayGetSize(pWinArray);
- ASSERT(pInfo->pChildren);
+ if (!pInfo->pChildren) {
+ return;
+ }
for (int32_t i = 0; i < size; i++) {
STimeWindow* pParentWin = taosArrayGet(pWinArray, i);
SResultRow* pCurResult = NULL;
- setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, pParentWin, true, &pCurResult, 0, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
+ setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, pParentWin, true, &pCurResult, 0, pSup->pCtx, numOfOutput,
+ pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
int32_t numOfChildren = taosArrayGetSize(pInfo->pChildren);
for (int32_t j = 0; j < numOfChildren; j++) {
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, j);
SIntervalAggOperatorInfo* pChInfo = pChildOp->info;
- SExprSupp* pChildSup = &pChildOp->exprSupp;
+ SExprSupp* pChildSup = &pChildOp->exprSupp;
- SResultRow* pChResult = NULL;
+ SResultRow* pChResult = NULL;
setTimeWindowOutputBuf(&pChInfo->binfo.resultRowInfo, pParentWin, true, &pChResult, 0, pChildSup->pCtx,
pChildSup->numOfExprs, pChildSup->rowEntryInfoOffset, &pChInfo->aggSup, pTaskInfo);
compactFunctions(pSup->pCtx, pChildSup->pCtx, numOfOutput, pTaskInfo);
@@ -2163,8 +2160,8 @@ static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExpr
bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup) {
SET_RES_WINDOW_KEY(pSup->keyBuf, &pWin->skey, sizeof(int64_t), groupId);
- SResultRowPosition* p1 = (SResultRowPosition*)taosHashGet(pSup->pResultRowHashTable,
- pSup->keyBuf, GET_RES_WINDOW_KEY_LEN(sizeof(int64_t)));
+ SResultRowPosition* p1 = (SResultRowPosition*)taosHashGet(pSup->pResultRowHashTable, pSup->keyBuf,
+ GET_RES_WINDOW_KEY_LEN(sizeof(int64_t)));
return p1 == NULL;
}
@@ -2197,7 +2194,8 @@ static void doHashInterval(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBloc
isDeletedWindow(&nextWin, tableGroupId, &pInfo->aggSup)) {
SArray* pUpWins = taosArrayInit(8, sizeof(STimeWindow));
taosArrayPush(pUpWins, &nextWin);
- rebuildIntervalWindow(pInfo, pSup, pUpWins, pInfo->binfo.pRes->info.groupId, pSup->numOfExprs, pOperatorInfo->pTaskInfo);
+ rebuildIntervalWindow(pInfo, pSup, pUpWins, pInfo->binfo.pRes->info.groupId, pSup->numOfExprs,
+ pOperatorInfo->pTaskInfo);
taosArrayDestroy(pUpWins);
}
int32_t code = setTimeWindowOutputBuf(pResultRowInfo, &nextWin, true, &pResult, tableGroupId, pSup->pCtx,
@@ -2215,8 +2213,8 @@ static void doHashInterval(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBloc
saveResultRow(pResult, tableGroupId, pUpdated);
}
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &nextWin, &pInfo->twAggSup.timeWindowData, startPos, forwardRows,
- tsCols, pSDataBlock->info.rows, numOfOutput, TSDB_ORDER_ASC);
+ doApplyFunctions(pTaskInfo, pSup->pCtx, &nextWin, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, tsCols,
+ pSDataBlock->info.rows, numOfOutput, TSDB_ORDER_ASC);
int32_t prevEndPos = (forwardRows - 1) * step + startPos;
ASSERT(pSDataBlock->info.window.skey > 0 && pSDataBlock->info.window.ekey > 0);
startPos = getNextQualifiedWindow(&pInfo->interval, &nextWin, &pSDataBlock->info, tsCols, prevEndPos, pInfo->order);
@@ -2257,9 +2255,7 @@ void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsCol
blockDataUpdateTsWindow(pDest, 0);
}
-static int32_t getChildIndex(SSDataBlock* pBlock) {
- return pBlock->info.childId;
-}
+static int32_t getChildIndex(SSDataBlock* pBlock) { return pBlock->info.childId; }
static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
SStreamFinalIntervalOperatorInfo* pInfo = pOperator->info;
@@ -2304,7 +2300,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
int32_t childIndex = getChildIndex(pBlock);
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex);
SIntervalAggOperatorInfo* pChildInfo = pChildOp->info;
- SExprSupp* pChildSup = &pChildOp->exprSupp;
+ SExprSupp* pChildSup = &pChildOp->exprSupp;
doClearWindows(&pChildInfo->aggSup, pChildSup, &pChildInfo->interval, pChildInfo->primaryTsIndex,
pChildSup->numOfExprs, pBlock, NULL);
@@ -2339,6 +2335,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
SStreamFinalIntervalOperatorInfo* pChInfo = pChildOp->info;
setInputDataBlock(pChildOp, pChildOp->exprSupp.pCtx, pBlock, pChInfo->order, MAIN_SCAN, true);
doHashInterval(pChildOp, pBlock, pBlock->info.groupId, NULL);
+ pChInfo->twAggSup.maxTs = TMAX(pChInfo->twAggSup.maxTs, pBlock->info.window.ekey);
}
maxTs = TMAX(maxTs, pBlock->info.window.ekey);
}
@@ -2406,7 +2403,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
initResultRowInfo(&pInfo->binfo.resultRowInfo);
pInfo->pChildren = NULL;
if (numOfChild > 0) {
- pInfo->pChildren = taosArrayInit(numOfChild, sizeof(SOperatorInfo));
+ pInfo->pChildren = taosArrayInit(numOfChild, sizeof(void*));
for (int32_t i = 0; i < numOfChild; i++) {
SOperatorInfo* pChildOp = createStreamFinalIntervalOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
if (pChildOp) {
@@ -2463,9 +2460,9 @@ _error:
void destroyStreamAggSupporter(SStreamAggSupporter* pSup) {
taosMemoryFreeClear(pSup->pKeyBuf);
- void **pIte = NULL;
+ void** pIte = NULL;
while ((pIte = taosHashIterate(pSup->pResultRows, pIte)) != NULL) {
- SArray *pWins = (SArray *) (*pIte);
+ SArray* pWins = (SArray*)(*pIte);
taosArrayDestroy(pWins);
}
taosHashCleanup(pSup->pResultRows);
@@ -2489,18 +2486,19 @@ void destroyStreamSessionAggOperatorInfo(void* param, int32_t numOfOutput) {
}
}
-int32_t initBasicInfoEx(SOptrBasicInfo* pBasicInfo, SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock) {
+int32_t initBasicInfoEx(SOptrBasicInfo* pBasicInfo, SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfCols,
+ SSDataBlock* pResultBlock) {
int32_t code = initExprSupp(pSup, pExprInfo, numOfCols);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
initBasicInfo(pBasicInfo, pResultBlock);
-
+
for (int32_t i = 0; i < numOfCols; ++i) {
pSup->pCtx[i].pBuf = NULL;
}
-
+
ASSERT(numOfCols > 0);
increaseTs(pSup->pCtx);
return TSDB_CODE_SUCCESS;
@@ -2519,18 +2517,20 @@ void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int
pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, waterMark);
}
-int32_t initSessionAggSupporter(SStreamAggSupporter* pSup, const char* pKey, SqlFunctionCtx* pCtx, int32_t numOfOutput) {
+int32_t initSessionAggSupporter(SStreamAggSupporter* pSup, const char* pKey, SqlFunctionCtx* pCtx,
+ int32_t numOfOutput) {
return initStreamAggSupporter(pSup, pKey, pCtx, numOfOutput, sizeof(SResultWindowInfo));
}
-SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo) {
- SSessionWinodwPhysiNode* pSessionNode = (SSessionWinodwPhysiNode*)pPhyNode;
- int32_t numOfCols = 0;
- SExprInfo* pExprInfo = createExprInfo(pSessionNode->window.pFuncs, NULL, &numOfCols);
- SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
- int32_t code = TSDB_CODE_OUT_OF_MEMORY;
+SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
+ SExecTaskInfo* pTaskInfo) {
+ SSessionWinodwPhysiNode* pSessionNode = (SSessionWinodwPhysiNode*)pPhyNode;
+ int32_t numOfCols = 0;
+ SExprInfo* pExprInfo = createExprInfo(pSessionNode->window.pFuncs, NULL, &numOfCols);
+ SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
+ int32_t code = TSDB_CODE_OUT_OF_MEMORY;
SStreamSessionAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamSessionAggOperatorInfo));
- SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
if (pInfo == NULL || pOperator == NULL) {
goto _error;
}
@@ -2542,8 +2542,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
-
-
+
code = initSessionAggSupporter(&pInfo->streamAggSup, "StreamSessionAggOperatorInfo", pSup->pCtx, numOfCols);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -2555,10 +2554,8 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
}
initDummyFunction(pInfo->pDummyCtx, pSup->pCtx, numOfCols);
- pInfo->twAggSup = (STimeWindowAggSupp) {
- .waterMark = pSessionNode->window.watermark,
- .calTrigger = pSessionNode->window.triggerType,
- .maxTs = INT64_MIN};
+ pInfo->twAggSup = (STimeWindowAggSupp){
+ .waterMark = pSessionNode->window.watermark, .calTrigger = pSessionNode->window.triggerType, .maxTs = INT64_MIN};
initResultRowInfo(&pInfo->binfo.resultRowInfo);
initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window);
@@ -2574,6 +2571,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
pInfo->pStDeleted = taosHashInit(64, hashFn, true, HASH_NO_LOCK);
pInfo->pDelIterator = NULL;
pInfo->pDelRes = createOneDataBlock(pResBlock, false);
+ pInfo->pDelRes->info.type = STREAM_DELETE;
blockDataEnsureCapacity(pInfo->pDelRes, 64);
pInfo->pChildren = NULL;
pInfo->isFinal = false;
@@ -2632,19 +2630,19 @@ static SResultWindowInfo* addNewSessionWindow(SArray* pWinInfos, TSKEY ts) {
}
SArray* getWinInfos(SStreamAggSupporter* pAggSup, uint64_t groupId) {
- void** ite = taosHashGet(pAggSup->pResultRows, &groupId, sizeof(uint64_t));
+ void** ite = taosHashGet(pAggSup->pResultRows, &groupId, sizeof(uint64_t));
SArray* pWinInfos = NULL;
if (ite == NULL) {
pWinInfos = taosArrayInit(1024, pAggSup->valueSize);
- taosHashPut(pAggSup->pResultRows, &groupId, sizeof(uint64_t), &pWinInfos, sizeof(void *));
+ taosHashPut(pAggSup->pResultRows, &groupId, sizeof(uint64_t), &pWinInfos, sizeof(void*));
} else {
pWinInfos = *ite;
}
return pWinInfos;
}
-SResultWindowInfo* getSessionTimeWindow(SStreamAggSupporter* pAggSup, TSKEY startTs,
- TSKEY endTs, uint64_t groupId, int64_t gap, int32_t* pIndex) {
+SResultWindowInfo* getSessionTimeWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId,
+ int64_t gap, int32_t* pIndex) {
SArray* pWinInfos = getWinInfos(pAggSup, groupId);
pAggSup->pCurWins = pWinInfos;
@@ -2683,10 +2681,10 @@ SResultWindowInfo* getSessionTimeWindow(SStreamAggSupporter* pAggSup, TSKEY star
return insertNewSessionWindow(pWinInfos, startTs, index + 1);
}
-int32_t updateSessionWindowInfo(SResultWindowInfo* pWinInfo, TSKEY* pStartTs,
- TSKEY* pEndTs, int32_t rows, int32_t start, int64_t gap, SHashObj* pStDeleted) {
+int32_t updateSessionWindowInfo(SResultWindowInfo* pWinInfo, TSKEY* pStartTs, TSKEY* pEndTs, int32_t rows,
+ int32_t start, int64_t gap, SHashObj* pStDeleted) {
for (int32_t i = start; i < rows; ++i) {
- if (!isInWindow(pWinInfo, pStartTs[i], gap) && (!pEndTs || !isInWindow(pWinInfo, pEndTs[i], gap)) ) {
+ if (!isInWindow(pWinInfo, pStartTs[i], gap) && (!pEndTs || !isInWindow(pWinInfo, pEndTs[i], gap))) {
return i - start;
}
if (pWinInfo->win.skey > pStartTs[i]) {
@@ -2742,7 +2740,7 @@ static int32_t doOneWindowAggImpl(int32_t tsColId, SOptrBasicInfo* pBinfo, SStre
SColumnInfoData* pTimeWindowData, SSDataBlock* pSDataBlock,
SResultWindowInfo* pCurWin, SResultRow** pResult, int32_t startIndex, int32_t winRows,
int32_t numOutput, SOperatorInfo* pOperator) {
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SColumnInfoData* pColDataInfo = taosArrayGet(pSDataBlock->pDataBlock, tsColId);
@@ -2760,14 +2758,14 @@ static int32_t doOneWindowAggImpl(int32_t tsColId, SOptrBasicInfo* pBinfo, SStre
static int32_t doOneWindowAgg(SStreamSessionAggOperatorInfo* pInfo, SSDataBlock* pSDataBlock,
SResultWindowInfo* pCurWin, SResultRow** pResult, int32_t startIndex, int32_t winRows,
- int32_t numOutput, SOperatorInfo * pOperator) {
+ int32_t numOutput, SOperatorInfo* pOperator) {
return doOneWindowAggImpl(pInfo->primaryTsIndex, &pInfo->binfo, &pInfo->streamAggSup, &pInfo->twAggSup.timeWindowData,
pSDataBlock, pCurWin, pResult, startIndex, winRows, numOutput, pOperator);
}
static int32_t doOneStateWindowAgg(SStreamStateAggOperatorInfo* pInfo, SSDataBlock* pSDataBlock,
SResultWindowInfo* pCurWin, SResultRow** pResult, int32_t startIndex,
- int32_t winRows, int32_t numOutput, SOperatorInfo * pOperator) {
+ int32_t winRows, int32_t numOutput, SOperatorInfo* pOperator) {
return doOneWindowAggImpl(pInfo->primaryTsIndex, &pInfo->binfo, &pInfo->streamAggSup, &pInfo->twAggSup.timeWindowData,
pSDataBlock, pCurWin, pResult, startIndex, winRows, numOutput, pOperator);
}
@@ -2788,7 +2786,7 @@ int32_t getNumCompactWindow(SArray* pWinInfos, int32_t startIndex, int64_t gap)
void compactTimeWindow(SStreamSessionAggOperatorInfo* pInfo, int32_t startIndex, int32_t num, uint64_t groupId,
int32_t numOfOutput, SHashObj* pStUpdated, SHashObj* pStDeleted, SOperatorInfo* pOperator) {
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SResultWindowInfo* pCurWin = taosArrayGet(pInfo->streamAggSup.pCurWins, startIndex);
@@ -2819,8 +2817,8 @@ typedef struct SWinRes {
uint64_t groupId;
} SWinRes;
-static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBlock,
- SHashObj* pStUpdated, SHashObj* pStDeleted, bool hasEndTs) {
+static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBlock, SHashObj* pStUpdated,
+ SHashObj* pStDeleted, bool hasEndTs) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
bool masterScan = true;
@@ -2838,14 +2836,14 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
if (pSDataBlock->pDataBlock != NULL) {
SColumnInfoData* pStartTsCol = taosArrayGet(pSDataBlock->pDataBlock, pInfo->primaryTsIndex);
- startTsCols = (int64_t*) pStartTsCol->pData;
+ startTsCols = (int64_t*)pStartTsCol->pData;
SColumnInfoData* pEndTsCol = NULL;
if (hasEndTs) {
pEndTsCol = taosArrayGet(pSDataBlock->pDataBlock, pInfo->endTsIndex);
} else {
pEndTsCol = taosArrayGet(pSDataBlock->pDataBlock, pInfo->primaryTsIndex);
}
- endTsCols = (int64_t*) pEndTsCol->pData;
+ endTsCols = (int64_t*)pEndTsCol->pData;
} else {
return;
}
@@ -2853,10 +2851,9 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
for (int32_t i = 0; i < pSDataBlock->info.rows;) {
int32_t winIndex = 0;
- SResultWindowInfo* pCurWin = getSessionTimeWindow(pAggSup, startTsCols[i],
- endTsCols[i], groupId, gap, &winIndex);
- winRows = updateSessionWindowInfo(pCurWin, startTsCols, endTsCols,
- pSDataBlock->info.rows, i, pInfo->gap, pStDeleted);
+ SResultWindowInfo* pCurWin = getSessionTimeWindow(pAggSup, startTsCols[i], endTsCols[i], groupId, gap, &winIndex);
+ winRows =
+ updateSessionWindowInfo(pCurWin, startTsCols, endTsCols, pSDataBlock->info.rows, i, pInfo->gap, pStDeleted);
code = doOneWindowAgg(pInfo, pSDataBlock, pCurWin, &pResult, i, winRows, numOfOutput, pOperator);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
@@ -2879,14 +2876,15 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
}
}
-static void doClearSessionWindows(SStreamAggSupporter* pAggSup, SExprSupp* pSup, SSDataBlock* pBlock,
- int32_t tsIndex, int32_t numOfOutput, int64_t gap, SArray* result) {
+static void doClearSessionWindows(SStreamAggSupporter* pAggSup, SExprSupp* pSup, SSDataBlock* pBlock, int32_t tsIndex,
+ int32_t numOfOutput, int64_t gap, SArray* result) {
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, tsIndex);
TSKEY* tsCols = (TSKEY*)pColDataInfo->pData;
int32_t step = 0;
for (int32_t i = 0; i < pBlock->info.rows; i += step) {
int32_t winIndex = 0;
- SResultWindowInfo* pCurWin = getSessionTimeWindow(pAggSup, tsCols[i], INT64_MIN, pBlock->info.groupId, gap, &winIndex);
+ SResultWindowInfo* pCurWin =
+ getSessionTimeWindow(pAggSup, tsCols[i], INT64_MIN, pBlock->info.groupId, gap, &winIndex);
step = updateSessionWindowInfo(pCurWin, tsCols, NULL, pBlock->info.rows, i, gap, NULL);
ASSERT(isInWindow(pCurWin, tsCols[i], gap));
doClearWindowImpl(&pCurWin->pos, pAggSup->pResultBuf, pSup, numOfOutput);
@@ -2936,7 +2934,7 @@ void doBuildDeleteDataBlock(SHashObj* pStDeleted, SSDataBlock* pBlock, void** It
static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray* pWinArray, int32_t groupId,
int32_t numOfOutput, SOperatorInfo* pOperator) {
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
int32_t size = taosArrayGetSize(pWinArray);
@@ -2955,7 +2953,7 @@ static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray* pWin
int32_t chWinSize = taosArrayGetSize(pChWins);
int32_t index = binarySearch(pChWins, chWinSize, pParentWin->win.skey, TSDB_ORDER_DESC, getSessionWindowEndkey);
if (index < 0) {
- index = 0;
+ index = 0;
}
for (int32_t k = index; k < chWinSize; k++) {
SResultWindowInfo* pcw = taosArrayGet(pChWins, k);
@@ -2976,15 +2974,14 @@ typedef SResultWindowInfo* (*__get_win_info_)(void*);
SResultWindowInfo* getResWinForSession(void* pData) { return (SResultWindowInfo*)pData; }
SResultWindowInfo* getResWinForState(void* pData) { return &((SStateWindowInfo*)pData)->winInfo; }
-int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArray* pClosed,
- __get_win_info_ fn) {
+int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArray* pClosed, __get_win_info_ fn) {
// Todo(liuyao) save window to tdb
- void **pIte = NULL;
+ void** pIte = NULL;
size_t keyLen = 0;
while ((pIte = taosHashIterate(pHashMap, pIte)) != NULL) {
uint64_t* pGroupId = taosHashGetKey(pIte, &keyLen);
- SArray *pWins = (SArray *) (*pIte);
- int32_t size = taosArrayGetSize(pWins);
+ SArray* pWins = (SArray*)(*pIte);
+ int32_t size = taosArrayGetSize(pWins);
for (int32_t i = 0; i < size; i++) {
void* pWin = taosArrayGet(pWins, i);
SResultWindowInfo* pSeWin = fn(pWin);
@@ -3005,9 +3002,9 @@ int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArra
}
int32_t getAllSessionWindow(SHashObj* pHashMap, SArray* pClosed, __get_win_info_ fn) {
- void **pIte = NULL;
+ void** pIte = NULL;
while ((pIte = taosHashIterate(pHashMap, pIte)) != NULL) {
- SArray *pWins = (SArray *) (*pIte);
+ SArray* pWins = (SArray*)(*pIte);
int32_t size = taosArrayGetSize(pWins);
for (int32_t i = 0; i < size; i++) {
void* pWin = taosArrayGet(pWins, i);
@@ -3031,12 +3028,14 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
} else if (pOperator->status == OP_RES_TO_RETURN) {
doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
+ /*printDataBlock(pInfo->pDelRes, "session del");*/
return pInfo->pDelRes;
}
doBuildResultDatablock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf);
if (pBInfo->pRes->info.rows == 0 || !hasDataInGroupInfo(&pInfo->groupResInfo)) {
doSetOperatorCompleted(pOperator);
}
+ /*printDataBlock(pBInfo->pRes, "session insert");*/
return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
}
@@ -3052,7 +3051,8 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
if (pBlock->info.type == STREAM_REPROCESS) {
SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo));
- doClearSessionWindows(&pInfo->streamAggSup, &pOperator->exprSupp, pBlock, 0, pOperator->exprSupp.numOfExprs, pInfo->gap, pWins);
+ doClearSessionWindows(&pInfo->streamAggSup, &pOperator->exprSupp, pBlock, 0, pOperator->exprSupp.numOfExprs,
+ pInfo->gap, pWins);
if (IS_FINAL_OP(pInfo)) {
int32_t childIndex = getChildIndex(pBlock);
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex);
@@ -3076,13 +3076,14 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
// if chIndex + 1 - size > 0, add new child
for (int32_t i = 0; i < chIndex + 1 - size; i++) {
- SOperatorInfo* pChildOp = createStreamFinalSessionAggOperatorInfo(NULL, pInfo->pPhyNode, pOperator->pTaskInfo, 0);
+ SOperatorInfo* pChildOp =
+ createStreamFinalSessionAggOperatorInfo(NULL, pInfo->pPhyNode, pOperator->pTaskInfo, 0);
if (!pChildOp) {
longjmp(pOperator->pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
taosArrayPush(pInfo->pChildren, &pChildOp);
}
- SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, chIndex);
+ SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, chIndex);
setInputDataBlock(pChildOp, pChildOp->exprSupp.pCtx, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true);
doStreamSessionAggImpl(pChildOp, pBlock, NULL, NULL, true);
}
@@ -3093,27 +3094,27 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
// restore the value
pOperator->status = OP_RES_TO_RETURN;
- closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated,
- getResWinForSession);
+ closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated, getResWinForSession);
copyUpdateResult(pStUpdated, pUpdated);
taosHashCleanup(pStUpdated);
- finalizeUpdatedResult(pSup->numOfExprs, pInfo->streamAggSup.pResultBuf, pUpdated,
- pSup->rowEntryInfoOffset);
+ finalizeUpdatedResult(pSup->numOfExprs, pInfo->streamAggSup.pResultBuf, pUpdated, pSup->rowEntryInfoOffset);
initMultiResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
+ /*printDataBlock(pInfo->pDelRes, "session del");*/
return pInfo->pDelRes;
}
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf);
+ /*printDataBlock(pBInfo->pRes, "session insert");*/
return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
}
static void clearStreamSessionOperator(SStreamSessionAggOperatorInfo* pInfo) {
- void **pIte = NULL;
+ void** pIte = NULL;
while ((pIte = taosHashIterate(pInfo->streamAggSup.pResultRows, pIte)) != NULL) {
- SArray *pWins = (SArray *) (*pIte);
+ SArray* pWins = (SArray*)(*pIte);
int32_t size = taosArrayGetSize(pWins);
for (int32_t i = 0; i < size; i++) {
SResultWindowInfo* pWin = (SResultWindowInfo*)taosArrayGet(pWins, i);
@@ -3139,7 +3140,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
SOptrBasicInfo* pBInfo = &pInfo->binfo;
TSKEY maxTs = INT64_MIN;
SExprSupp* pSup = &pOperator->exprSupp;
-
+
if (pOperator->status == OP_EXEC_DONE) {
return NULL;
} else if (pOperator->status == OP_RES_TO_RETURN) {
@@ -3221,8 +3222,8 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
}
-SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream,
- SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild) {
+SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
+ SExecTaskInfo* pTaskInfo, int32_t numOfChild) {
int32_t code = TSDB_CODE_OUT_OF_MEMORY;
SOperatorInfo* pOperator = createStreamSessionAggOperatorInfo(downstream, pPhyNode, pTaskInfo);
if (pOperator == NULL) {
@@ -3240,15 +3241,14 @@ SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream
blockDataEnsureCapacity(pInfo->pUpdateRes, 128);
pOperator->name = "StreamSessionSemiAggOperator";
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doStreamSessionSemiAgg, NULL, NULL, destroyStreamSessionAggOperatorInfo,
- aggEncodeResultRow, aggDecodeResultRow, NULL);
+ createOperatorFpSet(operatorDummyOpenFn, doStreamSessionSemiAgg, NULL, NULL,
+ destroyStreamSessionAggOperatorInfo, aggEncodeResultRow, aggDecodeResultRow, NULL);
}
pOperator->operatorType = pPhyNode->type;
if (numOfChild > 0) {
pInfo->pChildren = taosArrayInit(numOfChild, sizeof(void*));
for (int32_t i = 0; i < numOfChild; i++) {
- SOperatorInfo* pChild =
- createStreamFinalSessionAggOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
+ SOperatorInfo* pChild = createStreamFinalSessionAggOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
if (pChild == NULL) {
goto _error;
}
@@ -3366,8 +3366,8 @@ SStateWindowInfo* getStateWindowByTs(SStreamAggSupporter* pAggSup, TSKEY ts, uin
return NULL;
}
-SStateWindowInfo* getStateWindow(SStreamAggSupporter* pAggSup, TSKEY ts,
- uint64_t groupId, char* pKeyData, SColumn* pCol, int32_t* pIndex) {
+SStateWindowInfo* getStateWindow(SStreamAggSupporter* pAggSup, TSKEY ts, uint64_t groupId, char* pKeyData,
+ SColumn* pCol, int32_t* pIndex) {
SArray* pWinInfos = getWinInfos(pAggSup, groupId);
pAggSup->pCurWins = pWinInfos;
int32_t size = taosArrayGetSize(pWinInfos);
@@ -3499,11 +3499,10 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
char* pKeyData = colDataGetData(pKeyColInfo, i);
int32_t winIndex = 0;
bool allEqual = true;
- SStateWindowInfo* pCurWin =
- getStateWindow(pAggSup, tsCols[i], pSDataBlock->info.groupId, pKeyData,
- &pInfo->stateCol, &winIndex);
- winRows = updateStateWindowInfo(pAggSup->pCurWins, winIndex, tsCols, pKeyColInfo,
- pSDataBlock->info.rows, i, &allEqual, pInfo->pSeDeleted);
+ SStateWindowInfo* pCurWin =
+ getStateWindow(pAggSup, tsCols[i], pSDataBlock->info.groupId, pKeyData, &pInfo->stateCol, &winIndex);
+ winRows = updateStateWindowInfo(pAggSup->pCurWins, winIndex, tsCols, pKeyColInfo, pSDataBlock->info.rows, i,
+ &allEqual, pInfo->pSeDeleted);
if (!allEqual) {
taosArrayPush(pAggSup->pScanWindow, &pCurWin->winInfo.win);
taosHashRemove(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition));
@@ -3517,8 +3516,7 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
pCurWin->winInfo.isClosed = false;
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE) {
SWinRes value = {.ts = pCurWin->winInfo.win.skey, .groupId = groupId};
- code = taosHashPut(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition),
- &value, sizeof(SWinRes));
+ code = taosHashPut(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition), &value, sizeof(SWinRes));
if (code != TSDB_CODE_SUCCESS) {
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
@@ -3532,7 +3530,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
return NULL;
}
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
SOptrBasicInfo* pBInfo = &pInfo->binfo;
if (pOperator->status == OP_RES_TO_RETURN) {
@@ -3574,8 +3572,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
// restore the value
pOperator->status = OP_RES_TO_RETURN;
- closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated,
- getResWinForState);
+ closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated, getResWinForState);
copyUpdateResult(pSeUpdated, pUpdated);
taosHashCleanup(pSeUpdated);
@@ -3646,6 +3643,7 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
pInfo->pSeDeleted = taosHashInit(64, hashFn, true, HASH_NO_LOCK);
pInfo->pDelIterator = NULL;
pInfo->pDelRes = createOneDataBlock(pResBlock, false);
+ pInfo->pDelRes->info.type = STREAM_DELETE;
blockDataEnsureCapacity(pInfo->pDelRes, 64);
pInfo->pChildren = NULL;
@@ -3674,48 +3672,48 @@ _error:
return NULL;
}
-typedef struct SMergeIntervalAggOperatorInfo {
+typedef struct SMergeAlignedIntervalAggOperatorInfo {
SIntervalAggOperatorInfo intervalAggOperatorInfo;
bool hasGroupId;
uint64_t groupId;
SSDataBlock* prefetchedBlock;
bool inputBlocksFinished;
-} SMergeIntervalAggOperatorInfo;
+} SMergeAlignedIntervalAggOperatorInfo;
-void destroyMergeIntervalOperatorInfo(void* param, int32_t numOfOutput) {
- SMergeIntervalAggOperatorInfo* miaInfo = (SMergeIntervalAggOperatorInfo*)param;
+void destroyMergeAlignedIntervalOperatorInfo(void* param, int32_t numOfOutput) {
+ SMergeAlignedIntervalAggOperatorInfo* miaInfo = (SMergeAlignedIntervalAggOperatorInfo*)param;
destroyIntervalOperatorInfo(&miaInfo->intervalAggOperatorInfo, numOfOutput);
}
-static int32_t outputMergeIntervalResult(SOperatorInfo* pOperatorInfo, uint64_t tableGroupId, SSDataBlock* pResultBlock, TSKEY wstartTs) {
- SMergeIntervalAggOperatorInfo* miaInfo = pOperatorInfo->info;
- SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
- SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo;
+static int32_t outputMergeAlignedIntervalResult(SOperatorInfo* pOperatorInfo, uint64_t tableGroupId,
+ SSDataBlock* pResultBlock, TSKEY wstartTs) {
+ SMergeAlignedIntervalAggOperatorInfo* miaInfo = pOperatorInfo->info;
+ SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+ SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo;
SExprSupp* pSup = &pOperatorInfo->exprSupp;
- bool ascScan = (iaInfo->order == TSDB_ORDER_ASC);
+ bool ascScan = (iaInfo->order == TSDB_ORDER_ASC);
SET_RES_WINDOW_KEY(iaInfo->aggSup.keyBuf, &wstartTs, TSDB_KEYSIZE, tableGroupId);
SResultRowPosition* p1 = (SResultRowPosition*)taosHashGet(iaInfo->aggSup.pResultRowHashTable, iaInfo->aggSup.keyBuf,
GET_RES_WINDOW_KEY_LEN(TSDB_KEYSIZE));
ASSERT(p1 != NULL);
- finalizeResultRowIntoResultDataBlock(iaInfo->aggSup.pResultBuf, p1, pSup->pCtx, pSup->pExprInfo,
- pSup->numOfExprs, pSup->rowEntryInfoOffset, pResultBlock,
- pTaskInfo);
+ finalizeResultRowIntoResultDataBlock(iaInfo->aggSup.pResultBuf, p1, pSup->pCtx, pSup->pExprInfo, pSup->numOfExprs,
+ pSup->rowEntryInfoOffset, pResultBlock, pTaskInfo);
taosHashRemove(iaInfo->aggSup.pResultRowHashTable, iaInfo->aggSup.keyBuf, GET_RES_WINDOW_KEY_LEN(TSDB_KEYSIZE));
return 0;
}
-static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResultRowInfo, SSDataBlock* pBlock,
- int32_t scanFlag, SSDataBlock* pResultBlock) {
- SMergeIntervalAggOperatorInfo* miaInfo = pOperatorInfo->info;
- SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+static void doMergeAlignedIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResultRowInfo,
+ SSDataBlock* pBlock, int32_t scanFlag, SSDataBlock* pResultBlock) {
+ SMergeAlignedIntervalAggOperatorInfo* miaInfo = pOperatorInfo->info;
+ SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo;
- SExprSupp* pSup = &pOperatorInfo->exprSupp;
+ SExprSupp* pSup = &pOperatorInfo->exprSupp;
int32_t startPos = 0;
int32_t numOfOutput = pSup->numOfExprs;
@@ -3726,18 +3724,18 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo*
STimeWindow win;
win.skey = blockStartTs;
- win.ekey = taosTimeAdd(win.skey, iaInfo->interval.interval, iaInfo->interval.intervalUnit, iaInfo->interval.precision) - 1;
+ win.ekey =
+ taosTimeAdd(win.skey, iaInfo->interval.interval, iaInfo->interval.intervalUnit, iaInfo->interval.precision) - 1;
- //TODO: remove the hash table usage (groupid + winkey => result row position)
- int32_t ret =
- setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
+ // TODO: remove the hash table (groupid + winkey => result row position)
+ int32_t ret = setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId,
+ pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
- TSKEY currTs = blockStartTs;
- TSKEY currPos = startPos;
+ TSKEY currTs = blockStartTs;
+ TSKEY currPos = startPos;
STimeWindow currWin = win;
while (1) {
++currPos;
@@ -3748,39 +3746,41 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo*
continue;
} else {
updateTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &currWin, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &currWin, &iaInfo->twAggSup.timeWindowData, startPos,
- currPos - startPos, tsCols, pBlock->info.rows, numOfOutput, iaInfo->order);
+ doApplyFunctions(pTaskInfo, pSup->pCtx, &currWin, &iaInfo->twAggSup.timeWindowData, startPos, currPos - startPos,
+ tsCols, pBlock->info.rows, numOfOutput, iaInfo->order);
- outputMergeIntervalResult(pOperatorInfo, tableGroupId, pResultBlock, currTs);
+ outputMergeAlignedIntervalResult(pOperatorInfo, tableGroupId, pResultBlock, currTs);
currTs = tsCols[currPos];
currWin.skey = currTs;
- currWin.ekey = taosTimeAdd(currWin.skey, iaInfo->interval.interval, iaInfo->interval.intervalUnit, iaInfo->interval.precision) - 1;
+ currWin.ekey = taosTimeAdd(currWin.skey, iaInfo->interval.interval, iaInfo->interval.intervalUnit,
+ iaInfo->interval.precision) -
+ 1;
startPos = currPos;
- ret = setTimeWindowOutputBuf(pResultRowInfo, &currWin, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pSup->pCtx,
- numOfOutput, pSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
+ ret = setTimeWindowOutputBuf(pResultRowInfo, &currWin, (scanFlag == MAIN_SCAN), &pResult, tableGroupId,
+ pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
}
}
updateTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &currWin, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &currWin, &iaInfo->twAggSup.timeWindowData, startPos,
- currPos - startPos, tsCols, pBlock->info.rows, numOfOutput, iaInfo->order);
+ doApplyFunctions(pTaskInfo, pSup->pCtx, &currWin, &iaInfo->twAggSup.timeWindowData, startPos, currPos - startPos,
+ tsCols, pBlock->info.rows, numOfOutput, iaInfo->order);
- outputMergeIntervalResult(pOperatorInfo, tableGroupId, pResultBlock, currTs);
+ outputMergeAlignedIntervalResult(pOperatorInfo, tableGroupId, pResultBlock, currTs);
}
-static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
+static SSDataBlock* doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- SMergeIntervalAggOperatorInfo* miaInfo = pOperator->info;
- SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+ SMergeAlignedIntervalAggOperatorInfo* miaInfo = pOperator->info;
+ SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
if (pOperator->status == OP_EXEC_DONE) {
return NULL;
}
- SExprSupp* pSup = &pOperator->exprSupp;
+ SExprSupp* pSup = &pOperator->exprSupp;
SSDataBlock* pRes = iaInfo->binfo.pRes;
blockDataCleanup(pRes);
blockDataEnsureCapacity(pRes, pOperator->resultInfo.capacity);
@@ -3795,6 +3795,7 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
} else {
pBlock = miaInfo->prefetchedBlock;
miaInfo->groupId = pBlock->info.groupId;
+ miaInfo->prefetchedBlock = NULL;
}
if (pBlock == NULL) {
@@ -3812,6 +3813,276 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
getTableScanInfo(pOperator, &iaInfo->order, &scanFlag);
setInputDataBlock(pOperator, pSup->pCtx, pBlock, iaInfo->order, scanFlag, true);
+ doMergeAlignedIntervalAggImpl(pOperator, &iaInfo->binfo.resultRowInfo, pBlock, scanFlag, pRes);
+
+ if (pRes->info.rows >= pOperator->resultInfo.threshold) {
+ break;
+ }
+ }
+
+ pRes->info.groupId = miaInfo->groupId;
+ }
+
+ if (pRes->info.rows == 0) {
+ doSetOperatorCompleted(pOperator);
+ }
+
+ size_t rows = pRes->info.rows;
+ pOperator->resultInfo.totalRows += rows;
+ return (rows == 0) ? NULL : pRes;
+}
+
+SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo,
+ int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval,
+ int32_t primaryTsSlotId, SExecTaskInfo* pTaskInfo) {
+ SMergeAlignedIntervalAggOperatorInfo* miaInfo = taosMemoryCalloc(1, sizeof(SMergeAlignedIntervalAggOperatorInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ if (miaInfo == NULL || pOperator == NULL) {
+ goto _error;
+ }
+
+ SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+ SExprSupp* pSup = &pOperator->exprSupp;
+
+ iaInfo->win = pTaskInfo->window;
+ iaInfo->order = TSDB_ORDER_ASC;
+ iaInfo->interval = *pInterval;
+ iaInfo->execModel = pTaskInfo->execModel;
+ iaInfo->primaryTsIndex = primaryTsSlotId;
+
+ size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
+ initResultSizeInfo(pOperator, 4096);
+
+ int32_t code =
+ initAggInfo(&pOperator->exprSupp, &iaInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
+ initBasicInfo(&iaInfo->binfo, pResBlock);
+
+ initExecTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &iaInfo->win);
+
+ iaInfo->timeWindowInterpo = timeWindowinterpNeeded(pSup->pCtx, numOfCols, iaInfo);
+ if (iaInfo->timeWindowInterpo) {
+ iaInfo->binfo.resultRowInfo.openWindow = tdListNew(sizeof(SResultRowPosition));
+ }
+
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ initResultRowInfo(&iaInfo->binfo.resultRowInfo);
+
+ pOperator->name = "TimeMergeAlignedIntervalAggOperator";
+ pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL;
+ pOperator->blocking = false;
+ pOperator->status = OP_NOT_OPENED;
+ pOperator->exprSupp.pExprInfo = pExprInfo;
+ pOperator->pTaskInfo = pTaskInfo;
+ pOperator->exprSupp.numOfExprs = numOfCols;
+ pOperator->info = miaInfo;
+
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doMergeAlignedIntervalAgg, NULL, NULL,
+ destroyMergeAlignedIntervalOperatorInfo, NULL, NULL, NULL);
+
+ code = appendDownstream(pOperator, &downstream, 1);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ return pOperator;
+
+_error:
+ destroyMergeAlignedIntervalOperatorInfo(miaInfo, numOfCols);
+ taosMemoryFreeClear(miaInfo);
+ taosMemoryFreeClear(pOperator);
+ pTaskInfo->code = code;
+ return NULL;
+}
+
+//=====================================================================================================================
+// merge interval operator
+typedef struct SMergeIntervalAggOperatorInfo {
+ SIntervalAggOperatorInfo intervalAggOperatorInfo;
+
+ SHashObj* groupIntervalHash;
+ bool hasGroupId;
+ uint64_t groupId;
+ SSDataBlock* prefetchedBlock;
+ bool inputBlocksFinished;
+} SMergeIntervalAggOperatorInfo;
+
+void destroyMergeIntervalOperatorInfo(void* param, int32_t numOfOutput) {
+ SMergeIntervalAggOperatorInfo* miaInfo = (SMergeIntervalAggOperatorInfo*)param;
+ taosHashCleanup(miaInfo->groupIntervalHash);
+ destroyIntervalOperatorInfo(&miaInfo->intervalAggOperatorInfo, numOfOutput);
+}
+
+static int32_t outputPrevIntervalResult(SOperatorInfo* pOperatorInfo, uint64_t tableGroupId, SSDataBlock* pResultBlock,
+ STimeWindow* newWin) {
+ SMergeIntervalAggOperatorInfo* miaInfo = pOperatorInfo->info;
+ SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+ SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo;
+ bool ascScan = (iaInfo->order == TSDB_ORDER_ASC);
+ SExprSupp* pExprSup = &pOperatorInfo->exprSupp;
+
+ STimeWindow* prevWin = taosHashGet(miaInfo->groupIntervalHash, &tableGroupId, sizeof(tableGroupId));
+ if (prevWin == NULL) {
+ taosHashPut(miaInfo->groupIntervalHash, &tableGroupId, sizeof(tableGroupId), newWin, sizeof(STimeWindow));
+ return 0;
+ }
+
+ if (newWin == NULL || (ascScan && newWin->skey > prevWin->ekey || (!ascScan) && newWin->skey < prevWin->ekey)) {
+ SET_RES_WINDOW_KEY(iaInfo->aggSup.keyBuf, &prevWin->skey, TSDB_KEYSIZE, tableGroupId);
+ SResultRowPosition* p1 = (SResultRowPosition*)taosHashGet(iaInfo->aggSup.pResultRowHashTable, iaInfo->aggSup.keyBuf,
+ GET_RES_WINDOW_KEY_LEN(TSDB_KEYSIZE));
+ ASSERT(p1 != NULL);
+
+ finalizeResultRowIntoResultDataBlock(iaInfo->aggSup.pResultBuf, p1, pExprSup->pCtx, pExprSup->pExprInfo,
+ pExprSup->numOfExprs, pExprSup->rowEntryInfoOffset, pResultBlock, pTaskInfo);
+ taosHashRemove(iaInfo->aggSup.pResultRowHashTable, iaInfo->aggSup.keyBuf, GET_RES_WINDOW_KEY_LEN(TSDB_KEYSIZE));
+ if (newWin == NULL) {
+ taosHashRemove(miaInfo->groupIntervalHash, &tableGroupId, sizeof(tableGroupId));
+ } else {
+ taosHashPut(miaInfo->groupIntervalHash, &tableGroupId, sizeof(tableGroupId), newWin, sizeof(STimeWindow));
+ }
+ }
+
+ return 0;
+}
+
+static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResultRowInfo, SSDataBlock* pBlock,
+ int32_t scanFlag, SSDataBlock* pResultBlock) {
+ SMergeIntervalAggOperatorInfo* miaInfo = pOperatorInfo->info;
+ SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+
+ SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo;
+ SExprSupp* pExprSup = &pOperatorInfo->exprSupp;
+
+ int32_t startPos = 0;
+ int32_t numOfOutput = pExprSup->numOfExprs;
+ int64_t* tsCols = extractTsCol(pBlock, iaInfo);
+ uint64_t tableGroupId = pBlock->info.groupId;
+ bool ascScan = (iaInfo->order == TSDB_ORDER_ASC);
+ TSKEY blockStartTs = getStartTsKey(&pBlock->info.window, tsCols);
+ SResultRow* pResult = NULL;
+
+ STimeWindow win = getActiveTimeWindow(iaInfo->aggSup.pResultBuf, pResultRowInfo, blockStartTs, &iaInfo->interval,
+ iaInfo->interval.precision, &iaInfo->win);
+
+ int32_t ret =
+ setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pExprSup->pCtx,
+ numOfOutput, pExprSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
+ if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
+ longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ TSKEY ekey = ascScan ? win.ekey : win.skey;
+ int32_t forwardRows =
+ getNumOfRowsInTimeWindow(&pBlock->info, tsCols, startPos, ekey, binarySearchForKey, NULL, iaInfo->order);
+ ASSERT(forwardRows > 0);
+
+ // prev time window not interpolation yet.
+ if (iaInfo->timeWindowInterpo) {
+ SResultRowPosition pos = addToOpenWindowList(pResultRowInfo, pResult);
+ doInterpUnclosedTimeWindow(pOperatorInfo, numOfOutput, pResultRowInfo, pBlock, scanFlag, tsCols, &pos);
+
+ // restore current time window
+ ret = setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pExprSup->pCtx,
+ numOfOutput, pExprSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
+ if (ret != TSDB_CODE_SUCCESS) {
+ longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ // window start key interpolation
+ doWindowBorderInterpolation(iaInfo, pBlock, pResult, &win, startPos, forwardRows, pExprSup);
+ }
+
+ updateTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &win, true);
+ doApplyFunctions(pTaskInfo, pExprSup->pCtx, &win, &iaInfo->twAggSup.timeWindowData, startPos, forwardRows, tsCols,
+ pBlock->info.rows, numOfOutput, iaInfo->order);
+ doCloseWindow(pResultRowInfo, iaInfo, pResult);
+
+ // output previous interval results after this interval (&win) is closed
+ outputPrevIntervalResult(pOperatorInfo, tableGroupId, pResultBlock, &win);
+
+ STimeWindow nextWin = win;
+ while (1) {
+ int32_t prevEndPos = forwardRows - 1 + startPos;
+ startPos = getNextQualifiedWindow(&iaInfo->interval, &nextWin, &pBlock->info, tsCols, prevEndPos, iaInfo->order);
+ if (startPos < 0) {
+ break;
+ }
+
+ // null data, failed to allocate more memory buffer
+ int32_t code =
+ setTimeWindowOutputBuf(pResultRowInfo, &nextWin, (scanFlag == MAIN_SCAN), &pResult, tableGroupId,
+ pExprSup->pCtx, numOfOutput, pExprSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
+ if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
+ longjmp(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ ekey = ascScan ? nextWin.ekey : nextWin.skey;
+ forwardRows =
+ getNumOfRowsInTimeWindow(&pBlock->info, tsCols, startPos, ekey, binarySearchForKey, NULL, iaInfo->order);
+
+ // window start(end) key interpolation
+ doWindowBorderInterpolation(iaInfo, pBlock, pResult, &nextWin, startPos, forwardRows, pExprSup);
+
+ updateTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &nextWin, true);
+ doApplyFunctions(pTaskInfo, pExprSup->pCtx, &nextWin, &iaInfo->twAggSup.timeWindowData, startPos, forwardRows,
+ tsCols, pBlock->info.rows, numOfOutput, iaInfo->order);
+ doCloseWindow(pResultRowInfo, iaInfo, pResult);
+
+ // output previous interval results after this interval (&nextWin) is closed
+ outputPrevIntervalResult(pOperatorInfo, tableGroupId, pResultBlock, &nextWin);
+ }
+
+ if (iaInfo->timeWindowInterpo) {
+ saveDataBlockLastRow(iaInfo->pPrevValues, pBlock, iaInfo->pInterpCols);
+ }
+}
+
+static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ SMergeIntervalAggOperatorInfo* miaInfo = pOperator->info;
+ SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+ SExprSupp* pExpSupp = &pOperator->exprSupp;
+
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
+
+ SSDataBlock* pRes = iaInfo->binfo.pRes;
+ blockDataCleanup(pRes);
+ blockDataEnsureCapacity(pRes, pOperator->resultInfo.capacity);
+
+ if (!miaInfo->inputBlocksFinished) {
+ SOperatorInfo* downstream = pOperator->pDownstream[0];
+ int32_t scanFlag = MAIN_SCAN;
+ while (1) {
+ SSDataBlock* pBlock = NULL;
+ if (miaInfo->prefetchedBlock == NULL) {
+ pBlock = downstream->fpSet.getNextFn(downstream);
+ } else {
+ pBlock = miaInfo->prefetchedBlock;
+ miaInfo->groupId = pBlock->info.groupId;
+ miaInfo->prefetchedBlock = NULL;
+ }
+
+ if (pBlock == NULL) {
+ miaInfo->inputBlocksFinished = true;
+ break;
+ }
+
+ if (!miaInfo->hasGroupId) {
+ miaInfo->hasGroupId = true;
+ miaInfo->groupId = pBlock->info.groupId;
+ } else if (miaInfo->groupId != pBlock->info.groupId) {
+ miaInfo->prefetchedBlock = pBlock;
+ break;
+ }
+
+ getTableScanInfo(pOperator, &iaInfo->order, &scanFlag);
+ setInputDataBlock(pOperator, pExpSupp->pCtx, pBlock, iaInfo->order, scanFlag, true);
doMergeIntervalAggImpl(pOperator, &iaInfo->binfo.resultRowInfo, pBlock, scanFlag, pRes);
if (pRes->info.rows >= pOperator->resultInfo.threshold) {
@@ -3820,6 +4091,13 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
}
pRes->info.groupId = miaInfo->groupId;
+ } else {
+ void* p = taosHashIterate(miaInfo->groupIntervalHash, NULL);
+ if (p != NULL) {
+ size_t len = 0;
+ uint64_t* pKey = taosHashGetKey(p, &len);
+ outputPrevIntervalResult(pOperator, *pKey, pRes, NULL);
+ }
}
if (pRes->info.rows == 0) {
@@ -3841,29 +4119,30 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SExprI
}
SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
- SExprSupp* pSup = &pOperator->exprSupp;
- iaInfo->win = pTaskInfo->window;
- iaInfo->order = TSDB_ORDER_ASC;
- iaInfo->interval = *pInterval;
+ iaInfo->win = pTaskInfo->window;
+ iaInfo->order = TSDB_ORDER_ASC;
+ iaInfo->interval = *pInterval;
iaInfo->execModel = pTaskInfo->execModel;
+
iaInfo->primaryTsIndex = primaryTsSlotId;
+ SExprSupp* pExprSupp = &pOperator->exprSupp;
+
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
initResultSizeInfo(pOperator, 4096);
- int32_t code = initAggInfo(&pOperator->exprSupp, &iaInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
+ int32_t code = initAggInfo(pExprSupp, &iaInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
initBasicInfo(&iaInfo->binfo, pResBlock);
initExecTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &iaInfo->win);
- iaInfo->timeWindowInterpo = timeWindowinterpNeeded(pSup->pCtx, numOfCols, iaInfo);
+ iaInfo->timeWindowInterpo = timeWindowinterpNeeded(pExprSupp->pCtx, numOfCols, iaInfo);
if (iaInfo->timeWindowInterpo) {
iaInfo->binfo.resultRowInfo.openWindow = tdListNew(sizeof(SResultRowPosition));
- }
-
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
+ if (iaInfo->binfo.resultRowInfo.openWindow == NULL) {
+ goto _error;
+ }
}
initResultRowInfo(&iaInfo->binfo.resultRowInfo);
@@ -3893,4 +4172,4 @@ _error:
taosMemoryFreeClear(pOperator);
pTaskInfo->code = code;
return NULL;
-}
+}
\ No newline at end of file
diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c
index 581935514e..1dd72fd83f 100644
--- a/source/libs/executor/src/tsort.c
+++ b/source/libs/executor/src/tsort.c
@@ -86,6 +86,7 @@ SSortHandle* tsortCreateSortHandle(SArray* pSortInfo, int32_t type, int32_t page
pSortHandle->pOrderedSource = taosArrayInit(4, POINTER_BYTES);
pSortHandle->cmpParam.orderInfo = pSortInfo;
+ pSortHandle->cmpParam.cmpGroupId = false;
tsortSetComparFp(pSortHandle, msortComparFn);
@@ -374,6 +375,12 @@ int32_t msortComparFn(const void *pLeft, const void *pRight, void *param) {
SSDataBlock* pLeftBlock = pLeftSource->src.pBlock;
SSDataBlock* pRightBlock = pRightSource->src.pBlock;
+ if (pParam->cmpGroupId) {
+ if (pLeftBlock->info.groupId != pRightBlock->info.groupId) {
+ return pLeftBlock->info.groupId < pRightBlock->info.groupId ? -1 : 1;
+ }
+ }
+
for(int32_t i = 0; i < pInfo->size; ++i) {
SBlockOrderInfo* pOrder = TARRAY_GET_ELEM(pInfo, i);
SColumnInfoData* pLeftColInfoData = TARRAY_GET_ELEM(pLeftBlock->pDataBlock, pOrder->slotId);
@@ -680,6 +687,11 @@ int32_t tsortSetComparFp(SSortHandle* pHandle, _sort_merge_compar_fn_t fp) {
return TSDB_CODE_SUCCESS;
}
+int32_t tsortSetCompareGroupId(SSortHandle* pHandle, bool compareGroupId) {
+ pHandle->cmpParam.cmpGroupId = compareGroupId;
+ return TSDB_CODE_SUCCESS;
+}
+
STupleHandle* tsortNextTuple(SSortHandle* pHandle) {
if (pHandle->cmpParam.numOfSources == pHandle->numOfCompletedSources) {
return NULL;
diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c
index 076ae61460..1164b96262 100644
--- a/source/libs/function/src/builtinsimpl.c
+++ b/source/libs/function/src/builtinsimpl.c
@@ -195,13 +195,13 @@ typedef struct SMavgInfo {
} SMavgInfo;
typedef struct SSampleInfo {
- int32_t samples;
- int32_t totalPoints;
- int32_t numSampled;
- uint8_t colType;
- int16_t colBytes;
- char* data;
- int64_t* timestamp;
+ int32_t samples;
+ int32_t totalPoints;
+ int32_t numSampled;
+ uint8_t colType;
+ int16_t colBytes;
+ char* data;
+ STuplePos* tuplePos;
} SSampleInfo;
typedef struct STailItem {
@@ -1844,9 +1844,8 @@ int32_t leastSQRFunction(SqlFunctionCtx* pCtx) {
}
numOfElem++;
LEASTSQR_CAL(param, x, plist, i, pInfo->stepVal);
-
- break;
}
+ break;
}
case TSDB_DATA_TYPE_SMALLINT: {
int16_t* plist = (int16_t*)pCol->pData;
@@ -1871,7 +1870,6 @@ int32_t leastSQRFunction(SqlFunctionCtx* pCtx) {
numOfElem++;
LEASTSQR_CAL(param, x, plist, i, pInfo->stepVal);
}
-
break;
}
@@ -4350,7 +4348,7 @@ bool getSampleFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pFunc->pParameterList, 0);
SValueNode* pVal = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
int32_t numOfSamples = pVal->datum.i;
- pEnv->calcMemSize = sizeof(SSampleInfo) + numOfSamples * (pCol->node.resType.bytes + sizeof(int64_t));
+ pEnv->calcMemSize = sizeof(SSampleInfo) + numOfSamples * (pCol->node.resType.bytes + sizeof(STuplePos));
return true;
}
@@ -4371,25 +4369,30 @@ bool sampleFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo)
return false;
}
pInfo->data = (char*)pInfo + sizeof(SSampleInfo);
- pInfo->timestamp = (int64_t*)((char*)pInfo + sizeof(SSampleInfo) + pInfo->samples * pInfo->colBytes);
+ pInfo->tuplePos = (STuplePos*)((char*)pInfo + sizeof(SSampleInfo) + pInfo->samples * pInfo->colBytes);
return true;
}
-static void sampleAssignResult(SSampleInfo* pInfo, char* data, TSKEY ts, int32_t index) {
+static void sampleAssignResult(SSampleInfo* pInfo, char* data, int32_t index) {
assignVal(pInfo->data + index * pInfo->colBytes, data, pInfo->colBytes, pInfo->colType);
- *(pInfo->timestamp + index) = ts;
}
-static void doReservoirSample(SSampleInfo* pInfo, char* data, TSKEY ts, int32_t index) {
+static void doReservoirSample(SqlFunctionCtx* pCtx, SSampleInfo* pInfo, char* data, int32_t index) {
pInfo->totalPoints++;
if (pInfo->numSampled < pInfo->samples) {
- sampleAssignResult(pInfo, data, ts, pInfo->numSampled);
+ sampleAssignResult(pInfo, data, pInfo->numSampled);
+ if (pCtx->subsidiaries.num > 0) {
+ saveTupleData(pCtx, index, pCtx->pSrcBlock, pInfo->tuplePos + pInfo->numSampled * sizeof(STuplePos));
+ }
pInfo->numSampled++;
} else {
int32_t j = taosRand() % (pInfo->totalPoints);
if (j < pInfo->samples) {
- sampleAssignResult(pInfo, data, ts, j);
+ sampleAssignResult(pInfo, data, j);
+ if (pCtx->subsidiaries.num > 0) {
+ copyTupleData(pCtx, index, pCtx->pSrcBlock, pInfo->tuplePos + j * sizeof(STuplePos));
+ }
}
}
}
@@ -4400,11 +4403,6 @@ int32_t sampleFunction(SqlFunctionCtx* pCtx) {
SInputColumnInfoData* pInput = &pCtx->input;
- TSKEY* tsList = NULL;
- if (pInput->pPTS != NULL) {
- tsList = (int64_t*)pInput->pPTS->pData;
- }
-
SColumnInfoData* pInputCol = pInput->pData[0];
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
if (colDataIsNull_s(pInputCol, i)) {
@@ -4412,7 +4410,7 @@ int32_t sampleFunction(SqlFunctionCtx* pCtx) {
}
char* data = colDataGetData(pInputCol, i);
- doReservoirSample(pInfo, data, /*tsList[i]*/ 0, i);
+ doReservoirSample(pCtx, pInfo, data, i);
}
SET_VAL(pResInfo, pInfo->numSampled, pInfo->numSampled);
@@ -4431,6 +4429,7 @@ int32_t sampleFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
int32_t currentRow = pBlock->info.rows;
for (int32_t i = 0; i < pInfo->numSampled; ++i) {
colDataAppend(pCol, currentRow + i, pInfo->data + i * pInfo->colBytes, false);
+ setSelectivityValue(pCtx, pBlock, pInfo->tuplePos + i * sizeof(STuplePos), currentRow + i);
}
return pInfo->numSampled;
diff --git a/source/libs/function/src/functionMgt.c b/source/libs/function/src/functionMgt.c
index 710b01ce59..5fcf5e239c 100644
--- a/source/libs/function/src/functionMgt.c
+++ b/source/libs/function/src/functionMgt.c
@@ -186,6 +186,13 @@ bool fmIsInterpFunc(int32_t funcId) {
return FUNCTION_TYPE_INTERP == funcMgtBuiltins[funcId].type;
}
+bool fmIsLastRowFunc(int32_t funcId) {
+ if (funcId < 0 || funcId >= funcMgtBuiltinsNum) {
+ return false;
+ }
+ return FUNCTION_TYPE_LAST_ROW == funcMgtBuiltins[funcId].type;
+}
+
void fmFuncMgtDestroy() {
void* m = gFunMgtService.pFuncNameHashTable;
if (m != NULL && atomic_val_compare_exchange_ptr((void**)&gFunMgtService.pFuncNameHashTable, m, 0) == m) {
diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c
index f6ae027e48..f6370be6f4 100644
--- a/source/libs/function/src/tudf.c
+++ b/source/libs/function/src/tudf.c
@@ -467,7 +467,7 @@ int32_t getUdfdPipeName(char* pipeName, int32_t size) {
dnodeId[0] = '1';
}
#ifdef _WIN32
- snprintf(pipeName, size, "%s%s", UDF_LISTEN_PIPE_NAME_PREFIX, dnodeId);
+ snprintf(pipeName, size, "%s.%x.%s", UDF_LISTEN_PIPE_NAME_PREFIX,MurmurHash3_32(tsDataDir, strlen(tsDataDir)), dnodeId);
#else
snprintf(pipeName, size, "%s/%s%s", tsDataDir, UDF_LISTEN_PIPE_NAME_PREFIX, dnodeId);
#endif
diff --git a/source/libs/index/src/index.c b/source/libs/index/src/index.c
index 04d7e04b30..d6d55c6be0 100644
--- a/source/libs/index/src/index.c
+++ b/source/libs/index/src/index.c
@@ -35,12 +35,12 @@
#define INDEX_DATA_BOOL_NULL 0x02
#define INDEX_DATA_TINYINT_NULL 0x80
#define INDEX_DATA_SMALLINT_NULL 0x8000
-#define INDEX_DATA_INT_NULL 0x80000000L
-#define INDEX_DATA_BIGINT_NULL 0x8000000000000000L
+#define INDEX_DATA_INT_NULL 0x80000000LL
+#define INDEX_DATA_BIGINT_NULL 0x8000000000000000LL
#define INDEX_DATA_TIMESTAMP_NULL TSDB_DATA_BIGINT_NULL
#define INDEX_DATA_FLOAT_NULL 0x7FF00000 // it is an NAN
-#define INDEX_DATA_DOUBLE_NULL 0x7FFFFF0000000000L // an NAN
+#define INDEX_DATA_DOUBLE_NULL 0x7FFFFF0000000000LL // an NAN
#define INDEX_DATA_NCHAR_NULL 0xFFFFFFFF
#define INDEX_DATA_BINARY_NULL 0xFF
#define INDEX_DATA_JSON_NULL 0xFFFFFFFF
diff --git a/source/libs/index/src/indexComm.c b/source/libs/index/src/indexComm.c
index 99b49f97bd..383d47e9c1 100644
--- a/source/libs/index/src/indexComm.c
+++ b/source/libs/index/src/indexComm.c
@@ -25,12 +25,12 @@
#define INDEX_DATA_BOOL_NULL 0x02
#define INDEX_DATA_TINYINT_NULL 0x80
#define INDEX_DATA_SMALLINT_NULL 0x8000
-#define INDEX_DATA_INT_NULL 0x80000000L
-#define INDEX_DATA_BIGINT_NULL 0x8000000000000000L
+#define INDEX_DATA_INT_NULL 0x80000000LL
+#define INDEX_DATA_BIGINT_NULL 0x8000000000000000LL
#define INDEX_DATA_TIMESTAMP_NULL TSDB_DATA_BIGINT_NULL
#define INDEX_DATA_FLOAT_NULL 0x7FF00000 // it is an NAN
-#define INDEX_DATA_DOUBLE_NULL 0x7FFFFF0000000000L // an NAN
+#define INDEX_DATA_DOUBLE_NULL 0x7FFFFF0000000000LL // an NAN
#define INDEX_DATA_NCHAR_NULL 0xFFFFFFFF
#define INDEX_DATA_BINARY_NULL 0xFF
#define INDEX_DATA_JSON_NULL 0xFFFFFFFF
diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c
index 101edbd38d..05eaa88a83 100644
--- a/source/libs/nodes/src/nodesCloneFuncs.c
+++ b/source/libs/nodes/src/nodesCloneFuncs.c
@@ -558,6 +558,14 @@ static SNode* physiSessionCopy(const SSessionWinodwPhysiNode* pSrc, SSessionWino
return (SNode*)pDst;
}
+static SNode* physiPartitionCopy(const SPartitionPhysiNode* pSrc, SPartitionPhysiNode* pDst) {
+ COPY_BASE_OBJECT_FIELD(node, physiNodeCopy);
+ CLONE_NODE_LIST_FIELD(pExprs);
+ CLONE_NODE_LIST_FIELD(pPartitionKeys);
+ CLONE_NODE_LIST_FIELD(pTargets);
+ return (SNode*)pDst;
+}
+
static SNode* dataBlockDescCopy(const SDataBlockDescNode* pSrc, SDataBlockDescNode* pDst) {
COPY_SCALAR_FIELD(dataBlockId);
CLONE_NODE_LIST_FIELD(pSlots);
@@ -695,7 +703,7 @@ SNode* nodesCloneNode(const SNode* pNode) {
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
return physiSysTableScanCopy((const SSystemTableScanPhysiNode*)pNode, (SSystemTableScanPhysiNode*)pDst);
case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
- case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL:
+ case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL:
@@ -703,6 +711,8 @@ SNode* nodesCloneNode(const SNode* pNode) {
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION:
return physiSessionCopy((const SSessionWinodwPhysiNode*)pNode, (SSessionWinodwPhysiNode*)pDst);
+ case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
+ return physiPartitionCopy((const SPartitionPhysiNode*)pNode, (SPartitionPhysiNode*)pDst);
default:
break;
}
diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c
index 9b634d68d5..5c5c62d915 100644
--- a/source/libs/nodes/src/nodesCodeFuncs.c
+++ b/source/libs/nodes/src/nodesCodeFuncs.c
@@ -220,6 +220,8 @@ const char* nodesNodeName(ENodeType type) {
return "PhysiSystemTableScan";
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
return "PhysiBlockDistScan";
+ case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
+ return "PhysiLastRowScan";
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
return "PhysiProject";
case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
@@ -234,8 +236,8 @@ const char* nodesNodeName(ENodeType type) {
return "PhysiSort";
case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
return "PhysiHashInterval";
- case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL:
- return "PhysiMergeInterval";
+ case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
+ return "PhysiMergeAlignedInterval";
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
return "PhysiStreamInterval";
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
@@ -4112,6 +4114,7 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
return logicPlanToJson(pObj, pJson);
case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
+ case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
return physiTagScanNodeToJson(pObj, pJson);
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
@@ -4132,7 +4135,7 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
case QUERY_NODE_PHYSICAL_PLAN_SORT:
return physiSortNodeToJson(pObj, pJson);
case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
- case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL:
+ case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL:
@@ -4252,6 +4255,7 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
return jsonToLogicPlan(pJson, pObj);
case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
+ case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
return jsonToPhysiTagScanNode(pJson, pObj);
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
@@ -4272,7 +4276,7 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
case QUERY_NODE_PHYSICAL_PLAN_SORT:
return jsonToPhysiSortNode(pJson, pObj);
case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
- case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL:
+ case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL:
diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c
index 0a7a203e23..54fdf4acfe 100644
--- a/source/libs/nodes/src/nodesUtilFuncs.c
+++ b/source/libs/nodes/src/nodesUtilFuncs.c
@@ -273,6 +273,8 @@ SNode* nodesMakeNode(ENodeType type) {
return makeNode(type, sizeof(SSystemTableScanPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
return makeNode(type, sizeof(SBlockDistScanPhysiNode));
+ case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
+ return makeNode(type, sizeof(SLastRowScanPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
return makeNode(type, sizeof(SProjectPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
@@ -287,8 +289,8 @@ SNode* nodesMakeNode(ENodeType type) {
return makeNode(type, sizeof(SSortPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
return makeNode(type, sizeof(SIntervalPhysiNode));
- case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL:
- return makeNode(type, sizeof(SMergeIntervalPhysiNode));
+ case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
+ return makeNode(type, sizeof(SMergeAlignedIntervalPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
return makeNode(type, sizeof(SStreamIntervalPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
@@ -655,7 +657,7 @@ void nodesDestroyNode(SNode* pNode) {
break;
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
- taosMemoryFreeClear(((SShowCreateTableStmt*)pNode)->pMeta);
+ taosMemoryFreeClear(((SShowCreateTableStmt*)pNode)->pCfg);
break;
case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT: // no pointer field
case QUERY_NODE_KILL_CONNECTION_STMT: // no pointer field
@@ -787,6 +789,7 @@ void nodesDestroyNode(SNode* pNode) {
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
+ case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
destroyScanPhysiNode((SScanPhysiNode*)pNode);
break;
case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
@@ -831,7 +834,7 @@ void nodesDestroyNode(SNode* pNode) {
break;
}
case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
- case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL:
+ case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL:
diff --git a/source/libs/parser/inc/parUtil.h b/source/libs/parser/inc/parUtil.h
index e08f813c19..d06d6ec527 100644
--- a/source/libs/parser/inc/parUtil.h
+++ b/source/libs/parser/inc/parUtil.h
@@ -47,6 +47,7 @@ typedef struct SParseMetaCache {
SHashObj* pUserAuth; // key is SUserAuthInfo serialized string, element is bool indicating whether or not to pass
SHashObj* pUdf; // key is funcName, element is SFuncInfo*
SHashObj* pTableIndex; // key is tbFName, element is SArray*
+ SHashObj* pTableCfg; // key is tbFName, element is STableCfg*
SArray* pDnodes; // element is SEpSet
bool dnodeRequired;
} SParseMetaCache;
@@ -79,6 +80,7 @@ int32_t reserveUserAuthInCache(int32_t acctId, const char* pUser, const char* pD
int32_t reserveUserAuthInCacheExt(const char* pUser, const SName* pName, AUTH_TYPE type, SParseMetaCache* pMetaCache);
int32_t reserveUdfInCache(const char* pFunc, SParseMetaCache* pMetaCache);
int32_t reserveTableIndexInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
+int32_t reserveTableCfgInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
int32_t reserveDnodeRequiredInCache(SParseMetaCache* pMetaCache);
int32_t getTableMetaFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta);
int32_t getDbVgInfoFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, SArray** pVgInfo);
@@ -90,6 +92,7 @@ int32_t getUserAuthFromCache(SParseMetaCache* pMetaCache, const char* pUser, con
bool* pPass);
int32_t getUdfInfoFromCache(SParseMetaCache* pMetaCache, const char* pFunc, SFuncInfo* pInfo);
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes);
+int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput);
int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes);
void destoryParseMetaCache(SParseMetaCache* pMetaCache);
diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y
index 54c46ecb5d..16a78712ed 100644
--- a/source/libs/parser/inc/sql.y
+++ b/source/libs/parser/inc/sql.y
@@ -757,8 +757,9 @@ boolean_primary(A) ::= NK_LP(C) boolean_value_expression(B) NK_RP(D).
common_expression(A) ::= expression(B). { A = B; }
common_expression(A) ::= boolean_value_expression(B). { A = B; }
-/************************************************ from_clause *********************************************************/
-from_clause(A) ::= FROM table_reference_list(B). { A = B; }
+/************************************************ from_clause_opt *********************************************************/
+from_clause_opt(A) ::= . { A = NULL; }
+from_clause_opt(A) ::= FROM table_reference_list(B). { A = B; }
table_reference_list(A) ::= table_reference(B). { A = B; }
table_reference_list(A) ::= table_reference_list(B) NK_COMMA table_reference(C). { A = createJoinTableNode(pCxt, JOIN_TYPE_INNER, B, C, NULL); }
@@ -792,9 +793,9 @@ join_type(A) ::= INNER.
/************************************************ query_specification *************************************************/
query_specification(A) ::=
- SELECT set_quantifier_opt(B) select_list(C) from_clause(D) where_clause_opt(E)
- partition_by_clause_opt(F) range_opt(J) every_opt(K) fill_opt(L) twindow_clause_opt(G)
- group_by_clause_opt(H) having_clause_opt(I). {
+ SELECT set_quantifier_opt(B) select_list(C) from_clause_opt(D)
+ where_clause_opt(E) partition_by_clause_opt(F) range_opt(J) every_opt(K)
+ fill_opt(L) twindow_clause_opt(G) group_by_clause_opt(H) having_clause_opt(I). {
A = createSelectStmt(pCxt, B, C, D);
A = addWhereClause(pCxt, A, E);
A = addPartitionByClause(pCxt, A, F);
diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c
index 131eccae24..46d2ae8383 100644
--- a/source/libs/parser/src/parAstParser.c
+++ b/source/libs/parser/src/parAstParser.c
@@ -411,7 +411,14 @@ static int32_t collectMetaKeyFromShowCreateDatabase(SCollectMetaKeyCxt* pCxt, SS
}
static int32_t collectMetaKeyFromShowCreateTable(SCollectMetaKeyCxt* pCxt, SShowCreateTableStmt* pStmt) {
- return reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
+ SName name = {.type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId};
+ strcpy(name.dbname, pStmt->dbName);
+ strcpy(name.tname, pStmt->tableName);
+ int32_t code = catalogRemoveTableMeta(pCxt->pParseCxt->pCatalog, &name);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = reserveTableCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
+ }
+ return code;
}
static int32_t collectMetaKeyFromShowApps(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
diff --git a/source/libs/parser/src/parCalcConst.c b/source/libs/parser/src/parCalcConst.c
index 22d7afd642..0dfc79269e 100644
--- a/source/libs/parser/src/parCalcConst.c
+++ b/source/libs/parser/src/parCalcConst.c
@@ -227,12 +227,16 @@ static int32_t calcConstGroupBy(SCalcConstContext* pCxt, SSelectStmt* pSelect) {
}
}
}
- DESTORY_LIST(pSelect->pGroupByList);
+ NODES_DESTORY_LIST(pSelect->pGroupByList);
}
return code;
}
-static int32_t calcConstSelect(SCalcConstContext* pCxt, SSelectStmt* pSelect, bool subquery) {
+static int32_t calcConstSelectWithoutFrom(SCalcConstContext* pCxt, SSelectStmt* pSelect, bool subquery) {
+ return calcConstProjections(pCxt, pSelect, subquery);
+}
+
+static int32_t calcConstSelectFrom(SCalcConstContext* pCxt, SSelectStmt* pSelect, bool subquery) {
int32_t code = calcConstFromTable(pCxt, pSelect->pFromTable);
if (TSDB_CODE_SUCCESS == code) {
code = calcConstProjections(pCxt, pSelect, subquery);
@@ -258,6 +262,14 @@ static int32_t calcConstSelect(SCalcConstContext* pCxt, SSelectStmt* pSelect, bo
return code;
}
+static int32_t calcConstSelect(SCalcConstContext* pCxt, SSelectStmt* pSelect, bool subquery) {
+ if (NULL == pSelect->pFromTable) {
+ return calcConstSelectWithoutFrom(pCxt, pSelect, subquery);
+ } else {
+ return calcConstSelectFrom(pCxt, pSelect, subquery);
+ }
+}
+
static int32_t calcConstDelete(SCalcConstContext* pCxt, SDeleteStmt* pDelete) {
int32_t code = calcConstFromTable(pCxt, pDelete->pFromTable);
if (TSDB_CODE_SUCCESS == code) {
diff --git a/source/libs/parser/src/parInsert.c b/source/libs/parser/src/parInsert.c
index c8b78fcc8b..5d34250444 100644
--- a/source/libs/parser/src/parInsert.c
+++ b/source/libs/parser/src/parInsert.c
@@ -257,7 +257,7 @@ static int32_t checkAuth(SInsertParseContext* pCxt, char* pDbFname, bool* pPass)
if (pBasicCtx->async) {
return getUserAuthFromCache(pCxt->pMetaCache, pBasicCtx->pUser, pDbFname, AUTH_TYPE_WRITE, pPass);
}
- SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
+ SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
.requestId = pBasicCtx->requestId,
.requestObjRefId = pBasicCtx->requestRid,
.mgmtEps = pBasicCtx->mgmtEpSet};
@@ -270,11 +270,11 @@ static int32_t getTableSchema(SInsertParseContext* pCxt, SName* pTbName, bool is
if (pBasicCtx->async) {
return getTableMetaFromCache(pCxt->pMetaCache, pTbName, pTableMeta);
}
- SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
+ SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
.requestId = pBasicCtx->requestId,
.requestObjRefId = pBasicCtx->requestRid,
.mgmtEps = pBasicCtx->mgmtEpSet};
-
+
if (isStb) {
return catalogGetSTableMeta(pBasicCtx->pCatalog, &conn, pTbName, pTableMeta);
}
@@ -286,7 +286,7 @@ static int32_t getTableVgroup(SInsertParseContext* pCxt, SName* pTbName, SVgroup
if (pBasicCtx->async) {
return getTableVgroupFromCache(pCxt->pMetaCache, pTbName, pVg);
}
- SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
+ SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
.requestId = pBasicCtx->requestId,
.requestObjRefId = pBasicCtx->requestRid,
.mgmtEps = pBasicCtx->mgmtEpSet};
@@ -322,7 +322,7 @@ static int32_t getDBCfg(SInsertParseContext* pCxt, const char* pDbFName, SDbCfgI
if (pBasicCtx->async) {
CHECK_CODE(getDbCfgFromCache(pCxt->pMetaCache, pDbFName, pInfo));
} else {
- SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
+ SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
.requestId = pBasicCtx->requestId,
.requestObjRefId = pBasicCtx->requestRid,
.mgmtEps = pBasicCtx->mgmtEpSet};
@@ -1081,15 +1081,6 @@ end:
return code;
}
-static int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
- *pDst = taosMemoryMalloc(TABLE_META_SIZE(pSrc));
- if (NULL == *pDst) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
- }
- memcpy(*pDst, pSrc, TABLE_META_SIZE(pSrc));
- return TSDB_CODE_SUCCESS;
-}
-
static int32_t storeTableMeta(SInsertParseContext* pCxt, SHashObj* pHash, SName* pTableName, const char* pName,
int32_t len, STableMeta* pMeta) {
SVgroupInfo vg;
@@ -1315,15 +1306,6 @@ static void destroyInsertParseContext(SInsertParseContext* pCxt) {
destroyBlockArrayList(pCxt->pVgDataBlocks);
}
-static int32_t checkSchemalessDb(SInsertParseContext* pCxt, char* pDbName) {
-// SDbCfgInfo pInfo = {0};
-// char fullName[TSDB_TABLE_FNAME_LEN];
-// snprintf(fullName, sizeof(fullName), "%d.%s", pCxt->pComCxt->acctId, pDbName);
-// CHECK_CODE(getDBCfg(pCxt, fullName, &pInfo));
-// return pInfo.schemaless ? TSDB_CODE_SML_INVALID_DB_CONF : TSDB_CODE_SUCCESS;
- return TSDB_CODE_SUCCESS;
-}
-
// tb_name
// [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
// [(field1_name, ...)]
@@ -1377,8 +1359,6 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) {
SName name;
CHECK_CODE(createSName(&name, &tbnameToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg));
- CHECK_CODE(checkSchemalessDb(pCxt, name.dbname));
-
tNameExtractFullName(&name, tbFName);
CHECK_CODE(taosHashPut(pCxt->pTableNameHashObj, tbFName, strlen(tbFName), &name, sizeof(SName)));
char dbFName[TSDB_DB_FNAME_LEN];
diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c
index 1689fbd5dd..30c67b958c 100644
--- a/source/libs/parser/src/parTranslater.c
+++ b/source/libs/parser/src/parTranslater.c
@@ -133,6 +133,30 @@ static int32_t getTableMeta(STranslateContext* pCxt, const char* pDbName, const
return getTableMetaImpl(pCxt, toName(pCxt->pParseCxt->acctId, pDbName, pTableName, &name), pMeta);
}
+static int32_t getTableCfg(STranslateContext* pCxt, const SName* pName, STableCfg** pCfg) {
+ SParseContext* pParCxt = pCxt->pParseCxt;
+ int32_t code = collectUseDatabase(pName, pCxt->pDbs);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = collectUseTable(pName, pCxt->pTables);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ if (pParCxt->async) {
+ code = getTableCfgFromCache(pCxt->pMetaCache, pName, pCfg);
+ } else {
+ SRequestConnInfo conn = {.pTrans = pParCxt->pTransporter,
+ .requestId = pParCxt->requestId,
+ .requestObjRefId = pParCxt->requestRid,
+ .mgmtEps = pParCxt->mgmtEpSet};
+ code = catalogRefreshGetTableCfg(pParCxt->pCatalog, &conn, pName, pCfg);
+ }
+ }
+ if (TSDB_CODE_SUCCESS != code) {
+ parserError("catalogRefreshGetTableCfg error, code:%s, dbName:%s, tbName:%s", tstrerror(code), pName->dbname,
+ pName->tname);
+ }
+ return code;
+}
+
static int32_t refreshGetTableMeta(STranslateContext* pCxt, const char* pDbName, const char* pTableName,
STableMeta** pMeta) {
SParseContext* pParCxt = pCxt->pParseCxt;
@@ -665,6 +689,10 @@ static EDealRes translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** p
}
static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) {
+ if (NULL != pCxt->pCurrSelectStmt && NULL == pCxt->pCurrSelectStmt->pFromTable) {
+ return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_COLUMN, (*pCol)->colName);
+ }
+
// count(*)/first(*)/last(*) and so on
if (0 == strcmp((*pCol)->colName, "*")) {
return DEAL_RES_CONTINUE;
@@ -1176,6 +1204,7 @@ static void setFuncClassification(SSelectStmt* pSelect, SFunctionNode* pFunc) {
pSelect->hasUniqueFunc = pSelect->hasUniqueFunc ? true : (FUNCTION_TYPE_UNIQUE == pFunc->funcType);
pSelect->hasTailFunc = pSelect->hasTailFunc ? true : (FUNCTION_TYPE_TAIL == pFunc->funcType);
pSelect->hasInterpFunc = pSelect->hasInterpFunc ? true : (FUNCTION_TYPE_INTERP == pFunc->funcType);
+ pSelect->hasLastRowFunc = pSelect->hasLastRowFunc ? true : (FUNCTION_TYPE_LAST_ROW == pFunc->funcType);
}
}
@@ -2005,9 +2034,9 @@ static int32_t checkFill(STranslateContext* pCxt, SFillNode* pFill, SValueNode*
if (TIME_IS_VAR_DURATION(pInterval->unit)) {
int64_t f = 1;
if (pInterval->unit == 'n') {
- f = 30L * MILLISECOND_PER_DAY;
+ f = 30LL * MILLISECOND_PER_DAY;
} else if (pInterval->unit == 'y') {
- f = 365L * MILLISECOND_PER_DAY;
+ f = 365LL * MILLISECOND_PER_DAY;
}
intervalRange = pInterval->datum.i * f;
} else {
@@ -2465,7 +2494,13 @@ static int32_t replaceOrderByAlias(STranslateContext* pCxt, SNodeList* pProjecti
return pCxt->errCode;
}
-static int32_t translateSelect(STranslateContext* pCxt, SSelectStmt* pSelect) {
+static int32_t translateSelectWithoutFrom(STranslateContext* pCxt, SSelectStmt* pSelect) {
+ pCxt->pCurrSelectStmt = pSelect;
+ pCxt->currClause = SQL_CLAUSE_SELECT;
+ return translateExprList(pCxt, pSelect->pProjectionList);
+}
+
+static int32_t translateSelectFrom(STranslateContext* pCxt, SSelectStmt* pSelect) {
pCxt->pCurrSelectStmt = pSelect;
int32_t code = translateFrom(pCxt, pSelect->pFromTable);
if (TSDB_CODE_SUCCESS == code) {
@@ -2514,6 +2549,14 @@ static int32_t translateSelect(STranslateContext* pCxt, SSelectStmt* pSelect) {
return code;
}
+static int32_t translateSelect(STranslateContext* pCxt, SSelectStmt* pSelect) {
+ if (NULL == pSelect->pFromTable) {
+ return translateSelectWithoutFrom(pCxt, pSelect);
+ } else {
+ return translateSelectFrom(pCxt, pSelect);
+ }
+}
+
static SNode* createSetOperProject(const char* pTableAlias, SNode* pNode) {
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
if (NULL == pCol) {
@@ -2666,7 +2709,7 @@ static int64_t getUnitPerMinute(uint8_t precision) {
case TSDB_TIME_PRECISION_MILLI:
return MILLISECOND_PER_MINUTE;
case TSDB_TIME_PRECISION_MICRO:
- return MILLISECOND_PER_MINUTE * 1000L;
+ return MILLISECOND_PER_MINUTE * 1000LL;
case TSDB_TIME_PRECISION_NANO:
return NANOSECOND_PER_MINUTE;
default:
@@ -3503,13 +3546,24 @@ static int32_t buildRollupAst(STranslateContext* pCxt, SCreateTableStmt* pStmt,
return code;
}
+static int32_t buildRollupFuncs(SNodeList* pFuncs, SArray** pArray) {
+ if (NULL == pFuncs) {
+ return TSDB_CODE_SUCCESS;
+ }
+ *pArray = taosArrayInit(LIST_LENGTH(pFuncs), TSDB_FUNC_NAME_LEN);
+ SNode* pNode;
+ FOREACH(pNode, pFuncs) {
+ taosArrayPush(*pArray, ((SFunctionNode*)pNode)->functionName);
+ }
+ return TSDB_CODE_SUCCESS;
+}
+
static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStmt, SMCreateStbReq* pReq) {
pReq->igExists = pStmt->ignoreExists;
pReq->delay1 = pStmt->pOptions->maxDelay1;
pReq->delay2 = pStmt->pOptions->maxDelay2;
pReq->watermark1 = pStmt->pOptions->watermark1;
pReq->watermark2 = pStmt->pOptions->watermark2;
- // pReq->ttl = pStmt->pOptions->ttl;
columnDefNodeToField(pStmt->pCols, &pReq->pColumns);
columnDefNodeToField(pStmt->pTags, &pReq->pTags);
pReq->numOfColumns = LIST_LENGTH(pStmt->pCols);
@@ -3523,6 +3577,7 @@ static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStm
} else {
pReq->commentLen = -1;
}
+ buildRollupFuncs(pStmt->pOptions->pRollupFuncs, &pReq->pFuncs);
SName tableName;
tNameExtractFullName(toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &tableName), pReq->name);
@@ -4296,7 +4351,10 @@ static int32_t translateShowCreateDatabase(STranslateContext* pCxt, SShowCreateD
}
static int32_t translateShowCreateTable(STranslateContext* pCxt, SShowCreateTableStmt* pStmt) {
- return getTableMeta(pCxt, pStmt->dbName, pStmt->tableName, &pStmt->pMeta);
+ SName name;
+ toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &name);
+
+ return getTableCfg(pCxt, &name, (STableCfg**)&pStmt->pCfg);
}
static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c
index 51e0dd58d8..b474d95b3c 100644
--- a/source/libs/parser/src/parUtil.c
+++ b/source/libs/parser/src/parUtil.c
@@ -561,6 +561,9 @@ int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalog
if (TSDB_CODE_SUCCESS == code) {
code = buildTableReq(pMetaCache->pTableIndex, &pCatalogReq->pTableIndex);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = buildTableReq(pMetaCache->pTableCfg, &pCatalogReq->pTableCfg);
+ }
pCatalogReq->dNodeRequired = pMetaCache->dnodeRequired;
return code;
}
@@ -657,6 +660,9 @@ int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMet
if (TSDB_CODE_SUCCESS == code) {
code = putTableDataToCache(pCatalogReq->pTableIndex, pMetaData->pTableIndex, &pMetaCache->pTableIndex);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = putTableDataToCache(pCatalogReq->pTableCfg, pMetaData->pTableCfg, &pMetaCache->pTableCfg);
+ }
pMetaCache->pDnodes = pMetaData->pDnodeList;
return code;
}
@@ -863,6 +869,10 @@ int32_t reserveTableIndexInCache(int32_t acctId, const char* pDb, const char* pT
return reserveTableReqInCache(acctId, pDb, pTable, &pMetaCache->pTableIndex);
}
+int32_t reserveTableCfgInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache) {
+ return reserveTableReqInCache(acctId, pDb, pTable, &pMetaCache->pTableCfg);
+}
+
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes) {
char fullName[TSDB_TABLE_FNAME_LEN];
tNameExtractFullName(pName, fullName);
@@ -877,6 +887,41 @@ int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName,
return code;
}
+STableCfg* tableCfgDup(STableCfg* pCfg) {
+ STableCfg* pNew = taosMemoryMalloc(sizeof(*pNew));
+
+ memcpy(pNew, pCfg, sizeof(*pNew));
+ if (pNew->pComment) {
+ pNew->pComment = strdup(pNew->pComment);
+ }
+ if (pNew->pFuncs) {
+ pNew->pFuncs = taosArrayDup(pNew->pFuncs);
+ }
+
+ int32_t schemaSize = (pCfg->numOfColumns + pCfg->numOfTags) * sizeof(SSchema);
+
+ SSchema* pSchema = taosMemoryMalloc(schemaSize);
+ memcpy(pSchema, pCfg->pSchemas, schemaSize);
+
+ pNew->pSchemas = pSchema;
+
+ return pNew;
+}
+
+int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput) {
+ char fullName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(pName, fullName);
+ STableCfg* pCfg = NULL;
+ int32_t code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableCfg, (void**)&pCfg);
+ if (TSDB_CODE_SUCCESS == code) {
+ *pOutput = tableCfgDup(pCfg);
+ if (NULL == *pOutput) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ }
+ }
+ return code;
+}
+
int32_t reserveDnodeRequiredInCache(SParseMetaCache* pMetaCache) {
pMetaCache->dnodeRequired = true;
return TSDB_CODE_SUCCESS;
@@ -899,4 +944,5 @@ void destoryParseMetaCache(SParseMetaCache* pMetaCache) {
taosHashCleanup(pMetaCache->pUserAuth);
taosHashCleanup(pMetaCache->pUdf);
taosHashCleanup(pMetaCache->pTableIndex);
+ taosHashCleanup(pMetaCache->pTableCfg);
}
diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c
index c7651137b1..330cf67b22 100644
--- a/source/libs/parser/src/sql.c
+++ b/source/libs/parser/src/sql.c
@@ -139,16 +139,16 @@ typedef union {
#define ParseCTX_STORE
#define YYFALLBACK 1
#define YYNSTATE 641
-#define YYNRULE 466
+#define YYNRULE 467
#define YYNTOKEN 242
#define YY_MAX_SHIFT 640
#define YY_MIN_SHIFTREDUCE 933
-#define YY_MAX_SHIFTREDUCE 1398
-#define YY_ERROR_ACTION 1399
-#define YY_ACCEPT_ACTION 1400
-#define YY_NO_ACTION 1401
-#define YY_MIN_REDUCE 1402
-#define YY_MAX_REDUCE 1867
+#define YY_MAX_SHIFTREDUCE 1399
+#define YY_ERROR_ACTION 1400
+#define YY_ACCEPT_ACTION 1401
+#define YY_NO_ACTION 1402
+#define YY_MIN_REDUCE 1403
+#define YY_MAX_REDUCE 1869
/************* End control #defines *******************************************/
#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
@@ -217,226 +217,226 @@ typedef union {
*********** Begin parsing tables **********************************************/
#define YY_ACTTAB_COUNT (2192)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 1697, 1845, 1522, 309, 412, 1697, 413, 1434, 326, 1400,
- /* 10 */ 137, 1694, 37, 35, 1490, 1844, 1694, 1710, 417, 1842,
+ /* 0 */ 1698, 1847, 1523, 309, 412, 1698, 413, 1435, 326, 1401,
+ /* 10 */ 137, 1695, 37, 35, 1491, 1846, 1695, 1711, 417, 1844,
/* 20 */ 318, 556, 1208, 556, 1230, 38, 36, 34, 33, 32,
- /* 30 */ 325, 324, 109, 420, 109, 413, 1434, 1690, 1696, 451,
- /* 40 */ 1222, 456, 1690, 1696, 1726, 30, 240, 1206, 559, 1533,
- /* 50 */ 1793, 1533, 540, 559, 22, 556, 555, 1680, 14, 539,
- /* 60 */ 37, 35, 1335, 322, 1214, 1215, 157, 335, 318, 1710,
- /* 70 */ 1208, 134, 520, 365, 1790, 38, 36, 34, 33, 32,
- /* 80 */ 1535, 1, 1214, 1533, 1739, 67, 555, 85, 1711, 542,
- /* 90 */ 1713, 1714, 538, 58, 559, 1206, 1726, 1779, 113, 76,
- /* 100 */ 371, 292, 1775, 637, 519, 556, 14, 1528, 1845, 1680,
- /* 110 */ 1425, 539, 1214, 1845, 1845, 543, 369, 1277, 1278, 963,
- /* 120 */ 1526, 560, 152, 470, 555, 1631, 1842, 154, 152, 2,
- /* 130 */ 430, 1842, 1842, 1533, 206, 82, 1739, 290, 478, 86,
- /* 140 */ 1711, 542, 1713, 1714, 538, 1369, 559, 40, 118, 1779,
- /* 150 */ 1680, 637, 198, 311, 1775, 148, 1525, 967, 968, 1209,
+ /* 30 */ 325, 324, 109, 420, 109, 413, 1435, 1691, 1697, 451,
+ /* 40 */ 1222, 456, 1691, 1697, 1727, 30, 240, 1206, 559, 1534,
+ /* 50 */ 1795, 1534, 540, 559, 22, 556, 555, 1681, 14, 539,
+ /* 60 */ 37, 35, 1336, 322, 1214, 1215, 157, 335, 318, 1711,
+ /* 70 */ 1208, 134, 520, 365, 1792, 38, 36, 34, 33, 32,
+ /* 80 */ 1536, 1, 1214, 1534, 1740, 67, 555, 85, 1712, 542,
+ /* 90 */ 1714, 1715, 538, 58, 559, 1206, 1727, 1780, 113, 76,
+ /* 100 */ 371, 292, 1776, 637, 519, 556, 14, 1529, 1847, 1681,
+ /* 110 */ 1426, 539, 1214, 1847, 1847, 543, 369, 1277, 1278, 963,
+ /* 120 */ 1527, 560, 152, 470, 555, 1632, 1844, 154, 152, 2,
+ /* 130 */ 430, 1844, 1844, 1534, 206, 82, 1740, 290, 478, 86,
+ /* 140 */ 1712, 542, 1714, 1715, 538, 1370, 559, 40, 118, 1780,
+ /* 150 */ 1681, 637, 198, 311, 1776, 148, 1526, 967, 968, 1209,
/* 160 */ 58, 1207, 70, 328, 473, 1277, 1278, 232, 56, 467,
- /* 170 */ 364, 134, 363, 1233, 197, 495, 1806, 1223, 330, 1218,
- /* 180 */ 1535, 1578, 1580, 1212, 1213, 41, 1259, 1260, 1262, 1263,
+ /* 170 */ 364, 134, 363, 1233, 197, 495, 1808, 1223, 330, 1218,
+ /* 180 */ 1536, 1579, 1581, 1212, 1213, 41, 1259, 1260, 1262, 1263,
/* 190 */ 1264, 1265, 1266, 535, 557, 1274, 1275, 1276, 1279, 53,
- /* 200 */ 1232, 1226, 52, 1579, 1580, 26, 59, 1209, 1845, 1207,
+ /* 200 */ 1232, 1226, 52, 1580, 1581, 26, 59, 1209, 1847, 1207,
/* 210 */ 510, 155, 557, 1274, 1275, 38, 36, 34, 33, 32,
- /* 220 */ 37, 35, 153, 155, 1424, 1710, 1842, 402, 318, 67,
+ /* 220 */ 37, 35, 153, 155, 1425, 1711, 1844, 402, 318, 67,
/* 230 */ 1208, 1212, 1213, 302, 1259, 1260, 1262, 1263, 1264, 1265,
- /* 240 */ 1266, 535, 557, 1274, 1275, 1276, 1279, 516, 1726, 465,
- /* 250 */ 464, 1529, 1726, 489, 463, 1206, 509, 114, 460, 1668,
- /* 260 */ 540, 459, 458, 457, 1680, 1680, 14, 539, 37, 35,
+ /* 240 */ 1266, 535, 557, 1274, 1275, 1276, 1279, 516, 1727, 465,
+ /* 250 */ 464, 1530, 1727, 489, 463, 1206, 509, 114, 460, 1669,
+ /* 260 */ 540, 459, 458, 457, 1681, 1681, 14, 539, 37, 35,
/* 270 */ 1112, 1113, 1214, 166, 165, 117, 318, 155, 1208, 1299,
- /* 280 */ 520, 1511, 303, 58, 301, 300, 356, 453, 58, 2,
- /* 290 */ 155, 455, 1739, 508, 1845, 85, 1711, 542, 1713, 1714,
- /* 300 */ 538, 1304, 559, 1206, 344, 1779, 358, 354, 152, 292,
- /* 310 */ 1775, 637, 1842, 454, 115, 38, 36, 34, 33, 32,
- /* 320 */ 1214, 1845, 136, 1524, 1414, 1277, 1278, 1509, 518, 149,
- /* 330 */ 1786, 1787, 1233, 1791, 1694, 152, 27, 8, 430, 1842,
+ /* 280 */ 520, 1512, 303, 58, 301, 300, 356, 453, 58, 2,
+ /* 290 */ 155, 455, 1740, 508, 1847, 85, 1712, 542, 1714, 1715,
+ /* 300 */ 538, 1304, 559, 1206, 344, 1780, 358, 354, 152, 292,
+ /* 310 */ 1776, 637, 1844, 454, 115, 38, 36, 34, 33, 32,
+ /* 320 */ 1214, 1847, 136, 1525, 1415, 1277, 1278, 1510, 518, 149,
+ /* 330 */ 1788, 1789, 1233, 1793, 1695, 152, 27, 8, 430, 1844,
/* 340 */ 1070, 582, 581, 580, 1074, 579, 1076, 1077, 578, 1079,
- /* 350 */ 575, 1403, 1085, 572, 1087, 1088, 569, 566, 81, 637,
- /* 360 */ 1690, 1696, 38, 36, 34, 33, 32, 1209, 78, 1207,
- /* 370 */ 1359, 559, 99, 1277, 1278, 98, 97, 96, 95, 94,
- /* 380 */ 93, 92, 91, 90, 593, 1349, 38, 36, 34, 33,
+ /* 350 */ 575, 1404, 1085, 572, 1087, 1088, 569, 566, 81, 637,
+ /* 360 */ 1691, 1697, 38, 36, 34, 33, 32, 1209, 78, 1207,
+ /* 370 */ 1360, 559, 99, 1277, 1278, 98, 97, 96, 95, 94,
+ /* 380 */ 93, 92, 91, 90, 593, 1350, 38, 36, 34, 33,
/* 390 */ 32, 1212, 1213, 522, 1259, 1260, 1262, 1263, 1264, 1265,
- /* 400 */ 1266, 535, 557, 1274, 1275, 1276, 1279, 502, 1357, 1358,
- /* 410 */ 1360, 1361, 980, 155, 979, 1209, 99, 1207, 155, 98,
+ /* 400 */ 1266, 535, 557, 1274, 1275, 1276, 1279, 502, 1358, 1359,
+ /* 410 */ 1361, 1362, 980, 155, 979, 1209, 99, 1207, 155, 98,
/* 420 */ 97, 96, 95, 94, 93, 92, 91, 90, 37, 35,
- /* 430 */ 1280, 11, 10, 1710, 462, 461, 318, 162, 1208, 1212,
+ /* 430 */ 1280, 11, 10, 1711, 462, 461, 318, 162, 1208, 1212,
/* 440 */ 1213, 981, 1259, 1260, 1262, 1263, 1264, 1265, 1266, 535,
/* 450 */ 557, 1274, 1275, 1276, 1279, 38, 36, 34, 33, 32,
- /* 460 */ 1726, 479, 65, 1206, 1845, 64, 593, 155, 540, 980,
- /* 470 */ 147, 979, 1585, 1680, 1231, 539, 37, 35, 1843, 308,
- /* 480 */ 1214, 1461, 1842, 1572, 318, 1793, 1208, 1423, 1583, 1214,
- /* 490 */ 38, 36, 34, 33, 32, 1422, 449, 9, 981, 1234,
- /* 500 */ 1739, 1395, 1845, 87, 1711, 542, 1713, 1714, 538, 1789,
- /* 510 */ 559, 1206, 1311, 1779, 199, 134, 152, 1778, 1775, 637,
- /* 520 */ 1842, 543, 133, 1585, 1536, 1246, 1342, 1680, 1214, 321,
- /* 530 */ 323, 1630, 1232, 1277, 1278, 1680, 293, 609, 607, 1583,
- /* 540 */ 1421, 615, 614, 613, 333, 9, 612, 611, 610, 119,
+ /* 460 */ 1727, 479, 65, 1206, 1847, 64, 593, 155, 540, 980,
+ /* 470 */ 147, 979, 1586, 1681, 1231, 539, 37, 35, 1845, 308,
+ /* 480 */ 1214, 1462, 1844, 1573, 318, 1795, 1208, 1424, 1584, 1214,
+ /* 490 */ 38, 36, 34, 33, 32, 1423, 449, 9, 981, 1234,
+ /* 500 */ 1740, 1396, 1847, 87, 1712, 542, 1714, 1715, 538, 1791,
+ /* 510 */ 559, 1206, 1311, 1780, 199, 134, 152, 1779, 1776, 637,
+ /* 520 */ 1844, 543, 133, 1586, 1537, 1246, 1343, 1681, 1214, 321,
+ /* 530 */ 323, 1631, 1232, 1277, 1278, 1681, 293, 609, 607, 1584,
+ /* 540 */ 1422, 615, 614, 613, 333, 9, 612, 611, 610, 119,
/* 550 */ 605, 604, 603, 602, 601, 600, 599, 598, 127, 594,
- /* 560 */ 1246, 1402, 38, 36, 34, 33, 32, 637, 1297, 505,
- /* 570 */ 69, 291, 1285, 967, 968, 1209, 1420, 1207, 1232, 1419,
- /* 580 */ 1680, 1277, 1278, 1394, 28, 108, 107, 106, 105, 104,
+ /* 560 */ 1246, 1403, 38, 36, 34, 33, 32, 637, 1297, 505,
+ /* 570 */ 69, 291, 1285, 967, 968, 1209, 1421, 1207, 1232, 1420,
+ /* 580 */ 1681, 1277, 1278, 1395, 28, 108, 107, 106, 105, 104,
/* 590 */ 103, 102, 101, 100, 38, 36, 34, 33, 32, 1212,
- /* 600 */ 1213, 1510, 1259, 1260, 1262, 1263, 1264, 1265, 1266, 535,
- /* 610 */ 557, 1274, 1275, 1276, 1279, 556, 1680, 1585, 1585, 1680,
- /* 620 */ 1298, 331, 585, 1209, 329, 1207, 370, 231, 1518, 134,
- /* 630 */ 34, 33, 32, 1583, 1584, 1418, 37, 35, 1535, 511,
- /* 640 */ 506, 200, 1303, 1533, 318, 591, 1208, 1212, 1213, 1417,
+ /* 600 */ 1213, 1511, 1259, 1260, 1262, 1263, 1264, 1265, 1266, 535,
+ /* 610 */ 557, 1274, 1275, 1276, 1279, 556, 1681, 1586, 1586, 1681,
+ /* 620 */ 1298, 331, 585, 1209, 329, 1207, 370, 231, 1519, 134,
+ /* 630 */ 34, 33, 32, 1584, 1585, 1419, 37, 35, 1536, 511,
+ /* 640 */ 506, 200, 1303, 1534, 318, 591, 1208, 1212, 1213, 1418,
/* 650 */ 1259, 1260, 1262, 1263, 1264, 1265, 1266, 535, 557, 1274,
/* 660 */ 1275, 1276, 1279, 556, 125, 124, 588, 587, 586, 411,
- /* 670 */ 419, 1206, 415, 415, 372, 1680, 556, 29, 316, 1292,
- /* 680 */ 1293, 1294, 1295, 1296, 1300, 1301, 1302, 387, 1214, 1680,
- /* 690 */ 185, 1533, 556, 263, 591, 597, 1563, 1505, 1416, 1261,
- /* 700 */ 1190, 1191, 140, 388, 1533, 2, 1413, 556, 447, 443,
- /* 710 */ 439, 435, 184, 125, 124, 588, 587, 586, 429, 1793,
- /* 720 */ 1533, 1698, 1710, 1334, 289, 1232, 1230, 637, 1412, 1700,
- /* 730 */ 1411, 455, 1694, 395, 7, 1533, 407, 68, 1680, 556,
- /* 740 */ 182, 1277, 1278, 1788, 556, 1261, 1680, 1410, 1409, 1726,
- /* 750 */ 1530, 380, 1235, 454, 408, 1657, 382, 540, 1690, 1696,
- /* 760 */ 135, 524, 1680, 556, 539, 269, 1702, 1533, 1680, 559,
- /* 770 */ 1680, 1621, 1533, 556, 487, 496, 589, 267, 55, 1576,
- /* 780 */ 527, 54, 164, 1209, 553, 1207, 373, 1680, 1680, 1739,
- /* 790 */ 596, 1533, 287, 1711, 542, 1713, 1714, 538, 167, 559,
- /* 800 */ 181, 1533, 173, 1464, 178, 1520, 425, 1212, 1213, 1408,
+ /* 670 */ 419, 1206, 415, 415, 372, 1681, 556, 29, 316, 1292,
+ /* 680 */ 1293, 1294, 1295, 1296, 1300, 1301, 1302, 387, 1214, 1681,
+ /* 690 */ 185, 1534, 556, 263, 591, 597, 1564, 1506, 1417, 1261,
+ /* 700 */ 1190, 1191, 140, 388, 1534, 2, 1414, 556, 447, 443,
+ /* 710 */ 439, 435, 184, 125, 124, 588, 587, 586, 429, 1795,
+ /* 720 */ 1534, 1699, 1711, 1335, 289, 1232, 1230, 637, 1413, 1701,
+ /* 730 */ 1412, 455, 1695, 395, 7, 1534, 407, 68, 1681, 556,
+ /* 740 */ 182, 1277, 1278, 1790, 556, 1261, 1681, 1411, 1410, 1727,
+ /* 750 */ 1531, 380, 1235, 454, 408, 1658, 382, 540, 1691, 1697,
+ /* 760 */ 135, 524, 1681, 556, 539, 269, 1703, 1534, 1681, 559,
+ /* 770 */ 1681, 1622, 1534, 556, 487, 496, 589, 267, 55, 1577,
+ /* 780 */ 527, 54, 164, 1209, 553, 1207, 373, 1681, 1681, 1740,
+ /* 790 */ 596, 1534, 287, 1712, 542, 1714, 1715, 538, 167, 559,
+ /* 800 */ 181, 1534, 173, 1465, 178, 1521, 425, 1212, 1213, 1409,
/* 810 */ 1259, 1260, 1262, 1263, 1264, 1265, 1266, 535, 557, 1274,
- /* 820 */ 1275, 1276, 1279, 58, 590, 171, 406, 1576, 1516, 401,
+ /* 820 */ 1275, 1276, 1279, 58, 590, 171, 406, 1577, 1517, 401,
/* 830 */ 400, 399, 398, 397, 394, 393, 392, 391, 390, 386,
- /* 840 */ 385, 384, 383, 377, 376, 375, 374, 203, 1032, 1680,
+ /* 840 */ 385, 384, 383, 377, 376, 375, 374, 203, 1032, 1681,
/* 850 */ 38, 36, 34, 33, 32, 556, 556, 1208, 556, 516,
- /* 860 */ 1407, 84, 1406, 465, 464, 1034, 554, 253, 463, 332,
- /* 870 */ 1405, 114, 460, 1798, 1330, 459, 458, 457, 608, 1451,
- /* 880 */ 212, 534, 1206, 1533, 1533, 190, 1533, 117, 188, 486,
- /* 890 */ 1710, 1508, 1261, 62, 61, 368, 293, 1217, 161, 1214,
- /* 900 */ 1680, 466, 1680, 192, 362, 516, 191, 1330, 194, 196,
- /* 910 */ 1680, 193, 195, 1446, 1444, 288, 584, 1726, 352, 359,
- /* 920 */ 350, 346, 342, 158, 337, 519, 115, 477, 1297, 1415,
- /* 930 */ 1680, 1333, 539, 117, 1216, 468, 471, 123, 637, 1004,
- /* 940 */ 475, 150, 1786, 1787, 532, 1791, 235, 11, 10, 48,
- /* 950 */ 525, 216, 1491, 155, 448, 503, 1005, 1739, 1710, 480,
- /* 960 */ 86, 1711, 542, 1713, 1714, 538, 1440, 559, 1397, 1398,
- /* 970 */ 1779, 528, 115, 39, 311, 1775, 148, 223, 491, 39,
- /* 980 */ 1298, 1727, 1710, 334, 591, 1726, 39, 151, 1786, 1787,
- /* 990 */ 1356, 1791, 218, 540, 1209, 242, 1207, 1807, 1680, 1435,
- /* 1000 */ 539, 1573, 1303, 125, 124, 588, 587, 586, 1809, 1726,
+ /* 860 */ 1408, 84, 1407, 465, 464, 1034, 554, 253, 463, 332,
+ /* 870 */ 1406, 114, 460, 1800, 1331, 459, 458, 457, 608, 1452,
+ /* 880 */ 212, 534, 1206, 1534, 1534, 190, 1534, 117, 188, 486,
+ /* 890 */ 1711, 1509, 1261, 62, 61, 368, 293, 1217, 161, 1214,
+ /* 900 */ 1681, 466, 1681, 192, 362, 516, 191, 1331, 194, 196,
+ /* 910 */ 1681, 193, 195, 1447, 1445, 288, 584, 1727, 352, 359,
+ /* 920 */ 350, 346, 342, 158, 337, 519, 115, 477, 1297, 1416,
+ /* 930 */ 1681, 1334, 539, 117, 1216, 468, 471, 123, 637, 1004,
+ /* 940 */ 475, 150, 1788, 1789, 532, 1793, 235, 11, 10, 48,
+ /* 950 */ 525, 216, 1492, 155, 448, 503, 1005, 1740, 1711, 480,
+ /* 960 */ 86, 1712, 542, 1714, 1715, 538, 1441, 559, 1398, 1399,
+ /* 970 */ 1780, 528, 115, 39, 311, 1776, 148, 223, 491, 39,
+ /* 980 */ 1298, 1728, 1711, 334, 591, 1727, 39, 151, 1788, 1789,
+ /* 990 */ 1357, 1793, 218, 540, 1209, 242, 1207, 1809, 1681, 1436,
+ /* 1000 */ 539, 1574, 1303, 125, 124, 588, 587, 586, 1811, 1727,
/* 1010 */ 121, 1220, 633, 517, 1305, 234, 237, 540, 1212, 1213,
- /* 1020 */ 1267, 239, 1680, 1710, 539, 1739, 3, 1163, 272, 1711,
- /* 1030 */ 542, 1713, 1714, 538, 122, 559, 244, 29, 316, 1292,
- /* 1040 */ 1293, 1294, 1295, 1296, 1300, 1301, 1302, 123, 1219, 1739,
- /* 1050 */ 1726, 548, 86, 1711, 542, 1713, 1714, 538, 540, 559,
- /* 1060 */ 48, 564, 1779, 1680, 1710, 539, 311, 1775, 1858, 1289,
- /* 1070 */ 122, 123, 110, 122, 5, 250, 336, 1813, 1230, 339,
+ /* 1020 */ 1267, 239, 1681, 1711, 539, 1740, 3, 1163, 272, 1712,
+ /* 1030 */ 542, 1714, 1715, 538, 122, 559, 244, 29, 316, 1292,
+ /* 1040 */ 1293, 1294, 1295, 1296, 1300, 1301, 1302, 123, 1219, 1740,
+ /* 1050 */ 1727, 548, 86, 1712, 542, 1714, 1715, 538, 540, 559,
+ /* 1060 */ 48, 564, 1780, 1681, 1711, 539, 311, 1776, 1860, 1289,
+ /* 1070 */ 122, 123, 110, 122, 5, 250, 336, 1815, 1230, 339,
/* 1080 */ 343, 298, 1174, 1032, 299, 259, 389, 163, 1063, 396,
- /* 1090 */ 1739, 1726, 1623, 86, 1711, 542, 1713, 1714, 538, 540,
- /* 1100 */ 559, 262, 1091, 1779, 1680, 404, 539, 311, 1775, 1858,
- /* 1110 */ 403, 1095, 1102, 1100, 126, 405, 409, 1236, 1836, 410,
+ /* 1090 */ 1740, 1727, 1624, 86, 1712, 542, 1714, 1715, 538, 540,
+ /* 1100 */ 559, 262, 1091, 1780, 1681, 404, 539, 311, 1776, 1860,
+ /* 1110 */ 403, 1095, 1102, 1100, 126, 405, 409, 1236, 1838, 410,
/* 1120 */ 418, 1239, 421, 170, 172, 1238, 422, 423, 1240, 426,
- /* 1130 */ 424, 1739, 175, 177, 86, 1711, 542, 1713, 1714, 538,
- /* 1140 */ 1710, 559, 427, 1237, 1779, 428, 180, 450, 311, 1775,
- /* 1150 */ 1858, 431, 452, 66, 183, 1523, 187, 1519, 481, 1797,
- /* 1160 */ 189, 128, 307, 89, 260, 129, 1521, 1726, 482, 485,
- /* 1170 */ 201, 204, 488, 1517, 130, 540, 131, 490, 207, 1235,
- /* 1180 */ 1680, 210, 539, 1810, 504, 546, 6, 492, 1662, 1820,
- /* 1190 */ 1661, 1819, 513, 1800, 222, 520, 142, 499, 500, 224,
- /* 1200 */ 498, 225, 493, 1710, 501, 1330, 310, 1739, 497, 226,
- /* 1210 */ 278, 1711, 542, 1713, 1714, 538, 507, 559, 214, 217,
- /* 1220 */ 1710, 116, 1234, 42, 1841, 18, 526, 529, 227, 523,
- /* 1230 */ 1726, 233, 312, 1861, 544, 545, 1845, 320, 540, 1794,
- /* 1240 */ 1629, 549, 246, 1680, 1628, 539, 551, 1726, 261, 550,
- /* 1250 */ 154, 77, 1534, 248, 1842, 540, 75, 562, 520, 264,
- /* 1260 */ 1680, 228, 539, 1760, 1577, 1506, 256, 49, 636, 266,
- /* 1270 */ 1739, 270, 1674, 278, 1711, 542, 1713, 1714, 538, 279,
- /* 1280 */ 559, 271, 268, 1710, 141, 236, 1673, 1739, 530, 60,
- /* 1290 */ 87, 1711, 542, 1713, 1714, 538, 238, 559, 1672, 1845,
- /* 1300 */ 1779, 1710, 338, 1669, 531, 1775, 340, 341, 1201, 1202,
- /* 1310 */ 1726, 159, 345, 152, 1667, 347, 348, 1842, 537, 349,
- /* 1320 */ 1666, 1665, 351, 1680, 353, 539, 1664, 355, 1726, 1663,
- /* 1330 */ 357, 1647, 160, 360, 361, 1177, 540, 1176, 1641, 1640,
- /* 1340 */ 366, 1680, 367, 539, 1639, 1638, 1149, 1616, 63, 1615,
- /* 1350 */ 1739, 378, 1710, 286, 1711, 542, 1713, 1714, 538, 536,
- /* 1360 */ 559, 533, 1751, 1614, 1613, 1612, 1611, 1610, 1739, 379,
- /* 1370 */ 640, 138, 1711, 542, 1713, 1714, 538, 381, 559, 1726,
- /* 1380 */ 1609, 1608, 1607, 1606, 258, 1605, 1604, 540, 1603, 1602,
- /* 1390 */ 1601, 1600, 1680, 516, 539, 1599, 145, 1598, 1597, 1596,
- /* 1400 */ 120, 1595, 631, 627, 623, 619, 257, 1594, 1593, 1592,
- /* 1410 */ 1591, 1590, 1589, 1710, 1151, 1588, 521, 1859, 1587, 1739,
- /* 1420 */ 1586, 117, 87, 1711, 542, 1713, 1714, 538, 1463, 559,
- /* 1430 */ 1431, 83, 1779, 168, 251, 146, 970, 1776, 969, 111,
- /* 1440 */ 1726, 520, 1430, 169, 414, 1655, 1649, 416, 540, 1637,
- /* 1450 */ 112, 174, 1636, 1680, 176, 539, 1626, 1512, 179, 1462,
- /* 1460 */ 115, 1460, 434, 998, 433, 1458, 1710, 552, 438, 1456,
- /* 1470 */ 432, 1454, 437, 436, 441, 229, 1786, 515, 442, 514,
- /* 1480 */ 1739, 440, 1845, 282, 1711, 542, 1713, 1714, 538, 1710,
- /* 1490 */ 559, 444, 445, 1726, 1443, 494, 154, 446, 208, 1442,
- /* 1500 */ 1842, 540, 1429, 1514, 186, 1106, 1680, 516, 539, 1105,
- /* 1510 */ 1513, 1031, 1452, 1030, 1029, 1028, 1726, 1182, 606, 202,
- /* 1520 */ 608, 1025, 512, 47, 540, 1024, 304, 1023, 1447, 1680,
- /* 1530 */ 305, 539, 469, 1739, 1445, 117, 138, 1711, 542, 1713,
- /* 1540 */ 1714, 538, 315, 559, 306, 1710, 1428, 472, 474, 1427,
- /* 1550 */ 88, 476, 1654, 1184, 51, 520, 1739, 1648, 483, 287,
- /* 1560 */ 1711, 542, 1713, 1714, 538, 1635, 559, 1634, 1633, 1625,
- /* 1570 */ 71, 15, 1726, 4, 115, 209, 39, 1371, 23, 213,
- /* 1580 */ 537, 205, 1860, 484, 45, 1680, 211, 539, 50, 229,
- /* 1590 */ 1786, 515, 139, 514, 220, 215, 1845, 132, 1710, 1355,
- /* 1600 */ 219, 24, 221, 1348, 1700, 72, 230, 1710, 143, 1327,
- /* 1610 */ 152, 25, 1739, 1326, 1842, 286, 1711, 542, 1713, 1714,
- /* 1620 */ 538, 1710, 559, 44, 1752, 1726, 1388, 17, 1383, 1377,
- /* 1630 */ 10, 1382, 313, 540, 1726, 1387, 1386, 314, 1680, 19,
- /* 1640 */ 539, 1269, 540, 1268, 31, 1290, 144, 1680, 1726, 539,
+ /* 1130 */ 424, 1740, 175, 177, 86, 1712, 542, 1714, 1715, 538,
+ /* 1140 */ 1711, 559, 427, 1237, 1780, 428, 180, 450, 311, 1776,
+ /* 1150 */ 1860, 431, 452, 66, 183, 1524, 187, 1520, 481, 1799,
+ /* 1160 */ 189, 128, 307, 89, 260, 129, 1522, 1727, 482, 485,
+ /* 1170 */ 201, 204, 488, 1518, 130, 540, 131, 490, 207, 1235,
+ /* 1180 */ 1681, 210, 539, 1812, 504, 546, 6, 492, 1663, 1822,
+ /* 1190 */ 1662, 1821, 513, 1802, 222, 520, 142, 499, 500, 224,
+ /* 1200 */ 498, 225, 493, 1711, 501, 1331, 310, 1740, 497, 226,
+ /* 1210 */ 278, 1712, 542, 1714, 1715, 538, 507, 559, 214, 217,
+ /* 1220 */ 1711, 116, 1234, 42, 1843, 18, 526, 529, 227, 523,
+ /* 1230 */ 1727, 233, 312, 1863, 544, 545, 1847, 320, 540, 1796,
+ /* 1240 */ 1630, 549, 246, 1681, 1629, 539, 551, 1727, 261, 550,
+ /* 1250 */ 154, 77, 1535, 248, 1844, 540, 75, 562, 520, 264,
+ /* 1260 */ 1681, 228, 539, 1761, 1578, 1507, 256, 49, 636, 266,
+ /* 1270 */ 1740, 270, 1675, 278, 1712, 542, 1714, 1715, 538, 279,
+ /* 1280 */ 559, 271, 268, 1711, 141, 236, 1674, 1740, 530, 60,
+ /* 1290 */ 87, 1712, 542, 1714, 1715, 538, 238, 559, 1673, 1847,
+ /* 1300 */ 1780, 1711, 338, 1670, 531, 1776, 340, 341, 1201, 1202,
+ /* 1310 */ 1727, 159, 345, 152, 1668, 347, 348, 1844, 537, 349,
+ /* 1320 */ 1667, 1666, 351, 1681, 353, 539, 1665, 355, 1727, 1664,
+ /* 1330 */ 357, 1648, 160, 360, 361, 1177, 540, 1176, 1642, 1641,
+ /* 1340 */ 366, 1681, 367, 539, 1640, 1639, 1149, 1617, 63, 1616,
+ /* 1350 */ 1740, 378, 1711, 286, 1712, 542, 1714, 1715, 538, 536,
+ /* 1360 */ 559, 533, 1752, 1615, 1614, 1613, 1612, 1611, 1740, 379,
+ /* 1370 */ 640, 138, 1712, 542, 1714, 1715, 538, 381, 559, 1727,
+ /* 1380 */ 1610, 1609, 1608, 1607, 258, 1606, 1605, 540, 1604, 1603,
+ /* 1390 */ 1602, 1601, 1681, 516, 539, 1600, 145, 1599, 1598, 1597,
+ /* 1400 */ 120, 1596, 631, 627, 623, 619, 257, 1595, 1594, 1593,
+ /* 1410 */ 1592, 1591, 1590, 1711, 1151, 1589, 521, 1861, 1588, 1740,
+ /* 1420 */ 1587, 117, 87, 1712, 542, 1714, 1715, 538, 1464, 559,
+ /* 1430 */ 1432, 83, 1780, 168, 251, 146, 970, 1777, 969, 111,
+ /* 1440 */ 1727, 520, 1431, 169, 414, 1656, 1650, 416, 540, 1638,
+ /* 1450 */ 112, 174, 1637, 1681, 176, 539, 1627, 1513, 179, 1463,
+ /* 1460 */ 115, 1461, 434, 998, 433, 1459, 1711, 552, 438, 1457,
+ /* 1470 */ 432, 1455, 437, 436, 441, 229, 1788, 515, 442, 514,
+ /* 1480 */ 1740, 440, 1847, 282, 1712, 542, 1714, 1715, 538, 1711,
+ /* 1490 */ 559, 444, 445, 1727, 1444, 494, 154, 446, 208, 1443,
+ /* 1500 */ 1844, 540, 1430, 1515, 186, 1106, 1681, 516, 539, 1105,
+ /* 1510 */ 1514, 1031, 1453, 1030, 1029, 1028, 1727, 1182, 606, 202,
+ /* 1520 */ 608, 1025, 512, 47, 540, 1024, 304, 1023, 1448, 1681,
+ /* 1530 */ 305, 539, 469, 1740, 1446, 117, 138, 1712, 542, 1714,
+ /* 1540 */ 1715, 538, 315, 559, 306, 1711, 1429, 472, 474, 1428,
+ /* 1550 */ 88, 476, 1655, 1184, 51, 520, 1740, 1649, 483, 287,
+ /* 1560 */ 1712, 542, 1714, 1715, 538, 1636, 559, 1635, 1634, 1626,
+ /* 1570 */ 71, 15, 1727, 4, 115, 209, 39, 1372, 23, 213,
+ /* 1580 */ 537, 205, 1862, 484, 45, 1681, 211, 539, 50, 229,
+ /* 1590 */ 1788, 515, 139, 514, 220, 215, 1847, 132, 1711, 1356,
+ /* 1600 */ 219, 24, 221, 1349, 1701, 72, 230, 1711, 143, 1328,
+ /* 1610 */ 152, 25, 1740, 1327, 1844, 286, 1712, 542, 1714, 1715,
+ /* 1620 */ 538, 1711, 559, 44, 1753, 1727, 1389, 17, 1384, 1378,
+ /* 1630 */ 10, 1383, 313, 540, 1727, 1388, 1387, 314, 1681, 19,
+ /* 1640 */ 539, 1269, 540, 1268, 31, 1290, 144, 1681, 1727, 539,
/* 1650 */ 156, 317, 16, 12, 13, 20, 540, 43, 1254, 21,
- /* 1660 */ 319, 1680, 1710, 539, 1624, 1739, 541, 247, 287, 1711,
- /* 1670 */ 542, 1713, 1714, 538, 1739, 559, 241, 287, 1711, 542,
- /* 1680 */ 1713, 1714, 538, 1710, 559, 1353, 243, 547, 1739, 1726,
- /* 1690 */ 245, 273, 1711, 542, 1713, 1714, 538, 540, 559, 73,
- /* 1700 */ 74, 78, 1680, 1699, 539, 252, 1742, 1224, 1271, 249,
- /* 1710 */ 1726, 1092, 558, 46, 561, 563, 327, 1089, 540, 565,
- /* 1720 */ 567, 568, 570, 1680, 1086, 539, 571, 573, 1080, 1739,
- /* 1730 */ 574, 576, 274, 1711, 542, 1713, 1714, 538, 1078, 559,
- /* 1740 */ 1069, 1710, 1084, 583, 577, 1101, 1083, 79, 1082, 1081,
- /* 1750 */ 1739, 80, 1710, 281, 1711, 542, 1713, 1714, 538, 57,
- /* 1760 */ 559, 254, 1097, 1710, 996, 592, 1020, 595, 1726, 255,
- /* 1770 */ 1038, 1013, 1018, 1017, 1016, 1035, 540, 1015, 1014, 1726,
- /* 1780 */ 1012, 1680, 1011, 539, 1033, 1008, 1007, 540, 1006, 1003,
- /* 1790 */ 1726, 1002, 1680, 1001, 539, 1459, 617, 616, 540, 618,
- /* 1800 */ 1457, 620, 621, 1680, 622, 539, 1455, 624, 1739, 625,
- /* 1810 */ 626, 283, 1711, 542, 1713, 1714, 538, 1453, 559, 1739,
- /* 1820 */ 629, 628, 275, 1711, 542, 1713, 1714, 538, 1710, 559,
- /* 1830 */ 1739, 630, 1441, 284, 1711, 542, 1713, 1714, 538, 632,
- /* 1840 */ 559, 1426, 634, 635, 1710, 1210, 265, 638, 639, 1401,
- /* 1850 */ 1401, 1401, 1401, 1401, 1401, 1726, 1401, 1401, 1401, 1401,
- /* 1860 */ 1401, 1401, 1401, 540, 1401, 1401, 1401, 1401, 1680, 1401,
- /* 1870 */ 539, 1726, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 540,
- /* 1880 */ 1401, 1401, 1401, 1401, 1680, 1401, 539, 1401, 1401, 1401,
- /* 1890 */ 1401, 1401, 1401, 1710, 1401, 1739, 1401, 1401, 276, 1711,
- /* 1900 */ 542, 1713, 1714, 538, 1401, 559, 1401, 1710, 1401, 1401,
- /* 1910 */ 1401, 1739, 1401, 1401, 285, 1711, 542, 1713, 1714, 538,
- /* 1920 */ 1726, 559, 1401, 1401, 1401, 1401, 1401, 1401, 540, 1401,
- /* 1930 */ 1401, 1401, 1401, 1680, 1726, 539, 1401, 1401, 1401, 1401,
- /* 1940 */ 1401, 1401, 540, 1401, 1401, 1401, 1401, 1680, 1710, 539,
- /* 1950 */ 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401,
- /* 1960 */ 1739, 1401, 1401, 277, 1711, 542, 1713, 1714, 538, 1710,
- /* 1970 */ 559, 1401, 1401, 1401, 1739, 1726, 1401, 1722, 1711, 542,
- /* 1980 */ 1713, 1714, 538, 540, 559, 1401, 1401, 1401, 1680, 1401,
- /* 1990 */ 539, 1401, 1401, 1401, 1401, 1401, 1726, 1401, 1401, 1401,
- /* 2000 */ 1401, 1401, 1401, 1401, 540, 1401, 1401, 1401, 1401, 1680,
- /* 2010 */ 1401, 539, 1401, 1401, 1401, 1739, 1401, 1401, 1721, 1711,
- /* 2020 */ 542, 1713, 1714, 538, 1401, 559, 1401, 1710, 1401, 1401,
- /* 2030 */ 1401, 1401, 1401, 1401, 1401, 1401, 1739, 1401, 1710, 1720,
- /* 2040 */ 1711, 542, 1713, 1714, 538, 1401, 559, 1401, 1401, 1710,
- /* 2050 */ 1401, 1401, 1401, 1401, 1726, 1401, 1401, 1401, 1401, 1401,
- /* 2060 */ 1401, 1401, 540, 1401, 1401, 1726, 1401, 1680, 1401, 539,
- /* 2070 */ 1401, 1401, 1401, 540, 1401, 1401, 1726, 1401, 1680, 1401,
- /* 2080 */ 539, 1401, 1401, 1401, 540, 1401, 1401, 1401, 1401, 1680,
- /* 2090 */ 1710, 539, 1401, 1401, 1739, 1401, 1401, 296, 1711, 542,
- /* 2100 */ 1713, 1714, 538, 1401, 559, 1739, 1401, 1401, 295, 1711,
- /* 2110 */ 542, 1713, 1714, 538, 1710, 559, 1739, 1726, 1401, 297,
- /* 2120 */ 1711, 542, 1713, 1714, 538, 540, 559, 1401, 1401, 1401,
- /* 2130 */ 1680, 1401, 539, 1401, 1401, 1401, 1401, 1401, 1401, 1401,
- /* 2140 */ 1401, 1726, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 540,
- /* 2150 */ 1401, 1401, 1401, 1401, 1680, 1401, 539, 1739, 1401, 1401,
- /* 2160 */ 294, 1711, 542, 1713, 1714, 538, 1401, 559, 1401, 1401,
- /* 2170 */ 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401,
- /* 2180 */ 1401, 1739, 1401, 1401, 280, 1711, 542, 1713, 1714, 538,
- /* 2190 */ 1401, 559,
+ /* 1660 */ 319, 1681, 1711, 539, 1625, 1740, 541, 247, 287, 1712,
+ /* 1670 */ 542, 1714, 1715, 538, 1740, 559, 241, 287, 1712, 542,
+ /* 1680 */ 1714, 1715, 538, 1711, 559, 1354, 243, 547, 1740, 1727,
+ /* 1690 */ 245, 273, 1712, 542, 1714, 1715, 538, 540, 559, 73,
+ /* 1700 */ 74, 78, 1681, 1700, 539, 252, 1743, 1224, 1271, 249,
+ /* 1710 */ 1727, 1092, 558, 46, 561, 563, 327, 1089, 540, 565,
+ /* 1720 */ 567, 568, 570, 1681, 1086, 539, 571, 573, 1080, 1740,
+ /* 1730 */ 574, 576, 274, 1712, 542, 1714, 1715, 538, 1078, 559,
+ /* 1740 */ 1069, 1711, 1084, 583, 577, 1101, 1083, 79, 1082, 1081,
+ /* 1750 */ 1740, 80, 1711, 281, 1712, 542, 1714, 1715, 538, 57,
+ /* 1760 */ 559, 254, 1097, 1711, 996, 592, 1020, 595, 1727, 255,
+ /* 1770 */ 1038, 1013, 1018, 1017, 1016, 1035, 540, 1015, 1014, 1727,
+ /* 1780 */ 1012, 1681, 1011, 539, 1033, 1008, 1007, 540, 1006, 1003,
+ /* 1790 */ 1727, 1002, 1681, 1001, 539, 1460, 617, 616, 540, 618,
+ /* 1800 */ 1458, 620, 621, 1681, 622, 539, 1456, 624, 1740, 625,
+ /* 1810 */ 626, 283, 1712, 542, 1714, 1715, 538, 1454, 559, 1740,
+ /* 1820 */ 629, 628, 275, 1712, 542, 1714, 1715, 538, 1711, 559,
+ /* 1830 */ 1740, 630, 1442, 284, 1712, 542, 1714, 1715, 538, 632,
+ /* 1840 */ 559, 1427, 634, 635, 1711, 1210, 265, 638, 639, 1402,
+ /* 1850 */ 1402, 1402, 1402, 1402, 1402, 1727, 1402, 1402, 1402, 1402,
+ /* 1860 */ 1402, 1402, 1402, 540, 1402, 1402, 1402, 1402, 1681, 1402,
+ /* 1870 */ 539, 1727, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 540,
+ /* 1880 */ 1402, 1402, 1402, 1402, 1681, 1402, 539, 1402, 1402, 1402,
+ /* 1890 */ 1402, 1402, 1402, 1711, 1402, 1740, 1402, 1402, 276, 1712,
+ /* 1900 */ 542, 1714, 1715, 538, 1402, 559, 1402, 1711, 1402, 1402,
+ /* 1910 */ 1402, 1740, 1402, 1402, 285, 1712, 542, 1714, 1715, 538,
+ /* 1920 */ 1727, 559, 1402, 1402, 1402, 1402, 1402, 1402, 540, 1402,
+ /* 1930 */ 1402, 1402, 1402, 1681, 1727, 539, 1402, 1402, 1402, 1402,
+ /* 1940 */ 1402, 1402, 540, 1402, 1402, 1402, 1402, 1681, 1711, 539,
+ /* 1950 */ 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402,
+ /* 1960 */ 1740, 1402, 1402, 277, 1712, 542, 1714, 1715, 538, 1711,
+ /* 1970 */ 559, 1402, 1402, 1402, 1740, 1727, 1402, 1723, 1712, 542,
+ /* 1980 */ 1714, 1715, 538, 540, 559, 1402, 1402, 1402, 1681, 1402,
+ /* 1990 */ 539, 1402, 1402, 1402, 1402, 1402, 1727, 1402, 1402, 1402,
+ /* 2000 */ 1402, 1402, 1402, 1402, 540, 1402, 1402, 1402, 1402, 1681,
+ /* 2010 */ 1402, 539, 1402, 1402, 1402, 1740, 1402, 1402, 1722, 1712,
+ /* 2020 */ 542, 1714, 1715, 538, 1402, 559, 1402, 1711, 1402, 1402,
+ /* 2030 */ 1402, 1402, 1402, 1402, 1402, 1402, 1740, 1402, 1711, 1721,
+ /* 2040 */ 1712, 542, 1714, 1715, 538, 1402, 559, 1402, 1402, 1711,
+ /* 2050 */ 1402, 1402, 1402, 1402, 1727, 1402, 1402, 1402, 1402, 1402,
+ /* 2060 */ 1402, 1402, 540, 1402, 1402, 1727, 1402, 1681, 1402, 539,
+ /* 2070 */ 1402, 1402, 1402, 540, 1402, 1402, 1727, 1402, 1681, 1402,
+ /* 2080 */ 539, 1402, 1402, 1402, 540, 1402, 1402, 1402, 1402, 1681,
+ /* 2090 */ 1711, 539, 1402, 1402, 1740, 1402, 1402, 296, 1712, 542,
+ /* 2100 */ 1714, 1715, 538, 1402, 559, 1740, 1402, 1402, 295, 1712,
+ /* 2110 */ 542, 1714, 1715, 538, 1711, 559, 1740, 1727, 1402, 297,
+ /* 2120 */ 1712, 542, 1714, 1715, 538, 540, 559, 1402, 1402, 1402,
+ /* 2130 */ 1681, 1402, 539, 1402, 1402, 1402, 1402, 1402, 1402, 1402,
+ /* 2140 */ 1402, 1727, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 540,
+ /* 2150 */ 1402, 1402, 1402, 1402, 1681, 1402, 539, 1740, 1402, 1402,
+ /* 2160 */ 294, 1712, 542, 1714, 1715, 538, 1402, 559, 1402, 1402,
+ /* 2170 */ 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402,
+ /* 2180 */ 1402, 1740, 1402, 1402, 280, 1712, 542, 1714, 1715, 538,
+ /* 2190 */ 1402, 559,
};
static const YYCODETYPE yy_lookahead[] = {
/* 0 */ 274, 341, 273, 277, 248, 274, 250, 251, 277, 242,
@@ -763,71 +763,71 @@ static const short yy_reduce_ofst[] = {
/* 260 */ 977, 1005, 1013, 1015, 1014, 1039,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 10 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 20 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 30 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 40 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 50 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 60 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1468, 1399,
- /* 70 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 80 */ 1399, 1399, 1399, 1466, 1617, 1399, 1781, 1399, 1399, 1399,
- /* 90 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 100 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 110 */ 1399, 1399, 1399, 1468, 1399, 1792, 1792, 1792, 1466, 1399,
- /* 120 */ 1399, 1399, 1399, 1399, 1399, 1399, 1562, 1399, 1399, 1399,
- /* 130 */ 1399, 1399, 1399, 1399, 1399, 1650, 1399, 1399, 1862, 1399,
- /* 140 */ 1399, 1656, 1816, 1399, 1399, 1399, 1399, 1515, 1808, 1784,
- /* 150 */ 1798, 1785, 1847, 1847, 1847, 1801, 1399, 1812, 1399, 1399,
- /* 160 */ 1399, 1642, 1399, 1399, 1622, 1619, 1619, 1399, 1399, 1399,
- /* 170 */ 1399, 1468, 1399, 1468, 1399, 1399, 1468, 1399, 1468, 1399,
- /* 180 */ 1399, 1468, 1468, 1399, 1468, 1399, 1399, 1399, 1399, 1399,
- /* 190 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 200 */ 1399, 1399, 1466, 1652, 1399, 1466, 1399, 1399, 1466, 1399,
- /* 210 */ 1399, 1466, 1399, 1399, 1823, 1821, 1399, 1823, 1821, 1399,
- /* 220 */ 1399, 1399, 1835, 1831, 1823, 1839, 1837, 1814, 1812, 1798,
- /* 230 */ 1399, 1399, 1399, 1853, 1849, 1865, 1853, 1849, 1853, 1849,
- /* 240 */ 1399, 1821, 1399, 1399, 1821, 1399, 1627, 1399, 1399, 1466,
- /* 250 */ 1399, 1466, 1399, 1531, 1399, 1399, 1399, 1466, 1399, 1644,
- /* 260 */ 1658, 1565, 1565, 1565, 1469, 1404, 1399, 1399, 1399, 1399,
- /* 270 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1527,
- /* 280 */ 1725, 1834, 1833, 1757, 1756, 1755, 1753, 1724, 1399, 1399,
- /* 290 */ 1399, 1399, 1399, 1399, 1718, 1719, 1717, 1716, 1399, 1399,
- /* 300 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 310 */ 1399, 1782, 1399, 1850, 1854, 1399, 1399, 1399, 1701, 1399,
- /* 320 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 330 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 340 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 350 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 360 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 370 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 380 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 390 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 400 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 410 */ 1399, 1399, 1399, 1433, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 420 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 430 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 440 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 450 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 460 */ 1399, 1496, 1495, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 470 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 480 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 490 */ 1399, 1399, 1399, 1399, 1399, 1805, 1815, 1399, 1399, 1399,
- /* 500 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 510 */ 1701, 1399, 1832, 1399, 1791, 1787, 1399, 1399, 1783, 1399,
- /* 520 */ 1399, 1848, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 530 */ 1399, 1777, 1399, 1750, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 540 */ 1399, 1399, 1712, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 550 */ 1399, 1399, 1399, 1399, 1399, 1700, 1399, 1741, 1399, 1399,
- /* 560 */ 1399, 1399, 1399, 1399, 1399, 1399, 1559, 1399, 1399, 1399,
- /* 570 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1544,
- /* 580 */ 1542, 1541, 1540, 1399, 1537, 1399, 1399, 1399, 1399, 1568,
- /* 590 */ 1567, 1399, 1399, 1399, 1399, 1399, 1399, 1488, 1399, 1399,
- /* 600 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1479, 1399, 1478,
- /* 610 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 620 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 630 */ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
- /* 640 */ 1399,
+ /* 0 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 10 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 20 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 30 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 40 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 50 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 60 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1469, 1400,
+ /* 70 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 80 */ 1400, 1400, 1400, 1467, 1618, 1400, 1782, 1400, 1400, 1400,
+ /* 90 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 100 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 110 */ 1400, 1400, 1400, 1469, 1400, 1794, 1794, 1794, 1467, 1400,
+ /* 120 */ 1400, 1400, 1400, 1400, 1400, 1400, 1563, 1400, 1400, 1400,
+ /* 130 */ 1400, 1400, 1400, 1400, 1400, 1651, 1400, 1400, 1864, 1400,
+ /* 140 */ 1400, 1657, 1818, 1400, 1400, 1400, 1400, 1516, 1810, 1786,
+ /* 150 */ 1800, 1787, 1849, 1849, 1849, 1803, 1400, 1814, 1400, 1400,
+ /* 160 */ 1400, 1643, 1400, 1400, 1623, 1620, 1620, 1400, 1400, 1400,
+ /* 170 */ 1400, 1469, 1400, 1469, 1400, 1400, 1469, 1400, 1469, 1400,
+ /* 180 */ 1400, 1469, 1469, 1400, 1469, 1400, 1400, 1400, 1400, 1400,
+ /* 190 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 200 */ 1400, 1400, 1467, 1653, 1400, 1467, 1400, 1400, 1467, 1400,
+ /* 210 */ 1400, 1467, 1400, 1400, 1825, 1823, 1400, 1825, 1823, 1400,
+ /* 220 */ 1400, 1400, 1837, 1833, 1825, 1841, 1839, 1816, 1814, 1800,
+ /* 230 */ 1400, 1400, 1784, 1855, 1851, 1867, 1855, 1851, 1855, 1851,
+ /* 240 */ 1400, 1823, 1400, 1400, 1823, 1400, 1628, 1400, 1400, 1467,
+ /* 250 */ 1400, 1467, 1400, 1532, 1400, 1400, 1400, 1467, 1400, 1645,
+ /* 260 */ 1659, 1566, 1566, 1566, 1470, 1405, 1400, 1400, 1400, 1400,
+ /* 270 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1528,
+ /* 280 */ 1726, 1836, 1835, 1758, 1757, 1756, 1754, 1725, 1400, 1400,
+ /* 290 */ 1400, 1400, 1400, 1400, 1719, 1720, 1718, 1717, 1400, 1400,
+ /* 300 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 310 */ 1400, 1783, 1400, 1852, 1856, 1400, 1400, 1400, 1702, 1400,
+ /* 320 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 330 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 340 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 350 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 360 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 370 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 380 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 390 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 400 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 410 */ 1400, 1400, 1400, 1434, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 420 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 430 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 440 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 450 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 460 */ 1400, 1497, 1496, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 470 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 480 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 490 */ 1400, 1400, 1400, 1400, 1400, 1807, 1817, 1400, 1400, 1400,
+ /* 500 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 510 */ 1702, 1400, 1834, 1400, 1793, 1789, 1400, 1400, 1785, 1400,
+ /* 520 */ 1400, 1850, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 530 */ 1400, 1778, 1400, 1751, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 540 */ 1400, 1400, 1713, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 550 */ 1400, 1400, 1400, 1400, 1400, 1701, 1400, 1742, 1400, 1400,
+ /* 560 */ 1400, 1400, 1400, 1400, 1400, 1400, 1560, 1400, 1400, 1400,
+ /* 570 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1545,
+ /* 580 */ 1543, 1542, 1541, 1400, 1538, 1400, 1400, 1400, 1400, 1569,
+ /* 590 */ 1568, 1400, 1400, 1400, 1400, 1400, 1400, 1489, 1400, 1400,
+ /* 600 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1480, 1400, 1479,
+ /* 610 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 620 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 630 */ 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+ /* 640 */ 1400,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -1508,7 +1508,7 @@ static const char *const yyTokenName[] = {
/* 329 */ "boolean_value_expression",
/* 330 */ "boolean_primary",
/* 331 */ "common_expression",
- /* 332 */ "from_clause",
+ /* 332 */ "from_clause_opt",
/* 333 */ "table_reference_list",
/* 334 */ "table_reference",
/* 335 */ "table_primary",
@@ -1928,91 +1928,92 @@ static const char *const yyRuleName[] = {
/* 378 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP",
/* 379 */ "common_expression ::= expression",
/* 380 */ "common_expression ::= boolean_value_expression",
- /* 381 */ "from_clause ::= FROM table_reference_list",
- /* 382 */ "table_reference_list ::= table_reference",
- /* 383 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference",
- /* 384 */ "table_reference ::= table_primary",
- /* 385 */ "table_reference ::= joined_table",
- /* 386 */ "table_primary ::= table_name alias_opt",
- /* 387 */ "table_primary ::= db_name NK_DOT table_name alias_opt",
- /* 388 */ "table_primary ::= subquery alias_opt",
- /* 389 */ "table_primary ::= parenthesized_joined_table",
- /* 390 */ "alias_opt ::=",
- /* 391 */ "alias_opt ::= table_alias",
- /* 392 */ "alias_opt ::= AS table_alias",
- /* 393 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP",
- /* 394 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP",
- /* 395 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition",
- /* 396 */ "join_type ::=",
- /* 397 */ "join_type ::= INNER",
- /* 398 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt",
- /* 399 */ "set_quantifier_opt ::=",
- /* 400 */ "set_quantifier_opt ::= DISTINCT",
- /* 401 */ "set_quantifier_opt ::= ALL",
- /* 402 */ "select_list ::= NK_STAR",
- /* 403 */ "select_list ::= select_sublist",
- /* 404 */ "select_sublist ::= select_item",
- /* 405 */ "select_sublist ::= select_sublist NK_COMMA select_item",
- /* 406 */ "select_item ::= common_expression",
- /* 407 */ "select_item ::= common_expression column_alias",
- /* 408 */ "select_item ::= common_expression AS column_alias",
- /* 409 */ "select_item ::= table_name NK_DOT NK_STAR",
- /* 410 */ "where_clause_opt ::=",
- /* 411 */ "where_clause_opt ::= WHERE search_condition",
- /* 412 */ "partition_by_clause_opt ::=",
- /* 413 */ "partition_by_clause_opt ::= PARTITION BY expression_list",
- /* 414 */ "twindow_clause_opt ::=",
- /* 415 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP",
- /* 416 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP",
- /* 417 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt",
- /* 418 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt",
- /* 419 */ "sliding_opt ::=",
- /* 420 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP",
- /* 421 */ "fill_opt ::=",
- /* 422 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP",
- /* 423 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP",
- /* 424 */ "fill_mode ::= NONE",
- /* 425 */ "fill_mode ::= PREV",
- /* 426 */ "fill_mode ::= NULL",
- /* 427 */ "fill_mode ::= LINEAR",
- /* 428 */ "fill_mode ::= NEXT",
- /* 429 */ "group_by_clause_opt ::=",
- /* 430 */ "group_by_clause_opt ::= GROUP BY group_by_list",
- /* 431 */ "group_by_list ::= expression",
- /* 432 */ "group_by_list ::= group_by_list NK_COMMA expression",
- /* 433 */ "having_clause_opt ::=",
- /* 434 */ "having_clause_opt ::= HAVING search_condition",
- /* 435 */ "range_opt ::=",
- /* 436 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP",
- /* 437 */ "every_opt ::=",
- /* 438 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP",
- /* 439 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt",
- /* 440 */ "query_expression_body ::= query_primary",
- /* 441 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body",
- /* 442 */ "query_expression_body ::= query_expression_body UNION query_expression_body",
- /* 443 */ "query_primary ::= query_specification",
- /* 444 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP",
- /* 445 */ "order_by_clause_opt ::=",
- /* 446 */ "order_by_clause_opt ::= ORDER BY sort_specification_list",
- /* 447 */ "slimit_clause_opt ::=",
- /* 448 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER",
- /* 449 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER",
- /* 450 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER",
- /* 451 */ "limit_clause_opt ::=",
- /* 452 */ "limit_clause_opt ::= LIMIT NK_INTEGER",
- /* 453 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER",
- /* 454 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER",
- /* 455 */ "subquery ::= NK_LP query_expression NK_RP",
- /* 456 */ "search_condition ::= common_expression",
- /* 457 */ "sort_specification_list ::= sort_specification",
- /* 458 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification",
- /* 459 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt",
- /* 460 */ "ordering_specification_opt ::=",
- /* 461 */ "ordering_specification_opt ::= ASC",
- /* 462 */ "ordering_specification_opt ::= DESC",
- /* 463 */ "null_ordering_opt ::=",
- /* 464 */ "null_ordering_opt ::= NULLS FIRST",
- /* 465 */ "null_ordering_opt ::= NULLS LAST",
+ /* 381 */ "from_clause_opt ::=",
+ /* 382 */ "from_clause_opt ::= FROM table_reference_list",
+ /* 383 */ "table_reference_list ::= table_reference",
+ /* 384 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference",
+ /* 385 */ "table_reference ::= table_primary",
+ /* 386 */ "table_reference ::= joined_table",
+ /* 387 */ "table_primary ::= table_name alias_opt",
+ /* 388 */ "table_primary ::= db_name NK_DOT table_name alias_opt",
+ /* 389 */ "table_primary ::= subquery alias_opt",
+ /* 390 */ "table_primary ::= parenthesized_joined_table",
+ /* 391 */ "alias_opt ::=",
+ /* 392 */ "alias_opt ::= table_alias",
+ /* 393 */ "alias_opt ::= AS table_alias",
+ /* 394 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP",
+ /* 395 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP",
+ /* 396 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition",
+ /* 397 */ "join_type ::=",
+ /* 398 */ "join_type ::= INNER",
+ /* 399 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt",
+ /* 400 */ "set_quantifier_opt ::=",
+ /* 401 */ "set_quantifier_opt ::= DISTINCT",
+ /* 402 */ "set_quantifier_opt ::= ALL",
+ /* 403 */ "select_list ::= NK_STAR",
+ /* 404 */ "select_list ::= select_sublist",
+ /* 405 */ "select_sublist ::= select_item",
+ /* 406 */ "select_sublist ::= select_sublist NK_COMMA select_item",
+ /* 407 */ "select_item ::= common_expression",
+ /* 408 */ "select_item ::= common_expression column_alias",
+ /* 409 */ "select_item ::= common_expression AS column_alias",
+ /* 410 */ "select_item ::= table_name NK_DOT NK_STAR",
+ /* 411 */ "where_clause_opt ::=",
+ /* 412 */ "where_clause_opt ::= WHERE search_condition",
+ /* 413 */ "partition_by_clause_opt ::=",
+ /* 414 */ "partition_by_clause_opt ::= PARTITION BY expression_list",
+ /* 415 */ "twindow_clause_opt ::=",
+ /* 416 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP",
+ /* 417 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP",
+ /* 418 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt",
+ /* 419 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt",
+ /* 420 */ "sliding_opt ::=",
+ /* 421 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP",
+ /* 422 */ "fill_opt ::=",
+ /* 423 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP",
+ /* 424 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP",
+ /* 425 */ "fill_mode ::= NONE",
+ /* 426 */ "fill_mode ::= PREV",
+ /* 427 */ "fill_mode ::= NULL",
+ /* 428 */ "fill_mode ::= LINEAR",
+ /* 429 */ "fill_mode ::= NEXT",
+ /* 430 */ "group_by_clause_opt ::=",
+ /* 431 */ "group_by_clause_opt ::= GROUP BY group_by_list",
+ /* 432 */ "group_by_list ::= expression",
+ /* 433 */ "group_by_list ::= group_by_list NK_COMMA expression",
+ /* 434 */ "having_clause_opt ::=",
+ /* 435 */ "having_clause_opt ::= HAVING search_condition",
+ /* 436 */ "range_opt ::=",
+ /* 437 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP",
+ /* 438 */ "every_opt ::=",
+ /* 439 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP",
+ /* 440 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt",
+ /* 441 */ "query_expression_body ::= query_primary",
+ /* 442 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body",
+ /* 443 */ "query_expression_body ::= query_expression_body UNION query_expression_body",
+ /* 444 */ "query_primary ::= query_specification",
+ /* 445 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP",
+ /* 446 */ "order_by_clause_opt ::=",
+ /* 447 */ "order_by_clause_opt ::= ORDER BY sort_specification_list",
+ /* 448 */ "slimit_clause_opt ::=",
+ /* 449 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER",
+ /* 450 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER",
+ /* 451 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER",
+ /* 452 */ "limit_clause_opt ::=",
+ /* 453 */ "limit_clause_opt ::= LIMIT NK_INTEGER",
+ /* 454 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER",
+ /* 455 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER",
+ /* 456 */ "subquery ::= NK_LP query_expression NK_RP",
+ /* 457 */ "search_condition ::= common_expression",
+ /* 458 */ "sort_specification_list ::= sort_specification",
+ /* 459 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification",
+ /* 460 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt",
+ /* 461 */ "ordering_specification_opt ::=",
+ /* 462 */ "ordering_specification_opt ::= ASC",
+ /* 463 */ "ordering_specification_opt ::= DESC",
+ /* 464 */ "null_ordering_opt ::=",
+ /* 465 */ "null_ordering_opt ::= NULLS FIRST",
+ /* 466 */ "null_ordering_opt ::= NULLS LAST",
};
#endif /* NDEBUG */
@@ -2180,7 +2181,7 @@ static void yy_destructor(
case 329: /* boolean_value_expression */
case 330: /* boolean_primary */
case 331: /* common_expression */
- case 332: /* from_clause */
+ case 332: /* from_clause_opt */
case 333: /* table_reference_list */
case 334: /* table_reference */
case 335: /* table_primary */
@@ -2988,91 +2989,92 @@ static const struct {
{ 330, -3 }, /* (378) boolean_primary ::= NK_LP boolean_value_expression NK_RP */
{ 331, -1 }, /* (379) common_expression ::= expression */
{ 331, -1 }, /* (380) common_expression ::= boolean_value_expression */
- { 332, -2 }, /* (381) from_clause ::= FROM table_reference_list */
- { 333, -1 }, /* (382) table_reference_list ::= table_reference */
- { 333, -3 }, /* (383) table_reference_list ::= table_reference_list NK_COMMA table_reference */
- { 334, -1 }, /* (384) table_reference ::= table_primary */
- { 334, -1 }, /* (385) table_reference ::= joined_table */
- { 335, -2 }, /* (386) table_primary ::= table_name alias_opt */
- { 335, -4 }, /* (387) table_primary ::= db_name NK_DOT table_name alias_opt */
- { 335, -2 }, /* (388) table_primary ::= subquery alias_opt */
- { 335, -1 }, /* (389) table_primary ::= parenthesized_joined_table */
- { 337, 0 }, /* (390) alias_opt ::= */
- { 337, -1 }, /* (391) alias_opt ::= table_alias */
- { 337, -2 }, /* (392) alias_opt ::= AS table_alias */
- { 338, -3 }, /* (393) parenthesized_joined_table ::= NK_LP joined_table NK_RP */
- { 338, -3 }, /* (394) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */
- { 336, -6 }, /* (395) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
- { 339, 0 }, /* (396) join_type ::= */
- { 339, -1 }, /* (397) join_type ::= INNER */
- { 341, -12 }, /* (398) query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */
- { 342, 0 }, /* (399) set_quantifier_opt ::= */
- { 342, -1 }, /* (400) set_quantifier_opt ::= DISTINCT */
- { 342, -1 }, /* (401) set_quantifier_opt ::= ALL */
- { 343, -1 }, /* (402) select_list ::= NK_STAR */
- { 343, -1 }, /* (403) select_list ::= select_sublist */
- { 351, -1 }, /* (404) select_sublist ::= select_item */
- { 351, -3 }, /* (405) select_sublist ::= select_sublist NK_COMMA select_item */
- { 352, -1 }, /* (406) select_item ::= common_expression */
- { 352, -2 }, /* (407) select_item ::= common_expression column_alias */
- { 352, -3 }, /* (408) select_item ::= common_expression AS column_alias */
- { 352, -3 }, /* (409) select_item ::= table_name NK_DOT NK_STAR */
- { 310, 0 }, /* (410) where_clause_opt ::= */
- { 310, -2 }, /* (411) where_clause_opt ::= WHERE search_condition */
- { 344, 0 }, /* (412) partition_by_clause_opt ::= */
- { 344, -3 }, /* (413) partition_by_clause_opt ::= PARTITION BY expression_list */
- { 348, 0 }, /* (414) twindow_clause_opt ::= */
- { 348, -6 }, /* (415) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
- { 348, -4 }, /* (416) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */
- { 348, -6 }, /* (417) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
- { 348, -8 }, /* (418) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
- { 296, 0 }, /* (419) sliding_opt ::= */
- { 296, -4 }, /* (420) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */
- { 347, 0 }, /* (421) fill_opt ::= */
- { 347, -4 }, /* (422) fill_opt ::= FILL NK_LP fill_mode NK_RP */
- { 347, -6 }, /* (423) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
- { 353, -1 }, /* (424) fill_mode ::= NONE */
- { 353, -1 }, /* (425) fill_mode ::= PREV */
- { 353, -1 }, /* (426) fill_mode ::= NULL */
- { 353, -1 }, /* (427) fill_mode ::= LINEAR */
- { 353, -1 }, /* (428) fill_mode ::= NEXT */
- { 349, 0 }, /* (429) group_by_clause_opt ::= */
- { 349, -3 }, /* (430) group_by_clause_opt ::= GROUP BY group_by_list */
- { 354, -1 }, /* (431) group_by_list ::= expression */
- { 354, -3 }, /* (432) group_by_list ::= group_by_list NK_COMMA expression */
- { 350, 0 }, /* (433) having_clause_opt ::= */
- { 350, -2 }, /* (434) having_clause_opt ::= HAVING search_condition */
- { 345, 0 }, /* (435) range_opt ::= */
- { 345, -6 }, /* (436) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */
- { 346, 0 }, /* (437) every_opt ::= */
- { 346, -4 }, /* (438) every_opt ::= EVERY NK_LP duration_literal NK_RP */
- { 300, -4 }, /* (439) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */
- { 355, -1 }, /* (440) query_expression_body ::= query_primary */
- { 355, -4 }, /* (441) query_expression_body ::= query_expression_body UNION ALL query_expression_body */
- { 355, -3 }, /* (442) query_expression_body ::= query_expression_body UNION query_expression_body */
- { 359, -1 }, /* (443) query_primary ::= query_specification */
- { 359, -6 }, /* (444) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */
- { 356, 0 }, /* (445) order_by_clause_opt ::= */
- { 356, -3 }, /* (446) order_by_clause_opt ::= ORDER BY sort_specification_list */
- { 357, 0 }, /* (447) slimit_clause_opt ::= */
- { 357, -2 }, /* (448) slimit_clause_opt ::= SLIMIT NK_INTEGER */
- { 357, -4 }, /* (449) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
- { 357, -4 }, /* (450) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- { 358, 0 }, /* (451) limit_clause_opt ::= */
- { 358, -2 }, /* (452) limit_clause_opt ::= LIMIT NK_INTEGER */
- { 358, -4 }, /* (453) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */
- { 358, -4 }, /* (454) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- { 319, -3 }, /* (455) subquery ::= NK_LP query_expression NK_RP */
- { 340, -1 }, /* (456) search_condition ::= common_expression */
- { 360, -1 }, /* (457) sort_specification_list ::= sort_specification */
- { 360, -3 }, /* (458) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */
- { 361, -3 }, /* (459) sort_specification ::= expression ordering_specification_opt null_ordering_opt */
- { 362, 0 }, /* (460) ordering_specification_opt ::= */
- { 362, -1 }, /* (461) ordering_specification_opt ::= ASC */
- { 362, -1 }, /* (462) ordering_specification_opt ::= DESC */
- { 363, 0 }, /* (463) null_ordering_opt ::= */
- { 363, -2 }, /* (464) null_ordering_opt ::= NULLS FIRST */
- { 363, -2 }, /* (465) null_ordering_opt ::= NULLS LAST */
+ { 332, 0 }, /* (381) from_clause_opt ::= */
+ { 332, -2 }, /* (382) from_clause_opt ::= FROM table_reference_list */
+ { 333, -1 }, /* (383) table_reference_list ::= table_reference */
+ { 333, -3 }, /* (384) table_reference_list ::= table_reference_list NK_COMMA table_reference */
+ { 334, -1 }, /* (385) table_reference ::= table_primary */
+ { 334, -1 }, /* (386) table_reference ::= joined_table */
+ { 335, -2 }, /* (387) table_primary ::= table_name alias_opt */
+ { 335, -4 }, /* (388) table_primary ::= db_name NK_DOT table_name alias_opt */
+ { 335, -2 }, /* (389) table_primary ::= subquery alias_opt */
+ { 335, -1 }, /* (390) table_primary ::= parenthesized_joined_table */
+ { 337, 0 }, /* (391) alias_opt ::= */
+ { 337, -1 }, /* (392) alias_opt ::= table_alias */
+ { 337, -2 }, /* (393) alias_opt ::= AS table_alias */
+ { 338, -3 }, /* (394) parenthesized_joined_table ::= NK_LP joined_table NK_RP */
+ { 338, -3 }, /* (395) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */
+ { 336, -6 }, /* (396) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
+ { 339, 0 }, /* (397) join_type ::= */
+ { 339, -1 }, /* (398) join_type ::= INNER */
+ { 341, -12 }, /* (399) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */
+ { 342, 0 }, /* (400) set_quantifier_opt ::= */
+ { 342, -1 }, /* (401) set_quantifier_opt ::= DISTINCT */
+ { 342, -1 }, /* (402) set_quantifier_opt ::= ALL */
+ { 343, -1 }, /* (403) select_list ::= NK_STAR */
+ { 343, -1 }, /* (404) select_list ::= select_sublist */
+ { 351, -1 }, /* (405) select_sublist ::= select_item */
+ { 351, -3 }, /* (406) select_sublist ::= select_sublist NK_COMMA select_item */
+ { 352, -1 }, /* (407) select_item ::= common_expression */
+ { 352, -2 }, /* (408) select_item ::= common_expression column_alias */
+ { 352, -3 }, /* (409) select_item ::= common_expression AS column_alias */
+ { 352, -3 }, /* (410) select_item ::= table_name NK_DOT NK_STAR */
+ { 310, 0 }, /* (411) where_clause_opt ::= */
+ { 310, -2 }, /* (412) where_clause_opt ::= WHERE search_condition */
+ { 344, 0 }, /* (413) partition_by_clause_opt ::= */
+ { 344, -3 }, /* (414) partition_by_clause_opt ::= PARTITION BY expression_list */
+ { 348, 0 }, /* (415) twindow_clause_opt ::= */
+ { 348, -6 }, /* (416) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
+ { 348, -4 }, /* (417) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */
+ { 348, -6 }, /* (418) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
+ { 348, -8 }, /* (419) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
+ { 296, 0 }, /* (420) sliding_opt ::= */
+ { 296, -4 }, /* (421) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */
+ { 347, 0 }, /* (422) fill_opt ::= */
+ { 347, -4 }, /* (423) fill_opt ::= FILL NK_LP fill_mode NK_RP */
+ { 347, -6 }, /* (424) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
+ { 353, -1 }, /* (425) fill_mode ::= NONE */
+ { 353, -1 }, /* (426) fill_mode ::= PREV */
+ { 353, -1 }, /* (427) fill_mode ::= NULL */
+ { 353, -1 }, /* (428) fill_mode ::= LINEAR */
+ { 353, -1 }, /* (429) fill_mode ::= NEXT */
+ { 349, 0 }, /* (430) group_by_clause_opt ::= */
+ { 349, -3 }, /* (431) group_by_clause_opt ::= GROUP BY group_by_list */
+ { 354, -1 }, /* (432) group_by_list ::= expression */
+ { 354, -3 }, /* (433) group_by_list ::= group_by_list NK_COMMA expression */
+ { 350, 0 }, /* (434) having_clause_opt ::= */
+ { 350, -2 }, /* (435) having_clause_opt ::= HAVING search_condition */
+ { 345, 0 }, /* (436) range_opt ::= */
+ { 345, -6 }, /* (437) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */
+ { 346, 0 }, /* (438) every_opt ::= */
+ { 346, -4 }, /* (439) every_opt ::= EVERY NK_LP duration_literal NK_RP */
+ { 300, -4 }, /* (440) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */
+ { 355, -1 }, /* (441) query_expression_body ::= query_primary */
+ { 355, -4 }, /* (442) query_expression_body ::= query_expression_body UNION ALL query_expression_body */
+ { 355, -3 }, /* (443) query_expression_body ::= query_expression_body UNION query_expression_body */
+ { 359, -1 }, /* (444) query_primary ::= query_specification */
+ { 359, -6 }, /* (445) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */
+ { 356, 0 }, /* (446) order_by_clause_opt ::= */
+ { 356, -3 }, /* (447) order_by_clause_opt ::= ORDER BY sort_specification_list */
+ { 357, 0 }, /* (448) slimit_clause_opt ::= */
+ { 357, -2 }, /* (449) slimit_clause_opt ::= SLIMIT NK_INTEGER */
+ { 357, -4 }, /* (450) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
+ { 357, -4 }, /* (451) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ { 358, 0 }, /* (452) limit_clause_opt ::= */
+ { 358, -2 }, /* (453) limit_clause_opt ::= LIMIT NK_INTEGER */
+ { 358, -4 }, /* (454) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */
+ { 358, -4 }, /* (455) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ { 319, -3 }, /* (456) subquery ::= NK_LP query_expression NK_RP */
+ { 340, -1 }, /* (457) search_condition ::= common_expression */
+ { 360, -1 }, /* (458) sort_specification_list ::= sort_specification */
+ { 360, -3 }, /* (459) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */
+ { 361, -3 }, /* (460) sort_specification ::= expression ordering_specification_opt null_ordering_opt */
+ { 362, 0 }, /* (461) ordering_specification_opt ::= */
+ { 362, -1 }, /* (462) ordering_specification_opt ::= ASC */
+ { 362, -1 }, /* (463) ordering_specification_opt ::= DESC */
+ { 363, 0 }, /* (464) null_ordering_opt ::= */
+ { 363, -2 }, /* (465) null_ordering_opt ::= NULLS FIRST */
+ { 363, -2 }, /* (466) null_ordering_opt ::= NULLS LAST */
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -3349,7 +3351,7 @@ static YYACTIONTYPE yy_reduce(
case 66: /* exists_opt ::= */ yytestcase(yyruleno==66);
case 240: /* analyze_opt ::= */ yytestcase(yyruleno==240);
case 248: /* agg_func_opt ::= */ yytestcase(yyruleno==248);
- case 399: /* set_quantifier_opt ::= */ yytestcase(yyruleno==399);
+ case 400: /* set_quantifier_opt ::= */ yytestcase(yyruleno==400);
{ yymsp[1].minor.yy481 = false; }
break;
case 65: /* exists_opt ::= IF EXISTS */
@@ -3491,8 +3493,8 @@ static YYACTIONTYPE yy_reduce(
case 228: /* func_list ::= func */ yytestcase(yyruleno==228);
case 295: /* literal_list ::= signed_literal */ yytestcase(yyruleno==295);
case 349: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==349);
- case 404: /* select_sublist ::= select_item */ yytestcase(yyruleno==404);
- case 457: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==457);
+ case 405: /* select_sublist ::= select_item */ yytestcase(yyruleno==405);
+ case 458: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==458);
{ yylhsminor.yy600 = createNodeList(pCxt, yymsp[0].minor.yy392); }
yymsp[0].minor.yy600 = yylhsminor.yy600;
break;
@@ -3503,8 +3505,8 @@ static YYACTIONTYPE yy_reduce(
case 229: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==229);
case 296: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==296);
case 350: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==350);
- case 405: /* select_sublist ::= select_sublist NK_COMMA select_item */ yytestcase(yyruleno==405);
- case 458: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==458);
+ case 406: /* select_sublist ::= select_sublist NK_COMMA select_item */ yytestcase(yyruleno==406);
+ case 459: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==459);
{ yylhsminor.yy600 = addNodeToList(pCxt, yymsp[-2].minor.yy600, yymsp[0].minor.yy392); }
yymsp[-2].minor.yy600 = yylhsminor.yy600;
break;
@@ -3585,9 +3587,9 @@ static YYACTIONTYPE yy_reduce(
break;
case 129: /* specific_tags_opt ::= */
case 160: /* tags_def_opt ::= */ yytestcase(yyruleno==160);
- case 412: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==412);
- case 429: /* group_by_clause_opt ::= */ yytestcase(yyruleno==429);
- case 445: /* order_by_clause_opt ::= */ yytestcase(yyruleno==445);
+ case 413: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==413);
+ case 430: /* group_by_clause_opt ::= */ yytestcase(yyruleno==430);
+ case 446: /* order_by_clause_opt ::= */ yytestcase(yyruleno==446);
{ yymsp[1].minor.yy600 = NULL; }
break;
case 130: /* specific_tags_opt ::= NK_LP col_name_list NK_RP */
@@ -3678,7 +3680,7 @@ static YYACTIONTYPE yy_reduce(
break;
case 161: /* tags_def_opt ::= tags_def */
case 348: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==348);
- case 403: /* select_list ::= select_sublist */ yytestcase(yyruleno==403);
+ case 404: /* select_list ::= select_sublist */ yytestcase(yyruleno==404);
{ yylhsminor.yy600 = yymsp[0].minor.yy600; }
yymsp[0].minor.yy600 = yylhsminor.yy600;
break;
@@ -3851,15 +3853,16 @@ static YYACTIONTYPE yy_reduce(
case 217: /* like_pattern_opt ::= */
case 225: /* index_options ::= */ yytestcase(yyruleno==225);
case 254: /* into_opt ::= */ yytestcase(yyruleno==254);
- case 410: /* where_clause_opt ::= */ yytestcase(yyruleno==410);
- case 414: /* twindow_clause_opt ::= */ yytestcase(yyruleno==414);
- case 419: /* sliding_opt ::= */ yytestcase(yyruleno==419);
- case 421: /* fill_opt ::= */ yytestcase(yyruleno==421);
- case 433: /* having_clause_opt ::= */ yytestcase(yyruleno==433);
- case 435: /* range_opt ::= */ yytestcase(yyruleno==435);
- case 437: /* every_opt ::= */ yytestcase(yyruleno==437);
- case 447: /* slimit_clause_opt ::= */ yytestcase(yyruleno==447);
- case 451: /* limit_clause_opt ::= */ yytestcase(yyruleno==451);
+ case 381: /* from_clause_opt ::= */ yytestcase(yyruleno==381);
+ case 411: /* where_clause_opt ::= */ yytestcase(yyruleno==411);
+ case 415: /* twindow_clause_opt ::= */ yytestcase(yyruleno==415);
+ case 420: /* sliding_opt ::= */ yytestcase(yyruleno==420);
+ case 422: /* fill_opt ::= */ yytestcase(yyruleno==422);
+ case 434: /* having_clause_opt ::= */ yytestcase(yyruleno==434);
+ case 436: /* range_opt ::= */ yytestcase(yyruleno==436);
+ case 438: /* every_opt ::= */ yytestcase(yyruleno==438);
+ case 448: /* slimit_clause_opt ::= */ yytestcase(yyruleno==448);
+ case 452: /* limit_clause_opt ::= */ yytestcase(yyruleno==452);
{ yymsp[1].minor.yy392 = NULL; }
break;
case 218: /* like_pattern_opt ::= LIKE NK_STRING */
@@ -3918,7 +3921,7 @@ static YYACTIONTYPE yy_reduce(
break;
case 241: /* analyze_opt ::= ANALYZE */
case 249: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==249);
- case 400: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==400);
+ case 401: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==401);
{ yymsp[0].minor.yy481 = true; }
break;
case 242: /* explain_options ::= */
@@ -3954,9 +3957,9 @@ static YYACTIONTYPE yy_reduce(
{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy481, &yymsp[0].minor.yy57); }
break;
case 255: /* into_opt ::= INTO full_table_name */
- case 381: /* from_clause ::= FROM table_reference_list */ yytestcase(yyruleno==381);
- case 411: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==411);
- case 434: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==434);
+ case 382: /* from_clause_opt ::= FROM table_reference_list */ yytestcase(yyruleno==382);
+ case 412: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==412);
+ case 435: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==435);
{ yymsp[-1].minor.yy392 = yymsp[0].minor.yy392; }
break;
case 256: /* stream_options ::= */
@@ -4040,12 +4043,12 @@ static YYACTIONTYPE yy_reduce(
case 377: /* boolean_primary ::= predicate */ yytestcase(yyruleno==377);
case 379: /* common_expression ::= expression */ yytestcase(yyruleno==379);
case 380: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==380);
- case 382: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==382);
- case 384: /* table_reference ::= table_primary */ yytestcase(yyruleno==384);
- case 385: /* table_reference ::= joined_table */ yytestcase(yyruleno==385);
- case 389: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==389);
- case 440: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==440);
- case 443: /* query_primary ::= query_specification */ yytestcase(yyruleno==443);
+ case 383: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==383);
+ case 385: /* table_reference ::= table_primary */ yytestcase(yyruleno==385);
+ case 386: /* table_reference ::= joined_table */ yytestcase(yyruleno==386);
+ case 390: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==390);
+ case 441: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==441);
+ case 444: /* query_primary ::= query_specification */ yytestcase(yyruleno==444);
{ yylhsminor.yy392 = yymsp[0].minor.yy392; }
yymsp[0].minor.yy392 = yylhsminor.yy392;
break;
@@ -4105,8 +4108,8 @@ static YYACTIONTYPE yy_reduce(
case 292: /* signed_literal ::= duration_literal */
case 294: /* signed_literal ::= literal_func */ yytestcase(yyruleno==294);
case 351: /* star_func_para ::= expression */ yytestcase(yyruleno==351);
- case 406: /* select_item ::= common_expression */ yytestcase(yyruleno==406);
- case 456: /* search_condition ::= common_expression */ yytestcase(yyruleno==456);
+ case 407: /* select_item ::= common_expression */ yytestcase(yyruleno==407);
+ case 457: /* search_condition ::= common_expression */ yytestcase(yyruleno==457);
{ yylhsminor.yy392 = releaseRawExprNode(pCxt, yymsp[0].minor.yy392); }
yymsp[0].minor.yy392 = yylhsminor.yy392;
break;
@@ -4221,7 +4224,7 @@ static YYACTIONTYPE yy_reduce(
yymsp[0].minor.yy600 = yylhsminor.yy600;
break;
case 352: /* star_func_para ::= table_name NK_DOT NK_STAR */
- case 409: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==409);
+ case 410: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==410);
{ yylhsminor.yy392 = createColumnNode(pCxt, &yymsp[-2].minor.yy57, &yymsp[0].minor.yy0); }
yymsp[-2].minor.yy392 = yylhsminor.yy392;
break;
@@ -4330,47 +4333,47 @@ static YYACTIONTYPE yy_reduce(
}
yymsp[-2].minor.yy392 = yylhsminor.yy392;
break;
- case 383: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */
+ case 384: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */
{ yylhsminor.yy392 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy392, yymsp[0].minor.yy392, NULL); }
yymsp[-2].minor.yy392 = yylhsminor.yy392;
break;
- case 386: /* table_primary ::= table_name alias_opt */
+ case 387: /* table_primary ::= table_name alias_opt */
{ yylhsminor.yy392 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy57, &yymsp[0].minor.yy57); }
yymsp[-1].minor.yy392 = yylhsminor.yy392;
break;
- case 387: /* table_primary ::= db_name NK_DOT table_name alias_opt */
+ case 388: /* table_primary ::= db_name NK_DOT table_name alias_opt */
{ yylhsminor.yy392 = createRealTableNode(pCxt, &yymsp[-3].minor.yy57, &yymsp[-1].minor.yy57, &yymsp[0].minor.yy57); }
yymsp[-3].minor.yy392 = yylhsminor.yy392;
break;
- case 388: /* table_primary ::= subquery alias_opt */
+ case 389: /* table_primary ::= subquery alias_opt */
{ yylhsminor.yy392 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy392), &yymsp[0].minor.yy57); }
yymsp[-1].minor.yy392 = yylhsminor.yy392;
break;
- case 390: /* alias_opt ::= */
+ case 391: /* alias_opt ::= */
{ yymsp[1].minor.yy57 = nil_token; }
break;
- case 391: /* alias_opt ::= table_alias */
+ case 392: /* alias_opt ::= table_alias */
{ yylhsminor.yy57 = yymsp[0].minor.yy57; }
yymsp[0].minor.yy57 = yylhsminor.yy57;
break;
- case 392: /* alias_opt ::= AS table_alias */
+ case 393: /* alias_opt ::= AS table_alias */
{ yymsp[-1].minor.yy57 = yymsp[0].minor.yy57; }
break;
- case 393: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */
- case 394: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==394);
+ case 394: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */
+ case 395: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==395);
{ yymsp[-2].minor.yy392 = yymsp[-1].minor.yy392; }
break;
- case 395: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
+ case 396: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
{ yylhsminor.yy392 = createJoinTableNode(pCxt, yymsp[-4].minor.yy204, yymsp[-5].minor.yy392, yymsp[-2].minor.yy392, yymsp[0].minor.yy392); }
yymsp[-5].minor.yy392 = yylhsminor.yy392;
break;
- case 396: /* join_type ::= */
+ case 397: /* join_type ::= */
{ yymsp[1].minor.yy204 = JOIN_TYPE_INNER; }
break;
- case 397: /* join_type ::= INNER */
+ case 398: /* join_type ::= INNER */
{ yymsp[0].minor.yy204 = JOIN_TYPE_INNER; }
break;
- case 398: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */
+ case 399: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */
{
yymsp[-11].minor.yy392 = createSelectStmt(pCxt, yymsp[-10].minor.yy481, yymsp[-9].minor.yy600, yymsp[-8].minor.yy392);
yymsp[-11].minor.yy392 = addWhereClause(pCxt, yymsp[-11].minor.yy392, yymsp[-7].minor.yy392);
@@ -4383,74 +4386,74 @@ static YYACTIONTYPE yy_reduce(
yymsp[-11].minor.yy392 = addFillClause(pCxt, yymsp[-11].minor.yy392, yymsp[-3].minor.yy392);
}
break;
- case 401: /* set_quantifier_opt ::= ALL */
+ case 402: /* set_quantifier_opt ::= ALL */
{ yymsp[0].minor.yy481 = false; }
break;
- case 402: /* select_list ::= NK_STAR */
+ case 403: /* select_list ::= NK_STAR */
{ yymsp[0].minor.yy600 = NULL; }
break;
- case 407: /* select_item ::= common_expression column_alias */
+ case 408: /* select_item ::= common_expression column_alias */
{ yylhsminor.yy392 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy392), &yymsp[0].minor.yy57); }
yymsp[-1].minor.yy392 = yylhsminor.yy392;
break;
- case 408: /* select_item ::= common_expression AS column_alias */
+ case 409: /* select_item ::= common_expression AS column_alias */
{ yylhsminor.yy392 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy392), &yymsp[0].minor.yy57); }
yymsp[-2].minor.yy392 = yylhsminor.yy392;
break;
- case 413: /* partition_by_clause_opt ::= PARTITION BY expression_list */
- case 430: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==430);
- case 446: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==446);
+ case 414: /* partition_by_clause_opt ::= PARTITION BY expression_list */
+ case 431: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==431);
+ case 447: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==447);
{ yymsp[-2].minor.yy600 = yymsp[0].minor.yy600; }
break;
- case 415: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
+ case 416: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
{ yymsp[-5].minor.yy392 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy392), releaseRawExprNode(pCxt, yymsp[-1].minor.yy392)); }
break;
- case 416: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */
+ case 417: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */
{ yymsp[-3].minor.yy392 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy392)); }
break;
- case 417: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
+ case 418: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
{ yymsp[-5].minor.yy392 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy392), NULL, yymsp[-1].minor.yy392, yymsp[0].minor.yy392); }
break;
- case 418: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
+ case 419: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
{ yymsp[-7].minor.yy392 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy392), releaseRawExprNode(pCxt, yymsp[-3].minor.yy392), yymsp[-1].minor.yy392, yymsp[0].minor.yy392); }
break;
- case 420: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */
- case 438: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==438);
+ case 421: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */
+ case 439: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==439);
{ yymsp[-3].minor.yy392 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy392); }
break;
- case 422: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */
+ case 423: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */
{ yymsp[-3].minor.yy392 = createFillNode(pCxt, yymsp[-1].minor.yy270, NULL); }
break;
- case 423: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
+ case 424: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
{ yymsp[-5].minor.yy392 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy600)); }
break;
- case 424: /* fill_mode ::= NONE */
+ case 425: /* fill_mode ::= NONE */
{ yymsp[0].minor.yy270 = FILL_MODE_NONE; }
break;
- case 425: /* fill_mode ::= PREV */
+ case 426: /* fill_mode ::= PREV */
{ yymsp[0].minor.yy270 = FILL_MODE_PREV; }
break;
- case 426: /* fill_mode ::= NULL */
+ case 427: /* fill_mode ::= NULL */
{ yymsp[0].minor.yy270 = FILL_MODE_NULL; }
break;
- case 427: /* fill_mode ::= LINEAR */
+ case 428: /* fill_mode ::= LINEAR */
{ yymsp[0].minor.yy270 = FILL_MODE_LINEAR; }
break;
- case 428: /* fill_mode ::= NEXT */
+ case 429: /* fill_mode ::= NEXT */
{ yymsp[0].minor.yy270 = FILL_MODE_NEXT; }
break;
- case 431: /* group_by_list ::= expression */
+ case 432: /* group_by_list ::= expression */
{ yylhsminor.yy600 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy392))); }
yymsp[0].minor.yy600 = yylhsminor.yy600;
break;
- case 432: /* group_by_list ::= group_by_list NK_COMMA expression */
+ case 433: /* group_by_list ::= group_by_list NK_COMMA expression */
{ yylhsminor.yy600 = addNodeToList(pCxt, yymsp[-2].minor.yy600, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy392))); }
yymsp[-2].minor.yy600 = yylhsminor.yy600;
break;
- case 436: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */
+ case 437: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */
{ yymsp[-5].minor.yy392 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy392), releaseRawExprNode(pCxt, yymsp[-1].minor.yy392)); }
break;
- case 439: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */
+ case 440: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */
{
yylhsminor.yy392 = addOrderByClause(pCxt, yymsp[-3].minor.yy392, yymsp[-2].minor.yy600);
yylhsminor.yy392 = addSlimitClause(pCxt, yylhsminor.yy392, yymsp[-1].minor.yy392);
@@ -4458,56 +4461,56 @@ static YYACTIONTYPE yy_reduce(
}
yymsp[-3].minor.yy392 = yylhsminor.yy392;
break;
- case 441: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */
+ case 442: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */
{ yylhsminor.yy392 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy392, yymsp[0].minor.yy392); }
yymsp[-3].minor.yy392 = yylhsminor.yy392;
break;
- case 442: /* query_expression_body ::= query_expression_body UNION query_expression_body */
+ case 443: /* query_expression_body ::= query_expression_body UNION query_expression_body */
{ yylhsminor.yy392 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy392, yymsp[0].minor.yy392); }
yymsp[-2].minor.yy392 = yylhsminor.yy392;
break;
- case 444: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */
+ case 445: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */
{ yymsp[-5].minor.yy392 = yymsp[-4].minor.yy392; }
yy_destructor(yypParser,356,&yymsp[-3].minor);
yy_destructor(yypParser,357,&yymsp[-2].minor);
yy_destructor(yypParser,358,&yymsp[-1].minor);
break;
- case 448: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */
- case 452: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==452);
+ case 449: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */
+ case 453: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==453);
{ yymsp[-1].minor.yy392 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); }
break;
- case 449: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
- case 453: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==453);
+ case 450: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
+ case 454: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==454);
{ yymsp[-3].minor.yy392 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); }
break;
- case 450: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- case 454: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==454);
+ case 451: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ case 455: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==455);
{ yymsp[-3].minor.yy392 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); }
break;
- case 455: /* subquery ::= NK_LP query_expression NK_RP */
+ case 456: /* subquery ::= NK_LP query_expression NK_RP */
{ yylhsminor.yy392 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy392); }
yymsp[-2].minor.yy392 = yylhsminor.yy392;
break;
- case 459: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */
+ case 460: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */
{ yylhsminor.yy392 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy392), yymsp[-1].minor.yy162, yymsp[0].minor.yy529); }
yymsp[-2].minor.yy392 = yylhsminor.yy392;
break;
- case 460: /* ordering_specification_opt ::= */
+ case 461: /* ordering_specification_opt ::= */
{ yymsp[1].minor.yy162 = ORDER_ASC; }
break;
- case 461: /* ordering_specification_opt ::= ASC */
+ case 462: /* ordering_specification_opt ::= ASC */
{ yymsp[0].minor.yy162 = ORDER_ASC; }
break;
- case 462: /* ordering_specification_opt ::= DESC */
+ case 463: /* ordering_specification_opt ::= DESC */
{ yymsp[0].minor.yy162 = ORDER_DESC; }
break;
- case 463: /* null_ordering_opt ::= */
+ case 464: /* null_ordering_opt ::= */
{ yymsp[1].minor.yy529 = NULL_ORDER_DEFAULT; }
break;
- case 464: /* null_ordering_opt ::= NULLS FIRST */
+ case 465: /* null_ordering_opt ::= NULLS FIRST */
{ yymsp[-1].minor.yy529 = NULL_ORDER_FIRST; }
break;
- case 465: /* null_ordering_opt ::= NULLS LAST */
+ case 466: /* null_ordering_opt ::= NULLS LAST */
{ yymsp[-1].minor.yy529 = NULL_ORDER_LAST; }
break;
default:
diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp
index 0213a3a854..8802f91bdf 100644
--- a/source/libs/parser/test/mockCatalog.cpp
+++ b/source/libs/parser/test/mockCatalog.cpp
@@ -261,6 +261,11 @@ int32_t __catalogGetDnodeList(SCatalog* pCatalog, SRequestConnInfo* pConn, SArra
return g_mockCatalogService->catalogGetDnodeList(pDnodeList);
}
+int32_t __catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg** pCfg) {
+ *pCfg = (STableCfg*)taosMemoryCalloc(1, sizeof(STableCfg));
+ return 0;
+}
+
void initMetaDataEnv() {
g_mockCatalogService.reset(new MockCatalogService());
@@ -279,6 +284,7 @@ void initMetaDataEnv() {
stub.set(catalogRemoveTableMeta, __catalogRemoveTableMeta);
stub.set(catalogGetTableIndex, __catalogGetTableIndex);
stub.set(catalogGetDnodeList, __catalogGetDnodeList);
+ stub.set(catalogRefreshGetTableCfg, __catalogRefreshGetTableCfg);
// {
// AddrAny any("libcatalog.so");
// std::map result;
diff --git a/source/libs/parser/test/mockCatalogService.cpp b/source/libs/parser/test/mockCatalogService.cpp
index 7915c32437..1f7657146b 100644
--- a/source/libs/parser/test/mockCatalogService.cpp
+++ b/source/libs/parser/test/mockCatalogService.cpp
@@ -199,6 +199,9 @@ class MockCatalogServiceImpl {
if (TSDB_CODE_SUCCESS == code && pCatalogReq->dNodeRequired) {
code = catalogGetDnodeList(&pMetaData->pDnodeList);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = getAllTableCfg(pCatalogReq->pTableCfg, &pMetaData->pTableCfg);
+ }
return code;
}
@@ -545,6 +548,20 @@ class MockCatalogServiceImpl {
return TSDB_CODE_SUCCESS;
}
+ int32_t getAllTableCfg(SArray* pTableCfgReq, SArray** pTableCfgData) const {
+ if (NULL != pTableCfgReq) {
+ int32_t ntables = taosArrayGetSize(pTableCfgReq);
+ *pTableCfgData = taosArrayInit(ntables, sizeof(SMetaRes));
+ for (int32_t i = 0; i < ntables; ++i) {
+ SMetaRes res = {0};
+ res.pRes = taosMemoryCalloc(1, sizeof(STableCfg));
+ res.code = TSDB_CODE_SUCCESS;
+ taosArrayPush(*pTableCfgData, &res);
+ }
+ }
+ return TSDB_CODE_SUCCESS;
+ }
+
uint64_t id_;
std::unique_ptr builder_;
DbMetaCache meta_;
diff --git a/source/libs/parser/test/parSelectTest.cpp b/source/libs/parser/test/parSelectTest.cpp
index 11e09cd83d..e7ab1cb61b 100644
--- a/source/libs/parser/test/parSelectTest.cpp
+++ b/source/libs/parser/test/parSelectTest.cpp
@@ -388,4 +388,10 @@ TEST_F(ParserSelectTest, informationSchema) {
run("SELECT * FROM information_schema.user_databases WHERE name = 'information_schema'");
}
+TEST_F(ParserSelectTest, withoutFrom) {
+ useDb("root", "test");
+
+ run("SELECT 1");
+}
+
} // namespace ParserTest
diff --git a/source/libs/parser/test/parShowToUse.cpp b/source/libs/parser/test/parShowToUse.cpp
index 1a68e80872..81a09114e3 100644
--- a/source/libs/parser/test/parShowToUse.cpp
+++ b/source/libs/parser/test/parShowToUse.cpp
@@ -45,7 +45,7 @@ TEST_F(ParserShowToUseTest, showCreateSTable) {
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_SHOW_CREATE_STABLE_STMT);
ASSERT_EQ(pQuery->execMode, QUERY_EXEC_MODE_LOCAL);
ASSERT_TRUE(pQuery->haveResultSet);
- ASSERT_NE(((SShowCreateTableStmt*)pQuery->pRoot)->pMeta, nullptr);
+ ASSERT_NE(((SShowCreateTableStmt*)pQuery->pRoot)->pCfg, nullptr);
});
run("SHOW CREATE STABLE st1");
@@ -58,7 +58,7 @@ TEST_F(ParserShowToUseTest, showCreateTable) {
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_SHOW_CREATE_TABLE_STMT);
ASSERT_EQ(pQuery->execMode, QUERY_EXEC_MODE_LOCAL);
ASSERT_TRUE(pQuery->haveResultSet);
- ASSERT_NE(((SShowCreateTableStmt*)pQuery->pRoot)->pMeta, nullptr);
+ ASSERT_NE(((SShowCreateTableStmt*)pQuery->pRoot)->pCfg, nullptr);
});
run("SHOW CREATE TABLE t1");
diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c
index 46ba9aca74..9dbd49e66c 100644
--- a/source/libs/planner/src/planLogicCreater.c
+++ b/source/libs/planner/src/planLogicCreater.c
@@ -56,8 +56,12 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) {
pCol->node.resType = pToBeRewrittenExpr->resType;
strcpy(pCol->node.aliasName, pToBeRewrittenExpr->aliasName);
strcpy(pCol->colName, ((SExprNode*)pExpr)->aliasName);
- if (QUERY_NODE_FUNCTION == nodeType(pExpr) && FUNCTION_TYPE_WSTARTTS == ((SFunctionNode*)pExpr)->funcType) {
- pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
+ if (QUERY_NODE_FUNCTION == nodeType(pExpr)) {
+ if (FUNCTION_TYPE_WSTARTTS == ((SFunctionNode*)pExpr)->funcType) {
+ pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
+ } else if (FUNCTION_TYPE_TBNAME == ((SFunctionNode*)pExpr)->funcType) {
+ pCol->colType = COLUMN_TYPE_TBNAME;
+ }
}
nodesDestroyNode(*pNode);
*pNode = (SNode*)pCol;
@@ -292,6 +296,59 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
return code;
}
+static int32_t createColumnByLastRow(SNodeList* pFuncs, SNodeList** pOutput) {
+ int32_t code = TSDB_CODE_SUCCESS;
+ SNodeList* pCols = NULL;
+ SNode* pFunc = NULL;
+ FOREACH(pFunc, pFuncs) {
+ SFunctionNode* pLastRow = (SFunctionNode*)pFunc;
+ SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pLastRow->pParameterList, 0);
+ snprintf(pCol->colName, sizeof(pCol->colName), "%s", pLastRow->node.aliasName);
+ snprintf(pCol->node.aliasName, sizeof(pCol->colName), "%s", pLastRow->node.aliasName);
+ NODES_CLEAR_LIST(pLastRow->pParameterList);
+ code = nodesListMakeStrictAppend(&pCols, (SNode*)pCol);
+ if (TSDB_CODE_SUCCESS != code) {
+ break;
+ }
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ *pOutput = pCols;
+ } else {
+ nodesDestroyList(pCols);
+ }
+ return code;
+}
+
+static int32_t createLastRowScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SRealTableNode* pRealTable,
+ SLogicNode** pLogicNode) {
+ SScanLogicNode* pScan = NULL;
+ int32_t code = makeScanLogicNode(pCxt, pRealTable, false, (SLogicNode**)&pScan);
+
+ SNodeList* pFuncs = NULL;
+ if (TSDB_CODE_SUCCESS == code) {
+ pScan->scanType = SCAN_TYPE_LAST_ROW;
+ code = nodesCollectFuncs(pSelect, SQL_CLAUSE_FROM, fmIsLastRowFunc, &pFuncs);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = rewriteExprsForSelect(pFuncs, pSelect, SQL_CLAUSE_FROM);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = createColumnByLastRow(pFuncs, &pScan->pScanCols);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = createColumnByRewriteExprs(pScan->pScanCols, &pScan->node.pTargets);
+ }
+
+ if (TSDB_CODE_SUCCESS == code) {
+ *pLogicNode = (SLogicNode*)pScan;
+ } else {
+ nodesDestroyNode((SNode*)pScan);
+ }
+ nodesDestroyList(pFuncs);
+
+ return code;
+}
+
static int32_t createSubqueryLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, STempTableNode* pTable,
SLogicNode** pLogicNode) {
return createQueryLogicNode(pCxt, pTable->pSubquery, pLogicNode);
@@ -363,7 +420,11 @@ static int32_t doCreateLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pS
SLogicNode** pLogicNode) {
switch (nodeType(pTable)) {
case QUERY_NODE_REAL_TABLE:
- return createScanLogicNode(pCxt, pSelect, (SRealTableNode*)pTable, pLogicNode);
+ if (pSelect->hasLastRowFunc) {
+ return createLastRowScanLogicNode(pCxt, pSelect, (SRealTableNode*)pTable, pLogicNode);
+ } else {
+ return createScanLogicNode(pCxt, pSelect, (SRealTableNode*)pTable, pLogicNode);
+ }
case QUERY_NODE_TEMP_TABLE:
return createSubqueryLogicNode(pCxt, pSelect, (STempTableNode*)pTable, pLogicNode);
case QUERY_NODE_JOIN_TABLE:
@@ -840,7 +901,12 @@ static int32_t createDistinctLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSe
return code;
}
-static int32_t createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) {
+static int32_t createSelectWithoutFromLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect,
+ SLogicNode** pLogicNode) {
+ return createProjectLogicNode(pCxt, pSelect, pLogicNode);
+}
+
+static int32_t createSelectFromLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) {
SLogicNode* pRoot = NULL;
int32_t code = createLogicNodeByTable(pCxt, pSelect, pSelect->pFromTable, &pRoot);
if (TSDB_CODE_SUCCESS == code) {
@@ -880,6 +946,14 @@ static int32_t createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSele
return code;
}
+static int32_t createSelectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) {
+ if (NULL == pSelect->pFromTable) {
+ return createSelectWithoutFromLogicNode(pCxt, pSelect, pLogicNode);
+ } else {
+ return createSelectFromLogicNode(pCxt, pSelect, pLogicNode);
+ }
+}
+
static int32_t createSetOpRootLogicNode(SLogicPlanContext* pCxt, SSetOperator* pSetOperator, FCreateSetOpLogicNode func,
SLogicNode** pRoot) {
return createRootLogicNode(pCxt, pSetOperator, pSetOperator->precision, (FCreateLogicNode)func, pRoot);
diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c
index de6edea222..7e5424b7c6 100644
--- a/source/libs/planner/src/planOptimizer.c
+++ b/source/libs/planner/src/planOptimizer.c
@@ -292,16 +292,22 @@ static int32_t cpdCondAppend(SNode** pCond, SNode** pAdditionalCond) {
return code;
}
-static int32_t cpdCalcTimeRange(SScanLogicNode* pScan, SNode** pPrimaryKeyCond, SNode** pOtherCond) {
- bool isStrict = false;
- int32_t code = filterGetTimeRange(*pPrimaryKeyCond, &pScan->scanRange, &isStrict);
- if (TSDB_CODE_SUCCESS == code) {
- if (isStrict) {
- nodesDestroyNode(*pPrimaryKeyCond);
- } else {
- code = cpdCondAppend(pOtherCond, pPrimaryKeyCond);
+static int32_t cpdCalcTimeRange(SOptimizeContext* pCxt, SScanLogicNode* pScan, SNode** pPrimaryKeyCond,
+ SNode** pOtherCond) {
+ int32_t code = TSDB_CODE_SUCCESS;
+ if (pCxt->pPlanCxt->topicQuery || pCxt->pPlanCxt->streamQuery) {
+ code = cpdCondAppend(pOtherCond, pPrimaryKeyCond);
+ } else {
+ bool isStrict = false;
+ code = filterGetTimeRange(*pPrimaryKeyCond, &pScan->scanRange, &isStrict);
+ if (TSDB_CODE_SUCCESS == code) {
+ if (isStrict) {
+ nodesDestroyNode(*pPrimaryKeyCond);
+ } else {
+ code = cpdCondAppend(pOtherCond, pPrimaryKeyCond);
+ }
+ *pPrimaryKeyCond = NULL;
}
- *pPrimaryKeyCond = NULL;
}
return code;
}
@@ -317,7 +323,7 @@ static int32_t cpdOptimizeScanCondition(SOptimizeContext* pCxt, SScanLogicNode*
int32_t code = nodesPartitionCond(&pScan->node.pConditions, &pPrimaryKeyCond, &pScan->pTagIndexCond, &pScan->pTagCond,
&pOtherCond);
if (TSDB_CODE_SUCCESS == code && NULL != pPrimaryKeyCond) {
- code = cpdCalcTimeRange(pScan, &pPrimaryKeyCond, &pOtherCond);
+ code = cpdCalcTimeRange(pCxt, pScan, &pPrimaryKeyCond, &pOtherCond);
}
if (TSDB_CODE_SUCCESS == code) {
pScan->node.pConditions = pOtherCond;
@@ -1012,7 +1018,7 @@ static int32_t smaOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan)
static EDealRes partTagsOptHasColImpl(SNode* pNode, void* pContext) {
if (QUERY_NODE_COLUMN == nodeType(pNode)) {
- if (COLUMN_TYPE_TAG != ((SColumnNode*)pNode)->colType) {
+ if (COLUMN_TYPE_TAG != ((SColumnNode*)pNode)->colType && COLUMN_TYPE_TBNAME != ((SColumnNode*)pNode)->colType) {
*(bool*)pContext = true;
return DEAL_RES_END;
}
@@ -1027,9 +1033,9 @@ static bool partTagsOptHasCol(SNodeList* pPartKeys) {
}
static bool partTagsIsOptimizableNode(SLogicNode* pNode) {
- return ((QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode) /*||
+ return ((QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode) ||
(QUERY_NODE_LOGIC_PLAN_AGG == nodeType(pNode) && NULL != ((SAggLogicNode*)pNode)->pGroupKeys &&
- NULL != ((SAggLogicNode*)pNode)->pAggFuncs)*/) &&
+ NULL != ((SAggLogicNode*)pNode)->pAggFuncs)) &&
1 == LIST_LENGTH(pNode->pChildren) &&
QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(nodesListGetNode(pNode->pChildren, 0)));
}
@@ -1050,6 +1056,28 @@ static bool partTagsOptMayBeOptimized(SLogicNode* pNode) {
return !partTagsOptHasCol(partTagsGetPartKeys(pNode));
}
+static EDealRes partTagsOptRebuildTbanmeImpl(SNode** pNode, void* pContext) {
+ if (QUERY_NODE_COLUMN == nodeType(*pNode) && COLUMN_TYPE_TBNAME == ((SColumnNode*)*pNode)->colType) {
+ SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
+ if (NULL == pFunc) {
+ *(int32_t*)pContext = TSDB_CODE_OUT_OF_MEMORY;
+ return DEAL_RES_ERROR;
+ }
+ strcpy(pFunc->functionName, "tbname");
+ pFunc->funcType = FUNCTION_TYPE_TBNAME;
+ nodesDestroyNode(*pNode);
+ *pNode = (SNode*)pFunc;
+ return DEAL_RES_IGNORE_CHILD;
+ }
+ return DEAL_RES_CONTINUE;
+}
+
+static int32_t partTagsOptRebuildTbanme(SNodeList* pPartKeys) {
+ int32_t code = TSDB_CODE_SUCCESS;
+ nodesRewriteExprs(pPartKeys, partTagsOptRebuildTbanmeImpl, &code);
+ return code;
+}
+
static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) {
SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, partTagsOptMayBeOptimized);
if (NULL == pNode) {
@@ -1066,7 +1094,18 @@ static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub
nodesDestroyNode((SNode*)pNode);
}
} else {
- TSWAP(((SAggLogicNode*)pNode)->pGroupKeys, pScan->pPartTags);
+ SNode* pGroupKey = NULL;
+ FOREACH(pGroupKey, ((SAggLogicNode*)pNode)->pGroupKeys) {
+ code = nodesListMakeStrictAppend(
+ &pScan->pPartTags, nodesCloneNode(nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0)));
+ if (TSDB_CODE_SUCCESS != code) {
+ break;
+ }
+ }
+ NODES_DESTORY_LIST(((SAggLogicNode*)pNode)->pGroupKeys);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = partTagsOptRebuildTbanme(pScan->pPartTags);
}
return code;
}
@@ -1154,7 +1193,7 @@ static const SOptimizeRule optimizeRuleSet[] = {
{.pName = "ConditionPushDown", .optimizeFunc = cpdOptimize},
{.pName = "OrderByPrimaryKey", .optimizeFunc = opkOptimize},
{.pName = "SmaIndex", .optimizeFunc = smaOptimize},
- {.pName = "PartitionByTags", .optimizeFunc = partTagsOptimize},
+ // {.pName = "PartitionTags", .optimizeFunc = partTagsOptimize},
{.pName = "EliminateProject", .optimizeFunc = eliminateProjOptimize}
};
// clang-format on
diff --git a/source/libs/planner/src/planPhysiCreater.c b/source/libs/planner/src/planPhysiCreater.c
index b5a4e4b81f..5f8fd4ac4e 100644
--- a/source/libs/planner/src/planPhysiCreater.c
+++ b/source/libs/planner/src/planPhysiCreater.c
@@ -471,6 +471,8 @@ static ENodeType getScanOperatorType(EScanType scanType) {
return QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN;
case SCAN_TYPE_BLOCK_INFO:
return QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN;
+ case SCAN_TYPE_LAST_ROW:
+ return QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN;
default:
break;
}
@@ -568,6 +570,7 @@ static int32_t createScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubplan,
switch (pScanLogicNode->scanType) {
case SCAN_TYPE_TAG:
case SCAN_TYPE_BLOCK_INFO:
+ case SCAN_TYPE_LAST_ROW:
return createSimpleScanPhysiNode(pCxt, pSubplan, pScanLogicNode, pPhyNode);
case SCAN_TYPE_TABLE:
return createTableScanPhysiNode(pCxt, pSubplan, pScanLogicNode, pPhyNode);
@@ -741,7 +744,7 @@ static int32_t rewritePrecalcExprs(SPhysiPlanContext* pCxt, SNodeList* pList, SN
SRewritePrecalcExprsCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pPrecalcExprs = *pPrecalcExprs};
nodesRewriteExprs(*pRewrittenList, doRewritePrecalcExprs, &cxt);
if (0 == LIST_LENGTH(cxt.pPrecalcExprs) || TSDB_CODE_SUCCESS != cxt.errCode) {
- DESTORY_LIST(*pPrecalcExprs);
+ NODES_DESTORY_LIST(*pPrecalcExprs);
}
return cxt.errCode;
}
@@ -923,8 +926,16 @@ static int32_t createProjectPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChild
pProject->slimit = pProjectLogicNode->slimit;
pProject->soffset = pProjectLogicNode->soffset;
- int32_t code = setListSlotId(pCxt, ((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc->dataBlockId,
- -1, pProjectLogicNode->pProjections, &pProject->pProjections);
+ int32_t code = TSDB_CODE_SUCCESS;
+ if (0 == LIST_LENGTH(pChildren)) {
+ pProject->pProjections = nodesCloneList(pProjectLogicNode->pProjections);
+ if (NULL == pProject->pProjections) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ }
+ } else {
+ code = setListSlotId(pCxt, ((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc->dataBlockId, -1,
+ pProjectLogicNode->pProjections, &pProject->pProjections);
+ }
if (TSDB_CODE_SUCCESS == code) {
code = addDataBlockSlotsForProject(pCxt, pProjectLogicNode->stmtName, pProject->pProjections,
pProject->node.pOutputDataBlockDesc);
@@ -1047,7 +1058,7 @@ static ENodeType getIntervalOperatorType(EWindowAlgorithm windowAlgo) {
case INTERVAL_ALGO_HASH:
return QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL;
case INTERVAL_ALGO_MERGE:
- return QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL;
+ return QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL;
case INTERVAL_ALGO_STREAM_FINAL:
return QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL;
case INTERVAL_ALGO_STREAM_SEMI:
diff --git a/source/libs/planner/src/planSpliter.c b/source/libs/planner/src/planSpliter.c
index 390d665760..f0e0e84bd9 100644
--- a/source/libs/planner/src/planSpliter.c
+++ b/source/libs/planner/src/planSpliter.c
@@ -176,7 +176,7 @@ static bool stbSplNeedSplit(bool streamQuery, SLogicNode* pNode) {
return !stbSplHasGatherExecFunc(((SAggLogicNode*)pNode)->pAggFuncs) && stbSplHasMultiTbScan(streamQuery, pNode);
case QUERY_NODE_LOGIC_PLAN_WINDOW: {
SWindowLogicNode* pWindow = (SWindowLogicNode*)pNode;
- if (WINDOW_TYPE_STATE == pWindow->winType || (!streamQuery && WINDOW_TYPE_SESSION == pWindow->winType) ) {
+ if (WINDOW_TYPE_STATE == pWindow->winType || (!streamQuery && WINDOW_TYPE_SESSION == pWindow->winType)) {
return false;
}
return !stbSplHasGatherExecFunc(pWindow->pFuncs) && stbSplHasMultiTbScan(streamQuery, pNode);
@@ -380,6 +380,7 @@ static int32_t stbSplCreateExchangeNode(SSplitContext* pCxt, SLogicNode* pParent
SExchangeLogicNode* pExchange = NULL;
int32_t code = splCreateExchangeNode(pCxt, pPartChild, &pExchange);
if (TSDB_CODE_SUCCESS == code) {
+ pExchange->node.pParent = pParent;
code = nodesListMakeAppend(&pParent->pChildren, (SNode*)pExchange);
}
return code;
@@ -484,7 +485,27 @@ static int32_t stbSplSplitSession(SSplitContext* pCxt, SStableSplitInfo* pInfo)
}
}
-static int32_t stbSplSplitWindowNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) {
+static SNodeList* stbSplGetPartKeys(SLogicNode* pNode) {
+ if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) {
+ return ((SScanLogicNode*)pNode)->pPartTags;
+ } else {
+ return NULL;
+ }
+}
+
+static bool stbSplIsPartTbanme(SNodeList* pPartKeys) {
+ if (NULL == pPartKeys || 1 != LIST_LENGTH(pPartKeys)) {
+ return false;
+ }
+ SNode* pPartKey = nodesListGetNode(pPartKeys, 0);
+ return QUERY_NODE_FUNCTION == nodeType(pPartKey) && FUNCTION_TYPE_TBNAME == ((SFunctionNode*)pPartKey)->funcType;
+}
+
+static bool stbSplIsMultiTableWinodw(SWindowLogicNode* pWindow) {
+ return stbSplIsPartTbanme(stbSplGetPartKeys((SLogicNode*)nodesListGetNode(pWindow->node.pChildren, 0)));
+}
+
+static int32_t stbSplSplitWindowForMergeTable(SSplitContext* pCxt, SStableSplitInfo* pInfo) {
switch (((SWindowLogicNode*)pInfo->pSplitNode)->winType) {
case WINDOW_TYPE_INTERVAL:
return stbSplSplitInterval(pCxt, pInfo);
@@ -496,6 +517,34 @@ static int32_t stbSplSplitWindowNode(SSplitContext* pCxt, SStableSplitInfo* pInf
return TSDB_CODE_PLAN_INTERNAL_ERROR;
}
+static int32_t stbSplSplitWindowForMultiTable(SSplitContext* pCxt, SStableSplitInfo* pInfo) {
+ if (pCxt->pPlanCxt->streamQuery) {
+ SPLIT_FLAG_SET_MASK(pInfo->pSubplan->splitFlag, SPLIT_FLAG_STABLE_SPLIT);
+ return TSDB_CODE_SUCCESS;
+ }
+
+ SExchangeLogicNode* pExchange = NULL;
+ int32_t code = splCreateExchangeNode(pCxt, pInfo->pSplitNode, &pExchange);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = replaceLogicNode(pInfo->pSubplan, pInfo->pSplitNode, (SLogicNode*)pExchange);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = nodesListMakeStrictAppend(&pInfo->pSubplan->pChildren,
+ (SNode*)splCreateScanSubplan(pCxt, pInfo->pSplitNode, SPLIT_FLAG_STABLE_SPLIT));
+ }
+ pInfo->pSubplan->subplanType = SUBPLAN_TYPE_MERGE;
+ ++(pCxt->groupId);
+ return code;
+}
+
+static int32_t stbSplSplitWindowNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) {
+ if (stbSplIsMultiTableWinodw((SWindowLogicNode*)pInfo->pSplitNode)) {
+ return stbSplSplitWindowForMultiTable(pCxt, pInfo);
+ } else {
+ return stbSplSplitWindowForMergeTable(pCxt, pInfo);
+ }
+}
+
static int32_t stbSplCreatePartAggNode(SAggLogicNode* pMergeAgg, SLogicNode** pOutput) {
SNodeList* pFunc = pMergeAgg->pAggFuncs;
pMergeAgg->pAggFuncs = NULL;
@@ -885,7 +934,7 @@ static int32_t unionSplitSubplan(SSplitContext* pCxt, SLogicSubplan* pUnionSubpl
}
if (TSDB_CODE_SUCCESS == code) {
nodesDestroyList(pSubplanChildren);
- DESTORY_LIST(pSplitNode->pChildren);
+ NODES_DESTORY_LIST(pSplitNode->pChildren);
}
return code;
}
diff --git a/source/libs/planner/test/planBasicTest.cpp b/source/libs/planner/test/planBasicTest.cpp
index f74c7df355..790c418b17 100644
--- a/source/libs/planner/test/planBasicTest.cpp
+++ b/source/libs/planner/test/planBasicTest.cpp
@@ -83,3 +83,21 @@ TEST_F(PlanBasicTest, interpFunc) {
run("SELECT INTERP(c1) FROM t1 RANGE('2017-7-14 18:00:00', '2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR)");
}
+
+TEST_F(PlanBasicTest, lastRowFunc) {
+ useDb("root", "test");
+
+ run("SELECT LAST_ROW(c1) FROM t1");
+
+ run("SELECT LAST_ROW(*) FROM t1");
+
+ run("SELECT LAST_ROW(c1, c2) FROM t1");
+
+ run("SELECT LAST_ROW(c1) FROM st1");
+}
+
+TEST_F(PlanBasicTest, withoutFrom) {
+ useDb("root", "test");
+
+ run("SELECT 1");
+}
diff --git a/source/libs/planner/test/planOtherTest.cpp b/source/libs/planner/test/planOtherTest.cpp
index 12d14369de..b8963c29f9 100644
--- a/source/libs/planner/test/planOtherTest.cpp
+++ b/source/libs/planner/test/planOtherTest.cpp
@@ -37,7 +37,9 @@ TEST_F(PlanOtherTest, createStream) {
TEST_F(PlanOtherTest, createStreamUseSTable) {
useDb("root", "test");
- run("create stream if not exists s1 as select count(*) from st1 interval(10s)");
+ run("CREATE STREAM IF NOT EXISTS s1 as SELECT COUNT(*) FROM st1 INTERVAL(10s)");
+
+ run("CREATE STREAM IF NOT EXISTS s1 as SELECT COUNT(*) FROM st1 PARTITION BY TBNAME INTERVAL(10s)");
}
TEST_F(PlanOtherTest, createSmaIndex) {
diff --git a/source/libs/qcom/src/queryUtil.c b/source/libs/qcom/src/queryUtil.c
index 2120d24d26..c807c1c4cd 100644
--- a/source/libs/qcom/src/queryUtil.c
+++ b/source/libs/qcom/src/queryUtil.c
@@ -19,6 +19,7 @@
#include "tmsg.h"
#include "trpc.h"
#include "tsched.h"
+#include "cJSON.h"
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
#define VALIDNUMOFTAGS(x) ((x) >= 0 && (x) <= TSDB_MAX_TAGS)
@@ -220,3 +221,209 @@ void destroyQueryExecRes(SQueryExecRes* pRes) {
qError("invalid exec result for request type %d", pRes->msgType);
}
}
+
+int32_t dataConverToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *len) {
+ int32_t n = 0;
+
+ switch (type) {
+ case TSDB_DATA_TYPE_NULL:
+ n = sprintf(str, "null");
+ break;
+
+ case TSDB_DATA_TYPE_BOOL:
+ n = sprintf(str, (*(int8_t*)buf) ? "true" : "false");
+ break;
+
+ case TSDB_DATA_TYPE_TINYINT:
+ n = sprintf(str, "%d", *(int8_t*)buf);
+ break;
+
+ case TSDB_DATA_TYPE_SMALLINT:
+ n = sprintf(str, "%d", *(int16_t*)buf);
+ break;
+
+ case TSDB_DATA_TYPE_INT:
+ n = sprintf(str, "%d", *(int32_t*)buf);
+ break;
+
+ case TSDB_DATA_TYPE_BIGINT:
+ case TSDB_DATA_TYPE_TIMESTAMP:
+ n = sprintf(str, "%" PRId64, *(int64_t*)buf);
+ break;
+
+ case TSDB_DATA_TYPE_FLOAT:
+ n = sprintf(str, "%e", GET_FLOAT_VAL(buf));
+ break;
+
+ case TSDB_DATA_TYPE_DOUBLE:
+ n = sprintf(str, "%e", GET_DOUBLE_VAL(buf));
+ break;
+
+ case TSDB_DATA_TYPE_BINARY:
+ case TSDB_DATA_TYPE_NCHAR:
+ if (bufSize < 0) {
+// tscError("invalid buf size");
+ return TSDB_CODE_TSC_INVALID_VALUE;
+ }
+
+ *str = '"';
+ memcpy(str + 1, buf, bufSize);
+ *(str + bufSize + 1) = '"';
+ n = bufSize + 2;
+ break;
+
+ case TSDB_DATA_TYPE_UTINYINT:
+ n = sprintf(str, "%d", *(uint8_t*)buf);
+ break;
+
+ case TSDB_DATA_TYPE_USMALLINT:
+ n = sprintf(str, "%d", *(uint16_t*)buf);
+ break;
+
+ case TSDB_DATA_TYPE_UINT:
+ n = sprintf(str, "%u", *(uint32_t*)buf);
+ break;
+
+ case TSDB_DATA_TYPE_UBIGINT:
+ n = sprintf(str, "%" PRIu64, *(uint64_t*)buf);
+ break;
+
+ default:
+// tscError("unsupported type:%d", type);
+ return TSDB_CODE_TSC_INVALID_VALUE;
+ }
+
+ *len = n;
+
+ return TSDB_CODE_SUCCESS;
+}
+
+char* parseTagDatatoJson(void* p) {
+ char* string = NULL;
+ cJSON* json = cJSON_CreateObject();
+ if (json == NULL) {
+ goto end;
+ }
+
+ SArray* pTagVals = NULL;
+ if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
+ goto end;
+ }
+
+ int16_t nCols = taosArrayGetSize(pTagVals);
+ char tagJsonKey[256] = {0};
+ for (int j = 0; j < nCols; ++j) {
+ STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
+ // json key encode by binary
+ memset(tagJsonKey, 0, sizeof(tagJsonKey));
+ memcpy(tagJsonKey, pTagVal->pKey, strlen(pTagVal->pKey));
+ // json value
+ char type = pTagVal->type;
+ if (type == TSDB_DATA_TYPE_NULL) {
+ cJSON* value = cJSON_CreateNull();
+ if (value == NULL) {
+ goto end;
+ }
+ cJSON_AddItemToObject(json, tagJsonKey, value);
+ } else if (type == TSDB_DATA_TYPE_NCHAR) {
+ cJSON* value = NULL;
+ if (pTagVal->nData > 0) {
+ char* tagJsonValue = taosMemoryCalloc(pTagVal->nData, 1);
+ int32_t length = taosUcs4ToMbs((TdUcs4*)pTagVal->pData, pTagVal->nData, tagJsonValue);
+ if (length < 0) {
+ qError("charset:%s to %s. val:%s convert json value failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
+ pTagVal->pData);
+ taosMemoryFree(tagJsonValue);
+ goto end;
+ }
+ value = cJSON_CreateString(tagJsonValue);
+ taosMemoryFree(tagJsonValue);
+ if (value == NULL) {
+ goto end;
+ }
+ } else if (pTagVal->nData == 0) {
+ value = cJSON_CreateString("");
+ } else {
+ ASSERT(0);
+ }
+
+ cJSON_AddItemToObject(json, tagJsonKey, value);
+ } else if (type == TSDB_DATA_TYPE_DOUBLE) {
+ double jsonVd = *(double*)(&pTagVal->i64);
+ cJSON* value = cJSON_CreateNumber(jsonVd);
+ if (value == NULL) {
+ goto end;
+ }
+ cJSON_AddItemToObject(json, tagJsonKey, value);
+ } else if (type == TSDB_DATA_TYPE_BOOL) {
+ char jsonVd = *(char*)(&pTagVal->i64);
+ cJSON* value = cJSON_CreateBool(jsonVd);
+ if (value == NULL) {
+ goto end;
+ }
+ cJSON_AddItemToObject(json, tagJsonKey, value);
+ } else {
+ ASSERT(0);
+ }
+ }
+ string = cJSON_PrintUnformatted(json);
+end:
+ cJSON_Delete(json);
+ return string;
+}
+
+
+int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
+ if (NULL == pSrc) {
+ *pDst = NULL;
+ return TSDB_CODE_SUCCESS;
+ }
+
+ int32_t metaSize = (pSrc->tableInfo.numOfColumns + pSrc->tableInfo.numOfTags) * sizeof(SSchema);
+ *pDst = taosMemoryMalloc(metaSize);
+ if (NULL == *pDst) {
+ return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ }
+ memcpy(*pDst, pSrc, metaSize);
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst) {
+ if (NULL == pSrc) {
+ *pDst = NULL;
+ return TSDB_CODE_SUCCESS;
+ }
+
+ *pDst = taosMemoryMalloc(sizeof(*pSrc));
+ if (NULL == *pDst) {
+ return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ }
+ memcpy(*pDst, pSrc, sizeof(*pSrc));
+ if (pSrc->vgHash) {
+ (*pDst)->vgHash = taosHashInit(taosHashGetSize(pSrc->vgHash), taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_ENTRY_LOCK);
+ if (NULL == (*pDst)->vgHash) {
+ return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ }
+
+ SVgroupInfo* vgInfo = NULL;
+ void *pIter = taosHashIterate(pSrc->vgHash, NULL);
+ while (pIter) {
+ vgInfo = pIter;
+ int32_t* vgId = taosHashGetKey(pIter, NULL);
+
+ if (0 != taosHashPut((*pDst)->vgHash, vgId, sizeof(*vgId), vgInfo, sizeof(*vgInfo))) {
+ qError("taosHashPut failed, vgId:%d", vgInfo->vgId);
+ taosHashCancelIterate(pSrc->vgHash, pIter);
+ taosHashCleanup((*pDst)->vgHash);
+ taosMemoryFreeClear(*pDst);
+ return TSDB_CODE_CTG_MEM_ERROR;
+ }
+
+ pIter = taosHashIterate(pSrc->vgHash, pIter);
+ }
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+
diff --git a/source/libs/qcom/src/querymsg.c b/source/libs/qcom/src/querymsg.c
index b89c220519..e2dfd9682b 100644
--- a/source/libs/qcom/src/querymsg.c
+++ b/source/libs/qcom/src/querymsg.c
@@ -63,7 +63,7 @@ int32_t queryBuildUseDbOutput(SUseDbOutput *pOut, SUseDbRsp *usedbRsp) {
}
int32_t queryBuildTableMetaReqMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallcFp)(int32_t)) {
- SBuildTableMetaInput *pInput = input;
+ SBuildTableInput *pInput = input;
if (NULL == input || NULL == msg || NULL == msgLen) {
return TSDB_CODE_TSC_INVALID_INPUT;
}
@@ -221,6 +221,27 @@ int32_t queryBuildGetTbIndexMsg(void *input, char **msg, int32_t msgSize, int32_
return TSDB_CODE_SUCCESS;
}
+int32_t queryBuildGetTbCfgMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallcFp)(int32_t)) {
+ if (NULL == msg || NULL == msgLen) {
+ return TSDB_CODE_TSC_INVALID_INPUT;
+ }
+
+ SBuildTableInput *pInput = input;
+ STableCfgReq cfgReq = {0};
+ cfgReq.header.vgId = pInput->vgId;
+ strcpy(cfgReq.dbFName, pInput->dbFName);
+ strcpy(cfgReq.tbName, pInput->tbName);
+
+ int32_t bufLen = tSerializeSTableCfgReq(NULL, 0, &cfgReq);
+ void *pBuf = (*mallcFp)(bufLen);
+ tSerializeSTableCfgReq(pBuf, bufLen, &cfgReq);
+
+ *msg = pBuf;
+ *msgLen = bufLen;
+
+ return TSDB_CODE_SUCCESS;
+}
+
int32_t queryProcessUseDBRsp(void *output, char *msg, int32_t msgSize) {
SUseDbOutput *pOut = output;
@@ -493,6 +514,21 @@ int32_t queryProcessGetTbIndexRsp(void *output, char *msg, int32_t msgSize) {
return TSDB_CODE_SUCCESS;
}
+int32_t queryProcessGetTbCfgRsp(void *output, char *msg, int32_t msgSize) {
+ if (NULL == output || NULL == msg || msgSize <= 0) {
+ return TSDB_CODE_TSC_INVALID_INPUT;
+ }
+
+ STableCfgRsp *out = taosMemoryCalloc(1, sizeof(STableCfgRsp));
+ if (tDeserializeSTableCfgRsp(msg, msgSize, out) != 0) {
+ qError("tDeserializeSTableCfgRsp failed, msgSize:%d", msgSize);
+ return TSDB_CODE_INVALID_MSG;
+ }
+
+ *(STableCfgRsp**)output = out;
+
+ return TSDB_CODE_SUCCESS;
+}
void initQueryModuleMsgHandle() {
queryBuildMsg[TMSG_INDEX(TDMT_VND_TABLE_META)] = queryBuildTableMetaReqMsg;
@@ -504,6 +540,8 @@ void initQueryModuleMsgHandle() {
queryBuildMsg[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNC)] = queryBuildRetrieveFuncMsg;
queryBuildMsg[TMSG_INDEX(TDMT_MND_GET_USER_AUTH)] = queryBuildGetUserAuthMsg;
queryBuildMsg[TMSG_INDEX(TDMT_MND_GET_TABLE_INDEX)] = queryBuildGetTbIndexMsg;
+ queryBuildMsg[TMSG_INDEX(TDMT_VND_TABLE_CFG)] = queryBuildGetTbCfgMsg;
+ queryBuildMsg[TMSG_INDEX(TDMT_MND_TABLE_CFG)] = queryBuildGetTbCfgMsg;
queryProcessMsgRsp[TMSG_INDEX(TDMT_VND_TABLE_META)] = queryProcessTableMetaRsp;
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_TABLE_META)] = queryProcessTableMetaRsp;
@@ -514,6 +552,8 @@ void initQueryModuleMsgHandle() {
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNC)] = queryProcessRetrieveFuncRsp;
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_GET_USER_AUTH)] = queryProcessGetUserAuthRsp;
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_GET_TABLE_INDEX)] = queryProcessGetTbIndexRsp;
+ queryProcessMsgRsp[TMSG_INDEX(TDMT_VND_TABLE_CFG)] = queryProcessGetTbCfgRsp;
+ queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_TABLE_CFG)] = queryProcessGetTbCfgRsp;
}
#pragma GCC diagnostic pop
diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c
index 2369779105..d335b04ea4 100644
--- a/source/libs/scalar/src/sclfunc.c
+++ b/source/libs/scalar/src/sclfunc.c
@@ -1415,11 +1415,19 @@ int32_t roundFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOut
}
int32_t lowerFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
+#ifdef WINDOWS
+ return doCaseConvFunction(pInput, inputNum, pOutput, towlower);
+#else
return doCaseConvFunction(pInput, inputNum, pOutput, tolower);
+#endif
}
int32_t upperFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
+#ifdef WINDOWS
+ return doCaseConvFunction(pInput, inputNum, pOutput, towupper);
+#else
return doCaseConvFunction(pInput, inputNum, pOutput, toupper);
+#endif
}
int32_t ltrimFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h
index 999147eda4..1bd0671fb5 100644
--- a/source/libs/sync/inc/syncInt.h
+++ b/source/libs/sync/inc/syncInt.h
@@ -197,6 +197,7 @@ int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, S
cJSON* syncNode2Json(const SSyncNode* pSyncNode);
char* syncNode2Str(const SSyncNode* pSyncNode);
void syncNodeEventLog(const SSyncNode* pSyncNode, char* str);
+void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str);
char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c
index d2726201cc..c51cbc0513 100644
--- a/source/libs/sync/src/syncAppendEntries.c
+++ b/source/libs/sync/src/syncAppendEntries.c
@@ -99,19 +99,25 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
if (pMsg->term > ths->pRaftStore->currentTerm) {
syncNodeUpdateTerm(ths, pMsg->term);
}
- assert(pMsg->term <= ths->pRaftStore->currentTerm);
+ ASSERT(pMsg->term <= ths->pRaftStore->currentTerm);
// reset elect timer
if (pMsg->term == ths->pRaftStore->currentTerm) {
ths->leaderCache = pMsg->srcId;
syncNodeResetElectTimer(ths);
}
- assert(pMsg->dataLen >= 0);
+ ASSERT(pMsg->dataLen >= 0);
SyncTerm localPreLogTerm = 0;
if (pMsg->prevLogIndex >= SYNC_INDEX_BEGIN && pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) {
SSyncRaftEntry* pEntry = ths->pLogStore->getEntry(ths->pLogStore, pMsg->prevLogIndex);
- assert(pEntry != NULL);
+ if (pEntry == NULL) {
+ char logBuf[128];
+ snprintf(logBuf, sizeof(logBuf), "getEntry error, index:%ld, since %s", pMsg->prevLogIndex, terrstr());
+ syncNodeErrorLog(ths, logBuf);
+ return -1;
+ }
+
localPreLogTerm = pEntry->term;
syncEntryDestory(pEntry);
}
@@ -160,7 +166,7 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
// accept request
if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_FOLLOWER && logOK) {
// preIndex = -1, or has preIndex entry in local log
- assert(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore));
+ ASSERT(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore));
// has extra entries (> preIndex) in local log
bool hasExtraEntries = pMsg->prevLogIndex < ths->pLogStore->getLastIndex(ths->pLogStore);
@@ -179,13 +185,21 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
SyncIndex extraIndex = pMsg->prevLogIndex + 1;
SSyncRaftEntry* pExtraEntry = ths->pLogStore->getEntry(ths->pLogStore, extraIndex);
- assert(pExtraEntry != NULL);
+ if (pExtraEntry == NULL) {
+ char logBuf[128];
+ snprintf(logBuf, sizeof(logBuf), "getEntry error2, index:%ld, since %s", extraIndex, terrstr());
+ syncNodeErrorLog(ths, logBuf);
+ return -1;
+ }
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
- assert(pAppendEntry != NULL);
+ if (pAppendEntry == NULL) {
+ syncNodeErrorLog(ths, "syncEntryDeserialize pAppendEntry error");
+ return -1;
+ }
// log not match, conflict
- assert(extraIndex == pAppendEntry->index);
+ ASSERT(extraIndex == pAppendEntry->index);
if (pExtraEntry->term != pAppendEntry->term) {
conflict = true;
}
@@ -201,7 +215,12 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
for (SyncIndex index = delEnd; index >= delBegin; --index) {
if (ths->pFsm->FpRollBackCb != NULL) {
SSyncRaftEntry* pRollBackEntry = ths->pLogStore->getEntry(ths->pLogStore, index);
- assert(pRollBackEntry != NULL);
+ if (pRollBackEntry == NULL) {
+ char logBuf[128];
+ snprintf(logBuf, sizeof(logBuf), "getEntry error3, index:%ld, since %s", index, terrstr());
+ syncNodeErrorLog(ths, logBuf);
+ return -1;
+ }
// if (pRollBackEntry->msgType != TDMT_SYNC_NOOP) {
if (syncUtilUserRollback(pRollBackEntry->msgType)) {
@@ -257,7 +276,10 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
} else if (!hasExtraEntries && hasAppendEntries) {
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
- assert(pAppendEntry != NULL);
+ if (pAppendEntry == NULL) {
+ syncNodeErrorLog(ths, "syncEntryDeserialize pAppendEntry2 error");
+ return -1;
+ }
// append new entries
ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry);
@@ -287,7 +309,8 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
// do nothing
} else {
- assert(0);
+ syncNodeLog3("", ths);
+ ASSERT(0);
}
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c
index 7b342cdcff..f13a3604da 100644
--- a/source/libs/sync/src/syncAppendEntriesReply.c
+++ b/source/libs/sync/src/syncAppendEntriesReply.c
@@ -67,7 +67,7 @@ int32_t syncNodeOnAppendEntriesReplyCb(SSyncNode* ths, SyncAppendEntriesReply* p
return ret;
}
- assert(pMsg->term == ths->pRaftStore->currentTerm);
+ ASSERT(pMsg->term == ths->pRaftStore->currentTerm);
if (pMsg->success) {
// nextIndex' = [nextIndex EXCEPT ![i][j] = m.mmatchIndex + 1]
diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c
index ec3e1ab2ba..c92edae381 100644
--- a/source/libs/sync/src/syncCommit.c
+++ b/source/libs/sync/src/syncCommit.c
@@ -75,7 +75,7 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
if (agree) {
// term
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, index);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
// cannot commit, even if quorum agree. need check term!
if (pEntry->term == pSyncNode->pRaftStore->currentTerm) {
diff --git a/source/libs/sync/src/syncElection.c b/source/libs/sync/src/syncElection.c
index fdebbe3990..e0f2b0fed2 100644
--- a/source/libs/sync/src/syncElection.c
+++ b/source/libs/sync/src/syncElection.c
@@ -32,7 +32,7 @@
// /\ UNCHANGED <>
//
int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
- assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
+ ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
int32_t ret = 0;
for (int i = 0; i < pSyncNode->peersNum; ++i) {
@@ -44,7 +44,7 @@ int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
pMsg->lastLogTerm = pSyncNode->pLogStore->getLastTerm(pSyncNode->pLogStore);
ret = syncNodeRequestVote(pSyncNode, &pSyncNode->peersId[i], pMsg);
- assert(ret == 0);
+ ASSERT(ret == 0);
syncRequestVoteDestroy(pMsg);
}
return ret;
@@ -75,7 +75,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
syncNodeFollower2Candidate(pSyncNode);
}
- assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
+ ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
// start election
raftStoreNextTerm(pSyncNode->pRaftStore);
@@ -86,7 +86,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
syncNodeVoteForSelf(pSyncNode);
if (voteGrantedMajority(pSyncNode->pVotesGranted)) {
// only myself, to leader
- assert(!pSyncNode->pVotesGranted->toLeader);
+ ASSERT(!pSyncNode->pVotesGranted->toLeader);
syncNodeCandidate2Leader(pSyncNode);
pSyncNode->pVotesGranted->toLeader = true;
return ret;
@@ -98,7 +98,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
ret = syncNodeRequestVotePeers(pSyncNode);
}
- assert(ret == 0);
+ ASSERT(ret == 0);
syncNodeResetElectTimer(pSyncNode);
return ret;
diff --git a/source/libs/sync/src/syncEnv.c b/source/libs/sync/src/syncEnv.c
index c92af0dd42..fb0bfb8bef 100644
--- a/source/libs/sync/src/syncEnv.c
+++ b/source/libs/sync/src/syncEnv.c
@@ -14,7 +14,7 @@
*/
#include "syncEnv.h"
-// #include
+// #include
SSyncEnv *gSyncEnv = NULL;
@@ -40,7 +40,7 @@ int32_t syncEnvStart() {
taosSeedRand(seed);
// gSyncEnv = doSyncEnvStart(gSyncEnv);
gSyncEnv = doSyncEnvStart();
- assert(gSyncEnv != NULL);
+ ASSERT(gSyncEnv != NULL);
sTrace("sync env start ok");
return ret;
}
@@ -86,7 +86,7 @@ static void syncEnvTick(void *param, void *tmrId) {
static SSyncEnv *doSyncEnvStart() {
SSyncEnv *pSyncEnv = (SSyncEnv *)taosMemoryMalloc(sizeof(SSyncEnv));
- assert(pSyncEnv != NULL);
+ ASSERT(pSyncEnv != NULL);
memset(pSyncEnv, 0, sizeof(SSyncEnv));
pSyncEnv->envTickTimerCounter = 0;
@@ -103,7 +103,7 @@ static SSyncEnv *doSyncEnvStart() {
}
static int32_t doSyncEnvStop(SSyncEnv *pSyncEnv) {
- assert(pSyncEnv == gSyncEnv);
+ ASSERT(pSyncEnv == gSyncEnv);
if (pSyncEnv != NULL) {
atomic_store_8(&(pSyncEnv->isStart), 0);
taosTmrCleanUp(pSyncEnv->pTimerManager);
diff --git a/source/libs/sync/src/syncIO.c b/source/libs/sync/src/syncIO.c
index 0b5a9685c0..038c36c417 100644
--- a/source/libs/sync/src/syncIO.c
+++ b/source/libs/sync/src/syncIO.c
@@ -30,7 +30,7 @@ static int32_t syncIODestroy(SSyncIO *io);
static int32_t syncIOStartInternal(SSyncIO *io);
static int32_t syncIOStopInternal(SSyncIO *io);
-static void * syncIOConsumerFunc(void *param);
+static void *syncIOConsumerFunc(void *param);
static void syncIOProcessRequest(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
static void syncIOProcessReply(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
static int32_t syncIOAuth(void *parent, char *meterId, char *spi, char *encrypt, char *secret, char *ckey);
@@ -47,11 +47,11 @@ static void syncIOTickPing(void *param, void *tmrId);
int32_t syncIOStart(char *host, uint16_t port) {
int32_t ret = 0;
gSyncIO = syncIOCreate(host, port);
- assert(gSyncIO != NULL);
+ ASSERT(gSyncIO != NULL);
taosSeedRand(taosGetTimestampSec());
ret = syncIOStartInternal(gSyncIO);
- assert(ret == 0);
+ ASSERT(ret == 0);
sTrace("syncIOStart ok, gSyncIO:%p", gSyncIO);
return ret;
@@ -59,16 +59,16 @@ int32_t syncIOStart(char *host, uint16_t port) {
int32_t syncIOStop() {
int32_t ret = syncIOStopInternal(gSyncIO);
- assert(ret == 0);
+ ASSERT(ret == 0);
ret = syncIODestroy(gSyncIO);
- assert(ret == 0);
+ ASSERT(ret == 0);
return ret;
}
int32_t syncIOSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) {
- assert(pEpSet->inUse == 0);
- assert(pEpSet->numOfEps == 1);
+ ASSERT(pEpSet->inUse == 0);
+ ASSERT(pEpSet->numOfEps == 1);
int32_t ret = 0;
{
@@ -107,25 +107,25 @@ int32_t syncIOEqMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) {
int32_t syncIOQTimerStart() {
int32_t ret = syncIOStartQ(gSyncIO);
- assert(ret == 0);
+ ASSERT(ret == 0);
return ret;
}
int32_t syncIOQTimerStop() {
int32_t ret = syncIOStopQ(gSyncIO);
- assert(ret == 0);
+ ASSERT(ret == 0);
return ret;
}
int32_t syncIOPingTimerStart() {
int32_t ret = syncIOStartPing(gSyncIO);
- assert(ret == 0);
+ ASSERT(ret == 0);
return ret;
}
int32_t syncIOPingTimerStop() {
int32_t ret = syncIOStopPing(gSyncIO);
- assert(ret == 0);
+ ASSERT(ret == 0);
return ret;
}
@@ -151,7 +151,7 @@ static SSyncIO *syncIOCreate(char *host, uint16_t port) {
static int32_t syncIODestroy(SSyncIO *io) {
int32_t ret = 0;
int8_t start = atomic_load_8(&io->isStart);
- assert(start == 0);
+ ASSERT(start == 0);
if (io->serverRpc != NULL) {
rpcClose(io->serverRpc);
@@ -242,9 +242,9 @@ static int32_t syncIOStopInternal(SSyncIO *io) {
}
static void *syncIOConsumerFunc(void *param) {
- SSyncIO * io = param;
+ SSyncIO *io = param;
STaosQall *qall;
- SRpcMsg * pRpcMsg, rpcMsg;
+ SRpcMsg *pRpcMsg, rpcMsg;
qall = taosAllocateQall();
while (1) {
@@ -264,7 +264,7 @@ static void *syncIOConsumerFunc(void *param) {
if (pRpcMsg->msgType == TDMT_SYNC_PING) {
if (io->FpOnSyncPing != NULL) {
SyncPing *pSyncMsg = syncPingFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncPing(io->pSyncNode, pSyncMsg);
syncPingDestroy(pSyncMsg);
}
@@ -272,7 +272,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_PING_REPLY) {
if (io->FpOnSyncPingReply != NULL) {
SyncPingReply *pSyncMsg = syncPingReplyFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncPingReply(io->pSyncNode, pSyncMsg);
syncPingReplyDestroy(pSyncMsg);
}
@@ -280,7 +280,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) {
if (io->FpOnSyncClientRequest != NULL) {
SyncClientRequest *pSyncMsg = syncClientRequestFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncClientRequest(io->pSyncNode, pSyncMsg);
syncClientRequestDestroy(pSyncMsg);
}
@@ -288,7 +288,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE) {
if (io->FpOnSyncRequestVote != NULL) {
SyncRequestVote *pSyncMsg = syncRequestVoteFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncRequestVote(io->pSyncNode, pSyncMsg);
syncRequestVoteDestroy(pSyncMsg);
}
@@ -296,7 +296,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE_REPLY) {
if (io->FpOnSyncRequestVoteReply != NULL) {
SyncRequestVoteReply *pSyncMsg = syncRequestVoteReplyFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncRequestVoteReply(io->pSyncNode, pSyncMsg);
syncRequestVoteReplyDestroy(pSyncMsg);
}
@@ -304,7 +304,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES) {
if (io->FpOnSyncAppendEntries != NULL) {
SyncAppendEntries *pSyncMsg = syncAppendEntriesFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncAppendEntries(io->pSyncNode, pSyncMsg);
syncAppendEntriesDestroy(pSyncMsg);
}
@@ -312,7 +312,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES_REPLY) {
if (io->FpOnSyncAppendEntriesReply != NULL) {
SyncAppendEntriesReply *pSyncMsg = syncAppendEntriesReplyFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncAppendEntriesReply(io->pSyncNode, pSyncMsg);
syncAppendEntriesReplyDestroy(pSyncMsg);
}
@@ -320,7 +320,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_TIMEOUT) {
if (io->FpOnSyncTimeout != NULL) {
SyncTimeout *pSyncMsg = syncTimeoutFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncTimeout(io->pSyncNode, pSyncMsg);
syncTimeoutDestroy(pSyncMsg);
}
@@ -328,7 +328,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_SEND) {
if (io->FpOnSyncSnapshotSend != NULL) {
SyncSnapshotSend *pSyncMsg = syncSnapshotSendFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncSnapshotSend(io->pSyncNode, pSyncMsg);
syncSnapshotSendDestroy(pSyncMsg);
}
@@ -336,7 +336,7 @@ static void *syncIOConsumerFunc(void *param) {
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_RSP) {
if (io->FpOnSyncSnapshotRsp != NULL) {
SyncSnapshotRsp *pSyncMsg = syncSnapshotRspFromRpcMsg2(pRpcMsg);
- assert(pSyncMsg != NULL);
+ ASSERT(pSyncMsg != NULL);
io->FpOnSyncSnapshotRsp(io->pSyncNode, pSyncMsg);
syncSnapshotRspDestroy(pSyncMsg);
}
diff --git a/source/libs/sync/src/syncIndexMgr.c b/source/libs/sync/src/syncIndexMgr.c
index 2827fcc12f..5b432aeec4 100644
--- a/source/libs/sync/src/syncIndexMgr.c
+++ b/source/libs/sync/src/syncIndexMgr.c
@@ -20,7 +20,7 @@
SSyncIndexMgr *syncIndexMgrCreate(SSyncNode *pSyncNode) {
SSyncIndexMgr *pSyncIndexMgr = taosMemoryMalloc(sizeof(SSyncIndexMgr));
- assert(pSyncIndexMgr != NULL);
+ ASSERT(pSyncIndexMgr != NULL);
memset(pSyncIndexMgr, 0, sizeof(SSyncIndexMgr));
pSyncIndexMgr->replicas = &(pSyncNode->replicasId);
@@ -63,7 +63,7 @@ void syncIndexMgrSetIndex(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId,
}
// maybe config change
- // assert(0);
+ // ASSERT(0);
char host[128];
uint16_t port;
@@ -169,7 +169,7 @@ void syncIndexMgrSetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, S
}
// maybe config change
- // assert(0);
+ // ASSERT(0);
char host[128];
uint16_t port;
syncUtilU642Addr(pRaftId->addr, host, sizeof(host), &port);
@@ -183,5 +183,5 @@ SyncTerm syncIndexMgrGetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftI
return term;
}
}
- assert(0);
+ ASSERT(0);
}
\ No newline at end of file
diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c
index b520629e15..da6d869611 100644
--- a/source/libs/sync/src/syncMain.c
+++ b/source/libs/sync/src/syncMain.c
@@ -75,7 +75,7 @@ int32_t syncInit() {
void syncCleanUp() {
int32_t ret = syncEnvStop();
- assert(ret == 0);
+ ASSERT(ret == 0);
if (tsNodeRefId != -1) {
taosCloseRef(tsNodeRefId);
@@ -85,7 +85,7 @@ void syncCleanUp() {
int64_t syncOpen(const SSyncInfo* pSyncInfo) {
SSyncNode* pSyncNode = syncNodeOpen(pSyncInfo);
- assert(pSyncNode != NULL);
+ ASSERT(pSyncNode != NULL);
if (gRaftDetailLog) {
syncNodeLog2("syncNodeOpen open success", pSyncNode);
@@ -318,7 +318,7 @@ bool syncCanLeaderTransfer(int64_t rid) {
if (pSyncNode == NULL) {
return false;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
if (pSyncNode->replicaNum == 1) {
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -355,7 +355,7 @@ ESyncState syncGetMyRole(int64_t rid) {
if (pSyncNode == NULL) {
return TAOS_SYNC_STATE_ERROR;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
ESyncState state = pSyncNode->state;
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -367,7 +367,7 @@ bool syncIsReady(int64_t rid) {
if (pSyncNode == NULL) {
return false;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
bool b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && pSyncNode->restoreFinish;
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
return b;
@@ -378,7 +378,7 @@ bool syncIsRestoreFinish(int64_t rid) {
if (pSyncNode == NULL) {
return false;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
bool b = pSyncNode->restoreFinish;
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -390,7 +390,7 @@ int32_t syncGetSnapshotMeta(int64_t rid, struct SSnapshotMeta* sMeta) {
if (pSyncNode == NULL) {
return -1;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
sMeta->lastConfigIndex = pSyncNode->pRaftCfg->lastConfigIndex;
sTrace("vgId:%d, get snapshot meta, lastConfigIndex:%" PRId64, pSyncNode->vgId, pSyncNode->pRaftCfg->lastConfigIndex);
@@ -404,7 +404,7 @@ int32_t syncGetSnapshotMetaByIndex(int64_t rid, SyncIndex snapshotIndex, struct
if (pSyncNode == NULL) {
return -1;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
ASSERT(pSyncNode->pRaftCfg->configIndexCount >= 1);
SyncIndex lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[0];
@@ -448,7 +448,7 @@ SyncTerm syncGetMyTerm(int64_t rid) {
if (pSyncNode == NULL) {
return TAOS_SYNC_STATE_ERROR;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
SyncTerm term = pSyncNode->pRaftStore->currentTerm;
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -460,7 +460,7 @@ SyncGroupId syncGetVgId(int64_t rid) {
if (pSyncNode == NULL) {
return TAOS_SYNC_STATE_ERROR;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
SyncGroupId vgId = pSyncNode->vgId;
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -473,7 +473,7 @@ void syncGetEpSet(int64_t rid, SEpSet* pEpSet) {
memset(pEpSet, 0, sizeof(*pEpSet));
return;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
pEpSet->numOfEps = 0;
for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
snprintf(pEpSet->eps[i].fqdn, sizeof(pEpSet->eps[i].fqdn), "%s", (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodeFqdn);
@@ -494,7 +494,7 @@ int32_t syncGetRespRpc(int64_t rid, uint64_t index, SRpcMsg* msg) {
if (pSyncNode == NULL) {
return TAOS_SYNC_STATE_ERROR;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
SRespStub stub;
int32_t ret = syncRespMgrGet(pSyncNode->pSyncRespMgr, index, &stub);
@@ -511,7 +511,7 @@ int32_t syncGetAndDelRespRpc(int64_t rid, uint64_t index, SRpcHandleInfo* pInfo)
if (pSyncNode == NULL) {
return TAOS_SYNC_STATE_ERROR;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
SRespStub stub;
int32_t ret = syncRespMgrGetAndDel(pSyncNode->pSyncRespMgr, index, &stub);
@@ -530,7 +530,7 @@ void syncSetMsgCb(int64_t rid, const SMsgCb* msgcb) {
sTrace("syncSetQ get pSyncNode is NULL, rid:%ld", rid);
return;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
pSyncNode->msgcb = msgcb;
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -542,7 +542,7 @@ char* sync2SimpleStr(int64_t rid) {
sTrace("syncSetRpc get pSyncNode is NULL, rid:%ld", rid);
return NULL;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
char* s = syncNode2SimpleStr(pSyncNode);
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -554,7 +554,7 @@ void setPingTimerMS(int64_t rid, int32_t pingTimerMS) {
if (pSyncNode == NULL) {
return;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
pSyncNode->pingBaseLine = pingTimerMS;
pSyncNode->pingTimerMS = pingTimerMS;
@@ -566,7 +566,7 @@ void setElectTimerMS(int64_t rid, int32_t electTimerMS) {
if (pSyncNode == NULL) {
return;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
pSyncNode->electBaseLine = electTimerMS;
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -577,7 +577,7 @@ void setHeartbeatTimerMS(int64_t rid, int32_t hbTimerMS) {
if (pSyncNode == NULL) {
return;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
pSyncNode->hbBaseLine = hbTimerMS;
pSyncNode->heartbeatTimerMS = hbTimerMS;
@@ -592,7 +592,7 @@ int32_t syncPropose(int64_t rid, const SRpcMsg* pMsg, bool isWeak) {
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
return -1;
}
- assert(rid == pSyncNode->rid);
+ ASSERT(rid == pSyncNode->rid);
ret = syncNodePropose(pSyncNode, pMsg, isWeak);
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
@@ -662,7 +662,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
SSyncInfo* pSyncInfo = (SSyncInfo*)pOldSyncInfo;
SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
- assert(pSyncNode != NULL);
+ ASSERT(pSyncNode != NULL);
memset(pSyncNode, 0, sizeof(SSyncNode));
int32_t ret = 0;
@@ -682,12 +682,12 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
meta.snapshotEnable = pSyncInfo->snapshotEnable;
meta.lastConfigIndex = SYNC_INDEX_INVALID;
ret = raftCfgCreateFile((SSyncCfg*)&(pSyncInfo->syncCfg), meta, pSyncNode->configPath);
- assert(ret == 0);
+ ASSERT(ret == 0);
} else {
// update syncCfg by raft_config.json
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
- assert(pSyncNode->pRaftCfg != NULL);
+ ASSERT(pSyncNode->pRaftCfg != NULL);
pSyncInfo->syncCfg = pSyncNode->pRaftCfg->cfg;
if (gRaftDetailLog) {
@@ -712,7 +712,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
// init raft config
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
- assert(pSyncNode->pRaftCfg != NULL);
+ ASSERT(pSyncNode->pRaftCfg != NULL);
// init internal
pSyncNode->myNodeInfo = pSyncNode->pRaftCfg->cfg.nodeInfo[pSyncNode->pRaftCfg->cfg.myIndex];
@@ -771,23 +771,23 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
// init TLA+ server vars
pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER;
pSyncNode->pRaftStore = raftStoreOpen(pSyncNode->raftStorePath);
- assert(pSyncNode->pRaftStore != NULL);
+ ASSERT(pSyncNode->pRaftStore != NULL);
// init TLA+ candidate vars
pSyncNode->pVotesGranted = voteGrantedCreate(pSyncNode);
- assert(pSyncNode->pVotesGranted != NULL);
+ ASSERT(pSyncNode->pVotesGranted != NULL);
pSyncNode->pVotesRespond = votesRespondCreate(pSyncNode);
- assert(pSyncNode->pVotesRespond != NULL);
+ ASSERT(pSyncNode->pVotesRespond != NULL);
// init TLA+ leader vars
pSyncNode->pNextIndex = syncIndexMgrCreate(pSyncNode);
- assert(pSyncNode->pNextIndex != NULL);
+ ASSERT(pSyncNode->pNextIndex != NULL);
pSyncNode->pMatchIndex = syncIndexMgrCreate(pSyncNode);
- assert(pSyncNode->pMatchIndex != NULL);
+ ASSERT(pSyncNode->pMatchIndex != NULL);
// init TLA+ log vars
pSyncNode->pLogStore = logStoreCreate(pSyncNode);
- assert(pSyncNode->pLogStore != NULL);
+ ASSERT(pSyncNode->pLogStore != NULL);
pSyncNode->commitIndex = SYNC_INDEX_INVALID;
// timer ms init
@@ -845,7 +845,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
// tools
pSyncNode->pSyncRespMgr = syncRespMgrCreate(pSyncNode, 0);
- assert(pSyncNode->pSyncRespMgr != NULL);
+ ASSERT(pSyncNode->pSyncRespMgr != NULL);
// restore state
pSyncNode->restoreFinish = false;
@@ -893,7 +893,7 @@ void syncNodeStart(SSyncNode* pSyncNode) {
// int32_t ret = 0;
// ret = syncNodeStartPingTimer(pSyncNode);
- // assert(ret == 0);
+ // ASSERT(ret == 0);
if (gRaftDetailLog) {
syncNodeLog2("==state change become leader immediately==", pSyncNode);
@@ -915,10 +915,10 @@ void syncNodeClose(SSyncNode* pSyncNode) {
syncNodeEventLog(pSyncNode, "sync close");
int32_t ret;
- assert(pSyncNode != NULL);
+ ASSERT(pSyncNode != NULL);
ret = raftStoreClose(pSyncNode->pRaftStore);
- assert(ret == 0);
+ ASSERT(ret == 0);
syncRespMgrDestroy(pSyncNode->pSyncRespMgr);
voteGrantedDestroy(pSyncNode->pVotesGranted);
@@ -980,7 +980,7 @@ int32_t syncNodePingSelf(SSyncNode* pSyncNode) {
int32_t ret = 0;
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, &pSyncNode->myRaftId, pSyncNode->vgId);
ret = syncNodePing(pSyncNode, &pMsg->destId, pMsg);
- assert(ret == 0);
+ ASSERT(ret == 0);
syncPingDestroy(pMsg);
return ret;
@@ -992,7 +992,7 @@ int32_t syncNodePingPeers(SSyncNode* pSyncNode) {
SRaftId* destId = &(pSyncNode->peersId[i]);
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
ret = syncNodePing(pSyncNode, destId, pMsg);
- assert(ret == 0);
+ ASSERT(ret == 0);
syncPingDestroy(pMsg);
}
return ret;
@@ -1004,7 +1004,7 @@ int32_t syncNodePingAll(SSyncNode* pSyncNode) {
SRaftId* destId = &(pSyncNode->replicasId[i]);
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
ret = syncNodePing(pSyncNode, destId, pMsg);
- assert(ret == 0);
+ ASSERT(ret == 0);
syncPingDestroy(pMsg);
}
return ret;
@@ -1311,32 +1311,86 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) {
if (userStrLen < 256) {
char logBuf[128 + 256];
- snprintf(logBuf, sizeof(logBuf),
- "vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
- "replica-num:%d, "
- "lconfig:%ld, changing:%d",
- pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
- pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
- pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
- pSyncNode->changing);
+ if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
+ snprintf(logBuf, sizeof(logBuf),
+ "vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
+ "replica-num:%d, "
+ "lconfig:%ld, changing:%d",
+ pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
+ pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
+ pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
+ pSyncNode->changing);
+ } else {
+ snprintf(logBuf, sizeof(logBuf), "%s", str);
+ }
sDebug("%s", logBuf);
} else {
int len = 128 + userStrLen;
char* s = (char*)taosMemoryMalloc(len);
- snprintf(s, len,
- "vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
- "replica-num:%d, "
- "lconfig:%ld, changing:%d",
- pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
- pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
- pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
- pSyncNode->changing);
+ if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
+ snprintf(s, len,
+ "vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
+ "replica-num:%d, "
+ "lconfig:%ld, changing:%d",
+ pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
+ pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
+ pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
+ pSyncNode->changing);
+ } else {
+ snprintf(s, len, "%s", str);
+ }
sDebug("%s", s);
taosMemoryFree(s);
}
}
+void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) {
+ int32_t userStrLen = strlen(str);
+
+ SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
+ if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
+ pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
+ }
+ SyncIndex logLastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore);
+ SyncIndex logBeginIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
+
+ if (userStrLen < 256) {
+ char logBuf[128 + 256];
+ if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
+ snprintf(logBuf, sizeof(logBuf),
+ "vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
+ "replica-num:%d, "
+ "lconfig:%ld, changing:%d",
+ pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
+ pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
+ pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
+ pSyncNode->changing);
+ } else {
+ snprintf(logBuf, sizeof(logBuf), "%s", str);
+ }
+ sError("%s", logBuf);
+
+ } else {
+ int len = 128 + userStrLen;
+ char* s = (char*)taosMemoryMalloc(len);
+ if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
+ snprintf(s, len,
+ "vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
+ "replica-num:%d, "
+ "lconfig:%ld, changing:%d",
+ pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
+ pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
+ pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
+ pSyncNode->changing);
+ } else {
+ snprintf(s, len, "%s", str);
+ }
+ sError("%s", s);
+ taosMemoryFree(s);
+ }
+}
+
char* syncNode2SimpleStr(const SSyncNode* pSyncNode) {
int len = 256;
char* s = (char*)taosMemoryMalloc(len);
@@ -1702,8 +1756,8 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) {
}
void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
- assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
- assert(voteGrantedMajority(pSyncNode->pVotesGranted));
+ ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
+ ASSERT(voteGrantedMajority(pSyncNode->pVotesGranted));
syncNodeBecomeLeader(pSyncNode, "candidate to leader");
syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode);
@@ -1715,21 +1769,21 @@ void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
}
void syncNodeFollower2Candidate(SSyncNode* pSyncNode) {
- assert(pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER);
+ ASSERT(pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER);
pSyncNode->state = TAOS_SYNC_STATE_CANDIDATE;
syncNodeLog2("==state change syncNodeFollower2Candidate==", pSyncNode);
}
void syncNodeLeader2Follower(SSyncNode* pSyncNode) {
- assert(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
+ ASSERT(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
syncNodeBecomeFollower(pSyncNode, "leader to follower");
syncNodeLog2("==state change syncNodeLeader2Follower==", pSyncNode);
}
void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
- assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
+ ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
syncNodeBecomeFollower(pSyncNode, "candidate to follower");
syncNodeLog2("==state change syncNodeCandidate2Follower==", pSyncNode);
@@ -1740,8 +1794,8 @@ void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
// just called by syncNodeVoteForSelf
// need assert
void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId) {
- assert(term == pSyncNode->pRaftStore->currentTerm);
- assert(!raftStoreHasVoted(pSyncNode->pRaftStore));
+ ASSERT(term == pSyncNode->pRaftStore->currentTerm);
+ ASSERT(!raftStoreHasVoted(pSyncNode->pRaftStore));
raftStoreVote(pSyncNode->pRaftStore, pRaftId);
}
@@ -1764,7 +1818,7 @@ void syncNodeVoteForSelf(SSyncNode* pSyncNode) {
// snapshot --------------
bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
bool ret = false;
- SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
+ SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
if (snapshot.lastApplyIndex >= SYNC_INDEX_BEGIN) {
@@ -1774,6 +1828,7 @@ bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
return ret;
}
+#if 0
bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) {
ASSERT(syncNodeHasSnapshot(pSyncNode));
ASSERT(pSyncNode->pFsm->FpGetSnapshotInfo != NULL);
@@ -1784,6 +1839,7 @@ bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) {
bool b = (index <= snapshot.lastApplyIndex);
return b;
}
+#endif
SyncIndex syncNodeGetLastIndex(SSyncNode* pSyncNode) {
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
@@ -1800,7 +1856,7 @@ SyncTerm syncNodeGetLastTerm(SSyncNode* pSyncNode) {
SyncTerm lastTerm = 0;
if (syncNodeHasSnapshot(pSyncNode)) {
// has snapshot
- SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
+ SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
}
@@ -1834,8 +1890,8 @@ SyncIndex syncNodeSyncStartIndex(SSyncNode* pSyncNode) {
SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index) {
ASSERT(index >= SYNC_INDEX_BEGIN);
- SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
+ SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
if (index > syncStartIndex) {
syncNodeLog3("syncNodeGetPreIndex", pSyncNode);
ASSERT(0);
@@ -1847,8 +1903,47 @@ SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index) {
SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
ASSERT(index >= SYNC_INDEX_BEGIN);
- SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
+ SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
+ if (index > syncStartIndex) {
+ syncNodeLog3("syncNodeGetPreTerm", pSyncNode);
+ ASSERT(0);
+ }
+
+ if (index == SYNC_INDEX_BEGIN) {
+ return 0;
+ }
+
+ SyncTerm preTerm = 0;
+ SyncIndex preIndex = index - 1;
+ SSyncRaftEntry* pPreEntry = NULL;
+ int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, preIndex, &pPreEntry);
+ if (code == 0) {
+ ASSERT(pPreEntry != NULL);
+ preTerm = pPreEntry->term;
+ taosMemoryFree(pPreEntry);
+ return preTerm;
+ } else {
+ if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
+ SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
+ if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
+ pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
+ if (snapshot.lastApplyIndex == preIndex) {
+ return snapshot.lastApplyTerm;
+ }
+ }
+ }
+ }
+
+ ASSERT(0);
+ return -1;
+}
+
+#if 0
+SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
+ ASSERT(index >= SYNC_INDEX_BEGIN);
+
+ SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
if (index > syncStartIndex) {
syncNodeLog3("syncNodeGetPreTerm", pSyncNode);
ASSERT(0);
@@ -1861,7 +1956,7 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
SyncTerm preTerm = 0;
if (syncNodeHasSnapshot(pSyncNode)) {
// has snapshot
- SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
+ SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
}
@@ -1908,6 +2003,7 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
return preTerm;
}
+#endif
// get pre index and term of "index"
int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex* pPreIndex, SyncTerm* pPreTerm) {
@@ -2062,17 +2158,17 @@ static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) {
static int32_t syncNodeEqNoop(SSyncNode* ths) {
int32_t ret = 0;
- assert(ths->state == TAOS_SYNC_STATE_LEADER);
+ ASSERT(ths->state == TAOS_SYNC_STATE_LEADER);
- SyncIndex index = ths->pLogStore->getLastIndex(ths->pLogStore) + 1;
+ SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
SyncTerm term = ths->pRaftStore->currentTerm;
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
uint32_t entryLen;
char* serialized = syncEntrySerialize(pEntry, &entryLen);
SyncClientRequest* pSyncMsg = syncClientRequestBuild(entryLen);
- assert(pSyncMsg->dataLen == entryLen);
+ ASSERT(pSyncMsg->dataLen == entryLen);
memcpy(pSyncMsg->data, serialized, entryLen);
SRpcMsg rpcMsg = {0};
@@ -2092,10 +2188,10 @@ static int32_t syncNodeEqNoop(SSyncNode* ths) {
static int32_t syncNodeAppendNoop(SSyncNode* ths) {
int32_t ret = 0;
- SyncIndex index = ths->pLogStore->getLastIndex(ths->pLogStore) + 1;
+ SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
SyncTerm term = ths->pRaftStore->currentTerm;
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
if (ths->state == TAOS_SYNC_STATE_LEADER) {
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
@@ -2158,7 +2254,7 @@ int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg) {
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
SyncTerm term = ths->pRaftStore->currentTerm;
SSyncRaftEntry* pEntry = syncEntryBuild2((SyncClientRequest*)pMsg, term, index);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
if (ths->state == TAOS_SYNC_STATE_LEADER) {
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
diff --git a/source/libs/sync/src/syncMessage.c b/source/libs/sync/src/syncMessage.c
index 454609009c..119a178893 100644
--- a/source/libs/sync/src/syncMessage.c
+++ b/source/libs/sync/src/syncMessage.c
@@ -186,18 +186,18 @@ void syncTimeoutDestroy(SyncTimeout* pMsg) {
}
void syncTimeoutSerialize(const SyncTimeout* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncTimeoutDeserialize(const char* buf, uint32_t len, SyncTimeout* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncTimeoutSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -208,9 +208,9 @@ char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
SyncTimeout* syncTimeoutDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncTimeout* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncTimeoutDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -228,7 +228,7 @@ void syncTimeoutFromRpcMsg(const SRpcMsg* pRpcMsg, SyncTimeout* pMsg) {
SyncTimeout* syncTimeoutFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncTimeout* pMsg = syncTimeoutDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -322,19 +322,19 @@ void syncPingDestroy(SyncPing* pMsg) {
}
void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
- assert(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
+ ASSERT(len == pMsg->bytes);
+ ASSERT(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
}
char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncPingSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -345,9 +345,9 @@ char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
SyncPing* syncPingDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncPing* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncPingDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -406,7 +406,7 @@ SyncPing* syncPingDeserialize3(void* buf, int32_t bufLen) {
}
pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
pMsg->bytes = bytes;
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
@@ -435,7 +435,7 @@ SyncPing* syncPingDeserialize3(void* buf, int32_t bufLen) {
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
return NULL;
}
- assert(len = pMsg->dataLen);
+ ASSERT(len = pMsg->dataLen);
memcpy(pMsg->data, data, len);
tEndDecode(&decoder);
@@ -457,7 +457,7 @@ void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg) {
SyncPing* syncPingFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncPing* pMsg = syncPingDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -584,19 +584,19 @@ void syncPingReplyDestroy(SyncPingReply* pMsg) {
}
void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
- assert(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
+ ASSERT(len == pMsg->bytes);
+ ASSERT(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
}
char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncPingReplySerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -607,9 +607,9 @@ char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
SyncPingReply* syncPingReplyDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncPingReply* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncPingReplyDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -668,7 +668,7 @@ SyncPingReply* syncPingReplyDeserialize3(void* buf, int32_t bufLen) {
}
pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
pMsg->bytes = bytes;
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
@@ -697,7 +697,7 @@ SyncPingReply* syncPingReplyDeserialize3(void* buf, int32_t bufLen) {
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
return NULL;
}
- assert(len = pMsg->dataLen);
+ ASSERT(len = pMsg->dataLen);
memcpy(pMsg->data, data, len);
tEndDecode(&decoder);
@@ -719,7 +719,7 @@ void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg) {
SyncPingReply* syncPingReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncPingReply* pMsg = syncPingReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -844,18 +844,18 @@ void syncClientRequestDestroy(SyncClientRequest* pMsg) {
}
void syncClientRequestSerialize(const SyncClientRequest* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncClientRequestDeserialize(const char* buf, uint32_t len, SyncClientRequest* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncClientRequestSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -866,9 +866,9 @@ char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len)
SyncClientRequest* syncClientRequestDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncClientRequest* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncClientRequestDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -888,7 +888,7 @@ void syncClientRequestFromRpcMsg(const SRpcMsg* pRpcMsg, SyncClientRequest* pMsg
// step 3. RpcMsg => SyncClientRequest, from queue
SyncClientRequest* syncClientRequestFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncClientRequest* pMsg = syncClientRequestDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -974,18 +974,18 @@ void syncRequestVoteDestroy(SyncRequestVote* pMsg) {
}
void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncRequestVoteSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -996,9 +996,9 @@ char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
SyncRequestVote* syncRequestVoteDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncRequestVote* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncRequestVoteDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -1016,7 +1016,7 @@ void syncRequestVoteFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVote* pMsg) {
SyncRequestVote* syncRequestVoteFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncRequestVote* pMsg = syncRequestVoteDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -1125,18 +1125,18 @@ void syncRequestVoteReplyDestroy(SyncRequestVoteReply* pMsg) {
}
void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncRequestVoteReplySerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -1147,9 +1147,9 @@ char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t*
SyncRequestVoteReply* syncRequestVoteReplyDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncRequestVoteReply* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncRequestVoteReplyDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -1167,7 +1167,7 @@ void syncRequestVoteReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVoteReply
SyncRequestVoteReply* syncRequestVoteReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncRequestVoteReply* pMsg = syncRequestVoteReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -1274,19 +1274,19 @@ void syncAppendEntriesDestroy(SyncAppendEntries* pMsg) {
}
void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
- assert(pMsg->bytes == sizeof(SyncAppendEntries) + pMsg->dataLen);
+ ASSERT(len == pMsg->bytes);
+ ASSERT(pMsg->bytes == sizeof(SyncAppendEntries) + pMsg->dataLen);
}
char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncAppendEntriesSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -1297,9 +1297,9 @@ char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len)
SyncAppendEntries* syncAppendEntriesDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncAppendEntries* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncAppendEntriesDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -1317,7 +1317,7 @@ void syncAppendEntriesFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntries* pMsg
SyncAppendEntries* syncAppendEntriesFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncAppendEntries* pMsg = syncAppendEntriesDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -1444,18 +1444,18 @@ void syncAppendEntriesReplyDestroy(SyncAppendEntriesReply* pMsg) {
}
void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncAppendEntriesReplySerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -1466,9 +1466,9 @@ char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint3
SyncAppendEntriesReply* syncAppendEntriesReplyDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncAppendEntriesReply* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncAppendEntriesReplyDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -1486,7 +1486,7 @@ void syncAppendEntriesReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesR
SyncAppendEntriesReply* syncAppendEntriesReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -1607,18 +1607,18 @@ void syncApplyMsgDestroy(SyncApplyMsg* pMsg) {
}
void syncApplyMsgSerialize(const SyncApplyMsg* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncApplyMsgDeserialize(const char* buf, uint32_t len, SyncApplyMsg* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncApplyMsgSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -1629,9 +1629,9 @@ char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
SyncApplyMsg* syncApplyMsgDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncApplyMsg* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncApplyMsgDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -1752,19 +1752,19 @@ void syncSnapshotSendDestroy(SyncSnapshotSend* pMsg) {
}
void syncSnapshotSendSerialize(const SyncSnapshotSend* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncSnapshotSendDeserialize(const char* buf, uint32_t len, SyncSnapshotSend* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
- assert(pMsg->bytes == sizeof(SyncSnapshotSend) + pMsg->dataLen);
+ ASSERT(len == pMsg->bytes);
+ ASSERT(pMsg->bytes == sizeof(SyncSnapshotSend) + pMsg->dataLen);
}
char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncSnapshotSendSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -1775,9 +1775,9 @@ char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
SyncSnapshotSend* syncSnapshotSendDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncSnapshotSend* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncSnapshotSendDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -1795,7 +1795,7 @@ void syncSnapshotSendFromRpcMsg(const SRpcMsg* pRpcMsg, SyncSnapshotSend* pMsg)
SyncSnapshotSend* syncSnapshotSendFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncSnapshotSend* pMsg = syncSnapshotSendDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -1925,18 +1925,18 @@ void syncSnapshotRspDestroy(SyncSnapshotRsp* pMsg) {
}
void syncSnapshotRspSerialize(const SyncSnapshotRsp* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncSnapshotRspDeserialize(const char* buf, uint32_t len, SyncSnapshotRsp* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncSnapshotRspSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -1947,9 +1947,9 @@ char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
SyncSnapshotRsp* syncSnapshotRspDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncSnapshotRsp* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncSnapshotRspDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -1967,7 +1967,7 @@ void syncSnapshotRspFromRpcMsg(const SRpcMsg* pRpcMsg, SyncSnapshotRsp* pMsg) {
SyncSnapshotRsp* syncSnapshotRspFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncSnapshotRsp* pMsg = syncSnapshotRspDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -2085,18 +2085,18 @@ void syncLeaderTransferDestroy(SyncLeaderTransfer* pMsg) {
}
void syncLeaderTransferSerialize(const SyncLeaderTransfer* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncLeaderTransferDeserialize(const char* buf, uint32_t len, SyncLeaderTransfer* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncLeaderTransferSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -2107,9 +2107,9 @@ char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len
SyncLeaderTransfer* syncLeaderTransferDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncLeaderTransfer* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncLeaderTransferDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -2127,7 +2127,7 @@ void syncLeaderTransferFromRpcMsg(const SRpcMsg* pRpcMsg, SyncLeaderTransfer* pM
SyncLeaderTransfer* syncLeaderTransferFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncLeaderTransfer* pMsg = syncLeaderTransferDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
@@ -2247,18 +2247,18 @@ void syncReconfigFinishDestroy(SyncReconfigFinish* pMsg) {
}
void syncReconfigFinishSerialize(const SyncReconfigFinish* pMsg, char* buf, uint32_t bufLen) {
- assert(pMsg->bytes <= bufLen);
+ ASSERT(pMsg->bytes <= bufLen);
memcpy(buf, pMsg, pMsg->bytes);
}
void syncReconfigFinishDeserialize(const char* buf, uint32_t len, SyncReconfigFinish* pMsg) {
memcpy(pMsg, buf, len);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
}
char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len) {
char* buf = taosMemoryMalloc(pMsg->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
syncReconfigFinishSerialize(pMsg, buf, pMsg->bytes);
if (len != NULL) {
*len = pMsg->bytes;
@@ -2269,9 +2269,9 @@ char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len
SyncReconfigFinish* syncReconfigFinishDeserialize2(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SyncReconfigFinish* pMsg = taosMemoryMalloc(bytes);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
syncReconfigFinishDeserialize(buf, len, pMsg);
- assert(len == pMsg->bytes);
+ ASSERT(len == pMsg->bytes);
return pMsg;
}
@@ -2289,7 +2289,7 @@ void syncReconfigFinishFromRpcMsg(const SRpcMsg* pRpcMsg, SyncReconfigFinish* pM
SyncReconfigFinish* syncReconfigFinishFromRpcMsg2(const SRpcMsg* pRpcMsg) {
SyncReconfigFinish* pMsg = syncReconfigFinishDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
return pMsg;
}
diff --git a/source/libs/sync/src/syncRaftCfg.c b/source/libs/sync/src/syncRaftCfg.c
index 7d020f6892..2cc1eb0239 100644
--- a/source/libs/sync/src/syncRaftCfg.c
+++ b/source/libs/sync/src/syncRaftCfg.c
@@ -24,29 +24,29 @@ SRaftCfg *raftCfgOpen(const char *path) {
snprintf(pCfg->path, sizeof(pCfg->path), "%s", path);
pCfg->pFile = taosOpenFile(pCfg->path, TD_FILE_READ | TD_FILE_WRITE);
- assert(pCfg->pFile != NULL);
+ ASSERT(pCfg->pFile != NULL);
taosLSeekFile(pCfg->pFile, 0, SEEK_SET);
char buf[1024] = {0};
int len = taosReadFile(pCfg->pFile, buf, sizeof(buf));
- assert(len > 0);
+ ASSERT(len > 0);
int32_t ret = raftCfgFromStr(buf, pCfg);
- assert(ret == 0);
+ ASSERT(ret == 0);
return pCfg;
}
int32_t raftCfgClose(SRaftCfg *pRaftCfg) {
int64_t ret = taosCloseFile(&(pRaftCfg->pFile));
- assert(ret == 0);
+ ASSERT(ret == 0);
taosMemoryFree(pRaftCfg);
return 0;
}
int32_t raftCfgPersist(SRaftCfg *pRaftCfg) {
- assert(pRaftCfg != NULL);
+ ASSERT(pRaftCfg != NULL);
char *s = raftCfg2Str(pRaftCfg);
taosLSeekFile(pRaftCfg->pFile, 0, SEEK_SET);
@@ -61,10 +61,10 @@ int32_t raftCfgPersist(SRaftCfg *pRaftCfg) {
snprintf(buf, sizeof(buf), "%s", s);
int64_t ret = taosWriteFile(pRaftCfg->pFile, buf, sizeof(buf));
- assert(ret == sizeof(buf));
+ ASSERT(ret == sizeof(buf));
// int64_t ret = taosWriteFile(pRaftCfg->pFile, s, strlen(s) + 1);
- // assert(ret == strlen(s) + 1);
+ // ASSERT(ret == strlen(s) + 1);
taosMemoryFree(s);
taosFsyncFile(pRaftCfg->pFile);
@@ -135,27 +135,27 @@ int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) {
const cJSON *pJson = pRoot;
cJSON *pReplicaNum = cJSON_GetObjectItem(pJson, "replicaNum");
- assert(cJSON_IsNumber(pReplicaNum));
+ ASSERT(cJSON_IsNumber(pReplicaNum));
pSyncCfg->replicaNum = cJSON_GetNumberValue(pReplicaNum);
cJSON *pMyIndex = cJSON_GetObjectItem(pJson, "myIndex");
- assert(cJSON_IsNumber(pMyIndex));
+ ASSERT(cJSON_IsNumber(pMyIndex));
pSyncCfg->myIndex = cJSON_GetNumberValue(pMyIndex);
cJSON *pNodeInfoArr = cJSON_GetObjectItem(pJson, "nodeInfo");
int arraySize = cJSON_GetArraySize(pNodeInfoArr);
- assert(arraySize == pSyncCfg->replicaNum);
+ ASSERT(arraySize == pSyncCfg->replicaNum);
for (int i = 0; i < arraySize; ++i) {
cJSON *pNodeInfo = cJSON_GetArrayItem(pNodeInfoArr, i);
- assert(pNodeInfo != NULL);
+ ASSERT(pNodeInfo != NULL);
cJSON *pNodePort = cJSON_GetObjectItem(pNodeInfo, "nodePort");
- assert(cJSON_IsNumber(pNodePort));
+ ASSERT(cJSON_IsNumber(pNodePort));
((pSyncCfg->nodeInfo)[i]).nodePort = cJSON_GetNumberValue(pNodePort);
cJSON *pNodeFqdn = cJSON_GetObjectItem(pNodeInfo, "nodeFqdn");
- assert(cJSON_IsString(pNodeFqdn));
+ ASSERT(cJSON_IsString(pNodeFqdn));
snprintf(((pSyncCfg->nodeInfo)[i]).nodeFqdn, sizeof(((pSyncCfg->nodeInfo)[i]).nodeFqdn), "%s",
pNodeFqdn->valuestring);
}
@@ -165,10 +165,10 @@ int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) {
int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg) {
cJSON *pRoot = cJSON_Parse(s);
- assert(pRoot != NULL);
+ ASSERT(pRoot != NULL);
int32_t ret = syncCfgFromJson(pRoot, pSyncCfg);
- assert(ret == 0);
+ ASSERT(ret == 0);
cJSON_Delete(pRoot);
return 0;
@@ -207,10 +207,10 @@ char *raftCfg2Str(SRaftCfg *pRaftCfg) {
}
int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
- assert(pCfg != NULL);
+ ASSERT(pCfg != NULL);
TdFilePtr pFile = taosOpenFile(path, TD_FILE_CREATE | TD_FILE_WRITE);
- assert(pFile != NULL);
+ ASSERT(pFile != NULL);
SRaftCfg raftCfg;
raftCfg.cfg = *pCfg;
@@ -227,10 +227,10 @@ int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
ASSERT(strlen(s) + 1 <= CONFIG_FILE_LEN);
snprintf(buf, sizeof(buf), "%s", s);
int64_t ret = taosWriteFile(pFile, buf, sizeof(buf));
- assert(ret == sizeof(buf));
+ ASSERT(ret == sizeof(buf));
// int64_t ret = taosWriteFile(pFile, s, strlen(s) + 1);
- // assert(ret == strlen(s) + 1);
+ // ASSERT(ret == strlen(s) + 1);
taosMemoryFree(s);
taosCloseFile(&pFile);
@@ -255,15 +255,15 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) {
cJSON *pIndexArr = cJSON_GetObjectItem(pJson, "configIndexArr");
int arraySize = cJSON_GetArraySize(pIndexArr);
- assert(arraySize == pRaftCfg->configIndexCount);
+ ASSERT(arraySize == pRaftCfg->configIndexCount);
memset(pRaftCfg->configIndexArr, 0, sizeof(pRaftCfg->configIndexArr));
for (int i = 0; i < arraySize; ++i) {
cJSON *pIndexObj = cJSON_GetArrayItem(pIndexArr, i);
- assert(pIndexObj != NULL);
+ ASSERT(pIndexObj != NULL);
cJSON *pIndex = cJSON_GetObjectItem(pIndexObj, "index");
- assert(cJSON_IsString(pIndex));
+ ASSERT(cJSON_IsString(pIndex));
(pRaftCfg->configIndexArr)[i] = atoll(pIndex->valuestring);
}
@@ -276,10 +276,10 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) {
int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg) {
cJSON *pRoot = cJSON_Parse(s);
- assert(pRoot != NULL);
+ ASSERT(pRoot != NULL);
int32_t ret = raftCfgFromJson(pRoot, pRaftCfg);
- assert(ret == 0);
+ ASSERT(ret == 0);
cJSON_Delete(pRoot);
return 0;
diff --git a/source/libs/sync/src/syncRaftEntry.c b/source/libs/sync/src/syncRaftEntry.c
index 05a2dbaa3f..ff334a76bb 100644
--- a/source/libs/sync/src/syncRaftEntry.c
+++ b/source/libs/sync/src/syncRaftEntry.c
@@ -19,7 +19,7 @@
SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
uint32_t bytes = sizeof(SSyncRaftEntry) + dataLen;
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
memset(pEntry, 0, bytes);
pEntry->bytes = bytes;
pEntry->dataLen = dataLen;
@@ -29,14 +29,14 @@ SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
// step 4. SyncClientRequest => SSyncRaftEntry, add term, index
SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
SSyncRaftEntry* pEntry = syncEntryBuild3(pMsg, term, index);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
return pEntry;
}
SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->dataLen);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
pEntry->msgType = pMsg->msgType;
pEntry->originalRpcType = pMsg->originalRpcType;
@@ -63,7 +63,7 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId)
memcpy(rpcMsg.pCont, &head, sizeof(head));
SSyncRaftEntry* pEntry = syncEntryBuild(rpcMsg.contLen);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
pEntry->originalRpcType = TDMT_SYNC_NOOP;
@@ -72,7 +72,7 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId)
pEntry->term = term;
pEntry->index = index;
- assert(pEntry->dataLen == rpcMsg.contLen);
+ ASSERT(pEntry->dataLen == rpcMsg.contLen);
memcpy(pEntry->data, rpcMsg.pCont, rpcMsg.contLen);
rpcFreeCont(rpcMsg.pCont);
@@ -88,7 +88,7 @@ void syncEntryDestory(SSyncRaftEntry* pEntry) {
// step 5. SSyncRaftEntry => bin, to raft log
char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
char* buf = taosMemoryMalloc(pEntry->bytes);
- assert(buf != NULL);
+ ASSERT(buf != NULL);
memcpy(buf, pEntry, pEntry->bytes);
if (len != NULL) {
*len = pEntry->bytes;
@@ -100,9 +100,9 @@ char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len) {
uint32_t bytes = *((uint32_t*)buf);
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
memcpy(pEntry, buf, len);
- assert(len == pEntry->bytes);
+ ASSERT(len == pEntry->bytes);
return pEntry;
}
diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c
index 79d9b329c1..0f6e8a28d9 100644
--- a/source/libs/sync/src/syncRaftLog.c
+++ b/source/libs/sync/src/syncRaftLog.c
@@ -25,7 +25,7 @@ static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore);
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore);
static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore);
-static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index);
+
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore);
static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore);
static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry);
@@ -58,8 +58,6 @@ static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex b
return 0;
}
-int32_t raftLogResetBeginIndex(struct SSyncLogStore* pLogStore) { return 0; }
-
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
@@ -81,6 +79,7 @@ static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore) {
return count > 0 ? count : 0;
}
+#if 0
static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index) {
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
SyncIndex endIndex = raftLogEndIndex(pLogStore);
@@ -90,6 +89,7 @@ static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index) {
return false;
}
}
+#endif
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
SyncIndex lastIndex;
@@ -143,7 +143,10 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr
SWal* pWal = pData->pWal;
SyncIndex writeIndex = raftLogWriteIndex(pLogStore);
- ASSERT(pEntry->index == writeIndex);
+ if (pEntry->index != writeIndex) {
+ sError("raftLogAppendEntry error, pEntry->index:%ld update to writeIndex:%ld", pEntry->index, writeIndex);
+ pEntry->index = writeIndex;
+ }
int code = 0;
SSyncLogMeta syncMeta;
@@ -171,6 +174,7 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr
return code;
}
+#if 0
static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
@@ -215,6 +219,49 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index,
return code;
}
+#endif
+
+static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
+ SSyncLogStoreData* pData = pLogStore->data;
+ SWal* pWal = pData->pWal;
+ int32_t code;
+
+ *ppEntry = NULL;
+
+ SWalReadHandle* pWalHandle = walOpenReadHandle(pWal);
+ if (pWalHandle == NULL) {
+ return -1;
+ }
+
+ code = walReadWithHandle(pWalHandle, index);
+ if (code != 0) {
+ int32_t err = terrno;
+ const char* errStr = tstrerror(err);
+ int32_t linuxErr = errno;
+ const char* linuxErrMsg = strerror(errno);
+ sError("raftLogGetEntry error, err:%d %X, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, err, errStr, linuxErr,
+ linuxErrMsg);
+
+ walCloseReadHandle(pWalHandle);
+ return code;
+ }
+
+ *ppEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen);
+ ASSERT(*ppEntry != NULL);
+ (*ppEntry)->msgType = TDMT_SYNC_CLIENT_REQUEST;
+ (*ppEntry)->originalRpcType = pWalHandle->pHead->head.msgType;
+ (*ppEntry)->seqNum = pWalHandle->pHead->head.syncMeta.seqNum;
+ (*ppEntry)->isWeak = pWalHandle->pHead->head.syncMeta.isWeek;
+ (*ppEntry)->term = pWalHandle->pHead->head.syncMeta.term;
+ (*ppEntry)->index = index;
+ ASSERT((*ppEntry)->dataLen == pWalHandle->pHead->head.bodyLen);
+ memcpy((*ppEntry)->data, pWalHandle->pHead->head.body, pWalHandle->pHead->head.bodyLen);
+
+ // need to hold, do not new every time!!
+ walCloseReadHandle(pWalHandle);
+
+ return code;
+}
static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIndex) {
SSyncLogStoreData* pData = pLogStore->data;
@@ -245,10 +292,10 @@ static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** pp
//-------------------------------
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
SSyncLogStore* pLogStore = taosMemoryMalloc(sizeof(SSyncLogStore));
- assert(pLogStore != NULL);
+ ASSERT(pLogStore != NULL);
pLogStore->data = taosMemoryMalloc(sizeof(SSyncLogStoreData));
- assert(pLogStore->data != NULL);
+ ASSERT(pLogStore->data != NULL);
SSyncLogStoreData* pData = pLogStore->data;
pData->pSyncNode = pSyncNode;
@@ -277,7 +324,6 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
pLogStore->syncLogEndIndex = raftLogEndIndex;
pLogStore->syncLogIsEmpty = raftLogIsEmpty;
pLogStore->syncLogEntryCount = raftLogEntryCount;
- pLogStore->syncLogInRange = raftLogInRange;
pLogStore->syncLogLastIndex = raftLogLastIndex;
pLogStore->syncLogLastTerm = raftLogLastTerm;
pLogStore->syncLogAppendEntry = raftLogAppendEntry;
@@ -285,6 +331,8 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
pLogStore->syncLogTruncate = raftLogTruncate;
pLogStore->syncLogWriteIndex = raftLogWriteIndex;
+ // pLogStore->syncLogInRange = raftLogInRange;
+
return pLogStore;
}
@@ -301,7 +349,7 @@ int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) {
SWal* pWal = pData->pWal;
SyncIndex lastIndex = logStoreLastIndex(pLogStore);
- assert(pEntry->index == lastIndex + 1);
+ ASSERT(pEntry->index == lastIndex + 1);
int code = 0;
SSyncLogMeta syncMeta;
@@ -347,10 +395,10 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
linuxErrMsg);
ASSERT(0);
}
- // assert(walReadWithHandle(pWalHandle, index) == 0);
+ // ASSERT(walReadWithHandle(pWalHandle, index) == 0);
SSyncRaftEntry* pEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen);
- assert(pEntry != NULL);
+ ASSERT(pEntry != NULL);
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
pEntry->originalRpcType = pWalHandle->pHead->head.msgType;
@@ -358,7 +406,7 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
pEntry->isWeak = pWalHandle->pHead->head.syncMeta.isWeek;
pEntry->term = pWalHandle->pHead->head.syncMeta.term;
pEntry->index = index;
- assert(pEntry->dataLen == pWalHandle->pHead->head.bodyLen);
+ ASSERT(pEntry->dataLen == pWalHandle->pHead->head.bodyLen);
memcpy(pEntry->data, pWalHandle->pHead->head.body, pWalHandle->pHead->head.bodyLen);
// need to hold, do not new every time!!
@@ -373,7 +421,7 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
int32_t logStoreTruncate(SSyncLogStore* pLogStore, SyncIndex fromIndex) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
- // assert(walRollback(pWal, fromIndex) == 0);
+ // ASSERT(walRollback(pWal, fromIndex) == 0);
int32_t code = walRollback(pWal, fromIndex);
if (code != 0) {
int32_t err = terrno;
@@ -407,7 +455,7 @@ SyncTerm logStoreLastTerm(SSyncLogStore* pLogStore) {
int32_t logStoreUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
- // assert(walCommit(pWal, index) == 0);
+ // ASSERT(walCommit(pWal, index) == 0);
int32_t code = walCommit(pWal, index);
if (code != 0) {
int32_t err = terrno;
diff --git a/source/libs/sync/src/syncRaftStore.c b/source/libs/sync/src/syncRaftStore.c
index 52e8152926..a1ab95c00f 100644
--- a/source/libs/sync/src/syncRaftStore.c
+++ b/source/libs/sync/src/syncRaftStore.c
@@ -39,40 +39,40 @@ SRaftStore *raftStoreOpen(const char *path) {
if (!raftStoreFileExist(pRaftStore->path)) {
ret = raftStoreInit(pRaftStore);
- assert(ret == 0);
+ ASSERT(ret == 0);
}
pRaftStore->pFile = taosOpenFile(path, TD_FILE_READ | TD_FILE_WRITE);
- assert(pRaftStore->pFile != NULL);
+ ASSERT(pRaftStore->pFile != NULL);
int len = taosReadFile(pRaftStore->pFile, storeBuf, RAFT_STORE_BLOCK_SIZE);
- assert(len == RAFT_STORE_BLOCK_SIZE);
+ ASSERT(len == RAFT_STORE_BLOCK_SIZE);
ret = raftStoreDeserialize(pRaftStore, storeBuf, len);
- assert(ret == 0);
+ ASSERT(ret == 0);
return pRaftStore;
}
static int32_t raftStoreInit(SRaftStore *pRaftStore) {
- assert(pRaftStore != NULL);
+ ASSERT(pRaftStore != NULL);
pRaftStore->pFile = taosOpenFile(pRaftStore->path, TD_FILE_CREATE | TD_FILE_WRITE);
- assert(pRaftStore->pFile != NULL);
+ ASSERT(pRaftStore->pFile != NULL);
pRaftStore->currentTerm = 0;
pRaftStore->voteFor.addr = 0;
pRaftStore->voteFor.vgId = 0;
int32_t ret = raftStorePersist(pRaftStore);
- assert(ret == 0);
+ ASSERT(ret == 0);
taosCloseFile(&pRaftStore->pFile);
return 0;
}
int32_t raftStoreClose(SRaftStore *pRaftStore) {
- assert(pRaftStore != NULL);
+ ASSERT(pRaftStore != NULL);
taosCloseFile(&pRaftStore->pFile);
taosMemoryFree(pRaftStore);
@@ -81,17 +81,17 @@ int32_t raftStoreClose(SRaftStore *pRaftStore) {
}
int32_t raftStorePersist(SRaftStore *pRaftStore) {
- assert(pRaftStore != NULL);
+ ASSERT(pRaftStore != NULL);
int32_t ret;
char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0};
ret = raftStoreSerialize(pRaftStore, storeBuf, sizeof(storeBuf));
- assert(ret == 0);
+ ASSERT(ret == 0);
taosLSeekFile(pRaftStore->pFile, 0, SEEK_SET);
ret = taosWriteFile(pRaftStore->pFile, storeBuf, sizeof(storeBuf));
- assert(ret == RAFT_STORE_BLOCK_SIZE);
+ ASSERT(ret == RAFT_STORE_BLOCK_SIZE);
taosFsyncFile(pRaftStore->pFile);
return 0;
@@ -103,7 +103,7 @@ static bool raftStoreFileExist(char *path) {
}
int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
- assert(pRaftStore != NULL);
+ ASSERT(pRaftStore != NULL);
cJSON *pRoot = cJSON_CreateObject();
@@ -125,7 +125,7 @@ int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
char *serialized = cJSON_Print(pRoot);
int len2 = strlen(serialized);
- assert(len2 < len);
+ ASSERT(len2 < len);
memset(buf, 0, len);
snprintf(buf, len, "%s", serialized);
taosMemoryFree(serialized);
@@ -135,17 +135,17 @@ int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
}
int32_t raftStoreDeserialize(SRaftStore *pRaftStore, char *buf, size_t len) {
- assert(pRaftStore != NULL);
+ ASSERT(pRaftStore != NULL);
- assert(len > 0 && len <= RAFT_STORE_BLOCK_SIZE);
+ ASSERT(len > 0 && len <= RAFT_STORE_BLOCK_SIZE);
cJSON *pRoot = cJSON_Parse(buf);
cJSON *pCurrentTerm = cJSON_GetObjectItem(pRoot, "current_term");
- assert(cJSON_IsString(pCurrentTerm));
+ ASSERT(cJSON_IsString(pCurrentTerm));
sscanf(pCurrentTerm->valuestring, "%lu", &(pRaftStore->currentTerm));
cJSON *pVoteForAddr = cJSON_GetObjectItem(pRoot, "vote_for_addr");
- assert(cJSON_IsString(pVoteForAddr));
+ ASSERT(cJSON_IsString(pVoteForAddr));
sscanf(pVoteForAddr->valuestring, "%lu", &(pRaftStore->voteFor.addr));
cJSON *pVoteForVgid = cJSON_GetObjectItem(pRoot, "vote_for_vgid");
@@ -161,7 +161,7 @@ bool raftStoreHasVoted(SRaftStore *pRaftStore) {
}
void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId) {
- assert(!syncUtilEmptyId(pRaftId));
+ ASSERT(!syncUtilEmptyId(pRaftId));
pRaftStore->voteFor = *pRaftId;
raftStorePersist(pRaftStore);
}
@@ -216,7 +216,7 @@ cJSON *raftStore2Json(SRaftStore *pRaftStore) {
char *raftStore2Str(SRaftStore *pRaftStore) {
cJSON *pJson = raftStore2Json(pRaftStore);
- char * serialized = cJSON_Print(pJson);
+ char *serialized = cJSON_Print(pJson);
cJSON_Delete(pJson);
return serialized;
}
diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c
index f044ae5733..d6e6fbe522 100644
--- a/source/libs/sync/src/syncReplication.c
+++ b/source/libs/sync/src/syncReplication.c
@@ -49,7 +49,7 @@
// /\ UNCHANGED <>
//
int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
- assert(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
+ ASSERT(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pNextIndex", pSyncNode->pNextIndex);
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pMatchIndex", pSyncNode->pMatchIndex);
@@ -68,7 +68,7 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
SyncTerm preLogTerm = 0;
if (preLogIndex >= SYNC_INDEX_BEGIN) {
SSyncRaftEntry* pPreEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, preLogIndex);
- assert(pPreEntry != NULL);
+ ASSERT(pPreEntry != NULL);
preLogTerm = pPreEntry->term;
syncEntryDestory(pPreEntry);
@@ -81,12 +81,12 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, nextIndex);
if (pEntry != NULL) {
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
// add pEntry into msg
uint32_t len;
char* serialized = syncEntrySerialize(pEntry, &len);
- assert(len == pEntry->bytes);
+ ASSERT(len == pEntry->bytes);
memcpy(pMsg->data, serialized, len);
taosMemoryFree(serialized);
@@ -95,10 +95,10 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
} else {
// maybe overflow, send empty record
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
}
- assert(pMsg != NULL);
+ ASSERT(pMsg != NULL);
pMsg->srcId = pSyncNode->myRaftId;
pMsg->destId = *pDestId;
pMsg->term = pSyncNode->pRaftStore->currentTerm;
@@ -148,25 +148,32 @@ int32_t syncNodeAppendEntriesPeersSnapshot(SSyncNode* pSyncNode) {
SSyncRaftEntry* pEntry;
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, nextIndex, &pEntry);
- ASSERT(code == 0);
- if (pEntry != NULL) {
+ if (code == 0) {
+ ASSERT(pEntry != NULL);
+
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
ASSERT(pMsg != NULL);
// add pEntry into msg
uint32_t len;
char* serialized = syncEntrySerialize(pEntry, &len);
- assert(len == pEntry->bytes);
+ ASSERT(len == pEntry->bytes);
memcpy(pMsg->data, serialized, len);
taosMemoryFree(serialized);
syncEntryDestory(pEntry);
} else {
- // no entry in log
- pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
- ASSERT(pMsg != NULL);
+ if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
+ // no entry in log
+ pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
+ ASSERT(pMsg != NULL);
+
+ } else {
+ syncNodeLog3("", pSyncNode);
+ ASSERT(0);
+ }
}
// prepare msg
diff --git a/source/libs/sync/src/syncRequestVote.c b/source/libs/sync/src/syncRequestVote.c
index 9ed7f00982..def5c321ad 100644
--- a/source/libs/sync/src/syncRequestVote.c
+++ b/source/libs/sync/src/syncRequestVote.c
@@ -52,7 +52,7 @@ int32_t syncNodeOnRequestVoteCb(SSyncNode* ths, SyncRequestVote* pMsg) {
if (pMsg->term > ths->pRaftStore->currentTerm) {
syncNodeUpdateTerm(ths, pMsg->term);
}
- assert(pMsg->term <= ths->pRaftStore->currentTerm);
+ ASSERT(pMsg->term <= ths->pRaftStore->currentTerm);
bool logOK = (pMsg->lastLogTerm > ths->pLogStore->getLastTerm(ths->pLogStore)) ||
((pMsg->lastLogTerm == ths->pLogStore->getLastTerm(ths->pLogStore)) &&
diff --git a/source/libs/sync/src/syncRequestVoteReply.c b/source/libs/sync/src/syncRequestVoteReply.c
index 5d041cefcd..60963d0dd3 100644
--- a/source/libs/sync/src/syncRequestVoteReply.c
+++ b/source/libs/sync/src/syncRequestVoteReply.c
@@ -50,7 +50,7 @@ int32_t syncNodeOnRequestVoteReplyCb(SSyncNode* ths, SyncRequestVoteReply* pMsg)
return ret;
}
- // assert(!(pMsg->term > ths->pRaftStore->currentTerm));
+ // ASSERT(!(pMsg->term > ths->pRaftStore->currentTerm));
// no need this code, because if I receive reply.term, then I must have sent for that term.
// if (pMsg->term > ths->pRaftStore->currentTerm) {
// syncNodeUpdateTerm(ths, pMsg->term);
@@ -65,7 +65,7 @@ int32_t syncNodeOnRequestVoteReplyCb(SSyncNode* ths, SyncRequestVoteReply* pMsg)
return ret;
}
- assert(pMsg->term == ths->pRaftStore->currentTerm);
+ ASSERT(pMsg->term == ths->pRaftStore->currentTerm);
// This tallies votes even when the current state is not Candidate,
// but they won't be looked at, so it doesn't matter.
@@ -115,7 +115,7 @@ int32_t syncNodeOnRequestVoteReplySnapshotCb(SSyncNode* ths, SyncRequestVoteRepl
return ret;
}
- // assert(!(pMsg->term > ths->pRaftStore->currentTerm));
+ // ASSERT(!(pMsg->term > ths->pRaftStore->currentTerm));
// no need this code, because if I receive reply.term, then I must have sent for that term.
// if (pMsg->term > ths->pRaftStore->currentTerm) {
// syncNodeUpdateTerm(ths, pMsg->term);
diff --git a/source/libs/sync/src/syncRespMgr.c b/source/libs/sync/src/syncRespMgr.c
index 354575d29e..48c1b70a04 100644
--- a/source/libs/sync/src/syncRespMgr.c
+++ b/source/libs/sync/src/syncRespMgr.c
@@ -22,7 +22,7 @@ SSyncRespMgr *syncRespMgrCreate(void *data, int64_t ttl) {
pObj->pRespHash =
taosHashInit(sizeof(uint64_t), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
- assert(pObj->pRespHash != NULL);
+ ASSERT(pObj->pRespHash != NULL);
pObj->ttl = ttl;
pObj->data = data;
pObj->seqNum = 0;
diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c
index 68185131d1..ff3dc56f71 100644
--- a/source/libs/sync/src/syncSnapshot.c
+++ b/source/libs/sync/src/syncSnapshot.c
@@ -73,41 +73,49 @@ void snapshotSenderStart(SSyncSnapshotSender *pSender, SSnapshot snapshot, void
pSender->seq = SYNC_SNAPSHOT_SEQ_BEGIN;
pSender->ack = SYNC_SNAPSHOT_SEQ_INVALID;
- // open snapshot reader
+ // init snapshot and reader
ASSERT(pSender->pReader == NULL);
pSender->pReader = pReader;
pSender->snapshot = snapshot;
- /*
- // open snapshot reader
- ASSERT(pSender->pReader == NULL);
- int32_t ret = pSender->pSyncNode->pFsm->FpSnapshotStartRead(pSender->pSyncNode->pFsm, &(pSender->pReader));
- ASSERT(ret == 0);
-
- // get current snapshot info
- pSender->pSyncNode->pFsm->FpGetSnapshotInfo(pSender->pSyncNode->pFsm, &(pSender->snapshot));
- */
-
if (pSender->pCurrentBlock != NULL) {
taosMemoryFree(pSender->pCurrentBlock);
}
-
pSender->blockLen = 0;
if (pSender->snapshot.lastConfigIndex != SYNC_INDEX_INVALID) {
- SSyncRaftEntry *pEntry =
- pSender->pSyncNode->pLogStore->getEntry(pSender->pSyncNode->pLogStore, pSender->snapshot.lastConfigIndex);
- ASSERT(pEntry != NULL);
+ int32_t code = 0;
+ SSyncRaftEntry *pEntry = NULL;
+ code = pSender->pSyncNode->pLogStore->syncLogGetEntry(pSender->pSyncNode->pLogStore,
+ pSender->snapshot.lastConfigIndex, &pEntry);
- SRpcMsg rpcMsg;
- syncEntry2OriginalRpc(pEntry, &rpcMsg);
- SSyncCfg lastConfig;
- int32_t ret = syncCfgFromStr(rpcMsg.pCont, &lastConfig);
- ASSERT(ret == 0);
- pSender->lastConfig = lastConfig;
+ bool getLastConfig = false;
+ if (code == 0) {
+ ASSERT(pEntry != NULL);
- rpcFreeCont(rpcMsg.pCont);
- syncEntryDestory(pEntry);
+ SRpcMsg rpcMsg;
+ syncEntry2OriginalRpc(pEntry, &rpcMsg);
+
+ SSyncCfg lastConfig;
+ int32_t ret = syncCfgFromStr(rpcMsg.pCont, &lastConfig);
+ ASSERT(ret == 0);
+ pSender->lastConfig = lastConfig;
+ getLastConfig = true;
+
+ rpcFreeCont(rpcMsg.pCont);
+ syncEntryDestory(pEntry);
+ } else {
+ if (pSender->snapshot.lastConfigIndex == pSender->pSyncNode->pRaftCfg->lastConfigIndex) {
+ sTrace("vgId:%d sync sender get cfg from local", pSender->pSyncNode->vgId);
+ pSender->lastConfig = pSender->pSyncNode->pRaftCfg->cfg;
+ getLastConfig = true;
+ }
+ }
+
+ if (!getLastConfig) {
+ syncNodeLog3("", pSender->pSyncNode);
+ ASSERT(0);
+ }
} else {
memset(&(pSender->lastConfig), 0, sizeof(SSyncCfg));
@@ -525,6 +533,10 @@ int32_t syncNodeOnSnapshotSendCb(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
ASSERT(writeCode == 0);
pSyncNode->pFsm->FpSnapshotStopWrite(pSyncNode->pFsm, pReceiver->pWriter, true);
+ if (pReceiver->snapshot.lastApplyIndex > pReceiver->pSyncNode->commitIndex) {
+ pReceiver->pSyncNode->commitIndex = pReceiver->snapshot.lastApplyIndex;
+ }
+
pSyncNode->pLogStore->syncLogSetBeginIndex(pSyncNode->pLogStore, pMsg->lastIndex + 1);
// maybe update lastconfig
@@ -544,7 +556,7 @@ int32_t syncNodeOnSnapshotSendCb(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
do {
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver finish");
+ char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver finish, apply snapshot");
syncNodeEventLog(pSyncNode, eventLog);
taosMemoryFree(eventLog);
} while (0);
@@ -555,7 +567,7 @@ int32_t syncNodeOnSnapshotSendCb(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
needRsp = true;
do {
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver end");
+ char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver stop");
syncNodeEventLog(pSyncNode, eventLog);
taosMemoryFree(eventLog);
} while (0);
diff --git a/source/libs/sync/src/syncUtil.c b/source/libs/sync/src/syncUtil.c
index 1d1ff7ae53..5b73d980c4 100644
--- a/source/libs/sync/src/syncUtil.c
+++ b/source/libs/sync/src/syncUtil.c
@@ -86,7 +86,7 @@ void syncUtilraftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet) {
void syncUtilnodeInfo2raftId(const SNodeInfo* pNodeInfo, SyncGroupId vgId, SRaftId* raftId) {
uint32_t ipv4 = taosGetIpv4FromFqdn(pNodeInfo->nodeFqdn);
- assert(ipv4 != 0xFFFFFFFF);
+ ASSERT(ipv4 != 0xFFFFFFFF);
char ipbuf[128] = {0};
tinet_ntoa(ipbuf, ipv4);
raftId->addr = syncUtilAddr2U64(ipbuf, pNodeInfo->nodePort);
@@ -124,7 +124,7 @@ void syncUtilbufCopyDeep(const SSyncBuffer* src, SSyncBuffer* dest) {
int32_t syncUtilRand(int32_t max) { return taosRand() % max; }
int32_t syncUtilElectRandomMS(int32_t min, int32_t max) {
- assert(min > 0 && max > 0 && max >= min);
+ ASSERT(min > 0 && max > 0 && max >= min);
return min + syncUtilRand(max - min);
}
@@ -201,7 +201,7 @@ bool syncUtilCanPrint(char c) {
char* syncUtilprintBin(char* ptr, uint32_t len) {
char* s = taosMemoryMalloc(len + 1);
- assert(s != NULL);
+ ASSERT(s != NULL);
memset(s, 0, len + 1);
memcpy(s, ptr, len);
@@ -216,7 +216,7 @@ char* syncUtilprintBin(char* ptr, uint32_t len) {
char* syncUtilprintBin2(char* ptr, uint32_t len) {
uint32_t len2 = len * 4 + 1;
char* s = taosMemoryMalloc(len2);
- assert(s != NULL);
+ ASSERT(s != NULL);
memset(s, 0, len2);
char* p = s;
diff --git a/source/libs/sync/src/syncVoteMgr.c b/source/libs/sync/src/syncVoteMgr.c
index 528c2f26c8..d6c2cbd34e 100644
--- a/source/libs/sync/src/syncVoteMgr.c
+++ b/source/libs/sync/src/syncVoteMgr.c
@@ -24,7 +24,7 @@ static void voteGrantedClearVotes(SVotesGranted *pVotesGranted) {
SVotesGranted *voteGrantedCreate(SSyncNode *pSyncNode) {
SVotesGranted *pVotesGranted = taosMemoryMalloc(sizeof(SVotesGranted));
- assert(pVotesGranted != NULL);
+ ASSERT(pVotesGranted != NULL);
memset(pVotesGranted, 0, sizeof(SVotesGranted));
pVotesGranted->replicas = &(pSyncNode->replicasId);
@@ -62,9 +62,9 @@ bool voteGrantedMajority(SVotesGranted *pVotesGranted) {
}
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
- assert(pMsg->voteGranted == true);
- assert(pMsg->term == pVotesGranted->term);
- assert(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
+ ASSERT(pMsg->voteGranted == true);
+ ASSERT(pMsg->term == pVotesGranted->term);
+ ASSERT(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
int j = -1;
for (int i = 0; i < pVotesGranted->replicaNum; ++i) {
@@ -73,14 +73,14 @@ void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
break;
}
}
- assert(j != -1);
- assert(j >= 0 && j < pVotesGranted->replicaNum);
+ ASSERT(j != -1);
+ ASSERT(j >= 0 && j < pVotesGranted->replicaNum);
if (pVotesGranted->isGranted[j] != true) {
++(pVotesGranted->votes);
pVotesGranted->isGranted[j] = true;
}
- assert(pVotesGranted->votes <= pVotesGranted->replicaNum);
+ ASSERT(pVotesGranted->votes <= pVotesGranted->replicaNum);
}
void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term) {
@@ -127,7 +127,7 @@ cJSON *voteGranted2Json(SVotesGranted *pVotesGranted) {
char *voteGranted2Str(SVotesGranted *pVotesGranted) {
cJSON *pJson = voteGranted2Json(pVotesGranted);
- char * serialized = cJSON_Print(pJson);
+ char *serialized = cJSON_Print(pJson);
cJSON_Delete(pJson);
return serialized;
}
@@ -162,7 +162,7 @@ void voteGrantedLog2(char *s, SVotesGranted *pObj) {
// SVotesRespond -----------------------------
SVotesRespond *votesRespondCreate(SSyncNode *pSyncNode) {
SVotesRespond *pVotesRespond = taosMemoryMalloc(sizeof(SVotesRespond));
- assert(pVotesRespond != NULL);
+ ASSERT(pVotesRespond != NULL);
memset(pVotesRespond, 0, sizeof(SVotesRespond));
pVotesRespond->replicas = &(pSyncNode->replicasId);
@@ -198,15 +198,15 @@ bool votesResponded(SVotesRespond *pVotesRespond, const SRaftId *pRaftId) {
}
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg) {
- assert(pVotesRespond->term == pMsg->term);
+ ASSERT(pVotesRespond->term == pMsg->term);
for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
if (syncUtilSameId(&((*(pVotesRespond->replicas))[i]), &pMsg->srcId)) {
- // assert(pVotesRespond->isRespond[i] == false);
+ // ASSERT(pVotesRespond->isRespond[i] == false);
pVotesRespond->isRespond[i] = true;
return;
}
}
- assert(0);
+ ASSERT(0);
}
void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term) {
@@ -256,7 +256,7 @@ cJSON *votesRespond2Json(SVotesRespond *pVotesRespond) {
char *votesRespond2Str(SVotesRespond *pVotesRespond) {
cJSON *pJson = votesRespond2Json(pVotesRespond);
- char * serialized = cJSON_Print(pJson);
+ char *serialized = cJSON_Print(pJson);
cJSON_Delete(pJson);
return serialized;
}
diff --git a/source/libs/sync/test/CMakeLists.txt b/source/libs/sync/test/CMakeLists.txt
index 2057aa23a4..27084286da 100644
--- a/source/libs/sync/test/CMakeLists.txt
+++ b/source/libs/sync/test/CMakeLists.txt
@@ -34,6 +34,7 @@ add_executable(syncWriteTest "")
add_executable(syncReplicateTest "")
add_executable(syncRefTest "")
add_executable(syncLogStoreCheck "")
+add_executable(syncLogStoreCheck2 "")
add_executable(syncRaftCfgTest "")
add_executable(syncRespMgrTest "")
add_executable(syncSnapshotTest "")
@@ -196,6 +197,10 @@ target_sources(syncLogStoreCheck
PRIVATE
"syncLogStoreCheck.cpp"
)
+target_sources(syncLogStoreCheck2
+ PRIVATE
+ "syncLogStoreCheck2.cpp"
+)
target_sources(syncRaftCfgTest
PRIVATE
"syncRaftCfgTest.cpp"
@@ -442,6 +447,11 @@ target_include_directories(syncLogStoreCheck
"${TD_SOURCE_DIR}/include/libs/sync"
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
)
+target_include_directories(syncLogStoreCheck2
+ PUBLIC
+ "${TD_SOURCE_DIR}/include/libs/sync"
+ "${CMAKE_CURRENT_SOURCE_DIR}/../inc"
+)
target_include_directories(syncRaftCfgTest
PUBLIC
"${TD_SOURCE_DIR}/include/libs/sync"
@@ -668,6 +678,10 @@ target_link_libraries(syncLogStoreCheck
sync
gtest_main
)
+target_link_libraries(syncLogStoreCheck2
+ sync
+ gtest_main
+)
target_link_libraries(syncRaftCfgTest
sync
gtest_main
diff --git a/source/libs/sync/test/syncLogStoreCheck2.cpp b/source/libs/sync/test/syncLogStoreCheck2.cpp
new file mode 100644
index 0000000000..80679bc85c
--- /dev/null
+++ b/source/libs/sync/test/syncLogStoreCheck2.cpp
@@ -0,0 +1,76 @@
+#include
+#include
+#include "syncEnv.h"
+#include "syncIO.h"
+#include "syncInt.h"
+#include "syncRaftLog.h"
+#include "syncRaftStore.h"
+#include "syncUtil.h"
+#include "wal.h"
+
+void logTest() {
+ sTrace("--- sync log test: trace");
+ sDebug("--- sync log test: debug");
+ sInfo("--- sync log test: info");
+ sWarn("--- sync log test: warn");
+ sError("--- sync log test: error");
+ sFatal("--- sync log test: fatal");
+}
+
+void init() {
+ int code = walInit();
+ assert(code == 0);
+}
+
+void cleanup() { walCleanUp(); }
+
+SWal* createWal(char* path, int32_t vgId) {
+ SWalCfg walCfg;
+ memset(&walCfg, 0, sizeof(SWalCfg));
+ walCfg.vgId = vgId;
+ walCfg.fsyncPeriod = 1000;
+ walCfg.retentionPeriod = 1000;
+ walCfg.rollPeriod = 1000;
+ walCfg.retentionSize = 1000;
+ walCfg.segSize = 1000;
+ walCfg.level = TAOS_WAL_FSYNC;
+ SWal* pWal = walOpen(path, &walCfg);
+ assert(pWal != NULL);
+ return pWal;
+}
+
+SSyncNode* createSyncNode(SWal* pWal) {
+ SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
+ memset(pSyncNode, 0, sizeof(SSyncNode));
+ pSyncNode->pWal = pWal;
+ return pSyncNode;
+}
+
+void usage(char* exe) { printf("usage: %s path vgId \n", exe); }
+
+int main(int argc, char** argv) {
+ if (argc != 3) {
+ usage(argv[0]);
+ exit(-1);
+ }
+ char* path = argv[1];
+ int32_t vgId = atoi(argv[2]);
+
+ init();
+ SWal* pWal = createWal(path, vgId);
+ assert(pWal != NULL);
+ SSyncNode* pSyncNode = createSyncNode(pWal);
+ assert(pSyncNode != NULL);
+
+ SSyncLogStore* pLog = logStoreCreate(pSyncNode);
+ assert(pLog != NULL);
+
+ logStoreSimplePrint2((char*)"==syncLogStoreCheck2==", pLog);
+
+ walClose(pWal);
+ logStoreDestory(pLog);
+ taosMemoryFree(pSyncNode);
+
+ cleanup();
+ return 0;
+}
diff --git a/source/libs/sync/test/syncRaftLogTest2.cpp b/source/libs/sync/test/syncRaftLogTest2.cpp
index 32ff441a6f..bd6fa7c2c3 100644
--- a/source/libs/sync/test/syncRaftLogTest2.cpp
+++ b/source/libs/sync/test/syncRaftLogTest2.cpp
@@ -69,6 +69,7 @@ void test1() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest1 ----- ", pLogStore);
if (gAssert) {
@@ -88,6 +89,7 @@ void test1() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest1 restart ----- ", pLogStore);
if (gAssert) {
@@ -110,6 +112,7 @@ void test2() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
logStoreLog2((char*)"\n\n\ntest2 ----- ", pLogStore);
@@ -130,6 +133,7 @@ void test2() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest2 restart ----- ", pLogStore);
if (gAssert) {
@@ -152,6 +156,7 @@ void test3() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest3 ----- ", pLogStore);
if (gAssert) {
@@ -198,6 +203,7 @@ void test3() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest3 restart ----- ", pLogStore);
if (gAssert) {
@@ -220,6 +226,7 @@ void test4() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest4 ----- ", pLogStore);
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
@@ -257,6 +264,7 @@ void test4() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest4 restart ----- ", pLogStore);
if (gAssert) {
@@ -279,6 +287,7 @@ void test5() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
@@ -329,6 +338,7 @@ void test5() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest5 restart ----- ", pLogStore);
if (gAssert) {
@@ -351,6 +361,7 @@ void test6() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest6 ----- ", pLogStore);
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
@@ -401,6 +412,7 @@ void test6() {
init();
pLogStore = logStoreCreate(pSyncNode);
assert(pLogStore);
+ pSyncNode->pLogStore = pLogStore;
logStoreLog2((char*)"\n\n\ntest6 restart ----- ", pLogStore);
if (gAssert) {
diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c
index 45e71f6c0d..1c924fa636 100644
--- a/source/libs/tdb/src/db/tdbBtree.c
+++ b/source/libs/tdb/src/db/tdbBtree.c
@@ -56,14 +56,9 @@ typedef struct {
} SIntHdr;
#pragma pack(pop)
-typedef struct {
- u8 flags;
- SBTree *pBt;
-} SBtreeInitPageArg;
-
static int tdbDefaultKeyCmprFn(const void *pKey1, int keyLen1, const void *pKey2, int keyLen2);
static int tdbBtreeOpenImpl(SBTree *pBt);
-static int tdbBtreeInitPage(SPage *pPage, void *arg, int init);
+//static int tdbBtreeInitPage(SPage *pPage, void *arg, int init);
static int tdbBtreeEncodeCell(SPage *pPage, const void *pKey, int kLen, const void *pVal, int vLen, SCell *pCell,
int *szCell, TXN *pTxn, SBTree *pBt);
static int tdbBtreeDecodeCell(SPage *pPage, const SCell *pCell, SCellDecoder *pDecoder, TXN *pTxn, SBTree *pBt);
@@ -348,7 +343,7 @@ static int tdbBtreeOpenImpl(SBTree *pBt) {
return 0;
}
-static int tdbBtreeInitPage(SPage *pPage, void *arg, int init) {
+int tdbBtreeInitPage(SPage *pPage, void *arg, int init) {
SBTree *pBt;
u8 flags;
u8 leaf;
diff --git a/source/libs/tdb/src/db/tdbPager.c b/source/libs/tdb/src/db/tdbPager.c
index a74bb54883..dd3f09d5d2 100644
--- a/source/libs/tdb/src/db/tdbPager.c
+++ b/source/libs/tdb/src/db/tdbPager.c
@@ -424,4 +424,71 @@ static int tdbPagerWritePageToDB(SPager *pPager, SPage *pPage) {
}
return 0;
-}
\ No newline at end of file
+}
+
+int tdbPagerRestore(SPager *pPager, SBTree *pBt) {
+ int ret = 0;
+ SPgno journalSize = 0;
+ u8 *pageBuf = NULL;
+
+ tdb_fd_t jfd = tdbOsOpen(pPager->jFileName, TDB_O_RDWR, 0755);
+ if (jfd == NULL) {
+ return 0;
+ }
+
+ ret = tdbGetFileSize(jfd, pPager->pageSize, &journalSize);
+ if (ret < 0) {
+ return -1;
+ }
+
+ pageBuf = tdbOsCalloc(1, pPager->pageSize);
+ if (pageBuf == NULL) {
+ return -1;
+ }
+
+ TXN txn;
+ tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0);
+ SBtreeInitPageArg iArg;
+ iArg.pBt = pBt;
+ iArg.flags = 0;
+
+ for (int pgIndex = 0; pgIndex < journalSize; ++pgIndex) {
+ // read pgno & the page from journal
+ SPgno pgno;
+ SPage *pPage;
+
+ int ret = tdbOsRead(jfd, &pgno, sizeof(pgno));
+ if (ret < 0) {
+ return -1;
+ }
+
+ ret = tdbOsRead(jfd, pageBuf, pPager->pageSize);
+ if (ret < 0) {
+ return -1;
+ }
+
+ ret = tdbPagerFetchPage(pPager, &pgno, &pPage, tdbBtreeInitPage, &iArg, &txn);
+ if (ret < 0) {
+ return -1;
+ }
+
+ // write the page to db
+ ret = tdbPagerWritePageToDB(pPager, pPage);
+ if (ret < 0) {
+ return -1;
+ }
+
+ tdbPCacheRelease(pPager->pCache, pPage, &txn);
+ }
+
+ tdbOsFSync(pPager->fd);
+
+ tdbTxnClose(&txn);
+
+ tdbOsFree(pageBuf);
+
+ tdbOsClose(jfd);
+ tdbOsRemove(pPager->jFileName);
+
+ return 0;
+}
diff --git a/source/libs/tdb/src/db/tdbTable.c b/source/libs/tdb/src/db/tdbTable.c
index 1575f9f206..f1bfb4eabc 100644
--- a/source/libs/tdb/src/db/tdbTable.c
+++ b/source/libs/tdb/src/db/tdbTable.c
@@ -61,6 +61,11 @@ int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprF
return -1;
}
+ ret = tdbPagerRestore(pPager, pTb->pBt);
+ if (ret < 0) {
+ return -1;
+ }
+
*ppTb = pTb;
return 0;
}
diff --git a/source/libs/tdb/src/db/tdbUtil.c b/source/libs/tdb/src/db/tdbUtil.c
index 4acb83c8e4..9021e08ffe 100644
--- a/source/libs/tdb/src/db/tdbUtil.c
+++ b/source/libs/tdb/src/db/tdbUtil.c
@@ -64,4 +64,4 @@ int tdbGetFileSize(tdb_fd_t fd, int szPage, SPgno *size) {
*size = szBytes / szPage;
return 0;
-}
\ No newline at end of file
+}
diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h
index 39b5584fab..c914e098f7 100644
--- a/source/libs/tdb/src/inc/tdbInt.h
+++ b/source/libs/tdb/src/inc/tdbInt.h
@@ -158,6 +158,13 @@ int tdbBtreeUpsert(SBTree *pBt, const void *pKey, int nKey, const void *pData, i
int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen);
int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkLen, void **ppVal, int *vLen);
+typedef struct {
+ u8 flags;
+ SBTree *pBt;
+} SBtreeInitPageArg;
+
+int tdbBtreeInitPage(SPage *pPage, void *arg, int init);
+
// SBTC
int tdbBtcOpen(SBTC *pBtc, SBTree *pBt, TXN *pTxn);
int tdbBtcClose(SBTC *pBtc);
@@ -185,6 +192,7 @@ int tdbPagerFetchPage(SPager *pPager, SPgno *ppgno, SPage **ppPage, int (*initP
TXN *pTxn);
void tdbPagerReturnPage(SPager *pPager, SPage *pPage, TXN *pTxn);
int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno);
+int tdbPagerRestore(SPager *pPager, SBTree *pBt);
// tdbPCache.c ====================================
#define TDB_PCACHE_PAGE \
diff --git a/source/libs/tdb/src/inc/tdbUtil.h b/source/libs/tdb/src/inc/tdbUtil.h
index c518e8efcc..fe97f9c986 100644
--- a/source/libs/tdb/src/inc/tdbUtil.h
+++ b/source/libs/tdb/src/inc/tdbUtil.h
@@ -20,7 +20,7 @@
extern "C" {
#endif
-#if __STDC_VERSION__ >= 201112L
+#if __STDC_VERSION__ >= 201112LL
#define TDB_STATIC_ASSERT(op, info) static_assert(op, info)
#else
#define TDB_STATIC_ASSERT(op, info)
diff --git a/source/libs/transport/inc/transComm.h b/source/libs/transport/inc/transComm.h
index 146b127422..327fe50814 100644
--- a/source/libs/transport/inc/transComm.h
+++ b/source/libs/transport/inc/transComm.h
@@ -183,6 +183,8 @@ typedef enum { ConnNormal, ConnAcquire, ConnRelease, ConnBroken, ConnInPool } Co
#define transContLenFromMsg(msgLen) (msgLen - sizeof(STransMsgHead));
#define transIsReq(type) (type & 1U)
+#define transLabel(trans) ((STrans*)trans)->label
+
// int rpcAuthenticateMsg(void* pMsg, int msgLen, void* pAuth, void* pKey);
// void rpcBuildAuthHead(void* pMsg, int msgLen, void* pAuth, void* pKey);
//// int32_t rpcCompressRpcMsg(char* pCont, int32_t contLen);
diff --git a/source/libs/transport/inc/transLog.h b/source/libs/transport/inc/transLog.h
index 9947ba803f..121939787c 100644
--- a/source/libs/transport/inc/transLog.h
+++ b/source/libs/transport/inc/transLog.h
@@ -24,16 +24,21 @@ extern "C" {
#include "tlog.h"
#include "ttrace.h"
-#define tFatal(...) do {if (rpcDebugFlag & DEBUG_FATAL){ taosPrintLog("RPC FATAL ", DEBUG_FATAL, rpcDebugFlag, __VA_ARGS__); }} while (0)
-#define tError(...)do { if (rpcDebugFlag & DEBUG_ERROR){ taosPrintLog("RPC ERROR ", DEBUG_ERROR, rpcDebugFlag, __VA_ARGS__); } } while(0)
-#define tWarn(...) do { if (rpcDebugFlag & DEBUG_WARN) { taosPrintLog("RPC WARN ", DEBUG_WARN, rpcDebugFlag, __VA_ARGS__); }} while(0)
-#define tInfo(...) do { if (rpcDebugFlag & DEBUG_INFO) { taosPrintLog("RPC ", DEBUG_INFO, rpcDebugFlag, __VA_ARGS__); }} while(0)
-#define tDebug(...) do {if (rpcDebugFlag & DEBUG_DEBUG){ taosPrintLog("RPC ", DEBUG_DEBUG, rpcDebugFlag, __VA_ARGS__); }} while(0)
-#define tTrace(...) do {if (rpcDebugFlag & DEBUG_TRACE){ taosPrintLog("RPC ", DEBUG_TRACE, rpcDebugFlag, __VA_ARGS__); }} while(0)
-#define tDump(x, y) do {if (rpcDebugFlag & DEBUG_DUMP) { taosDumpData((unsigned char *)x, y); } } while(0)
+#define tFatal(...) { if (rpcDebugFlag & DEBUG_FATAL) { taosPrintLog("RPC FATAL ", DEBUG_FATAL, rpcDebugFlag, __VA_ARGS__); }}
+#define tError(...) { if (rpcDebugFlag & DEBUG_ERROR ){ taosPrintLog("RPC ERROR ", DEBUG_ERROR, rpcDebugFlag, __VA_ARGS__); }}
+#define tWarn(...) { if (rpcDebugFlag & DEBUG_WARN) { taosPrintLog("RPC WARN ", DEBUG_WARN, rpcDebugFlag, __VA_ARGS__); }}
+#define tInfo(...) { if (rpcDebugFlag & DEBUG_INFO) { taosPrintLog("RPC ", DEBUG_INFO, rpcDebugFlag, __VA_ARGS__); }}
+#define tDebug(...) { if (rpcDebugFlag & DEBUG_DEBUG) { taosPrintLog("RPC ", DEBUG_DEBUG, rpcDebugFlag, __VA_ARGS__); }}
+#define tTrace(...) { if (rpcDebugFlag & DEBUG_TRACE) { taosPrintLog("RPC ", DEBUG_TRACE, rpcDebugFlag, __VA_ARGS__); }}
+#define tDump(x, y) { if (rpcDebugFlag & DEBUG_DUMP) { taosDumpData((unsigned char *)x, y); } }
+
+#define tGTrace(param, ...) do { if (rpcDebugFlag & DEBUG_TRACE){char buf[40] = {0}; TRACE_TO_STR(trace, buf); tTrace(param ", gtid:%s", __VA_ARGS__, buf);}} while(0)
+#define tGFatal(param, ...) do {if (rpcDebugFlag & DEBUG_FATAL){ char buf[40] = {0}; TRACE_TO_STR(trace, buf); tFatal(param ", gtid:%s", __VA_ARGS__, buf); }} while (0)
+#define tGError(param, ...) do { if (rpcDebugFlag & DEBUG_ERROR){ char buf[40] = {0}; TRACE_TO_STR(trace, buf); tError(param ", gtid:%s", __VA_ARGS__, buf);} } while(0)
+#define tGWarn(param, ...) do { if (rpcDebugFlag & DEBUG_WARN) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); tWarn(param ", gtid:%s", __VA_ARGS__, buf); }} while(0)
+#define tGInfo(param, ...) do { if (rpcDebugFlag & DEBUG_INFO) { char buf[40] = {0}; TRACE_TO_STR(trace, buf); tInfo(param ", gtid:%s", __VA_ARGS__, buf); }} while(0)
+#define tGDebug(param,...) do {if (rpcDebugFlag & DEBUG_DEBUG){ char buf[40] = {0}; TRACE_TO_STR(trace, buf); tDebug(param ", gtid:%s", __VA_ARGS__, buf); }} while(0)
-//#define tTR(param, ...) do { char buf[40] = {0};TRACE_TO_STR(trace, buf);tTrace("TRID: %s "param, buf, __VA_ARGS__);} while(0)
-#define tGTrace(param, ...) do { char buf[40] = {0}; TRACE_TO_STR(trace, buf); tTrace(param ", GTID: %s", __VA_ARGS__, buf);} while(0)
// clang-format on
#ifdef __cplusplus
diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c
index 912c8b59c2..bf03ea26ba 100644
--- a/source/libs/transport/src/transCli.c
+++ b/source/libs/transport/src/transCli.c
@@ -175,6 +175,7 @@ static void cliReleaseUnfinishedMsg(SCliConn* conn) {
#define CONN_SHOULD_RELEASE(conn, head) \
do { \
if ((head)->release == 1 && (head->msgLen) == sizeof(*head)) { \
+ int connStatus = conn->status; \
uint64_t ahandle = head->ahandle; \
CONN_GET_MSGCTX_BY_AHANDLE(conn, ahandle); \
conn->status = ConnRelease; \
@@ -186,7 +187,9 @@ static void cliReleaseUnfinishedMsg(SCliConn* conn) {
} \
destroyCmsg(pMsg); \
cliReleaseUnfinishedMsg(conn); \
- addConnToPool(((SCliThrdObj*)conn->hostThrd)->pool, conn); \
+ if (connStatus != ConnInPool) { \
+ addConnToPool(((SCliThrdObj*)conn->hostThrd)->pool, conn); \
+ } \
return; \
} \
} while (0)
@@ -450,7 +453,7 @@ void* destroyConnPool(void* pool) {
while (connList != NULL) {
while (!QUEUE_IS_EMPTY(&connList->conn)) {
queue* h = QUEUE_HEAD(&connList->conn);
- QUEUE_REMOVE(h);
+ // QUEUE_REMOVE(h);
SCliConn* c = QUEUE_DATA(h, SCliConn, conn);
cliDestroyConn(c, true);
}
@@ -476,18 +479,19 @@ static SCliConn* getConnFromPool(void* pool, char* ip, uint32_t port) {
if (QUEUE_IS_EMPTY(&plist->conn)) {
return NULL;
}
- queue* h = QUEUE_HEAD(&plist->conn);
- QUEUE_REMOVE(h);
+ queue* h = QUEUE_HEAD(&plist->conn);
SCliConn* conn = QUEUE_DATA(h, SCliConn, conn);
conn->status = ConnNormal;
+ QUEUE_REMOVE(&conn->conn);
QUEUE_INIT(&conn->conn);
+ assert(h == &conn->conn);
return conn;
}
static void addConnToPool(void* pool, SCliConn* conn) {
SCliThrdObj* thrd = conn->hostThrd;
CONN_HANDLE_THREAD_QUIT(thrd);
- STrans* pTransInst = ((SCliThrdObj*)conn->hostThrd)->pTransInst;
+ STrans* pTransInst = thrd->pTransInst;
conn->expireTime = taosGetTimestampMs() + CONN_PERSIST_TIME(pTransInst->idleTime);
transQueueClear(&conn->cliMsgs);
transCtxCleanup(&conn->ctx);
@@ -500,6 +504,7 @@ static void addConnToPool(void* pool, SCliConn* conn) {
SConnList* plist = taosHashGet((SHashObj*)pool, key, strlen(key));
// list already create before
assert(plist != NULL);
+ QUEUE_INIT(&conn->conn);
QUEUE_PUSH(&plist->conn, &conn->conn);
assert(!QUEUE_IS_EMPTY(&plist->conn));
}
@@ -561,7 +566,6 @@ static SCliConn* cliCreateConn(SCliThrdObj* pThrd) {
}
static void cliDestroyConn(SCliConn* conn, bool clear) {
tTrace("%s conn %p remove from conn pool", CONN_GET_INST_LABEL(conn), conn);
-
QUEUE_REMOVE(&conn->conn);
if (clear) {
uv_close((uv_handle_t*)conn->stream, cliDestroy);
@@ -778,11 +782,11 @@ void cliHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd) {
int ret = transSetConnOption((uv_tcp_t*)conn->stream);
if (ret) {
- tError("%s conn %p failed to set conn option, errmsg %s", pTransInst->label, conn, uv_err_name(ret));
+ tError("%s conn %p failed to set conn option, errmsg %s", transLabel(pTransInst), conn, uv_err_name(ret));
}
int fd = taosCreateSocketWithTimeOutOpt(TRANS_CONN_TIMEOUT);
if (fd == -1) {
- tTrace("%s conn %p failed to create socket", pTransInst->label, conn);
+ tTrace("%s conn %p failed to create socket", transLabel(pTransInst), conn);
cliHandleExcept(conn);
return;
}
@@ -1006,7 +1010,9 @@ int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) {
tTrace("%s use remote epset, inUse: %d, retry count:%d, limit: %d", pTransInst->label, pEpSet->inUse,
pCtx->retryCount + 1, TRANS_RETRY_COUNT_LIMIT);
}
- addConnToPool(pThrd->pool, pConn);
+ if (pConn->status != ConnInPool) {
+ addConnToPool(pThrd->pool, pConn);
+ }
STaskArg* arg = taosMemoryMalloc(sizeof(STaskArg));
arg->param1 = pMsg;
@@ -1110,7 +1116,7 @@ void transSendRequest(void* shandle, const SEpSet* pEpSet, STransMsg* pReq, STra
SCliThrdObj* thrd = ((SCliObj*)pTransInst->tcphandle)->pThreadObj[idx];
STraceId* trace = &pReq->info.traceId;
- tGTrace("%s send request at thread:%08" PRId64 ", dst: %s:%d, app:%p", pTransInst->label, thrd->pid,
+ tGTrace("%s send request at thread:%08" PRId64 ", dst: %s:%d, app:%p", transLabel(pTransInst), thrd->pid,
EPSET_GET_INUSE_IP(&pCtx->epSet), EPSET_GET_INUSE_PORT(&pCtx->epSet), pReq->info.ahandle);
ASSERT(transSendAsync(thrd->asyncPool, &(cliMsg->q)) == 0);
}
@@ -1143,7 +1149,7 @@ void transSendRecv(void* shandle, const SEpSet* pEpSet, STransMsg* pReq, STransM
SCliThrdObj* thrd = ((SCliObj*)pTransInst->tcphandle)->pThreadObj[idx];
STraceId* trace = &pReq->info.traceId;
- tGTrace("%s send request at thread:%08" PRId64 ", dst: %s:%d, app:%p", pTransInst->label, thrd->pid,
+ tGTrace("%s send request at thread:%08" PRId64 ", dst: %s:%d, app:%p", transLabel(pTransInst), thrd->pid,
EPSET_GET_INUSE_IP(&pCtx->epSet), EPSET_GET_INUSE_PORT(&pCtx->epSet), pReq->info.ahandle);
transSendAsync(thrd->asyncPool, &(cliMsg->q));
diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c
index f9558d7252..593a790a21 100644
--- a/source/libs/transport/src/transSvr.c
+++ b/source/libs/transport/src/transSvr.c
@@ -284,12 +284,12 @@ static void uvHandleReq(SSvrConn* pConn) {
if (pConn->status == ConnNormal && pHead->noResp == 0) {
transRefSrvHandle(pConn);
- tGTrace("conn %p %s received from %s:%d, local info: %s:%d, msg size: %d", pConn, TMSG_INFO(transMsg.msgType),
- taosInetNtoa(pConn->addr.sin_addr), ntohs(pConn->addr.sin_port), taosInetNtoa(pConn->localAddr.sin_addr),
- ntohs(pConn->localAddr.sin_port), transMsg.contLen);
- } else {
- tGTrace("conn %p %s received from %s:%d, local info: %s:%d, msg size: %d, resp:%d, code: %d", pConn,
+ tGTrace("%s conn %p %s received from %s:%d, local info: %s:%d, msg size: %d", transLabel(pConn), pConn,
TMSG_INFO(transMsg.msgType), taosInetNtoa(pConn->addr.sin_addr), ntohs(pConn->addr.sin_port),
+ taosInetNtoa(pConn->localAddr.sin_addr), ntohs(pConn->localAddr.sin_port), transMsg.contLen);
+ } else {
+ tGTrace("%s conn %p %s received from %s:%d, local info: %s:%d, msg size: %d, resp:%d, code: %d", transLabel(pConn),
+ pConn, TMSG_INFO(transMsg.msgType), taosInetNtoa(pConn->addr.sin_addr), ntohs(pConn->addr.sin_port),
taosInetNtoa(pConn->localAddr.sin_addr), ntohs(pConn->localAddr.sin_port), transMsg.contLen, pHead->noResp,
transMsg.code);
// no ref here
@@ -304,7 +304,8 @@ static void uvHandleReq(SSvrConn* pConn) {
transMsg.info.refId = pConn->refId;
transMsg.info.traceId = pHead->traceId;
- tGTrace("handle %p conn: %p translated to app, refId: %" PRIu64 "", transMsg.info.handle, pConn, pConn->refId);
+ tGTrace("%s handle %p conn: %p translated to app, refId: %" PRIu64 "", transLabel(pConn), transMsg.info.handle, pConn,
+ pConn->refId);
assert(transMsg.info.handle != NULL);
if (pHead->noResp == 1) {
@@ -330,12 +331,12 @@ void uvOnRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) {
SConnBuffer* pBuf = &conn->readBuf;
if (nread > 0) {
pBuf->len += nread;
- tTrace("conn %p total read: %d, current read: %d", conn, pBuf->len, (int)nread);
+ tTrace("%s conn %p total read: %d, current read: %d", transLabel(conn->pTransInst), conn, pBuf->len, (int)nread);
if (transReadComplete(pBuf)) {
- tTrace("conn %p alread read complete packet", conn);
+ tTrace("%s conn %p alread read complete packet", transLabel(conn->pTransInst), conn);
uvHandleReq(conn);
} else {
- tTrace("conn %p read partial packet, continue to read", conn);
+ tTrace("%s conn %p read partial packet, continue to read", transLabel(conn->pTransInst), conn);
}
return;
}
@@ -343,12 +344,12 @@ void uvOnRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) {
return;
}
- tError("conn %p read error: %s", conn, uv_err_name(nread));
+ tError("%s conn %p read error: %s", transLabel(conn->pTransInst), conn, uv_err_name(nread));
if (nread < 0) {
conn->broken = true;
if (conn->status == ConnAcquire) {
if (conn->regArg.init) {
- tTrace("conn %p broken, notify server app", conn);
+ tTrace("%s conn %p broken, notify server app", transLabel(conn->pTransInst), conn);
STrans* pTransInst = conn->pTransInst;
(*pTransInst->cfp)(pTransInst->parent, &(conn->regArg.msg), NULL);
memset(&conn->regArg, 0, sizeof(conn->regArg));
@@ -457,9 +458,9 @@ static void uvPrepareSendData(SSvrMsg* smsg, uv_buf_t* wb) {
int32_t len = transMsgLenFromCont(pMsg->contLen);
STraceId* trace = &pMsg->info.traceId;
- tGTrace("conn %p %s is sent to %s:%d, local info: %s:%d, msglen:%d", pConn, TMSG_INFO(pHead->msgType),
- taosInetNtoa(pConn->addr.sin_addr), ntohs(pConn->addr.sin_port), taosInetNtoa(pConn->localAddr.sin_addr),
- ntohs(pConn->localAddr.sin_port), len);
+ tGTrace("%s conn %p %s is sent to %s:%d, local info: %s:%d, msglen:%d", transLabel(pConn->pTransInst), pConn,
+ TMSG_INFO(pHead->msgType), taosInetNtoa(pConn->addr.sin_addr), ntohs(pConn->addr.sin_port),
+ taosInetNtoa(pConn->localAddr.sin_addr), ntohs(pConn->localAddr.sin_port), len);
pHead->msgLen = htonl(len);
wb->base = msg;
@@ -737,7 +738,7 @@ static bool addHandleToWorkloop(SWorkThrdObj* pThrd, char* pipeName) {
// conn set
QUEUE_INIT(&pThrd->conn);
- pThrd->asyncPool = transCreateAsyncPool(pThrd->loop, 5, pThrd, uvWorkerAsyncCb);
+ pThrd->asyncPool = transCreateAsyncPool(pThrd->loop, 1, pThrd, uvWorkerAsyncCb);
uv_pipe_connect(&pThrd->connect_req, pThrd->pipe, pipeName, uvOnPipeConnectionCb);
// uv_read_start((uv_stream_t*)pThrd->pipe, uvAllocConnBufferCb, uvOnConnectionCb);
return true;
@@ -801,7 +802,7 @@ static SSvrConn* createConn(void* hThrd) {
pConn->refId = exh->refId;
transRefSrvHandle(pConn);
- tTrace("handle %p, conn %p created, refId: %" PRId64 "", exh, pConn, pConn->refId);
+ tTrace("%s handle %p, conn %p created, refId: %" PRId64 "", transLabel(pThrd->pTransInst), exh, pConn, pConn->refId);
return pConn;
}
@@ -848,7 +849,7 @@ static void uvDestroyConn(uv_handle_t* handle) {
transReleaseExHandle(refMgt, conn->refId);
transRemoveExHandle(refMgt, conn->refId);
- tDebug("conn %p destroy", conn);
+ tDebug("%s conn %p destroy", transLabel(thrd->pTransInst), conn);
// uv_timer_stop(&conn->pTimer);
transQueueDestroy(&conn->srvMsgs);
@@ -977,18 +978,18 @@ void uvHandleRelease(SSvrMsg* msg, SWorkThrdObj* thrd) {
uvStartSendRespInternal(msg);
return;
} else if (conn->status == ConnRelease || conn->status == ConnNormal) {
- tDebug("conn %p already released, ignore release-msg", conn);
+ tDebug("%s conn %p already released, ignore release-msg", transLabel(thrd->pTransInst), conn);
}
destroySmsg(msg);
}
void uvHandleResp(SSvrMsg* msg, SWorkThrdObj* thrd) {
// send msg to client
- tDebug("conn %p start to send resp (2/2)", msg->pConn);
+ tDebug("%s conn %p start to send resp (2/2)", transLabel(thrd->pTransInst), msg->pConn);
uvStartSendResp(msg);
}
void uvHandleRegister(SSvrMsg* msg, SWorkThrdObj* thrd) {
SSvrConn* conn = msg->pConn;
- tDebug("conn %p register brokenlink callback", conn);
+ tDebug("%s conn %p register brokenlink callback", transLabel(thrd->pTransInst), conn);
if (conn->status == ConnAcquire) {
if (!transQueuePush(&conn->srvMsgs, msg)) {
return;
@@ -1094,7 +1095,7 @@ void transReleaseSrvHandle(void* handle) {
m->msg = tmsg;
m->type = Release;
- tTrace("conn %p start to release", exh->handle);
+ tTrace("%s conn %p start to release", transLabel(pThrd->pTransInst), exh->handle);
transSendAsync(pThrd->asyncPool, &m->q);
transReleaseExHandle(refMgt, refId);
return;
@@ -1152,7 +1153,7 @@ void transRegisterMsg(const STransMsg* msg) {
m->msg = tmsg;
m->type = Register;
- tTrace("conn %p start to register brokenlink callback", exh->handle);
+ tTrace("%s conn %p start to register brokenlink callback", transLabel(pThrd->pTransInst), exh->handle);
transSendAsync(pThrd->asyncPool, &m->q);
transReleaseExHandle(refMgt, refId);
return;
diff --git a/source/libs/wal/src/walRead.c b/source/libs/wal/src/walRead.c
index e940191cea..9bed6d230b 100644
--- a/source/libs/wal/src/walRead.c
+++ b/source/libs/wal/src/walRead.c
@@ -100,7 +100,6 @@ static int32_t walReadChangeFile(SWalReadHandle *pRead, int64_t fileFirstVer) {
TdFilePtr pLogTFile = taosOpenFile(fnameStr, TD_FILE_READ);
if (pLogTFile == NULL) {
terrno = TAOS_SYSTEM_ERROR(errno);
- terrno = TSDB_CODE_WAL_INVALID_VER;
wError("cannot open file %s, since %s", fnameStr, terrstr());
return -1;
}
@@ -259,6 +258,12 @@ int32_t walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalReadHead **p
int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) {
int64_t code;
+
+ if (pRead->pWal->vers.firstVer == -1) {
+ terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
+ return -1;
+ }
+
// TODO: check wal life
if (pRead->curVersion != ver) {
if (walReadSeekVer(pRead, ver) < 0) {
diff --git a/source/util/src/tbuffer.c b/source/util/src/tbuffer.c
index 8552ccac2c..d2fac72c77 100644
--- a/source/util/src/tbuffer.c
+++ b/source/util/src/tbuffer.c
@@ -21,7 +21,7 @@ typedef union Un4B {
uint32_t ui;
float f;
} Un4B;
-#if __STDC_VERSION__ >= 201112L
+#if __STDC_VERSION__ >= 201112LL
static_assert(sizeof(Un4B) == sizeof(uint32_t), "sizeof(Un4B) must equal to sizeof(uint32_t)");
static_assert(sizeof(Un4B) == sizeof(float), "sizeof(Un4B) must equal to sizeof(float)");
#endif
@@ -30,7 +30,7 @@ typedef union Un8B {
uint64_t ull;
double d;
} Un8B;
-#if __STDC_VERSION__ >= 201112L
+#if __STDC_VERSION__ >= 201112LL
static_assert(sizeof(Un8B) == sizeof(uint64_t), "sizeof(Un8B) must equal to sizeof(uint64_t)");
static_assert(sizeof(Un8B) == sizeof(double), "sizeof(Un8B) must equal to sizeof(double)");
#endif
diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c
index 041aec4054..38613a77e6 100644
--- a/source/util/src/tcompression.c
+++ b/source/util/src/tcompression.c
@@ -58,7 +58,7 @@
static const int32_t TEST_NUMBER = 1;
#define is_bigendian() ((*(char *)&TEST_NUMBER) == 0)
-#define SIMPLE8B_MAX_INT64 ((uint64_t)2305843009213693951L)
+#define SIMPLE8B_MAX_INT64 ((uint64_t)2305843009213693951LL)
#define safeInt64Add(a, b) (((a >= 0) && (b <= INT64_MAX - a)) || ((a < 0) && (b >= INT64_MIN - a)))
#define ZIGZAG_ENCODE(T, v) ((u##T)((v) >> (sizeof(T) * 8 - 1))) ^ (((u##T)(v)) << 1) // zigzag encode
diff --git a/source/util/src/tencode.c b/source/util/src/tencode.c
index 185daf9e45..2267c90783 100644
--- a/source/util/src/tencode.c
+++ b/source/util/src/tencode.c
@@ -16,7 +16,7 @@
#define _DEFAULT_SOURCE
#include "tencode.h"
-#if __STDC_VERSION__ >= 201112L
+#if __STDC_VERSION__ >= 201112LL
static_assert(sizeof(float) == sizeof(uint32_t), "sizeof(float) must equal to sizeof(uint32_t)");
static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) must equal to sizeof(uint64_t)");
#endif
diff --git a/source/util/src/terror.c b/source/util/src/terror.c
index 66a73ac92b..b89e908df7 100644
--- a/source/util/src/terror.c
+++ b/source/util/src/terror.c
@@ -134,6 +134,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_TSC_STMT_TBNAME_ERROR, "Stmt table name not s
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_STMT_CLAUSE_ERROR, "not supported stmt clause")
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_QUERY_KILLED, "Query killed")
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_NO_EXEC_NODE, "No available execution node")
+TAOS_DEFINE_ERROR(TSDB_CODE_TSC_NOT_STABLE_ERROR, "Table is not a super table")
// mnode-common
TAOS_DEFINE_ERROR(TSDB_CODE_MND_APP_ERROR, "Mnode internal error")
diff --git a/source/util/src/thash.c b/source/util/src/thash.c
index 98762d8fb0..8275072748 100644
--- a/source/util/src/thash.c
+++ b/source/util/src/thash.c
@@ -31,12 +31,12 @@
#define GET_HASH_NODE_DATA(_n) ((char *)(_n) + sizeof(SHashNode))
#define GET_HASH_PNODE(_n) ((SHashNode *)((char *)(_n) - sizeof(SHashNode)))
-#define FREE_HASH_NODE(_fp, _n) \
- do { \
- if (_fp != NULL) { \
- (_fp)(_n); \
- } \
- taosMemoryFreeClear(_n); \
+#define FREE_HASH_NODE(_fp, _n) \
+ do { \
+ if (_fp != NULL) { \
+ (_fp)(GET_HASH_NODE_DATA(_n)); \
+ } \
+ taosMemoryFreeClear(_n); \
} while (0);
struct SHashNode {
@@ -56,7 +56,7 @@ typedef struct SHashEntry {
} SHashEntry;
struct SHashObj {
- SHashEntry ** hashList;
+ SHashEntry **hashList;
size_t capacity; // number of slots
int64_t size; // number of elements in hash table
_hash_fn_t hashFp; // hash function
@@ -65,7 +65,7 @@ struct SHashObj {
SRWLatch lock; // read-write spin lock
SHashLockTypeE type; // lock type
bool enableUpdate; // enable update
- SArray * pMemBlock; // memory block allocated for SHashEntry
+ SArray *pMemBlock; // memory block allocated for SHashEntry
_hash_before_fn_t callbackFp; // function invoked before return the value to caller
};
@@ -633,7 +633,7 @@ void taosHashTableResize(SHashObj *pHashObj) {
}
int64_t st = taosGetTimestampUs();
- void * pNewEntryList = taosMemoryRealloc(pHashObj->hashList, sizeof(void *) * newCapacity);
+ void *pNewEntryList = taosMemoryRealloc(pHashObj->hashList, sizeof(void *) * newCapacity);
if (pNewEntryList == NULL) {
// uDebug("cache resize failed due to out of memory, capacity remain:%zu", pHashObj->capacity);
return;
@@ -642,7 +642,7 @@ void taosHashTableResize(SHashObj *pHashObj) {
pHashObj->hashList = pNewEntryList;
size_t inc = newCapacity - pHashObj->capacity;
- void * p = taosMemoryCalloc(inc, sizeof(SHashEntry));
+ void *p = taosMemoryCalloc(inc, sizeof(SHashEntry));
for (int32_t i = 0; i < inc; ++i) {
pHashObj->hashList[i + pHashObj->capacity] = (void *)((char *)p + i * sizeof(SHashEntry));
@@ -653,9 +653,9 @@ void taosHashTableResize(SHashObj *pHashObj) {
pHashObj->capacity = newCapacity;
for (int32_t idx = 0; idx < pHashObj->capacity; ++idx) {
SHashEntry *pe = pHashObj->hashList[idx];
- SHashNode * pNode;
- SHashNode * pNext;
- SHashNode * pPrev = NULL;
+ SHashNode *pNode;
+ SHashNode *pNext;
+ SHashNode *pPrev = NULL;
if (pe->num == 0) {
assert(pe->next == NULL);
diff --git a/tests/pytest/util/boundary.py b/tests/pytest/util/boundary.py
new file mode 100644
index 0000000000..4cef926f2e
--- /dev/null
+++ b/tests/pytest/util/boundary.py
@@ -0,0 +1,44 @@
+class DataBoundary:
+ def __init__(self):
+ self.TINYINT_BOUNDARY = [-128, 127]
+ self.SMALLINT_BOUNDARY = [-32768, 32767]
+ self.INT_BOUNDARY = [-2147483648, 2147483647]
+ self.BIGINT_BOUNDARY = [-9223372036854775808, 9223372036854775807]
+ self.UTINYINT_BOUNDARY = [0, 255]
+ self.USMALLINT_BOUNDARY = [0, 65535]
+ self.UINT_BOUNDARY = [0, 4294967295]
+ self.UBIGINT_BOUNDARY = [0, 18446744073709551615]
+ self.FLOAT_BOUNDARY = [-3.40E+38, 3.40E+38]
+ self.DOUBLE_BOUNDARY = [-1.7e+308, 1.7e+308]
+ self.BOOL_BOUNDARY = [True, False]
+ self.BINARY_MAX_LENGTH = 16374
+ self.NCHAR_MAX_LENGTH = 4093
+ self.DBNAME_MAX_LENGTH = 64
+ self.STBNAME_MAX_LENGTH = 192
+ self.TBNAME_MAX_LENGTH = 192
+ self.CHILD_TBNAME_MAX_LENGTH = 192
+ self.TAG_KEY_MAX_LENGTH = 64
+ self.COL_KEY_MAX_LENGTH = 64
+ self.MAX_TAG_COUNT = 128
+ self.MAX_TAG_COL_COUNT = 4096
+ self.mnodeShmSize = [6292480, 2147483647]
+ self.mnodeShmSize_default = 6292480
+ self.vnodeShmSize = [6292480, 2147483647]
+ self.vnodeShmSize_default = 31458304
+ self.DB_PARAM_BUFFER_CONFIG = {"create_name": "buffer", "query_name": "buffer", "vnode_json_key": "szBuf", "boundary": [3, 16384], "default": 96}
+ self.DB_PARAM_CACHELAST_CONFIG = {"create_name": "cachelast", "query_name": "cache_model", "vnode_json_key": "", "boundary": [0, 1, 2, 3], "default": 0}
+ self.DB_PARAM_COMP_CONFIG = {"create_name": "comp", "query_name": "compression", "vnode_json_key": "", "boundary": [0, 1, 2], "default": 2}
+ self.DB_PARAM_DURATION_CONFIG = {"create_name": "duration", "query_name": "duration", "vnode_json_key": "daysPerFile", "boundary": [1, 3650, '60m', '5256000m', '1h', '87600h', '1d', '3650d'], "default": "14400m"}
+ self.DB_PARAM_FSYNC_CONFIG = {"create_name": "fsync", "query_name": "fsync", "vnode_json_key": "", "boundary": [0, 180000], "default": 3000}
+ self.DB_PARAM_KEEP_CONFIG = {"create_name": "keep", "query_name": "fsync", "vnode_json_key": "", "boundary": [1, 365000,'1440m','525600000m','24h','8760000h','1d','365000d'], "default": "5256000m,5256000m,5256000m"}
+ self.DB_PARAM_MAXROWS_CONFIG = {"create_name": "maxrows", "query_name": "maxrows", "vnode_json_key": "maxRows", "boundary": [200, 10000], "default": 4096}
+ self.DB_PARAM_MINROWS_CONFIG = {"create_name": "minrows", "query_name": "minrows", "vnode_json_key": "minRows", "boundary": [10, 1000], "default": 100}
+ self.DB_PARAM_NTABLES_CONFIG = {"create_name": "ntables", "query_name": "ntables", "vnode_json_key": "", "boundary": 0, "default": 0}
+ self.DB_PARAM_PAGES_CONFIG = {"create_name": "pages", "query_name": "pages", "vnode_json_key": "szCache", "boundary": [64], "default": 256}
+ self.DB_PARAM_PAGESIZE_CONFIG = {"create_name": "pagesize", "query_name": "pagesize", "vnode_json_key": "szPage", "boundary": [1, 16384], "default": 4}
+ self.DB_PARAM_PRECISION_CONFIG = {"create_name": "precision", "query_name": "precision", "vnode_json_key": "", "boundary": ['ms', 'us', 'ns'], "default": "ms"}
+ self.DB_PARAM_REPLICA_CONFIG = {"create_name": "replica", "query_name": "replica", "vnode_json_key": "", "boundary": [1], "default": 1}
+ self.DB_PARAM_SINGLE_STABLE_CONFIG = {"create_name": "single_stable", "query_name": "single_stable_model", "vnode_json_key": "", "boundary": [0, 1], "default": 0}
+ self.DB_PARAM_STRICT_CONFIG = {"create_name": "strict", "query_name": "strict", "vnode_json_key": "", "boundary": {"no_strict": 0, "strict": 1}, "default": "no_strict"}
+ self.DB_PARAM_VGROUPS_CONFIG = {"create_name": "vgroups", "query_name": "vgroups", "vnode_json_key": "", "boundary": [1, 32], "default": 2}
+ self.DB_PARAM_WAL_CONFIG = {"create_name": "wal", "query_name": "wal", "vnode_json_key": "", "boundary": [1, 2], "default": 1}
\ No newline at end of file
diff --git a/tests/pytest/util/common.py b/tests/pytest/util/common.py
index e158f8edd2..b43f87be29 100644
--- a/tests/pytest/util/common.py
+++ b/tests/pytest/util/common.py
@@ -17,7 +17,7 @@ import string
import requests
import time
import socket
-
+from .boundary import DataBoundary
import taos
from util.log import *
from util.sql import *
@@ -25,9 +25,45 @@ from util.cases import *
from util.dnodes import *
from util.common import *
-class TDCom:
- def init(self, conn, logSql):
- tdSql.init(conn.cursor(), logSql)
+class TDCom:
+ def __init__(self):
+ self.sml_type = None
+ self.env_setting = None
+ self.smlChildTableName_value = None
+ self.defaultJSONStrType_value = None
+ self.smlTagNullName_value = None
+ self.default_varchar_length = 256
+ self.default_nchar_length = 256
+ self.default_varchar_datatype = "letters"
+ self.default_nchar_datatype = "letters"
+ self.default_tagname_prefix = "t"
+ self.default_colname_prefix = "c"
+ self.default_stbname_prefix = "stb"
+ self.default_ctbname_prefix = "ctb"
+ self.default_tbname_prefix = "tb"
+ self.default_tag_index_start_num = 1
+ self.default_column_index_start_num = 1
+ self.default_stbname_index_start_num = 1
+ self.default_ctbname_index_start_num = 1
+ self.default_tbname_index_start_num = 1
+ self.default_tagts_name = "ts"
+ self.default_colts_name = "ts"
+ self.dbname = "test"
+ self.stb_name = "stb"
+ self.ctb_name = "ctb"
+ self.tb_name = "tb"
+ self.need_tagts = False
+ self.tag_type_str = ""
+ self.column_type_str = ""
+ self.columns_str = None
+ self.ts_value = None
+ self.tag_value_list = list()
+ self.column_value_list = list()
+ self.full_type_list = ["tinyint", "smallint", "int", "bigint", "tinyint unsigned", "smallint unsigned", "int unsigned", "bigint unsigned", "float", "double", "binary", "nchar", "bool"]
+ self.white_list = ["statsd", "node_exporter", "collectd", "icinga2", "tcollector", "information_schema", "performance_schema"]
+ self.Boundary = DataBoundary()
+ # def init(self, conn, logSql):
+ # # tdSql.init(conn.cursor(), logSql)
def preDefine(self):
header = {'Authorization': 'Basic cm9vdDp0YW9zZGF0YQ=='}
@@ -113,6 +149,59 @@ class TDCom:
def dateToTs(self, datetime_input):
return int(time.mktime(time.strptime(datetime_input, "%Y-%m-%d %H:%M:%S.%f")))
+ def genTs(self, precision="ms", ts="", protype="taosc", ns_tag=None):
+ """
+ protype = "taosc" or "restful"
+ gen ts and datetime
+ """
+ if precision == "ns":
+ if ts == "" or ts is None:
+ ts = time.time_ns()
+ else:
+ ts = ts
+ if ns_tag is None:
+ dt = ts
+ else:
+ dt = datetime.fromtimestamp(ts // 1000000000)
+ dt = dt.strftime('%Y-%m-%d %H:%M:%S') + '.' + str(int(ts % 1000000000)).zfill(9)
+ if protype == "restful":
+ dt = datetime.fromtimestamp(ts // 1000000000)
+ dt = dt.strftime('%Y-%m-%d %H:%M:%S') + '.' + str(int(ts % 1000000000)).zfill(9)
+ else:
+ if ts == "" or ts is None:
+ ts = time.time()
+ else:
+ ts = ts
+ if precision == "ms" or precision is None:
+ ts = int(round(ts * 1000))
+ dt = datetime.fromtimestamp(ts // 1000)
+ if protype == "taosc":
+ dt = dt.strftime('%Y-%m-%d %H:%M:%S') + '.' + str(int(ts % 1000)).zfill(3) + '000'
+ elif protype == "restful":
+ dt = dt.strftime('%Y-%m-%d %H:%M:%S') + '.' + str(int(ts % 1000)).zfill(3)
+ else:
+ pass
+ elif precision == "us":
+ ts = int(round(ts * 1000000))
+ dt = datetime.fromtimestamp(ts // 1000000)
+ dt = dt.strftime('%Y-%m-%d %H:%M:%S') + '.' + str(int(ts % 1000000)).zfill(6)
+ return ts, dt
+
+ def get_long_name(self, length=10, mode="letters"):
+ """
+ generate long name
+ mode could be numbers/letters/letters_mixed/mixed
+ """
+ if mode == "numbers":
+ population = string.digits
+ elif mode == "letters":
+ population = string.ascii_letters.lower()
+ elif mode == "letters_mixed":
+ population = string.ascii_letters.upper() + string.ascii_letters.lower()
+ else:
+ population = string.ascii_letters.lower() + string.digits
+ return "".join(random.choices(population, k=length))
+
def getLongName(self, len, mode = "mixed"):
"""
generate long name
@@ -177,84 +266,92 @@ class TDCom:
def close(self):
self.cursor.close()
- def create_database(self,tsql, dbName='test',dropFlag=1,precision="ms", **kwargs):
+ ########################################################################################################################################
+ # new common API
+ ########################################################################################################################################
+ def create_database(self,tsql, dbName='test',dropFlag=1,**kwargs):
if dropFlag == 1:
tsql.execute("drop database if exists %s"%(dbName))
'''
vgroups replica precision strict wal fsync comp cachelast single_stable buffer pagesize pages minrows maxrows duration keep retentions
'''
- sqlString = f'create database if not exists {dbName} precision "{precision}" vgroups 4'
+ sqlString = f'create database if not exists {dbName} '
+
+ dbParams = ""
if len(kwargs) > 0:
- dbParams = ""
for param, value in kwargs.items():
- dbParams += f'{param} {value} '
+ if param == "precision":
+ dbParams += f'{param} "{value}" '
+ else:
+ dbParams += f'{param} {value} '
sqlString += f'{dbParams}'
+ tdLog.debug("create db sql: %s"%sqlString)
tsql.execute(sqlString)
tdLog.debug("complete to create database %s"%(dbName))
return
- def create_stable(self,tsql, dbName,stbName,columnDict,tagDict):
- colSchema = ''
- for i in range(columnDict['int']):
- colSchema += ', c%d int'%i
- tagSchema = ''
- for i in range(tagDict['int']):
- if i > 0:
- tagSchema += ','
- tagSchema += 't%d int'%i
+ # def create_stable(self,tsql, dbName,stbName,column_elm_list=None, tag_elm_list=None):
+ # colSchema = ''
+ # for i in range(columnDict['int']):
+ # colSchema += ', c%d int'%i
+ # tagSchema = ''
+ # for i in range(tagDict['int']):
+ # if i > 0:
+ # tagSchema += ','
+ # tagSchema += 't%d int'%i
- tsql.execute("create table if not exists %s.%s (ts timestamp %s) tags(%s)"%(dbName, stbName, colSchema, tagSchema))
- tdLog.debug("complete to create %s.%s" %(dbName, stbName))
- return
+ # tsql.execute("create table if not exists %s.%s (ts timestamp %s) tags(%s)"%(dbName, stbName, colSchema, tagSchema))
+ # tdLog.debug("complete to create %s.%s" %(dbName, stbName))
+ # return
- def create_ctables(self,tsql, dbName,stbName,ctbNum,tagDict):
- tsql.execute("use %s" %dbName)
- tagsValues = ''
- for i in range(tagDict['int']):
- if i > 0:
- tagsValues += ','
- tagsValues += '%d'%i
+ # def create_ctables(self,tsql, dbName,stbName,ctbNum,tagDict):
+ # tsql.execute("use %s" %dbName)
+ # tagsValues = ''
+ # for i in range(tagDict['int']):
+ # if i > 0:
+ # tagsValues += ','
+ # tagsValues += '%d'%i
- pre_create = "create table"
- sql = pre_create
- #tdLog.debug("doing create one stable %s and %d child table in %s ..." %(stbname, count ,dbname))
- for i in range(ctbNum):
- sql += " %s_%d using %s tags(%s)"%(stbName,i,stbName,tagsValues)
- if (i > 0) and (i%100 == 0):
- tsql.execute(sql)
- sql = pre_create
- if sql != pre_create:
- tsql.execute(sql)
+ # pre_create = "create table"
+ # sql = pre_create
+ # #tdLog.debug("doing create one stable %s and %d child table in %s ..." %(stbname, count ,dbname))
+ # for i in range(ctbNum):
+ # sql += " %s_%d using %s tags(%s)"%(stbName,i,stbName,tagsValues)
+ # if (i > 0) and (i%100 == 0):
+ # tsql.execute(sql)
+ # sql = pre_create
+ # if sql != pre_create:
+ # tsql.execute(sql)
- tdLog.debug("complete to create %d child tables in %s.%s" %(ctbNum, dbName, stbName))
- return
+ # tdLog.debug("complete to create %d child tables in %s.%s" %(ctbNum, dbName, stbName))
+ # return
- def insert_data(self,tsql,dbName,stbName,ctbNum,rowsPerTbl,batchNum,startTs=0):
- tdLog.debug("start to insert data ............")
- tsql.execute("use %s" %dbName)
- pre_insert = "insert into "
- sql = pre_insert
- if startTs == 0:
- t = time.time()
- startTs = int(round(t * 1000))
- #tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
- for i in range(ctbNum):
- sql += " %s_%d values "%(stbName,i)
- for j in range(rowsPerTbl):
- sql += "(%d, %d, %d)"%(startTs + j, j, j)
- if (j > 0) and ((j%batchNum == 0) or (j == rowsPerTbl - 1)):
- tsql.execute(sql)
- if j < rowsPerTbl - 1:
- sql = "insert into %s_%d values " %(stbName,i)
- else:
- sql = "insert into "
- #end sql
- if sql != pre_insert:
- #print("insert sql:%s"%sql)
- tsql.execute(sql)
- tdLog.debug("insert data ............ [OK]")
- return
+ # def insert_data(self,tsql,dbName,stbName,ctbNum,rowsPerTbl,batchNum,startTs=0):
+ # tdLog.debug("start to insert data ............")
+ # tsql.execute("use %s" %dbName)
+ # pre_insert = "insert into "
+ # sql = pre_insert
+ # if startTs == 0:
+ # t = time.time()
+ # startTs = int(round(t * 1000))
+ # #tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
+ # for i in range(ctbNum):
+ # sql += " %s_%d values "%(stbName,i)
+ # for j in range(rowsPerTbl):
+ # sql += "(%d, %d, %d)"%(startTs + j, j, j)
+ # if (j > 0) and ((j%batchNum == 0) or (j == rowsPerTbl - 1)):
+ # tsql.execute(sql)
+ # if j < rowsPerTbl - 1:
+ # sql = "insert into %s_%d values " %(stbName,i)
+ # else:
+ # sql = "insert into "
+ # #end sql
+ # if sql != pre_insert:
+ # #print("insert sql:%s"%sql)
+ # tsql.execute(sql)
+ # tdLog.debug("insert data ............ [OK]")
+ # return
def getBuildPath(self):
selfPath = os.path.dirname(os.path.realpath(__file__))
@@ -295,4 +392,250 @@ class TDCom:
newTdSql.init(cur, False)
return newTdSql
+ ################################################################################################################
+ # port from the common.py of new test frame
+ ################################################################################################################
+ def gen_default_tag_str(self):
+ default_tag_str = ""
+ for tag_type in self.full_type_list:
+ if tag_type.lower() not in ["varchar", "binary", "nchar"]:
+ default_tag_str += f" {self.default_tagname_prefix}{self.default_tag_index_start_num} {tag_type},"
+ else:
+ if tag_type.lower() in ["varchar", "binary"]:
+ default_tag_str += f" {self.default_tagname_prefix}{self.default_tag_index_start_num} {tag_type}({self.default_varchar_length}),"
+ else:
+ default_tag_str += f" {self.default_tagname_prefix}{self.default_tag_index_start_num} {tag_type}({self.default_nchar_length}),"
+ self.default_tag_index_start_num += 1
+ if self.need_tagts:
+ default_tag_str = self.default_tagts_name + " timestamp," + default_tag_str
+ return default_tag_str[:-1].lstrip()
+
+ def gen_default_column_str(self):
+ self.default_column_index_start_num = 1
+ default_column_str = ""
+ for col_type in self.full_type_list:
+ if col_type.lower() not in ["varchar", "binary", "nchar"]:
+ default_column_str += f" {self.default_colname_prefix}{self.default_column_index_start_num} {col_type},"
+ else:
+ if col_type.lower() in ["varchar", "binary"]:
+ default_column_str += f" {self.default_colname_prefix}{self.default_column_index_start_num} {col_type}({self.default_varchar_length}),"
+ else:
+ default_column_str += f" {self.default_colname_prefix}{self.default_column_index_start_num} {col_type}({self.default_nchar_length}),"
+ self.default_column_index_start_num += 1
+ default_column_str = self.default_colts_name + " timestamp," + default_column_str
+ return default_column_str[:-1].lstrip()
+
+ def gen_tag_type_str(self, tagname_prefix, tag_elm_list):
+ tag_index_start_num = 1
+ tag_type_str = ""
+ if tag_elm_list is None:
+ tag_type_str = self.gen_default_tag_str()
+ else:
+ for tag_elm in tag_elm_list:
+ if "count" in tag_elm:
+ total_count = int(tag_elm["count"])
+ else:
+ total_count = 1
+ if total_count > 0:
+ for _ in range(total_count):
+ tag_type_str += f'{tagname_prefix}{tag_index_start_num} {tag_elm["type"]}, '
+ if tag_elm["type"] in ["varchar", "binary", "nchar"]:
+ tag_type_str = tag_type_str.rstrip()[:-1] + f'({tag_elm["len"]}), '
+ tag_index_start_num += 1
+ else:
+ continue
+ tag_type_str = tag_type_str.rstrip()[:-1]
+
+ return tag_type_str
+
+ def gen_column_type_str(self, colname_prefix, column_elm_list):
+ column_index_start_num = 1
+ column_type_str = ""
+ if column_elm_list is None:
+ column_type_str = self.gen_default_column_str()
+ else:
+ for column_elm in column_elm_list:
+ if "count" in column_elm:
+ total_count = int(column_elm["count"])
+ else:
+ total_count = 1
+ if total_count > 0:
+ for _ in range(total_count):
+ column_type_str += f'{colname_prefix}{column_index_start_num} {column_elm["type"]}, '
+ if column_elm["type"] in ["varchar", "binary", "nchar"]:
+ column_type_str = column_type_str.rstrip()[:-1] + f'({column_elm["len"]}), '
+ column_index_start_num += 1
+ else:
+ continue
+ column_type_str = self.default_colts_name + " timestamp, " + column_type_str.rstrip()[:-1]
+ return column_type_str
+
+ def gen_random_type_value(self, type_name, binary_length, binary_type, nchar_length, nchar_type):
+ if type_name.lower() == "tinyint":
+ return random.randint(self.Boundary.TINYINT_BOUNDARY[0], self.Boundary.TINYINT_BOUNDARY[1])
+ elif type_name.lower() == "smallint":
+ return random.randint(self.Boundary.SMALLINT_BOUNDARY[0], self.Boundary.SMALLINT_BOUNDARY[1])
+ elif type_name.lower() == "int":
+ return random.randint(self.Boundary.INT_BOUNDARY[0], self.Boundary.INT_BOUNDARY[1])
+ elif type_name.lower() == "bigint":
+ return random.randint(self.Boundary.BIGINT_BOUNDARY[0], self.Boundary.BIGINT_BOUNDARY[1])
+ elif type_name.lower() == "tinyint unsigned":
+ return random.randint(self.Boundary.UTINYINT_BOUNDARY[0], self.Boundary.UTINYINT_BOUNDARY[1])
+ elif type_name.lower() == "smallint unsigned":
+ return random.randint(self.Boundary.USMALLINT_BOUNDARY[0], self.Boundary.USMALLINT_BOUNDARY[1])
+ elif type_name.lower() == "int unsigned":
+ return random.randint(self.Boundary.UINT_BOUNDARY[0], self.Boundary.UINT_BOUNDARY[1])
+ elif type_name.lower() == "bigint unsigned":
+ return random.randint(self.Boundary.UBIGINT_BOUNDARY[0], self.Boundary.UBIGINT_BOUNDARY[1])
+ elif type_name.lower() == "float":
+ return random.uniform(self.Boundary.FLOAT_BOUNDARY[0], self.Boundary.FLOAT_BOUNDARY[1])
+ elif type_name.lower() == "double":
+ return random.uniform(self.Boundary.FLOAT_BOUNDARY[0], self.Boundary.FLOAT_BOUNDARY[1])
+ elif type_name.lower() == "binary":
+ return f'{self.get_long_name(binary_length, binary_type)}'
+ elif type_name.lower() == "varchar":
+ return self.get_long_name(binary_length, binary_type)
+ elif type_name.lower() == "nchar":
+ return self.get_long_name(nchar_length, nchar_type)
+ elif type_name.lower() == "bool":
+ return random.choice(self.Boundary.BOOL_BOUNDARY)
+ elif type_name.lower() == "timestamp":
+ return self.genTs()[0]
+ else:
+ pass
+
+ def gen_tag_value_list(self, tag_elm_list):
+ tag_value_list = list()
+ if tag_elm_list is None:
+ tag_value_list = list(map(lambda i: self.gen_random_type_value(i, self.default_varchar_length, self.default_varchar_datatype, self.default_nchar_length, self.default_nchar_datatype), self.full_type_list))
+ else:
+ for tag_elm in tag_elm_list:
+ if "count" in tag_elm:
+ total_count = int(tag_elm["count"])
+ else:
+ total_count = 1
+ if total_count > 0:
+ for _ in range(total_count):
+ if tag_elm["type"] in ["varchar", "binary", "nchar"]:
+ tag_value_list.append(self.gen_random_type_value(tag_elm["type"], tag_elm["len"], self.default_varchar_datatype, tag_elm["len"], self.default_nchar_datatype))
+ else:
+ tag_value_list.append(self.gen_random_type_value(tag_elm["type"], "", "", "", ""))
+ else:
+ continue
+ return tag_value_list
+
+ def gen_column_value_list(self, column_elm_list, ts_value=None):
+ if ts_value is None:
+ ts_value = self.genTs()[0]
+
+ column_value_list = list()
+ if column_elm_list is None:
+ column_value_list = list(map(lambda i: self.gen_random_type_value(i, self.default_varchar_length, self.default_varchar_datatype, self.default_nchar_length, self.default_nchar_datatype), self.full_type_list))
+ else:
+ for column_elm in column_elm_list:
+ if "count" in column_elm:
+ total_count = int(column_elm["count"])
+ else:
+ total_count = 1
+ if total_count > 0:
+ for _ in range(total_count):
+ if column_elm["type"] in ["varchar", "binary", "nchar"]:
+ column_value_list.append(self.gen_random_type_value(column_elm["type"], column_elm["len"], self.default_varchar_datatype, column_elm["len"], self.default_nchar_datatype))
+ else:
+ column_value_list.append(self.gen_random_type_value(column_elm["type"], "", "", "", ""))
+ else:
+ continue
+ column_value_list = [self.ts_value] + self.column_value_list
+ return column_value_list
+
+ def create_stable(self, tsql, dbname=None, stbname="stb", column_elm_list=None, tag_elm_list=None,
+ count=1, default_stbname_prefix="stb", **kwargs):
+ colname_prefix = 'c'
+ tagname_prefix = 't'
+ stbname_index_start_num = 1
+ stb_params = ""
+ if len(kwargs) > 0:
+ for param, value in kwargs.items():
+ stb_params += f'{param} "{value}" '
+ column_type_str = self.gen_column_type_str(colname_prefix, column_elm_list)
+ tag_type_str = self.gen_tag_type_str(tagname_prefix, tag_elm_list)
+
+ if int(count) <= 1:
+ create_stable_sql = f'create table {dbname}.{stbname} ({column_type_str}) tags ({tag_type_str}) {stb_params};'
+ tdLog.info("create stb sql: %s"%create_stable_sql)
+ tsql.execute(create_stable_sql)
+ else:
+ for _ in range(count):
+ create_stable_sql = f'create table {dbname}.{default_stbname_prefix}{stbname_index_start_num} ({column_type_str}) tags ({tag_type_str}) {stb_params};'
+ stbname_index_start_num += 1
+ tsql.execute(create_stable_sql)
+
+ def create_ctable(self, tsql, dbname=None, stbname=None, tag_elm_list=None, count=1, default_ctbname_prefix="ctb", **kwargs):
+ ctbname_index_start_num = 0
+ ctb_params = ""
+ if len(kwargs) > 0:
+ for param, value in kwargs.items():
+ ctb_params += f'{param} "{value}" '
+ tag_value_list = self.gen_tag_value_list(tag_elm_list)
+ tag_value_str = ""
+ # tag_value_str = ", ".join(str(v) for v in self.tag_value_list)
+ for tag_value in tag_value_list:
+ if isinstance(tag_value, str):
+ tag_value_str += f'"{tag_value}", '
+ else:
+ tag_value_str += f'{tag_value}, '
+ tag_value_str = tag_value_str.rstrip()[:-1]
+
+ if int(count) <= 1:
+ create_ctable_sql = f'create table {dbname}.{default_ctbname_prefix}{ctbname_index_start_num} using {dbname}.{stbname} tags ({tag_value_str}) {ctb_params};'
+ tsql.execute(create_ctable_sql)
+ else:
+ for _ in range(count):
+ create_ctable_sql = f'create table {dbname}.{default_ctbname_prefix}{ctbname_index_start_num} using {dbname}.{stbname} tags ({tag_value_str}) {ctb_params};'
+ ctbname_index_start_num += 1
+ tdLog.info("create ctb sql: %s"%create_ctable_sql)
+ tsql.execute(create_ctable_sql)
+
+ def create_table(self, tsql, dbname=None, tbname="ntb", column_elm_list=None, count=1, **kwargs):
+ tbname_index_start_num = 1
+ tbname_prefix="ntb"
+
+ tb_params = ""
+ if len(kwargs) > 0:
+ for param, value in kwargs.items():
+ tb_params += f'{param} "{value}" '
+ column_type_str = self.gen_column_type_str(tbname_prefix, column_elm_list)
+
+ if int(count) <= 1:
+ create_table_sql = f'create table {dbname}.{tbname} ({column_type_str}) {tb_params};'
+ tsql.execute(create_table_sql)
+ else:
+ for _ in range(count):
+ create_table_sql = f'create table {dbname}.{tbname_prefix}{tbname_index_start_num} ({column_type_str}) {tb_params};'
+ tbname_index_start_num += 1
+ tsql.execute(create_table_sql)
+
+ def insert_rows(self, tsql, dbname=None, tbname=None, column_ele_list=None, start_ts_value=None, count=1):
+ if start_ts_value is None:
+ start_ts_value = self.genTs()[0]
+
+ column_value_list = self.gen_column_value_list(column_ele_list, start_ts_value)
+ # column_value_str = ", ".join(str(v) for v in self.column_value_list)
+ column_value_str = ""
+ for column_value in column_value_list:
+ if isinstance(column_value, str):
+ column_value_str += f'"{column_value}", '
+ else:
+ column_value_str += f'{column_value}, '
+ column_value_str = column_value_str.rstrip()[:-1]
+ if int(count) <= 1:
+ insert_sql = f'insert into {self.tb_name} values ({column_value_str});'
+ tsql.execute(insert_sql)
+ else:
+ for num in range(count):
+ column_value_list = self.gen_column_value_list(column_ele_list, f'{start_ts_value}+{num}s')
+ column_value_str = ", ".join(str(v) for v in column_value_list)
+ insert_sql = f'insert into {dbname}.{tbname} values ({column_value_str});'
+ tsql.execute(insert_sql)
+
tdCom = TDCom()
diff --git a/tests/pytest/util/sqlset.py b/tests/pytest/util/sqlset.py
new file mode 100644
index 0000000000..939f53154a
--- /dev/null
+++ b/tests/pytest/util/sqlset.py
@@ -0,0 +1,46 @@
+###################################################################
+# Copyright (c) 2016 by TAOS Technologies, Inc.
+# All rights reserved.
+#
+# This file is proprietary and confidential to TAOS Technologies.
+# No part of this file may be reproduced, stored, transmitted,
+# disclosed or used in any form or by any means other than as
+# expressly provided by the written permission from Jianhui Tao
+#
+###################################################################
+
+# -*- coding: utf-8 -*-
+
+from util.sql import tdSql
+
+class TDSetSql:
+ def init(self, conn, logSql):
+ tdSql.init(conn.cursor(), logSql)
+ self.stbname = 'stb'
+
+ def set_create_normaltable_sql(self, ntbname='ntb',
+ column_dict={'ts':'timestamp','col1':'tinyint','col2':'smallint','col3':'int','col4':'bigint','col5': 'unsigned int','col6': 'unsigned tinyint','col7': 'unsigned smallint',
+ 'col8': 'unsigned int','col9': 'unsigned bigint','col10': 'float','col11': 'double','col12': 'bool','col13': 'binary(20)','col14': 'nchar(20)'}):
+ column_sql = ''
+ for k, v in column_dict.items():
+ column_sql += f"{k} {v},"
+ create_ntb_sql = f'create table {ntbname} ({column_sql[:-1]})'
+ return create_ntb_sql
+
+ def set_create_stable_sql(self,stbname='stb',
+ column_dict={'ts':'timestamp','col1':'tinyint','col2':'smallint','col3':'int','col4':'bigint','col5': 'unsigned int','col6': 'unsigned tinyint','col7': 'unsigned smallint',
+ 'col8': 'unsigned int','col9': 'unsigned bigint','col10': 'float','col11': 'double','col12': 'bool','col13': 'binary(20)','col14': 'nchar(20)'},
+ tag_dict={'ts_tag':'timestamp','t1':'tinyint','t2':'smallint','t3':'int','t4':'bigint','t5': 'unsigned int','t6': 'unsigned tinyint','t7': 'unsigned smallint',
+ 't8': 'unsigned int','t9': 'unsigned bigint','t10': 'float','t11': 'double','t12': 'bool','t13': 'binary(20)','t14': 'nchar(20)'}):
+ column_sql = ''
+ tag_sql = ''
+ for k,v in column_dict.items():
+ column_sql += f"{k} {v},"
+ for k,v in tag_dict.items():
+ tag_sql += f"{k} {v},"
+ create_stb_sql = f'create table {stbname} ({column_sql[:-1]}) tags({tag_sql[:-1]})'
+ return create_stb_sql
+
+
+
+
\ No newline at end of file
diff --git a/tests/script/api/batchprepare.c b/tests/script/api/batchprepare.c
index 7dd7621d0b..0e7030b230 100644
--- a/tests/script/api/batchprepare.c
+++ b/tests/script/api/batchprepare.c
@@ -353,13 +353,13 @@ void taosMemoryFree(const void *ptr) {
static int64_t taosGetTimestampMs() {
struct timeval systemTime;
taosGetTimeOfDay(&systemTime);
- return (int64_t)systemTime.tv_sec * 1000L + (int64_t)systemTime.tv_usec/1000;
+ return (int64_t)systemTime.tv_sec * 1000LL + (int64_t)systemTime.tv_usec/1000;
}
static int64_t taosGetTimestampUs() {
struct timeval systemTime;
taosGetTimeOfDay(&systemTime);
- return (int64_t)systemTime.tv_sec * 1000000L + (int64_t)systemTime.tv_usec;
+ return (int64_t)systemTime.tv_sec * 1000000LL + (int64_t)systemTime.tv_usec;
}
bool colExists(TAOS_MULTI_BIND* pBind, int32_t dataType) {
diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt
index 276b5e6e34..1ab6491736 100644
--- a/tests/script/jenkins/basic.txt
+++ b/tests/script/jenkins/basic.txt
@@ -23,6 +23,11 @@
# ---- dnode
./test.sh -f tsim/dnode/create_dnode.sim
./test.sh -f tsim/dnode/drop_dnode_has_mnode.sim
+./test.sh -f tsim/dnode/drop_dnode_has_qnode_snode.sim
+./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica1.sim
+#./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica3.sim
+#./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica1.sim
+#./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica3.sim
# ---- insert
./test.sh -f tsim/insert/basic0.sim
@@ -75,7 +80,7 @@
./test.sh -f tsim/stream/distributeInterval0.sim
# ./test.sh -f tsim/stream/distributesession0.sim
# ./test.sh -f tsim/stream/session0.sim
-# ./test.sh -f tsim/stream/session1.sim
+./test.sh -f tsim/stream/session1.sim
# ./test.sh -f tsim/stream/state0.sim
./test.sh -f tsim/stream/triggerInterval0.sim
# ./test.sh -f tsim/stream/triggerSession0.sim
diff --git a/tests/script/sh/abs_max.c b/tests/script/sh/abs_max.c
index cd8ba0ff15..d623adacf9 100644
--- a/tests/script/sh/abs_max.c
+++ b/tests/script/sh/abs_max.c
@@ -11,8 +11,8 @@ typedef struct SUdfInit{
} SUdfInit;
-#define TSDB_DATA_INT_NULL 0x80000000L
-#define TSDB_DATA_BIGINT_NULL 0x8000000000000000L
+#define TSDB_DATA_INT_NULL 0x80000000LL
+#define TSDB_DATA_BIGINT_NULL 0x8000000000000000LL
void abs_max(char* data, short itype, short ibytes, int numOfRows, long long* ts, char* dataOutput, char* interBuf, char* tsOutput,
int* numOfOutput, short otype, short obytes, SUdfInit* buf) {
diff --git a/tests/script/sh/demo.c b/tests/script/sh/demo.c
index 23d2174448..2a862c0464 100644
--- a/tests/script/sh/demo.c
+++ b/tests/script/sh/demo.c
@@ -17,7 +17,7 @@ typedef struct SDemo{
}SDemo;
#define FLOAT_NULL 0x7FF00000 // it is an NAN
-#define DOUBLE_NULL 0x7FFFFF0000000000L // it is an NAN
+#define DOUBLE_NULL 0x7FFFFF0000000000LL // it is an NAN
void demo(char* data, short itype, short ibytes, int numOfRows, long long* ts, char* dataOutput, char* interBuf, char* tsOutput,
diff --git a/tests/script/sh/deploy.bat b/tests/script/sh/deploy.bat
index 921f1611fb..f0d8c10b7e 100644
--- a/tests/script/sh/deploy.bat
+++ b/tests/script/sh/deploy.bat
@@ -59,48 +59,29 @@ for /f "skip=1" %%A in (
'wmic computersystem get caption'
) do if not defined fqdn set "fqdn=%%A"
-echo firstEp %fqdn%:7100 > %TAOS_CFG%
+echo firstEp %fqdn%:7100 >> %TAOS_CFG%
+echo secondEp %fqdn%:7200 >> %TAOS_CFG%
echo fqdn %fqdn% >> %TAOS_CFG%
echo serverPort %NODE% >> %TAOS_CFG%
+echo supportVnodes 128 >> %TAOS_CFG%
echo dataDir %DATA_DIR% >> %TAOS_CFG%
echo logDir %LOG_DIR% >> %TAOS_CFG%
echo debugFlag 0 >> %TAOS_CFG%
-echo mDebugFlag 135 >> %TAOS_CFG%
-echo sdbDebugFlag 135 >> %TAOS_CFG%
-echo dDebugFlag 135 >> %TAOS_CFG%
-echo vDebugFlag 135 >> %TAOS_CFG%
-echo tsdbDebugFlag 135 >> %TAOS_CFG%
-echo cDebugFlag 135 >> %TAOS_CFG%
-echo jnidebugFlag 135 >> %TAOS_CFG%
-echo odbcdebugFlag 135 >> %TAOS_CFG%
-echo httpDebugFlag 135 >> %TAOS_CFG%
-echo monDebugFlag 135 >> %TAOS_CFG%
-echo mqttDebugFlag 135 >> %TAOS_CFG%
-echo qdebugFlag 135 >> %TAOS_CFG%
-echo rpcDebugFlag 135 >> %TAOS_CFG%
+echo mDebugFlag 143 >> %TAOS_CFG%
+echo dDebugFlag 143 >> %TAOS_CFG%
+echo vDebugFlag 143 >> %TAOS_CFG%
+echo tqDebugFlag 143 >> %TAOS_CFG%
+echo tsdbDebugFlag 143 >> %TAOS_CFG%
+echo cDebugFlag 143 >> %TAOS_CFG%
+echo jniDebugFlag 143 >> %TAOS_CFG%
+echo qDebugFlag 143 >> %TAOS_CFG%
+echo rpcDebugFlag 143 >> %TAOS_CFG%
echo tmrDebugFlag 131 >> %TAOS_CFG%
-echo udebugFlag 135 >> %TAOS_CFG%
-echo sdebugFlag 135 >> %TAOS_CFG%
-echo wdebugFlag 135 >> %TAOS_CFG%
-echo cqdebugFlag 135 >> %TAOS_CFG%
-echo monitor 0 >> %TAOS_CFG%
-echo monitorInterval 1 >> %TAOS_CFG%
-echo http 0 >> %TAOS_CFG%
-echo slaveQuery 0 >> %TAOS_CFG%
-echo numOfThreadsPerCore 2.0 >> %TAOS_CFG%
-echo defaultPass taosdata >> %TAOS_CFG%
+echo uDebugFlag 143 >> %TAOS_CFG%
+echo sDebugFlag 143 >> %TAOS_CFG%
+echo wDebugFlag 143 >> %TAOS_CFG%
echo numOfLogLines 20000000 >> %TAOS_CFG%
-echo mnodeEqualVnodeNum 0 >> %TAOS_CFG%
-echo balanceInterval 1 >> %TAOS_CFG%
-echo clog 2 >> %TAOS_CFG%
-echo days 10 >> %TAOS_CFG%
echo statusInterval 1 >> %TAOS_CFG%
-echo maxVgroupsPerDb 4 >> %TAOS_CFG%
-echo minTablesPerVnode 4 >> %TAOS_CFG%
-echo maxTablesPerVnode 1000 >> %TAOS_CFG%
-echo tableIncStepPerVnode 10000 >> %TAOS_CFG%
echo asyncLog 0 >> %TAOS_CFG%
-echo numOfMnodes 1 >> %TAOS_CFG%
echo locale en_US.UTF-8 >> %TAOS_CFG%
-echo fsync 0 >> %TAOS_CFG%
echo telemetryReporting 0 >> %TAOS_CFG%
diff --git a/tests/script/sh/exec.bat b/tests/script/sh/exec.bat
index 6651c7aa8f..7a2c58fc66 100644
--- a/tests/script/sh/exec.bat
+++ b/tests/script/sh/exec.bat
@@ -30,9 +30,28 @@ rem echo CFG_DIR: %CFG_DIR%
set TAOS_CFG=%CFG_DIR%taos.cfg
rem echo TAOS_CFG: %TAOS_CFG%
+set LOG_DIR=%NODE_DIR%log\
+rem echo LOG_DIR: %LOG_DIR%
+
+set TAOS_LOG=%LOG_DIR%taosdlog.0
+rem echo TAOS_LOG: %TAOS_LOG%
+
if %EXEC_OPTON% == start (
+ rm -rf %TAOS_LOG%
echo start %TAOSD% -c %CFG_DIR%
start %TAOSD% -c %CFG_DIR%
+ set /a check_num=0
+:check_online
+ sleep 1
+ set /a check_num=check_num+1
+ if "%check_num%" == "11" (
+ echo check online out time.
+ goto :finish
+ )
+ echo check taosd online
+ tail -n +0 %TAOS_LOG% | grep -q "TDengine initialized successfully" || goto :check_online
+ echo finish
+ goto :finish
)
if %EXEC_OPTON% == stop (
@@ -44,5 +63,8 @@ if %EXEC_OPTON% == stop (
) do (
rem echo taskkill /IM %%A
taskkill /IM %%A > NUL 2>&1
+ goto :finish
)
)
+
+:finish
\ No newline at end of file
diff --git a/tests/script/sh/sum_double.c b/tests/script/sh/sum_double.c
index 0297920361..d6eea5d291 100644
--- a/tests/script/sh/sum_double.c
+++ b/tests/script/sh/sum_double.c
@@ -10,7 +10,7 @@ typedef struct SUdfInit{
int const_item; /* 0 if result is independent of arguments */
} SUdfInit;
-#define TSDB_DATA_INT_NULL 0x80000000L
+#define TSDB_DATA_INT_NULL 0x80000000LL
void sum_double(char* data, short itype, short ibytes, int numOfRows, long long* ts, char* dataOutput, char* interBuf, char* tsOutput,
diff --git a/tests/script/tsim/db/alter_option.sim b/tests/script/tsim/db/alter_option.sim
index fede960a6a..f24e32279d 100644
--- a/tests/script/tsim/db/alter_option.sim
+++ b/tests/script/tsim/db/alter_option.sim
@@ -43,8 +43,16 @@ print ===> $data20 $data21 $data22 $data23 $data24 $data25
if $data00 != 1 then
return -1
endi
-if $data01 != localhost:7100 then
- return -1
+system_content printf %OS%
+if $system_content == Windows_NT then
+ system_content printf %COMPUTERNAME%:7100
+ if $data01 != $system_content then
+ return -1
+ endi
+else
+ if $data01 != localhost:7100 then
+ return -1
+ endi
endi
if $data04 != ready then
goto check_dnode_ready_1
diff --git a/tests/script/tsim/db/create_all_options.sim b/tests/script/tsim/db/create_all_options.sim
index efe7ff99cf..3979ef1ec1 100644
--- a/tests/script/tsim/db/create_all_options.sim
+++ b/tests/script/tsim/db/create_all_options.sim
@@ -43,8 +43,16 @@ print ===> $data20 $data21 $data22 $data23 $data24 $data25
if $data00 != 1 then
return -1
endi
-if $data01 != localhost:7100 then
- return -1
+system_content printf %OS%
+if $system_content == Windows_NT then
+ system_content printf %COMPUTERNAME%:7100
+ if $data01 != $system_content then
+ return -1
+ endi
+else
+ if $data01 != localhost:7100 then
+ return -1
+ endi
endi
if $data04 != ready then
goto check_dnode_ready_1
diff --git a/tests/script/tsim/dnode/drop_dnode_has_mnode.sim b/tests/script/tsim/dnode/drop_dnode_has_mnode.sim
index 1dbec2c04d..16cd2bb3b0 100644
--- a/tests/script/tsim/dnode/drop_dnode_has_mnode.sim
+++ b/tests/script/tsim/dnode/drop_dnode_has_mnode.sim
@@ -70,6 +70,7 @@ if $data(2)[2] != follower then
endi
print =============== step4: drop dnode 2
+sql_error drop dnode 1
sql drop dnode 2
print show dnodes;
@@ -83,7 +84,7 @@ if $data00 != 1 then
return -1
endi
-print show dnodes;
+print show mnodes;
sql show mnodes
print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
print $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4]
diff --git a/tests/script/tsim/dnode/drop_dnode_has_multi_vnode_replica1.sim b/tests/script/tsim/dnode/drop_dnode_has_multi_vnode_replica1.sim
new file mode 100644
index 0000000000..15ad13b6fa
--- /dev/null
+++ b/tests/script/tsim/dnode/drop_dnode_has_multi_vnode_replica1.sim
@@ -0,0 +1,135 @@
+system sh/stop_dnodes.sh
+system sh/deploy.sh -n dnode1 -i 1
+system sh/deploy.sh -n dnode2 -i 2
+system sh/deploy.sh -n dnode3 -i 3
+system sh/cfg.sh -n dnode1 -c supportVnodes -v 0
+system sh/exec.sh -n dnode1 -s start
+system sh/exec.sh -n dnode2 -s start
+sql connect
+
+print =============== step1 create dnode2
+sql create dnode $hostname port 7200
+sql create dnode $hostname port 7300
+
+$x = 0
+step1:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step1
+endi
+if $data(2)[4] != ready then
+ goto step1
+endi
+if $data(3)[4] != offline then
+ goto step1
+endi
+
+print =============== step2 create database
+sql create database d1 vgroups 4
+sql use d1
+sql create table d1.st (ts timestamp, i int) tags (j int)
+sql create table d1.c1 using st tags(1)
+sql show d1.tables
+if $rows != 1 then
+ return -1
+endi
+
+sql show d1.vgroups
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+if $rows != 4 then
+ return -1
+endi
+if $data(2)[3] != 2 then
+ return -1
+endi
+if $data(3)[3] != 2 then
+ return -1
+endi
+if $data(4)[3] != 2 then
+ return -1
+endi
+if $data(5)[3] != 2 then
+ return -1
+endi
+
+print =============== step3: start dnode 3
+system sh/exec.sh -n dnode3 -s start
+$x = 0
+step4:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step4
+endi
+if $data(2)[4] != ready then
+ goto step4
+endi
+if $data(3)[4] != ready then
+ goto step4
+endi
+
+print =============== step3: drop dnode2
+sql drop dnode 2
+
+print show dnodes;
+sql show dnodes;
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4]
+if $rows != 2 then
+ return -1
+endi
+
+sql show d1.vgroups
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+if $rows != 4 then
+ return -1
+endi
+if $data(2)[3] != 3 then
+ return -1
+endi
+if $data(3)[3] != 3 then
+ return -1
+endi
+if $data(4)[3] != 3 then
+ return -1
+endi
+if $data(5)[3] != 3 then
+ return -1
+endi
+
+print =============== step4: select data
+sql show d1.tables
+if $rows != 1 then
+ return -1
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
diff --git a/tests/script/tsim/dnode/drop_dnode_has_multi_vnode_replica3.sim b/tests/script/tsim/dnode/drop_dnode_has_multi_vnode_replica3.sim
new file mode 100644
index 0000000000..35a2466297
--- /dev/null
+++ b/tests/script/tsim/dnode/drop_dnode_has_multi_vnode_replica3.sim
@@ -0,0 +1,135 @@
+system sh/stop_dnodes.sh
+system sh/deploy.sh -n dnode1 -i 1
+system sh/deploy.sh -n dnode2 -i 2
+system sh/deploy.sh -n dnode3 -i 3
+system sh/deploy.sh -n dnode4 -i 4
+system sh/deploy.sh -n dnode5 -i 5
+system sh/cfg.sh -n dnode1 -c supportVnodes -v 0
+system sh/exec.sh -n dnode1 -s start
+system sh/exec.sh -n dnode2 -s start
+system sh/exec.sh -n dnode3 -s start
+system sh/exec.sh -n dnode4 -s start
+sql connect
+
+print =============== step1 create dnode2 dnode3 dnode4 dnode 5
+sql create dnode $hostname port 7200
+sql create dnode $hostname port 7300
+sql create dnode $hostname port 7400
+sql create dnode $hostname port 7500
+
+$x = 0
+step1:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step1
+endi
+if $data(2)[4] != ready then
+ goto step1
+endi
+if $data(3)[4] != ready then
+ goto step1
+endi
+if $data(4)[4] != ready then
+ goto step1
+endi
+if $data(5)[4] != offline then
+ goto step1
+endi
+
+print =============== step3 create database
+sql create database d1 vgroups 4 replica 3
+sql use d1
+sql create table d1.st (ts timestamp, i int) tags (j int)
+sql create table d1.c1 using st tags(1)
+sql show d1.tables
+if $rows != 1 then
+ return -1
+endi
+
+sql show d1.vgroups
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+if $rows != 1 then
+ return -1
+endi
+if $data(2)[3] != 2 then
+ return -1
+endi
+if $data(2)[5] != 3 then
+ return -1
+endi
+if $data(2)[7] != 4 then
+ return -1
+endi
+
+print =============== step4: drop dnode 2
+system sh/exec.sh -n dnode5 -s start
+$x = 0
+step4:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step4
+endi
+if $data(2)[4] != ready then
+ goto step4
+endi
+if $data(3)[4] != ready then
+ goto step4
+endi
+if $data(4)[4] != ready then
+ goto step4
+endi
+if $data(5)[4] != ready then
+ goto step4
+endi
+
+print =============== step5: drop dnode2
+sql drop dnode 2
+
+print show dnodes;
+sql show dnodes;
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4]
+if $rows != 4 then
+ return -1
+endi
+
+print show d1.vgroups
+sql show d1.vgroups
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+if $rows != 1 then
+ return -1
+endi
+
+
+print =============== step6: select data
+sql show d1.tables
+if $rows != 1 then
+ return -1
+endi
+
+return
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
diff --git a/tests/script/tsim/dnode/drop_dnode_has_qnode_snode.sim b/tests/script/tsim/dnode/drop_dnode_has_qnode_snode.sim
new file mode 100644
index 0000000000..6641ce053c
--- /dev/null
+++ b/tests/script/tsim/dnode/drop_dnode_has_qnode_snode.sim
@@ -0,0 +1,71 @@
+system sh/stop_dnodes.sh
+system sh/deploy.sh -n dnode1 -i 1
+system sh/deploy.sh -n dnode2 -i 2
+system sh/exec.sh -n dnode1 -s start
+system sh/exec.sh -n dnode2 -s start
+sql connect
+
+print =============== step1 create dnode2
+sql create dnode $hostname port 7200
+
+$x = 0
+step1:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 2 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step1
+endi
+if $data(2)[4] != ready then
+ goto step1
+endi
+
+print =============== step2: create qnode snode on dnode 2
+sql create qnode on dnode 2
+sql create snode on dnode 2
+
+sql show qnodes
+if $rows != 1 then
+ return -1
+endi
+
+sql show snodes
+if $rows != 1 then
+ return -1
+endi
+
+print =============== step3: drop dnode 2
+sql drop dnode 2
+
+print show dnodes;
+sql show dnodes;
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4]
+if $rows != 1 then
+ return -1
+endi
+if $data00 != 1 then
+ return -1
+endi
+
+sql show qnodes
+if $rows != 0 then
+ return -1
+endi
+
+sql show snodes
+if $rows != 0 then
+ return -1
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
diff --git a/tests/script/tsim/dnode/drop_dnode_has_vnode_replica1.sim b/tests/script/tsim/dnode/drop_dnode_has_vnode_replica1.sim
new file mode 100644
index 0000000000..63639877ee
--- /dev/null
+++ b/tests/script/tsim/dnode/drop_dnode_has_vnode_replica1.sim
@@ -0,0 +1,151 @@
+system sh/stop_dnodes.sh
+system sh/deploy.sh -n dnode1 -i 1
+system sh/deploy.sh -n dnode2 -i 2
+system sh/deploy.sh -n dnode3 -i 3
+system sh/cfg.sh -n dnode1 -c supportVnodes -v 0
+system sh/exec.sh -n dnode1 -s start
+system sh/exec.sh -n dnode2 -s start
+sql connect
+
+print =============== step1 create dnode2
+sql create dnode $hostname port 7200
+sql create dnode $hostname port 7300
+
+$x = 0
+step1:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step1
+endi
+if $data(2)[4] != ready then
+ goto step1
+endi
+if $data(3)[4] != offline then
+ goto step1
+endi
+
+print =============== step2 drop dnode which not exist
+sql_error drop dnode 1
+sql_error drop dnode 4
+
+print =============== step3 create database
+sql create database d1 vgroups 1
+sql use d1
+sql create table d1.st (ts timestamp, i int) tags (j int)
+sql create table d1.c1 using st tags(1)
+sql show d1.tables
+if $rows != 1 then
+ return -1
+endi
+
+sql show d1.vgroups
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+if $rows != 1 then
+ return -1
+endi
+if $data(2)[3] != 2 then
+ return -1
+endi
+
+print =============== step4: drop dnode 2
+print cant drop since no enough vnodes
+sql_error drop dnode 2
+
+system sh/exec.sh -n dnode2 -s stop
+system sh/exec.sh -n dnode3 -s start
+$x = 0
+step4:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step4
+endi
+if $data(2)[4] != offline then
+ goto step4
+endi
+if $data(3)[4] != ready then
+ goto step4
+endi
+
+# cant drop since offline
+sql_error drop dnode 2
+
+print =============== step5: start dnode2
+system sh/exec.sh -n dnode2 -s start
+
+$x = 0
+step5:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step5
+endi
+if $data(2)[4] != ready then
+ goto step5
+endi
+if $data(3)[4] != ready then
+ goto step5
+endi
+
+print =============== step6: drop dnode2
+sql drop dnode 2
+
+print show dnodes;
+sql show dnodes;
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4]
+if $rows != 2 then
+ return -1
+endi
+
+print show d1.vgroups
+sql show d1.vgroups
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+if $rows != 1 then
+ return -1
+endi
+if $data(2)[3] != 3 then
+ return -1
+endi
+
+print =============== step7: select data
+sql show d1.tables
+if $rows != 1 then
+ return -1
+endi
+
+return
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
diff --git a/tests/script/tsim/dnode/drop_dnode_has_vnode_replica3.sim b/tests/script/tsim/dnode/drop_dnode_has_vnode_replica3.sim
new file mode 100644
index 0000000000..91679a7e81
--- /dev/null
+++ b/tests/script/tsim/dnode/drop_dnode_has_vnode_replica3.sim
@@ -0,0 +1,137 @@
+system sh/stop_dnodes.sh
+system sh/deploy.sh -n dnode1 -i 1
+system sh/deploy.sh -n dnode2 -i 2
+system sh/deploy.sh -n dnode3 -i 3
+system sh/deploy.sh -n dnode4 -i 4
+system sh/deploy.sh -n dnode5 -i 5
+system sh/cfg.sh -n dnode1 -c supportVnodes -v 0
+system sh/exec.sh -n dnode1 -s start
+system sh/exec.sh -n dnode2 -s start
+system sh/exec.sh -n dnode3 -s start
+system sh/exec.sh -n dnode4 -s start
+sql connect
+
+print =============== step1 create dnode2 dnode3 dnode4 dnode 5
+sql create dnode $hostname port 7200
+sql create dnode $hostname port 7300
+sql create dnode $hostname port 7400
+sql create dnode $hostname port 7500
+
+$x = 0
+step1:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step1
+endi
+if $data(2)[4] != ready then
+ goto step1
+endi
+if $data(3)[4] != ready then
+ goto step1
+endi
+if $data(4)[4] != ready then
+ goto step1
+endi
+if $data(5)[4] != offline then
+ goto step1
+endi
+
+print =============== step3 create database
+sql create database d1 vgroups 1 replica 3
+sql use d1
+sql create table d1.st (ts timestamp, i int) tags (j int)
+sql create table d1.c1 using st tags(1)
+sql show d1.tables
+if $rows != 1 then
+ return -1
+endi
+
+sql show d1.vgroups
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+if $rows != 1 then
+ return -1
+endi
+if $data(2)[3] != 2 then
+ return -1
+endi
+if $data(2)[5] != 3 then
+ return -1
+endi
+if $data(2)[7] != 4 then
+ return -1
+endi
+
+print =============== step4: drop dnode 2
+system sh/exec.sh -n dnode5 -s start
+$x = 0
+step4:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
+sql show dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+if $rows != 3 then
+ return -1
+endi
+if $data(1)[4] != ready then
+ goto step4
+endi
+if $data(2)[4] != ready then
+ goto step4
+endi
+if $data(3)[4] != ready then
+ goto step4
+endi
+if $data(4)[4] != ready then
+ goto step4
+endi
+if $data(5)[4] != ready then
+ goto step4
+endi
+
+print =============== step5: drop dnode2
+sql drop dnode 2
+
+print show dnodes;
+sql show dnodes;
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+print $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4]
+if $rows != 4 then
+ return -1
+endi
+
+print show d1.vgroups
+sql show d1.vgroups
+print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
+if $rows != 1 then
+ return -1
+endi
+#if $data(2)[3] != 3 then
+# return -1
+#endi
+
+print =============== step6: select data
+sql show d1.tables
+if $rows != 1 then
+ return -1
+endi
+
+return
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
diff --git a/tests/script/tsim/show/basic.sim b/tests/script/tsim/show/basic.sim
index f23d75d78b..94ca2f6550 100644
--- a/tests/script/tsim/show/basic.sim
+++ b/tests/script/tsim/show/basic.sim
@@ -36,6 +36,7 @@ sql create database db vgroups 3
sql use db
sql create table stb (ts timestamp, c int) tags (t int)
sql create table t0 using stb tags (0)
+sql create table tba (ts timestamp, c1 binary(10), c2 nchar(10));
print =============== run show xxxx
sql show dnodes
@@ -62,7 +63,7 @@ if $rows != 1 then
endi
#sql show streams,
sql show tables
-if $rows != 1 then
+if $rows != 2 then
return -1
endi
#sql show user_table_distributed
@@ -98,7 +99,7 @@ if $rows != 1 then
endi
#sql select * from information_schema.`streams`
sql select * from information_schema.user_tables
-if $rows != 29 then
+if $rows != 30 then
return -1
endi
#sql select * from information_schema.user_table_distributed
@@ -160,7 +161,7 @@ if $rows != 1 then
endi
#sql show streams,
sql show tables
-if $rows != 1 then
+if $rows != 2 then
return -1
endi
#sql show user_table_distributed
@@ -196,7 +197,7 @@ if $rows != 1 then
endi
#sql select * from performance_schema.`streams`
sql select * from information_schema.user_tables
-if $rows != 29 then
+if $rows != 30 then
return -1
endi
#sql select * from information_schema.user_table_distributed
@@ -209,5 +210,22 @@ if $rows != 3 then
return -1
endi
+sql show create stable stb;
+if $rows != 1 then
+ return -1
+endi
+
+sql show create table t0;
+if $rows != 1 then
+ return -1
+endi
+
+sql show create table tba;
+if $rows != 1 then
+ return -1
+endi
+
+sql_error show create stable t0;
+
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
diff --git a/tests/script/tsim/trans/create_db.sim b/tests/script/tsim/trans/create_db.sim
index f730f2fb67..d4d158ede0 100644
--- a/tests/script/tsim/trans/create_db.sim
+++ b/tests/script/tsim/trans/create_db.sim
@@ -96,50 +96,53 @@ sql_error create database d1 vgroups 2;
print =============== kill dnode2
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-print =============== create database
-sql show transactions
-if $rows != 0 then
- return -1
-endi
+system_content printf %OS%
+if $system_content != Windows_NT then
+ print =============== create database
+ sql show transactions
+ if $rows != 0 then
+ return -1
+ endi
-sql_error create database d2 vgroups 2;
+ sql_error create database d2 vgroups 2;
-print =============== show transactions
-sql show transactions
-if $rows != 1 then
- return -1
-endi
+ print =============== show transactions
+ sql show transactions
+ if $rows != 1 then
+ return -1
+ endi
-if $data[0][0] != 8 then
- return -1
-endi
+ if $data[0][0] != 8 then
+ return -1
+ endi
-if $data[0][2] != redoAction then
- return -1
-endi
+ if $data[0][2] != redoAction then
+ return -1
+ endi
-if $data[0][3] != d2 then
- return -1
-endi
+ if $data[0][3] != d2 then
+ return -1
+ endi
-sql show databases ;
-if $rows != 4 then
- return -1
-endi
-print d2 ==> $data(d2)[19]
-if $data(d2)[19] != creating then
- return -1
-endi
+ sql show databases ;
+ if $rows != 4 then
+ return -1
+ endi
+ print d2 ==> $data(d2)[19]
+ if $data(d2)[19] != creating then
+ return -1
+ endi
-sql_error create database d2 vgroups 2;
+ sql_error create database d2 vgroups 2;
-print =============== kill transaction
-sql kill transaction 8;
-sleep 2000
+ print =============== kill transaction
+ sql kill transaction 8;
+ sleep 2000
-sql show transactions
-if $rows != 0 then
- return -1
+ sql show transactions
+ if $rows != 0 then
+ return -1
+ endi
endi
print =============== start dnode2
@@ -153,25 +156,25 @@ step3:
print ====> dnode not ready!
return -1
endi
-sql show dnodes
-print ===> $data00 $data01 $data02 $data03 $data04 $data05
-print ===> $data10 $data11 $data12 $data13 $data14 $data15
-if $rows != 2 then
- return -1
-endi
-if $data(1)[4] != ready then
- goto step3
-endi
-if $data(2)[4] != ready then
- goto step3
-endi
+ sql show dnodes
+ print ===> $data00 $data01 $data02 $data03 $data04 $data05
+ print ===> $data10 $data11 $data12 $data13 $data14 $data15
+ if $rows != 2 then
+ return -1
+ endi
+ if $data(1)[4] != ready then
+ goto step3
+ endi
+ if $data(2)[4] != ready then
+ goto step3
+ endi
sql show transactions
if $rows != 0 then
return -1
endi
-sql drop database d2;
+sql drop database if exists d2;
sql show transactions
if $rows != 0 then
diff --git a/tests/script/wtest.bat b/tests/script/wtest.bat
index 9ed58a90d1..1aa27202c6 100644
--- a/tests/script/wtest.bat
+++ b/tests/script/wtest.bat
@@ -52,6 +52,7 @@ echo wal 0 >> %TAOS_CFG%
echo asyncLog 0 >> %TAOS_CFG%
echo locale en_US.UTF-8 >> %TAOS_CFG%
echo enableCoreFile 1 >> %TAOS_CFG%
+echo charset cp65001 >> %TAOS_CFG%
set "FILE_NAME=testSuite.sim"
if "%1" == "-f" set "FILE_NAME=%2"
diff --git a/tests/system-test/2-query/sample.py b/tests/system-test/2-query/sample.py
index a84d93404a..33ef7e65db 100644
--- a/tests/system-test/2-query/sample.py
+++ b/tests/system-test/2-query/sample.py
@@ -624,8 +624,7 @@ class TDTestCase:
tdLog.info(" sample data is in datas groups ,successed sql is : %s" % sample_query )
else:
tdLog.exit(" sample data is not in datas groups ,failed sql is : %s" % sample_query )
-
-
+
def basic_sample_query(self):
tdSql.execute(" drop database if exists db ")
tdSql.execute(" create database if not exists db duration 300 ")
@@ -760,6 +759,14 @@ class TDTestCase:
self.check_sample("select sample( c1 ,3 ) from t1 where c1 between 1 and 10" ,"select c1 from t1 where c1 between 1 and 10")
+ tdSql.query("select sample(c1,2) ,c2,c3 ,c5 from stb1")
+ tdSql.checkRows(2)
+ tdSql.checkCols(4)
+
+ self.check_sample("select sample( c1 ,3 ),c2,c3,c4,c5 from t1 where c1 between 1 and 10" ,"select c1,c2,c3,c4,c5 from t1 where c1 between 1 and 10")
+ self.check_sample("select sample( c1 ,3 ),c2,c3,c4,c5 from stb1 where c1 between 1 and 10" ,"select c1,c2,c3,c4,c5 from stb1 where c1 between 1 and 10")
+ self.check_sample("select sample( c1 ,3 ),t1 from stb1 where c1 between 1 and 10" ,"select c1,t1 from stb1 where c1 between 1 and 10")
+
# join
tdSql.query("select sample( ct4.c1 , 1 ) from ct1, ct4 where ct4.ts=ct1.ts")
@@ -772,8 +779,8 @@ class TDTestCase:
self.check_sample("select sample(c1,2) from stb1 partition by tbname" , "select c1 from stb1 partition by tbname")
# nest query
- # tdSql.query("select sample(c1,2) from (select c1 from t1); ")
- # tdSql.checkRows(2)
+ tdSql.query("select sample(c1,2) from (select c1 from t1); ")
+ tdSql.checkRows(2)
# union all
tdSql.query("select sample(c1,2) from t1 union all select sample(c1,3) from t1")
diff --git a/tests/system-test/2-query/top.py b/tests/system-test/2-query/top.py
index 83f535856e..86e201ea9a 100644
--- a/tests/system-test/2-query/top.py
+++ b/tests/system-test/2-query/top.py
@@ -11,103 +11,159 @@
# -*- coding: utf-8 -*-
-import random
import string
from util.common import *
from util.log import *
from util.cases import *
from util.sql import *
-
+from util.sqlset import *
class TDTestCase:
def init(self, conn, logSql):
tdLog.debug("start to execute %s" % __file__)
tdSql.init(conn.cursor())
-
+ self.setsql = TDSetSql()
+ self.ntbname = 'ntb'
self.rowNum = 10
self.tbnum = 20
self.ts = 1537146000000
self.binary_str = 'taosdata'
self.nchar_str = '涛思数据'
- def top_check_base(self):
- tdSql.prepare()
- tdSql.execute('''create table stb(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 tinyint unsigned, col6 smallint unsigned,
- col7 int unsigned, col8 bigint unsigned, col9 float, col10 double, col11 bool, col12 binary(20), col13 nchar(20)) tags(loc nchar(20))''')
- tdSql.execute("create table stb_1 using stb tags('beijing')")
- for i in range(self.rowNum):
- tdSql.execute(f"insert into stb_1 values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d, '{self.binary_str}%d', '{self.nchar_str}%d')"
- % (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1))
- column_list = ['col1','col2','col3','col4','col5','col6','col7','col8']
- error_column_list = ['col11','col12','col13']
- error_param_list = [0,101]
- for i in column_list:
- tdSql.query(f'select top({i},2) from stb_1')
- tdSql.checkRows(2)
- tdSql.checkEqual(tdSql.queryResult,[(9,),(10,)])
- for j in error_param_list:
- tdSql.error(f'select top({i},{j}) from stb_1')
- for i in error_column_list:
- tdSql.error(f'select top({i},10) from stb_1')
- tdSql.query("select ts,top(col1, 2),ts from stb_1 group by tbname")
- tdSql.checkRows(2)
- tdSql.query('select top(col2,1) from stb_1 interval(1y) order by col2')
- tdSql.checkData(0,0,10)
- tdSql.error("select * from stb_1 where top(col2,1)=1")
- tdSql.execute('drop database db')
- def top_check_stb_distribute(self):
- # prepare data for vgroup 4
+ self.column_dict = {
+ 'ts' : 'timestamp',
+ 'col1': 'tinyint',
+ 'col2': 'smallint',
+ 'col3': 'int',
+ 'col4': 'bigint',
+ 'col5': 'tinyint unsigned',
+ 'col6': 'smallint unsigned',
+ 'col7': 'int unsigned',
+ 'col8': 'bigint unsigned',
+ 'col9': 'float',
+ 'col10': 'double',
+ 'col11': 'bool',
+ 'col12': 'binary(20)',
+ 'col13': 'nchar(20)'
+ }
+
+ self.param_list = [1,100]
+
+ def insert_data(self,column_dict,tbname,row_num):
+ sql = ''
+ for k, v in column_dict.items():
+ if v.lower() == 'timestamp' or v.lower() == 'tinyint' or v.lower() == 'smallint' or v.lower() == 'int' or v.lower() == 'bigint' or \
+ v.lower() == 'tinyint unsigned' or v.lower() == 'smallint unsigned' or v.lower() == 'int unsigned' or v.lower() == 'bigint unsigned' or v.lower() == 'bool':
+ sql += '%d,'
+ elif v.lower() == 'float' or v.lower() == 'double':
+ sql += '%f,'
+ elif 'binary' in v.lower():
+ sql += f'"{self.binary_str}%d",'
+ elif 'nchar' in v.lower():
+ sql += f'"{self.nchar_str}%d",'
+ insert_sql = f'insert into {tbname} values({sql[:-1]})'
+ for i in range(row_num):
+ insert_list = []
+ for k, v in column_dict.items():
+ if v.lower() in[ 'tinyint' , 'smallint' , 'int', 'bigint' , 'tinyint unsigned' , 'smallint unsigned' , 'int unsigned' , 'bigint unsigned'] or\
+ 'binary' in v.lower() or 'nchar' in v.lower():
+ insert_list.append(1 + i)
+ elif v.lower() == 'float' or v.lower() == 'double':
+ insert_list.append(0.1 + i)
+ elif v.lower() == 'bool':
+ insert_list.append(i % 2)
+ elif v.lower() == 'timestamp':
+ insert_list.append(self.ts + i)
+ tdSql.execute(insert_sql%(tuple(insert_list)))
+ pass
+ def top_check_data(self,tbname,tb_type):
+ new_column_dict = {}
+ for param in self.param_list:
+ for k,v in self.column_dict.items():
+ if v.lower() in ['tinyint','smallint','int','bigint','tinyint unsigned','smallint unsigned','int unsigned','bigint unsigned']:
+ tdSql.query(f'select top({k},{param}) from {tbname}')
+ if param >= self.rowNum:
+ if tb_type in ['normal_table','child_table']:
+ tdSql.checkRows(self.rowNum)
+ values_list = []
+ for i in range(self.rowNum):
+ tp = (self.rowNum-i,)
+ values_list.insert(0,tp)
+ tdSql.checkEqual(tdSql.queryResult,values_list)
+ elif tb_type == 'stable':
+ tdSql.checkRows(param)
+ elif param < self.rowNum:
+ if tb_type in ['normal_table','child_table']:
+ tdSql.checkRows(param)
+ values_list = []
+ for i in range(param):
+ tp = (self.rowNum-i,)
+ values_list.insert(0,tp)
+ tdSql.checkEqual(tdSql.queryResult,values_list)
+ elif tb_type == 'stable':
+ tdSql.checkRows(param)
+ for i in [self.param_list[0]-1,self.param_list[-1]+1]:
+ tdSql.error(f'select top({k},{i}) from {tbname}')
+ new_column_dict.update({k:v})
+ elif v.lower() == 'bool' or 'binary' in v.lower() or 'nchar' in v.lower():
+ tdSql.error(f'select top({k},{param}) from {tbname}')
+ tdSql.error(f'select * from {tbname} where top({k},{param})=1')
+ for key in new_column_dict.keys():
+ for k in self.column_dict.keys():
+ if key == k :
+ continue
+ else:
+ tdSql.query(f'select top({key},2),{k} from {tbname} group by tbname')
+ if tb_type == 'normal_table' or tb_type == 'child_table':
+ tdSql.checkRows(2)
+ else:
+ tdSql.checkRows(2*self.tbnum)
+ def top_check_stb(self):
dbname = tdCom.getLongName(10, "letters")
stbname = tdCom.getLongName(5, "letters")
+ tag_dict = {
+ 't0':'int'
+ }
+ tag_values = [
+ f'1'
+ ]
tdSql.execute(f"create database if not exists {dbname} vgroups 2")
tdSql.execute(f'use {dbname}')
- # build 20 child tables,every table insert 10 rows
- tdSql.execute(f'''create table {stbname}(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 tinyint unsigned, col6 smallint unsigned,
- col7 int unsigned, col8 bigint unsigned, col9 float, col10 double, col11 bool, col12 binary(20), col13 nchar(20)) tags(loc nchar(20))''')
+ tdSql.execute(self.setsql.set_create_stable_sql(stbname,self.column_dict,tag_dict))
+
for i in range(self.tbnum):
- tdSql.execute(f"create table {stbname}_{i} using {stbname} tags('beijing')")
- tdSql.execute(f"insert into {stbname}_{i}(ts) values(%d)" % (self.ts - 1-i))
- column_list = ['col1','col2','col3','col4','col5','col6','col7','col8']
- for i in [f'{stbname}', f'{dbname}.{stbname}']:
- for j in column_list:
- tdSql.query(f"select top({j},1) from {i}")
- tdSql.checkRows(0)
+ tdSql.execute(f"create table {stbname}_{i} using {stbname} tags({tag_values[0]})")
+ tdSql.execute(self.insert_data(self.column_dict,f'{stbname}_{i}',self.rowNum))
tdSql.query('show tables')
vgroup_list = []
for i in range(len(tdSql.queryResult)):
vgroup_list.append(tdSql.queryResult[i][6])
- vgroup_list_set = set(vgroup_list)
+ vgroup_list_set = set(vgroup_list)
for i in vgroup_list_set:
vgroups_num = vgroup_list.count(i)
- if vgroups_num >=2:
+ if vgroups_num >= 2:
tdLog.info(f'This scene with {vgroups_num} vgroups is ok!')
- continue
- else:
- tdLog.exit(f'This scene does not meet the requirements with {vgroups_num} vgroup!\n')
- for i in range(self.rowNum):
- for j in range(self.tbnum):
- tdSql.execute(f"insert into {stbname}_{j} values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d, '{self.binary_str}%d', '{self.nchar_str}%d')"
- % (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1))
-
- error_column_list = ['col11','col12','col13']
- error_param_list = [0,101]
- for i in column_list:
- tdSql.query(f'select top({i},2) from {stbname}')
- tdSql.checkRows(2)
- tdSql.checkEqual(tdSql.queryResult,[(10,),(10,)])
- for j in error_param_list:
- tdSql.error(f'select top({i},{j}) from {stbname}')
- for i in error_column_list:
- tdSql.error(f'select top({i},10) from {stbname}')
- tdSql.query(f"select ts,top(col1, 2),ts from {stbname} group by tbname")
- tdSql.checkRows(2*self.tbnum)
- tdSql.query(f'select top(col2,1) from {stbname} interval(1y) order by col2')
- tdSql.checkData(0,0,10)
- tdSql.error(f"select * from {stbname} where top(col2,1)=1")
+ else:
+ tdLog.exit(
+ 'This scene does not meet the requirements with {vgroups_num} vgroup!\n')
+ for i in range(self.tbnum):
+ self.top_check_data(f'{stbname}_{i}','child_table')
+ self.top_check_data(stbname,'stable')
+ tdSql.execute(f'drop database {dbname}')
+
+ def top_check_ntb(self):
+ tdSql.prepare()
+ tdSql.execute(self.setsql.set_create_normaltable_sql(self.ntbname,self.column_dict))
+ self.insert_data(self.column_dict,self.ntbname,self.rowNum)
+ self.top_check_data(self.ntbname,'normal_table')
+ tdSql.execute('drop database db')
+
def run(self):
- self.top_check_base()
- self.top_check_stb_distribute()
+ self.top_check_ntb()
+ self.top_check_stb()
+
+
def stop(self):
tdSql.close()
tdLog.success("%s successfully executed" % __file__)
diff --git a/tests/system-test/2-query/twa.py b/tests/system-test/2-query/twa.py
new file mode 100644
index 0000000000..b400e503d9
--- /dev/null
+++ b/tests/system-test/2-query/twa.py
@@ -0,0 +1,150 @@
+from util.log import *
+from util.cases import *
+from util.sql import *
+import numpy as np
+import random ,os ,sys
+import platform
+import math
+
+class TDTestCase:
+ updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 ,
+ "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143,
+ "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143,
+ "maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 }
+
+ def init(self, conn, logSql):
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor())
+ self.vnode_disbutes = None
+ self.ts = 1537146000000
+ self.tb_nums = 20
+ self.row_nums = 100
+ self.time_step = 1000
+
+ def prepare_datas_of_distribute(self):
+
+ # prepate datas for 20 tables distributed at different vgroups
+ tdSql.execute("create database if not exists testdb keep 3650 duration 1000 vgroups 5")
+ tdSql.execute(" use testdb ")
+ tdSql.execute(
+ '''create table stb1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ tags (t0 timestamp, t1 int, t2 bigint, t3 smallint, t4 tinyint, t5 float, t6 double, t7 bool, t8 binary(16),t9 nchar(32))
+ '''
+ )
+
+ for i in range(self.tb_nums):
+ tdSql.execute(f'create table ct{i+1} using stb1 tags ( now(), {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, "binary{i}", "nchar{i}" )')
+ ts = self.ts
+ for j in range(self.row_nums):
+ ts+=j*self.time_step
+ tdSql.execute(
+ f"insert into ct{i+1} values({ts}, 1, 11111, 111, 1, 1.11, 11.11, 2, 'binary{j}', 'nchar{j}', now()+{1*j}a )"
+ )
+
+ tdSql.execute("insert into ct1 values (now()-810d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
+ tdSql.execute("insert into ct1 values (now()-400d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
+ tdSql.execute("insert into ct1 values (now()+90d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
+
+ tdLog.info(" prepare data for distributed_aggregate done! ")
+
+ def twa_support_types(self):
+ tdSql.query("desc stb1 ")
+ schema_list = tdSql.queryResult
+ for col_type in schema_list:
+ if col_type[1] in ["TINYINT" ,"SMALLINT","BIGINT" ,"INT","FLOAT","DOUBLE"]:
+ tdSql.query(f" select twa({col_type[0]}) from stb1 partition by tbname ")
+ else:
+ tdSql.error(f" select twa({col_type[0]}) from stb1 partition by tbname ")
+
+
+ def check_distribute_datas(self):
+ # get vgroup_ids of all
+ tdSql.query("show vgroups ")
+ vgroups = tdSql.queryResult
+
+ vnode_tables={}
+
+ for vgroup_id in vgroups:
+ vnode_tables[vgroup_id[0]]=[]
+
+ # check sub_table of per vnode ,make sure sub_table has been distributed
+ tdSql.query("show tables like 'ct%'")
+ table_names = tdSql.queryResult
+ tablenames = []
+ for table_name in table_names:
+ vnode_tables[table_name[6]].append(table_name[0])
+ self.vnode_disbutes = vnode_tables
+
+ count = 0
+ for k ,v in vnode_tables.items():
+ if len(v)>=2:
+ count+=1
+ if count < 2:
+ tdLog.exit(" the datas of all not satisfy sub_table has been distributed ")
+
+ def distribute_twa_query(self):
+ # basic filter
+ tdSql.query(" select twa(c1) from ct1 ")
+ tdSql.checkData(0,0,1.000000000)
+
+ tdSql.query(" select twa(c1) from stb1 partition by tbname ")
+ tdSql.checkRows(self.tb_nums)
+ tdSql.checkData(0,0,1.000000000)
+
+ tdSql.query(" select twa(c2) from stb1 group by tbname ")
+ tdSql.checkRows(self.tb_nums)
+ tdSql.checkData(0,0,11111.000000000)
+
+ tdSql.query("select twa(c1+c2) from stb1 partition by tbname ")
+ tdSql.checkData(0,0,11112.000000000)
+
+ tdSql.query("select twa(c1) from stb1 partition by t1")
+ tdSql.checkRows(self.tb_nums)
+ tdSql.checkData(0,0,1.000000000)
+
+ # union all
+ tdSql.query(" select twa(c1) from stb1 partition by tbname union all select twa(c1) from stb1 partition by tbname ")
+ tdSql.checkRows(40)
+ tdSql.checkData(0,0,1.000000000)
+
+ # join
+
+ tdSql.execute(" create database if not exists db ")
+ tdSql.execute(" use db ")
+ tdSql.execute(" create stable st (ts timestamp , c1 int ,c2 float) tags(t1 int) ")
+ tdSql.execute(" create table tb1 using st tags(1) ")
+ tdSql.execute(" create table tb2 using st tags(2) ")
+
+
+ for i in range(10):
+ ts = i*10 + self.ts
+ tdSql.execute(f" insert into tb1 values({ts},{i},{i}.0)")
+ tdSql.execute(f" insert into tb2 values({ts},{i},{i}.0)")
+
+ tdSql.query(" select twa(tb1.c1), twa(tb2.c2) from tb1, tb2 where tb1.ts=tb2.ts ")
+ tdSql.checkRows(1)
+ tdSql.checkData(0,0,4.500000000)
+ tdSql.checkData(0,1,4.500000000)
+
+ # group by
+ tdSql.execute(" use testdb ")
+
+ # mixup with other functions
+ tdSql.query(" select twa(c1),twa(c2),max(c1),elapsed(ts) from stb1 ")
+ tdSql.checkData(0,0,1.000000000)
+ tdSql.checkData(0,1,11111.000000000)
+ tdSql.checkData(0,2,1)
+
+ def run(self):
+ self.prepare_datas_of_distribute()
+ self.check_distribute_datas()
+ self.twa_support_types()
+ self.distribute_twa_query()
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())
diff --git a/tests/system-test/7-tmq/stbFilter.py b/tests/system-test/7-tmq/stbFilter.py
new file mode 100644
index 0000000000..542894574b
--- /dev/null
+++ b/tests/system-test/7-tmq/stbFilter.py
@@ -0,0 +1,260 @@
+
+import taos
+import sys
+import time
+import socket
+import os
+import threading
+
+from util.log import *
+from util.sql import *
+from util.cases import *
+from util.dnodes import *
+from util.common import *
+sys.path.append("./7-tmq")
+from tmqCommon import *
+
+class TDTestCase:
+ def init(self, conn, logSql):
+ tdLog.debug(f"start to excute {__file__}")
+ tdSql.init(conn.cursor())
+ #tdSql.init(conn.cursor(), logSql) # output sql.txt file
+
+ def tmqCase1(self):
+ tdLog.printNoPrefix("======== test case 1: ")
+ paraDict = {'dbName': 'db1',
+ 'dropFlag': 1,
+ 'event': '',
+ 'vgroups': 4,
+ 'stbName': 'stb',
+ 'colPrefix': 'c',
+ 'tagPrefix': 't',
+ 'colSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'ctbPrefix': 'ctb',
+ 'ctbNum': 10,
+ 'rowsPerTbl': 10000,
+ 'batchNum': 100,
+ 'startTs': 1640966400000, # 2022-01-01 00:00:00.000
+ 'pollDelay': 10,
+ 'showMsg': 1,
+ 'showRow': 1}
+
+ topicNameList = ['topic1', 'topic2', 'topic3']
+ expectRowsList = []
+ tmqCom.initConsumerTable()
+ tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=4,replica=1)
+ tdLog.info("create stb")
+ tdCom.create_stable(tdSql, dbname=paraDict["dbName"],stbname=paraDict["stbName"], column_elm_list=paraDict['colSchema'], tag_elm_list=paraDict['tagSchema'])
+ tdLog.info("create ctb")
+ tdCom.create_ctable(tdSql, dbname=paraDict["dbName"],stbname=paraDict["stbName"],tag_elm_list=paraDict['tagSchema'],count=paraDict["ctbNum"], default_ctbname_prefix=paraDict['ctbPrefix'])
+ tdLog.info("insert data")
+ tmqCom.insert_data(tdSql,paraDict["dbName"],paraDict["ctbPrefix"],paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"],paraDict["startTs"])
+
+ tdLog.info("create topics from stb with filter")
+ queryString = "select ts, log(c1), ceil(pow(c1,3)) from %s.%s where c1 %% 4 == 0" %(paraDict['dbName'], paraDict['stbName'])
+ sqlString = "create topic %s as %s" %(topicNameList[0], queryString)
+ tdLog.info("create topic sql: %s"%sqlString)
+ tdSql.execute(sqlString)
+ tdSql.query(queryString)
+ expectRowsList.append(tdSql.getRows())
+
+ queryString = "select ts, log(c1), cos(c1) from %s.%s where c1 > 5000" %(paraDict['dbName'], paraDict['stbName'])
+ sqlString = "create topic %s as %s" %(topicNameList[1], queryString)
+ tdLog.info("create topic sql: %s"%sqlString)
+ tdSql.execute(sqlString)
+ tdSql.query(queryString)
+ expectRowsList.append(tdSql.getRows())
+
+ queryString = "select ts, log(c1), atan(c1) from %s.%s where ts >= %d" %(paraDict['dbName'], paraDict['stbName'], paraDict["startTs"]+9000)
+ sqlString = "create topic %s as %s" %(topicNameList[2], queryString)
+ tdLog.info("create topic sql: %s"%sqlString)
+ tdSql.execute(sqlString)
+ tdSql.query(queryString)
+ expectRowsList.append(tdSql.getRows())
+
+ # init consume info, and start tmq_sim, then check consume result
+ tdLog.info("insert consume info to consume processor")
+ consumerId = 0
+ expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"]
+ topicList = topicNameList[0]
+ ifcheckdata = 0
+ ifManualCommit = 1
+ keyList = 'group.id:cgrp1, enable.auto.commit:false, auto.commit.interval.ms:6000, auto.offset.reset:earliest'
+ tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
+
+ tdLog.info("start consume processor")
+ tmqCom.startTmqSimProcess(paraDict['pollDelay'],paraDict["dbName"],paraDict['showMsg'], paraDict['showRow'])
+
+ tdLog.info("wait the consume result")
+ expectRows = 1
+ resultList = tmqCom.selectConsumeResult(expectRows)
+
+ if expectRowsList[0] != resultList[0]:
+ tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[0], resultList[0]))
+ tdLog.exit("0 tmq consume rows error!")
+
+ # reinit consume info, and start tmq_sim, then check consume result
+ tmqCom.initConsumerTable()
+ consumerId = 1
+ topicList = topicNameList[1]
+ tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
+
+ tdLog.info("start consume processor")
+ tmqCom.startTmqSimProcess(paraDict['pollDelay'],paraDict["dbName"],paraDict['showMsg'], paraDict['showRow'])
+
+ tdLog.info("wait the consume result")
+ expectRows = 1
+ resultList = tmqCom.selectConsumeResult(expectRows)
+ if expectRowsList[1] != resultList[0]:
+ tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[1], resultList[0]))
+ tdLog.exit("1 tmq consume rows error!")
+
+ # reinit consume info, and start tmq_sim, then check consume result
+ tmqCom.initConsumerTable()
+ consumerId = 2
+ topicList = topicNameList[2]
+ tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
+
+ tdLog.info("start consume processor")
+ tmqCom.startTmqSimProcess(paraDict['pollDelay'],paraDict["dbName"],paraDict['showMsg'], paraDict['showRow'])
+
+ tdLog.info("wait the consume result")
+ expectRows = 1
+ resultList = tmqCom.selectConsumeResult(expectRows)
+ # if expectRowsList[2] != resultList[0]:
+ # tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[2], resultList[0]))
+ # tdLog.exit("2 tmq consume rows error!")
+
+ time.sleep(10)
+ for i in range(len(topicNameList)):
+ tdSql.query("drop topic %s"%topicNameList[i])
+
+ tdLog.printNoPrefix("======== test case 1 end ...... ")
+
+ def tmqCase2(self):
+ tdLog.printNoPrefix("======== test case 2: ")
+ paraDict = {'dbName': 'db2',
+ 'dropFlag': 1,
+ 'event': '',
+ 'vgroups': 4,
+ 'stbName': 'stb',
+ 'colPrefix': 'c',
+ 'tagPrefix': 't',
+ 'colSchema': [{'type': 'INT', 'count':2}, {'type': 'binary', 'len':20, 'count':1}],
+ 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
+ 'ctbPrefix': 'ctb',
+ 'ctbNum': 10,
+ 'rowsPerTbl': 10000,
+ 'batchNum': 100,
+ 'startTs': 1640966400000, # 2022-01-01 00:00:00.000
+ 'pollDelay': 10,
+ 'showMsg': 1,
+ 'showRow': 1}
+
+ topicNameList = ['topic1', 'topic2', 'topic3']
+ expectRowsList = []
+ tmqCom.initConsumerTable()
+ tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=4,replica=1)
+ tdLog.info("create stb")
+ tdCom.create_stable(tdSql, dbname=paraDict["dbName"],stbname=paraDict["stbName"], column_elm_list=paraDict['colSchema'], tag_elm_list=paraDict['tagSchema'])
+ tdLog.info("create ctb")
+ tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'], ctbNum=paraDict['ctbNum'])
+ tdLog.info("insert data")
+ tmqCom.insert_data_1(tdSql,paraDict["dbName"],paraDict["ctbPrefix"],paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"],paraDict["startTs"])
+
+ tdLog.info("create topics from stb with filter")
+ # sqlString = "create topic %s as select ts, sin(c1), pow(c2,3) from %s.%s where c2 >= 0" %(topicNameList[0], paraDict['dbName'], paraDict['stbName'])
+ queryString = "select ts, sin(c1), pow(c2,3) from %s.%s where c2 >= 0" %(paraDict['dbName'], paraDict['stbName'])
+ sqlString = "create topic %s as %s" %(topicNameList[0], queryString)
+ tdLog.info("create topic sql: %s"%sqlString)
+ tdSql.execute(sqlString)
+ tdSql.query(queryString)
+ expectRowsList.append(tdSql.getRows())
+
+ queryString = "select ts, sin(c1), pow(c2,3) from %s.%s where sin(c2) >= 0" %(paraDict['dbName'], paraDict['stbName'])
+ sqlString = "create topic %s as %s" %(topicNameList[1], queryString)
+ tdLog.info("create topic sql: %s"%sqlString)
+ tdSql.execute(sqlString)
+ tdSql.query(queryString)
+ expectRowsList.append(tdSql.getRows())
+
+ queryString = "select ts, sin(c1), floor(pow(c2,3)), c2 from %s.%s where (sin(c2) >= 0) and (floor(pow(c2,3)) %% 9 == 0)" %(paraDict['dbName'], paraDict['stbName'])
+ sqlString = "create topic %s as %s" %(topicNameList[2], queryString)
+ tdLog.info("create topic sql: %s"%sqlString)
+ tdSql.execute(sqlString)
+ tdSql.query(queryString)
+ expectRowsList.append(tdSql.getRows())
+
+ # start tmq consume processor
+ tdLog.info("insert consume info to consume processor")
+ consumerId = 0
+ expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"]
+ topicList = topicNameList[0]
+ ifcheckdata = 0
+ ifManualCommit = 1
+ keyList = 'group.id:cgrp1, enable.auto.commit:false, auto.commit.interval.ms:6000, auto.offset.reset:earliest'
+ tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
+
+ tdLog.info("start consume processor")
+ tmqCom.startTmqSimProcess(paraDict['pollDelay'],paraDict["dbName"],paraDict['showMsg'], paraDict['showRow'])
+
+ tdLog.info("wait the consume result")
+ expectRows = 1
+ resultList = tmqCom.selectConsumeResult(expectRows)
+
+ if expectRowsList[0] != resultList[0]:
+ tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[0], resultList[0]))
+ tdLog.exit("0 tmq consume rows error!")
+
+ # reinit consume info, and start tmq_sim, then check consume result
+ tmqCom.initConsumerTable()
+ consumerId = 1
+ topicList = topicNameList[1]
+ tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
+
+ tdLog.info("start consume processor")
+ tmqCom.startTmqSimProcess(paraDict['pollDelay'],paraDict["dbName"],paraDict['showMsg'], paraDict['showRow'])
+
+ tdLog.info("wait the consume result")
+ expectRows = 1
+ resultList = tmqCom.selectConsumeResult(expectRows)
+ if expectRowsList[1] != resultList[0]:
+ tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[1], resultList[0]))
+ tdLog.exit("1 tmq consume rows error!")
+
+ # # reinit consume info, and start tmq_sim, then check consume result
+ tmqCom.initConsumerTable()
+ consumerId = 2
+ topicList = topicNameList[2]
+ tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
+
+ tdLog.info("start consume processor")
+ tmqCom.startTmqSimProcess(paraDict['pollDelay'],paraDict["dbName"],paraDict['showMsg'], paraDict['showRow'])
+
+ tdLog.info("wait the consume result")
+ expectRows = 1
+ resultList = tmqCom.selectConsumeResult(expectRows)
+ if expectRowsList[2] != resultList[0]:
+ tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[2], resultList[0]))
+ tdLog.exit("2 tmq consume rows error!")
+
+ # time.sleep(10)
+ # for i in range(len(topicNameList)):
+ # tdSql.query("drop topic %s"%topicNameList[i])
+
+ tdLog.printNoPrefix("======== test case 2 end ...... ")
+
+ def run(self):
+ tdSql.prepare()
+ self.tmqCase1()
+ self.tmqCase2()
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+event = threading.Event()
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
diff --git a/tests/system-test/7-tmq/tmqCommon.py b/tests/system-test/7-tmq/tmqCommon.py
index 68adaa4126..9b23056546 100644
--- a/tests/system-test/7-tmq/tmqCommon.py
+++ b/tests/system-test/7-tmq/tmqCommon.py
@@ -42,9 +42,11 @@ class TMQCom:
tdSql.query("create database if not exists %s vgroups 1"%(cdbName))
tdSql.query("drop table if exists %s.consumeinfo "%(cdbName))
tdSql.query("drop table if exists %s.consumeresult "%(cdbName))
+ tdSql.query("drop table if exists %s.notifyinfo "%(cdbName))
tdSql.query("create table %s.consumeinfo (ts timestamp, consumerid int, topiclist binary(1024), keylist binary(1024), expectmsgcnt bigint, ifcheckdata int, ifmanualcommit int)"%cdbName)
tdSql.query("create table %s.consumeresult (ts timestamp, consumerid int, consummsgcnt bigint, consumrowcnt bigint, checkresult int)"%cdbName)
+ tdSql.query("create table %s.notifyinfo (ts timestamp, cmdid int, consumerid int)"%cdbName)
def initConsumerInfoTable(self,cdbName='cdb'):
tdLog.info("drop consumeinfo table")
@@ -92,13 +94,190 @@ class TMQCom:
tdLog.info(shellCmd)
os.system(shellCmd)
+ def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb'):
+ while 1:
+ tdSql.query("select * from %s.notifyinfo"%cdbName)
+ #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3))
+ if (tdSql.getRows() == 1) and (tdSql.getData(0, 1) == 0):
+ break
+ else:
+ time.sleep(0.1)
+ return
+
+ def getStartCommitNotifyFromTmqsim(self,cdbName='cdb'):
+ while 1:
+ tdSql.query("select * from %s.notifyinfo"%cdbName)
+ #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3))
+ if tdSql.getRows() == 2 :
+ print(tdSql.getData(0, 1), tdSql.getData(1, 1))
+ if tdSql.getData(1, 1) == 1:
+ break
+ time.sleep(0.1)
+ return
+
+ def create_database(self,tsql, dbName,dropFlag=1,vgroups=4,replica=1):
+ if dropFlag == 1:
+ tsql.execute("drop database if exists %s"%(dbName))
+
+ tsql.execute("create database if not exists %s vgroups %d replica %d"%(dbName, vgroups, replica))
+ tdLog.debug("complete to create database %s"%(dbName))
+ return
+
+ def create_stable(self,tsql, dbName,stbName):
+ tsql.execute("create table if not exists %s.%s (ts timestamp, c1 int, c2 int, c3 binary(16)) tags(t1 int, t2 binary(32))"%(dbName, stbName))
+ tdLog.debug("complete to create %s.%s" %(dbName, stbName))
+ return
+
+ def create_ctable(self,tsql=None, dbName='dbx',stbName='stb',ctbPrefix='ctb',ctbNum=1):
+ tsql.execute("use %s" %dbName)
+ pre_create = "create table"
+ sql = pre_create
+ #tdLog.debug("doing create one stable %s and %d child table in %s ..." %(stbname, count ,dbname))
+ for i in range(ctbNum):
+ tagValue = 'beijing'
+ if (i % 2 == 0):
+ tagValue = 'shanghai'
+
+ sql += " %s%d using %s tags(%d, '%s')"%(ctbPrefix,i,stbName,i+1, tagValue)
+ if (i > 0) and (i%100 == 0):
+ tsql.execute(sql)
+ sql = pre_create
+ if sql != pre_create:
+ tsql.execute(sql)
+
+ tdLog.debug("complete to create %d child tables in %s.%s" %(ctbNum, dbName, stbName))
+ return
+
+ def insert_data(self,tsql,dbName,stbName,ctbNum,rowsPerTbl,batchNum,startTs=None):
+ tdLog.debug("start to insert data ............")
+ tsql.execute("use %s" %dbName)
+ pre_insert = "insert into "
+ sql = pre_insert
+
+ if startTs is None:
+ t = time.time()
+ startTs = int(round(t * 1000))
+ #tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
+ for i in range(ctbNum):
+ sql += " %s%d values "%(stbName,i)
+ for j in range(rowsPerTbl):
+ sql += "(%d, %d, 'tmqrow_%d') "%(startTs + j, j, j)
+ if (j > 0) and ((j%batchNum == 0) or (j == rowsPerTbl - 1)):
+ tsql.execute(sql)
+ if j < rowsPerTbl - 1:
+ sql = "insert into %s%d values " %(stbName,i)
+ else:
+ sql = "insert into "
+ #end sql
+ if sql != pre_insert:
+ #print("insert sql:%s"%sql)
+ tsql.execute(sql)
+ tdLog.debug("insert data ............ [OK]")
+ return
+
+ def insert_data_1(self,tsql,dbName,ctbPrefix,ctbNum,rowsPerTbl,batchNum,startTs):
+ tdLog.debug("start to insert data ............")
+ tsql.execute("use %s" %dbName)
+ pre_insert = "insert into "
+ sql = pre_insert
+
+ t = time.time()
+ startTs = int(round(t * 1000))
+ #tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
+ for i in range(ctbNum):
+ sql += " %s%d values "%(ctbPrefix,i)
+ for j in range(rowsPerTbl):
+ if (j % 2 == 0):
+ sql += "(%d, %d, %d, 'tmqrow_%d') "%(startTs + j, j, j, j)
+ else:
+ sql += "(%d, %d, %d, 'tmqrow_%d') "%(startTs + j, j, -j, j)
+ if (j > 0) and ((j%batchNum == 0) or (j == rowsPerTbl - 1)):
+ tsql.execute(sql)
+ if j < rowsPerTbl - 1:
+ sql = "insert into %s%d values " %(ctbPrefix,i)
+ else:
+ sql = "insert into "
+ #end sql
+ if sql != pre_insert:
+ #print("insert sql:%s"%sql)
+ tsql.execute(sql)
+ tdLog.debug("insert data ............ [OK]")
+ return
+
+ def insert_data_interlaceByMultiTbl(self,tsql,dbName,ctbPrefix,ctbNum,rowsPerTbl,batchNum,startTs=0):
+ tdLog.debug("start to insert data ............")
+ tsql.execute("use %s" %dbName)
+ pre_insert = "insert into "
+ sql = pre_insert
+
+ if startTs == 0:
+ t = time.time()
+ startTs = int(round(t * 1000))
+
+ ctbDict = {}
+ for i in range(ctbNum):
+ ctbDict[i] = 0
+
+ #tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
+ rowsOfCtb = 0
+ while rowsOfCtb < rowsPerTbl:
+ for i in range(ctbNum):
+ sql += " %s.%s_%d values "%(dbName,ctbPrefix,i)
+ for k in range(batchNum):
+ sql += "(%d, %d, 'tmqrow_%d') "%(startTs + ctbDict[i], ctbDict[i], ctbDict[i])
+ ctbDict[i] += 1
+ if (0 == ctbDict[i]%batchNum) or (ctbDict[i] == rowsPerTbl):
+ tsql.execute(sql)
+ sql = "insert into "
+ break
+ rowsOfCtb = ctbDict[0]
+
+ tdLog.debug("insert data ............ [OK]")
+ return
+
+ def insert_data_with_autoCreateTbl(self,tsql,dbName,stbName,ctbPrefix,ctbNum,rowsPerTbl,batchNum,startTs=0):
+ tdLog.debug("start to insert data wiht auto create child table ............")
+ tsql.execute("use %s" %dbName)
+ pre_insert = "insert into "
+ sql = pre_insert
+
+ if startTs == 0:
+ t = time.time()
+ startTs = int(round(t * 1000))
+
+ #tdLog.debug("doing insert data into stable:%s rows:%d ..."%(stbName, allRows))
+ rowsOfSql = 0
+ for i in range(ctbNum):
+ sql += " %s.%s_%d using %s.%s tags (%d) values "%(dbName,ctbPrefix,i,dbName,stbName,i)
+ for j in range(rowsPerTbl):
+ sql += "(%d, %d, 'tmqrow_%d') "%(startTs + j, j, j)
+ rowsOfSql += 1
+ if (j > 0) and ((rowsOfSql == batchNum) or (j == rowsPerTbl - 1)):
+ tsql.execute(sql)
+ rowsOfSql = 0
+ if j < rowsPerTbl - 1:
+ sql = "insert into %s.%s_%d using %s.%s tags (%d) values " %(dbName,ctbPrefix,i,dbName,stbName,i)
+ else:
+ sql = "insert into "
+ #end sql
+ if sql != pre_insert:
+ #print("insert sql:%s"%sql)
+ tsql.execute(sql)
+ tdLog.debug("insert data ............ [OK]")
+ return
+
def syncCreateDbStbCtbInsertData(self, tsql, paraDict):
- tdCom.create_database(tsql, paraDict["dbName"],paraDict["dropFlag"], paraDict['precision'])
- tdCom.create_stable(tsql, paraDict["dbName"],paraDict["stbName"], paraDict["columnDict"], paraDict["tagDict"])
- tdCom.create_ctables(tsql, paraDict["dbName"],paraDict["stbName"],paraDict["ctbNum"],paraDict["tagDict"])
+ tdCom.create_database(tsql, paraDict["dbName"],paraDict["dropFlag"])
+ tdCom.create_stable(tsql, dbname=paraDict["dbName"],stbname=paraDict["stbName"], column_elm_list=paraDict['colSchema'], tag_elm_list=paraDict['tagSchema'])
+ tdCom.create_ctable(tsql, dbname=paraDict["dbName"],stbname=paraDict["stbName"],tag_elm_list=paraDict['tagSchema'],count=paraDict["ctbNum"], default_ctbname_prefix=paraDict['ctbPrefix'])
if "event" in paraDict and type(paraDict['event']) == type(threading.Event()):
paraDict["event"].set()
- tdCom.insert_data(tsql,paraDict["dbName"],paraDict["stbName"],paraDict["ctbNum"],paraDict["rowsPerTbl"],paraDict["batchNum"],paraDict["startTs"])
+
+ ctbPrefix = paraDict['ctbPrefix']
+ ctbNum = paraDict["ctbNum"]
+ for i in range(ctbNum):
+ tbName = '%s%s'%(ctbPrefix,i)
+ tdCom.insert_rows(tsql,dbname=paraDict["dbName"],tbname=tbName,start_ts_value=paraDict['startTs'],count=paraDict['rowsPerTbl'])
return
def threadFunction(self, **paraDict):
diff --git a/tests/system-test/fulltest.sh b/tests/system-test/fulltest.sh
index ee946caf53..0e7c4673ee 100755
--- a/tests/system-test/fulltest.sh
+++ b/tests/system-test/fulltest.sh
@@ -108,6 +108,7 @@ python3 ./test.py -f 2-query/distribute_agg_spread.py
python3 ./test.py -f 2-query/distribute_agg_apercentile.py
python3 ./test.py -f 2-query/distribute_agg_avg.py
python3 ./test.py -f 2-query/distribute_agg_stddev.py
+python3 ./test.py -f 2-query/twa.py
python3 ./test.py -f 6-cluster/5dnode1mnode.py
python3 ./test.py -f 6-cluster/5dnode2mnode.py
@@ -130,3 +131,4 @@ python3 ./test.py -f 7-tmq/subscribeStb4.py
python3 ./test.py -f 7-tmq/db.py
python3 ./test.py -f 7-tmq/tmqError.py
python3 ./test.py -f 7-tmq/schema.py
+python3 ./test.py -f 7-tmq/stbFilter.py
diff --git a/tests/tsim/src/simExe.c b/tests/tsim/src/simExe.c
index f97a13d2c5..aaad76bb53 100644
--- a/tests/tsim/src/simExe.c
+++ b/tests/tsim/src/simExe.c
@@ -39,13 +39,26 @@ void simLogSql(char *sql, bool useSharp) {
char *simParseArbitratorName(char *varName) {
static char hostName[140];
+#ifdef WINDOWS
+ taosGetFqdn(hostName);
+ sprintf(&hostName[strlen(hostName)], ":%d", 8000);
+#else
sprintf(hostName, "%s:%d", "localhost", 8000);
+#endif
return hostName;
}
char *simParseHostName(char *varName) {
static char hostName[140];
+#ifdef WINDOWS
+ hostName[0] = '\"';
+ taosGetFqdn(&hostName[1]);
+ int strEndIndex = strlen(hostName);
+ hostName[strEndIndex] = '\"';
+ hostName[strEndIndex + 1] = '\0';
+#else
sprintf(hostName, "%s", "localhost");
+#endif
return hostName;
}
@@ -399,7 +412,8 @@ bool simExecuteSystemCmd(SScript *script, char *option) {
sprintf(buf, "cd %s; ", simScriptDir);
simVisuallizeOption(script, option, buf + strlen(buf));
#else
- sprintf(buf, "%s%s", simScriptDir, option);
+ sprintf(buf, "%s", simScriptDir);
+ simVisuallizeOption(script, option, buf + strlen(buf));
simReplaceStr(buf, ".sh", ".bat");
#endif
diff --git a/tools/taos-tools b/tools/taos-tools
index 28a49b447f..d3c29fb492 160000
--- a/tools/taos-tools
+++ b/tools/taos-tools
@@ -1 +1 @@
-Subproject commit 28a49b447f71c4f014ebbac858b7215b897d57fd
+Subproject commit d3c29fb492514cbaf08cb533976121bff5d94dea