diff --git a/docs/en/10-cluster/02-cluster-mgmt.md b/docs/en/10-cluster/02-cluster-mgmt.md
index 674c92e2766a4eb304079140af19c8efea72d55e..bd3386c41161fc55b4bedcecd6ad3ab5c35be8b6 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 bd718eef9f8dc181628132de831dbca2af59d158..9780e8f6c68904e444d07c6a8c87b095c6b70ead 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 f651983528ca824b4e6b14586aac5a5bfb4ecab8..54dc1062d6440cc0fc7b8c69d9e4c6b53e4cd01e 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 b4254c428b28a0084e54b5e3c509dd2e0ec651b9..1add8522a712aa2cfef6187e577c42d205432b66 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 cebfafa225e6e8de75ff84bb51fa664784177910..e74c9de7b2aa71278a99d45f250e0dcaf86d4704 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 4d8bed4d2d6b3a0404e10213aeab599767325cc2..d7d472eb98a22325e850f4f040dccaa34d02bbff 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 5f6e3b2aeb6c27bbcc5f9dd7fcd89af3431e2f25..961eb6c93ad51ba785a9075c2e026fa20f7a8446 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 1eb73b503c00fba7947f998a1810e7d9cbb2edcc..a6b32ee2393c85ae60c87edbc800991cec5230b7 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 340cb9893f6077413a944ce479eaf2a72cf1b4da..50ccae512db144172021d5f925adf5f970ffcc7d 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 907798d19da4aadfd73bfa0c74390aaaec34f701..bb5e903d1e6391d2ec6c80216a2bbf9f1b715d73 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 28f97d10285d0f620ef919db9e691c98e3a28197..c691c2f7b217811b60fcd5bc4249d9ad5441b79a 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 0c720138bd55d9b1c6fcc1bb08f2ec9717609315..20f4765190bb434c363c8cd2d2e35a7c0716bdfe 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 cbaff29cb2de5ab4e93d39caa1cd89810fbdddde..1f314d19e7da4863f8ec7ab3e2d2f45169b9babb 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 4578087164be768067df842c341d861241a1d78d..10c3f313a2c5e59f5bd297480bf37b368b8a7743 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 58e2393970089e49b71f3ab616da9f5893e007de..26a100bb1bf3d9ea0d591b52e1fed31e6296a5d8 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 aeaeb12bc3e723ea1542c7593c66aa82b5cd3f56..86b663ca450a1d7de15807636e4802e0f0b3d728 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 3191d0c8ebae730a167a804b2ef15f299e8ed805..f58ccde335274cd466fba2163e88fc73ac099893 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 d562d07d776052d9e6a797da9adfe507e05ccfd3..26f27580337b690f7a41d63124ae6fe1bfd70179 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 e963f25616cc92ebb64a75c9de6daecca50c8116..2cb0c65d35470970a970b0712f565bad261aa826 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 949c15ed0d7c7a4e4c317edaace21f29a9eaab36..965ec61671925dd4d9e22e07a58826d47ecd9ed3 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 e695a9e282ba7943136d4667089cfda47e847812..eb68f52a40366057a76acc11c17a4f661c2a95cc 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 c5a8b95a08cc37e4d665e01f5de01eca97b16087..5304dba741ddaa95b4d03148938711eeef65810e 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 af82e29ec500aec1d5519d59cb5f184bf736d0e4..ef266068cbaff046ec6ebcf0bf02d0b44ee9d3a2 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 d48995418e530646e8ef540bfb0630fc90cd9636..ded9dc37d7163f833b5f6959656617c7533b195c 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 f07705ff442b65f1295431e59b48ef50a76cadc0..d730cc0d8af8e3db0c16e4609138c0f63ac5329b 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 31cb5e87b99a5ac61fef740bb8c9393c032ef75a..6726b3fe2da1bee3d7f35e2550fa4e23352cfc78 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 6a75613fa4312ca6cd19aa3dc3e0eb195be764a7..191bfe088abd203e543d6a9042bc9193434ff48e 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 6fa4e6bffb35c11c4ae04f435dc34a67baddbb24..7d2bf019d2f7a35aad42aaa6ae3405f89b26d5ce 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 fffb03d9a5d7c797174daaad1b72ebb7dd444868..832564e0dbe8a2914a6d1cc852919282b8c44ba6 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 bc46da14e55485ebada0c26f8bd6e17c3b367933..d5843f699ffaccd1a031c2dd012c7386d190041b 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 7e9ce34f9f000c8d52dccd3fe11d879ee1cd1650..a8f8ad00e19e6e5b3d88968d4c9b8761b83447ad 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 fd055135799a5e508ec535b43d46e9246c8d644e..ce454d439d9590c1068206eaab94f07ec3e86a16 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 89349d2de931fd02e729733e258c4b19d2351438..474e6ab37890fc01d253089755cd9267d8b081cf 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 32477febebcf35f851f9a915022ec6358ba27b79..7f3f76b4b60c95aa0adb493bba4f9af70ef9b954 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 c2821669f07fa310932f4b9573f46a991b99ea96..d9502ec8f34d73eab7c0870f15756349e9b167d4 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 71bbc8ddd43aaf6583bcf4758ca018fe798108d4..5e1ef23f1c7819d524f99e72485e942a13ee9ecc 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 660f512fc520c5657d12c0db11aae58085defc9f..4761e3dc366886b8c5423776108d34bfc332c512 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 7897f62f62ec9dd99b27568e6c7f4a74ac6463ca..01958aa05355e489371679c56f74d73bf2f2db0b 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 6ef94481ea8edd66317f4d2a7b01bc3234ccd4d9..21d9351cebd8759e80095f18d98743d9bd103366 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 3e4cb6a64d737befb98ed19fbfd983e3a60aab39..0605e3a69e8630c6a0c091110252775d8880547c 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 43d934c43101161bc63a487c644a5f6f3b218348..b10d92ee3de1a0e06d801c9a8840751a9f52f37c 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 c810a0cbc75474154c9f19b5872656bb7fc2dfbe..58266724a5278d0baafcebd70f9d33423c6cd1cc 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 19f60229f926583f321ab350f6ac6043f6c9b096..87b4626e83fb400e45083ea5d3380dee0f543c75 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 3e38565a4fe67b93d8ba8b9d30160ce54b13dee5..17615500c47abc2ea0dcad21b5a70ec8a1310892 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 180f18a6ddc68a5cd93987714c3d2b42349a529f..ec7bb02ca7cd86ad5f677fa229f7a575ace6086a 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 58c3570c3631ec0ceee76163d4afd50e047245ad..8d068689559c4d4dfa85ab0c1b3cf9b354ef2674 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 c9bccaf1d02117dc43a7c631605543243bd6bb3b..45fefaf87008ac8bc27935fc01bef0059265c8be 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 ef82d1131cad05fc67e8bfbdefa174d45d01f25b..675a3aa03fc0f2ab75087a877b75b72c84cd7640 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 d7b2e3ec24a89c0a4576753f1e6343cffff9ce02..7056337c8d6d84997f622eac898ffe8e4980898f 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 fd80679316ad4df7dbcac44e636bb29f42c1800d..832e328d962479f739004ae765171ddfeb71aa2d 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 f5625f32d5a73af783dc0172ba949cc6d4532462..0a6c97e63c8e9af36bd6d91b4d05445f77a82db3 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 12188a3b3a08aee7bdae08b202c3563106ee35d1..df1330197a7b98ed85e047fbc7522c87dac5e19f 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 3e50ea8262045795cc0e8b28c7e5aa967713aacb..e04662d22beac273dbe153f269c2a41483ea67b7 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 8666739dab0d4e45cdcb0f5eabe2d4f3804dd4f3..e3358b41df07b75d3a1624bbd13f08645b1d66d7 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 de6a44d456c992defcdbae39d97b260b471e43a6..eec108414e352377cefe88c3bc28ee3df6cb552a 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 94ddbcd409c8ef4b1ad6bf8d97bda63edb63ea92..696e714a8cb58abdff44b08e8ea7d76de15ece44 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 47c4a4ed0fe982c64ed8358f66e6d9d0ee6e4f8b..ff4a9e4ead5511b3c876522f2103b429f30da4ed 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 9339402d4300c9271017110f5b0da4a4c672bf05..32be479116c30e6e4023baa1bccaafdd1efdf22b 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 b628f0dde5347b2a482bb618c77017c1753a60bf..ece66d30fbe19ea06b014636d572eb17214b65b3 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 ce73246e51adcb3906b16a56084d44cf2fb0bed4..19d7c2b03d01cf05cd528cce7f84d8440f5161d0 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 2333a93ce094e000b725e4df917d7b088f4cc4e3..32d183ca0ad44438d28d40a234fd7dcd5cf8d0c3 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 b5a2da091ff0113037964494a591a58ce8b072c7..e764aba48e4188430cfc67c3f2844689b077b089 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 7c90c3538cc3428d6c6456c8c67f9acb4818e82c..98a03aa39bfd82e508d16f33edbc959ad3b53bb5 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 ce2456d8c35fe8e851406456c7aa7ac4d6ac97d1..44730cd3b533283ab9d914b691adba0536c70585 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 6adadf50455950e5d49bf0a5a9e178673c6fcf6b..df986fd4d6474aea96e34eda5ddf39407f838c2d 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,40 +350,32 @@ 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));
- }
+ // 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));
+ }
- SName* name = taosHashIterate(pTb, NULL);
- while (name) {
- catalogRemoveTableMeta(pCtg, name);
- name = taosHashIterate(pTb, name);
- }
+ for (int32_t i = 0; i < pJob->tbCfgNum; ++i) {
+ SName* name = taosArrayGet(pReq->pTableCfg, i);
+ taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
+ }
- 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);
- }
- }
+ 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);
ctgDropTbIndexEnqueue(pCtg, name, true);
@@ -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 1de5ee3d7d9ea6c3ce24b6890e12cfc0cb9c75d8..eeb627624b5b0eabb34df92f4362c0c1ddff18da 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 fa1a26283286d01cc4574c4babbb28ad5fb36996..81dabffb4e7d1bf82e87a111267aaf03841fc9bf 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 476eb371b057e27a2420dd6b35582b58db8aca72..8635457dfe50a5f509f8fc981d29927d4601f6fa 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 6a3852abbcc4ee84e423790821d6d7ab5afd2baa..778742b0fa042884e62cb244d102a00a7d55460f 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;
+
+ 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));
-static int32_t execShowCreateSTable(SShowCreateTableStmt* pStmt) { return TSDB_CODE_FAILED; }
+ 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 ae0f669d656a458a310339e461ad2e55918ee211..2d55b06f064ca0023c551f8718a44b69d1996f8a 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 0ceb2e8aa1917d08b6dc109c0674d810023112a2..8fc4c262b77174a2502b682c5b3490d4ce207936 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 363f379ee471e9d9d604784f1fcd24880b4ae3e7..35bdd4ee554e4a1af7b040293909000d77f2fcdd 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 40e85613b2294df79dd900d05787453ab3a32397..cfad21eb0890d6cbfe57444cba3f4afe4942246d 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 8d5c48f6cd459e47ba5566eaa4f196d118fb484f..3a8a8653b531277633593a23e23ba305a5c4fd29 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 4f4fa33830840c88f7e72eb7469ad799dc1fc19a..b36385272506f0ccdbcf9c45fb2529d679453a53 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 9d13276e6d68d2aaf380d0ac3111c2214c6f0e75..97be4645a8030741644f9c8fc84cc270a0ecad9e 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 63285daa3a068fe3e66d39690c7bacf423cb758f..3ff45d7237cee7c9f7c09cd01a5df8928bdcd6a4 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,27 +3746,298 @@ 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);
+
+ outputMergeAlignedIntervalResult(pOperatorInfo, tableGroupId, pResultBlock, currTs);
+}
+
+static SSDataBlock* doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) {
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ SMergeAlignedIntervalAggOperatorInfo* miaInfo = pOperator->info;
+ SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
+
+ SExprSupp* pSup = &pOperator->exprSupp;
+ 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, 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);
+ }
- outputMergeIntervalResult(pOperatorInfo, tableGroupId, pResultBlock, currTs);
+ 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) {
@@ -3776,11 +4045,12 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
SMergeIntervalAggOperatorInfo* miaInfo = pOperator->info;
SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo;
+ SExprSupp* pExpSupp = &pOperator->exprSupp;
+
if (pOperator->status == OP_EXEC_DONE) {
return NULL;
}
- SExprSupp* pSup = &pOperator->exprSupp;
SSDataBlock* pRes = iaInfo->binfo.pRes;
blockDataCleanup(pRes);
blockDataEnsureCapacity(pRes, pOperator->resultInfo.capacity);
@@ -3795,6 +4065,7 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
} else {
pBlock = miaInfo->prefetchedBlock;
miaInfo->groupId = pBlock->info.groupId;
+ miaInfo->prefetchedBlock = NULL;
}
if (pBlock == NULL) {
@@ -3811,7 +4082,7 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
}
getTableScanInfo(pOperator, &iaInfo->order, &scanFlag);
- setInputDataBlock(pOperator, pSup->pCtx, pBlock, iaInfo->order, scanFlag, true);
+ 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 581935514e20fb0b755ca03439f5053d14f70469..1dd72fd83fb080749a58e47aba22e0b461f47e5b 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 076ae6146021b33179eb2271086c4b5a613176fd..1164b962624c94af6024808e2de6438553d14be1 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 710b01ce59eb04573ed3ec9befe3046f1876df4e..5fcf5e239cc28d639eb2655d8d121c158d2cdec7 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 f6ae027e48cc01a3d098d25156de168365abd04a..f6370be6f4ad8a128990b161d760526b87ce0a00 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 04d7e04b30848329c9edfda3d569d7aa0d225f5d..d6d55c6be0ce50bb148450cba3be999ec2ae9f49 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 99b49f97bd13b57a47a0e1160fdbfd0b4f9e1717..383d47e9c1ee053831e593f5994b560c55931073 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 101edbd38de7d3c10103c9fc685da300e2d05cde..05eaa88a83c505efdd9ec6de3b5c553935f6241c 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 9b634d68d599e0f7bd9b8bf8f0882e5650725454..5c5c62d915f1b6cc2fad4aafca4b2f1c3746e44a 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 0a7a203e2391b618cfa50711e059102834ac521d..54fdf4acfe53fdbc6d75484d49ea0ceed9936b03 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 e08f813c194a101f129b59677d65a405049505f6..d06d6ec52724a397f3c279f1685f3b96c96dfdfa 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 54c46ecb5dcf06d1f9f3264820e0265580d36504..16a78712edcd1df4741cea1e0be65114520f250e 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 131eccae247265b4c7e7d94f041031453f3b92a4..46d2ae838362f4cc1ee117803af95629da5880f0 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 22d7afd6424a291e397a5a206f822ddadd1e2bc8..0dfc79269e9a47bf7af13521a36c1e0073015f20 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 c8b78fcc8bf6acfc242a975014ef2d11b38c4d23..5d34250444d88f64df4de049e77dd33dfb709558 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 1689fbd5dddce1fda845b833ddf5ad431e3e1e43..30c67b958cab03a73c87725818e692efad85a333 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 51e0dd58d88e6bec9337deff629858578d6a72b0..b474d95b3c68d11194d6b5b58e1dfa60aad5ee63 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 c7651137b1d7f8d5dc219790797394978fada021..330cf67b222d5573fbadd171101502cf25a5e5f9 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 0213a3a8542098381c52d56f70029fe3d830461b..8802f91bdf5d164f6ce5a39c09eb6eeff475599f 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 7915c32437323be187bc4510a5a25147e7c31b67..1f7657146b76fcc01d136c6f801bf54a593e7a9e 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 11e09cd83d89f5ba02df18f5a439786ffe6d83c0..e7ab1cb61b2281ed3cf65dc5d5742e4ff1c80be1 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 1a68e8087201a0f7cbd46fc622321bb21d602c36..81a09114e3343c35da1cd972ef8f0ae63bb592a2 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 46ba9aca7409cc7dd279cd2c595697b963c0655b..9dbd49e66c82e196d1277d6237cc7a6a9bcc9159 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 de6edea222c40f36b0a93ccbe55e0fe056b7fd34..7e5424b7c62d74525e2884c62605fd30b56a6fcc 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 b5a4e4b81f300b67312d0a39490e8225480aaf7f..5f8fd4ac4ead1bef6f3017d8a1deb90a8121e04b 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 390d665760bcda5d5fd0acfecad27ca3bb82193b..f0e0e84bd9bf88ece3575bf905c05416f26cf0d9 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 f74c7df355ad74b1db1192caf83c60fca7673f79..790c418b17a307a216d7b21735221ceb811e8710 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 12d14369dedb0b5e5823d52454182148855e3ad2..b8963c29f986823057f7f8e38919c56f3bfe2967 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 2120d24d2612e804a16827125cc7356449dd0d70..c807c1c4cdaa0e958df0842358a741e5ef73ddba 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 b89c220519c60c3c3b67cc10f001ff3447448bbd..e2dfd9682bc6426f73c81eef3027696a2bd96394 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 2369779105f06685be2120907531ee0a32869c84..d335b04ea474bb41e4d09c89b946866e8b919f30 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 999147eda4ef34774c80e8f6cd898292da19e379..1bd0671fb5515d901a4271f39d1e9f05131d868d 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 d2726201cceb50c910e0cebfff23322c6747a1ef..c51cbc05132e2b4fc253ad861cab50f7d28b4167 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 7b342cdcff5b9990ff3825eaca58f5f68496d7b0..f13a3604dab1e776583164c0315b243a6a766665 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 ec3e1ab2baf94deb6153f3f0b69b067e05f33a92..c92edae381ae631cacb2b2dfd20c25e8f46eb4c9 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 fdebbe3990f32efed4b5e63a07dcc50ad2666fd8..e0f2b0fed2fb7b2c5dffccdd05db6095dbf72c71 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 c92af0dd427f3af746da8d6876e9df127cf10990..fb0bfb8bef318c2f8d2d53f12cfabcfa4fb30ef2 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 0b5a9685c0e86de847fbf2d4e6cc180650872ab1..038c36c417e5586ff144d173cf42fa7094724a94 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 2827fcc12f4f0dfbabbfd18b3d6991fa5d783d90..5b432aeec4e214a7c79106934965012d1b162b02 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 b520629e15ac57f762f2da5ed6db086017f3a215..da6d869611661bf0684fc1e2095651e587501768 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);
+ 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 454609009c8ecd3dfee235c5ea87ecd2a49c0fe2..119a178893ab66bb3b3edd5fec89389e139fabaf 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 7d020f68927dec517ecf9e71e7a32ef5196fc36d..2cc1eb023991e1b31d4b803fa5845fc284147054 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 05a2dbaa3f36b00cd9202844d65f97f022ba22ae..ff334a76bb67811cc99d465415f15a60b69d54d6 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 79d9b329c10bf8e2fc6db6ee7865bd31fbc764ae..0f6e8a28d983a2064d756ab49f82f58461139ea7 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 52e815292607d69e7d364f6a11c31c184f07914a..a1ab95c00fc3d07b57b86fca79b19c8a1048aef3 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 f044ae5733aa7714af208fe9c4208859206ac35e..d6e6fbe52250f47160b205e0a6e7f2d2e6d40486 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 9ed7f00982720e4cf4720645e3393bb6d8c84af4..def5c321ad4f29b316ef1ed6597e9cd2ca29adc1 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 5d041cefcd62eba0593f1bc19ec17da805a43cb2..60963d0dd3b3bd4f7ce18de1a6746fd446306851 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 354575d29e6be2b4abf5a88743572c869d3344f7..48c1b70a04e965145027912c5cbebf6e339cd670 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 68185131d1ff0a2161a729ca1b4b9f7a65007016..ff3dc56f715fd69b0adc0615f826d4797cee4688 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);
-
- SRpcMsg rpcMsg;
- syncEntry2OriginalRpc(pEntry, &rpcMsg);
- SSyncCfg lastConfig;
- int32_t ret = syncCfgFromStr(rpcMsg.pCont, &lastConfig);
- ASSERT(ret == 0);
- pSender->lastConfig = lastConfig;
+ int32_t code = 0;
+ SSyncRaftEntry *pEntry = NULL;
+ code = pSender->pSyncNode->pLogStore->syncLogGetEntry(pSender->pSyncNode->pLogStore,
+ pSender->snapshot.lastConfigIndex, &pEntry);
+
+ bool getLastConfig = false;
+ if (code == 0) {
+ ASSERT(pEntry != NULL);
+
+ 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;
+ }
+ }
- rpcFreeCont(rpcMsg.pCont);
- syncEntryDestory(pEntry);
+ 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 1d1ff7ae53682b3b47badc7e04084de89463b2f3..5b73d980c4088966cc56ef0d58e2a097920bbee5 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 528c2f26c85c17f33f0a783def69ef9f26798b1b..d6c2cbd34e3d90935bc651fac54a697b2e9bbc4e 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 2057aa23a4d07e492a70164017b5111b434218ff..27084286da53dc68c9346af9b5c5c00fa0dc28f2 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 0000000000000000000000000000000000000000..80679bc85c4067fef291dcc583b727f1f3e909c3
--- /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 32ff441a6f43fdaf8cce260473ebb89d635348c6..bd6fa7c2c3c5616b206540e63e0b52821608691f 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 45e71f6c0dd706117549b9d0a54aa2a9be675be4..1c924fa636cbcd30064315825b92a9181d9f3ae2 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 a74bb54883fe3e8d4ab344e80d3cd4b01f2cb525..dd3f09d5d2de800773b2f444c1876c9679aa6982 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 1575f9f206d3dd6b77eec6e61a5840e47efedc4b..f1bfb4eabcc2f899c00ae4627177f154de6c140e 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 4acb83c8e4aa514dfce03f6d5cd8697837025591..9021e08ffe590a215404f846a70cba6ce19183ef 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 39b5584fab86f1b2ce1c15478c79eb71f924562e..c914e098f7afd55ea2cfda2c5c7c5465fe97ff50 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 c518e8efcc2e372af9a3e4cce09c5a320035fc88..fe97f9c98622acea963a3204066f80217f06c4c9 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 146b127422345e2989a2c644e60aa2065b7ac8c5..327fe50814505259baaba21ec8c2a16d40ea3f18 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 9947ba803f4d22e3b2264338c487990c584c8eed..121939787cc0e9c35adcc357c376e710f6f156bd 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 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)
+#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)
+
// clang-format on
#ifdef __cplusplus
diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c
index 912c8b59c211413e4ee49ac5074585d734457278..bf03ea26ba8d05226b23e80e8a40d4816e0105f2 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 f9558d7252ceabfd6514f53665baefa60dd2ef23..593a790a2121f12d30e17ee0adb1b5de9c21ffb7 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 e940191ceafe7688f606df47114920360e16dad0..9bed6d230bcd227317075c1894462b1d805d270b 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 8552ccac2c66600ab851fb9770887f6e8a431c78..d2fac72c77dc55a1c9e7c087d1af8f78dc466409 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 041aec4054761b52e926f874401f9acca5bfb27f..38613a77e6c4bf7729d523fd5acbab93e8e366d9 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 185daf9e45e70c86729b467563625677c32a5e07..2267c907833a7826c322996dd61cb3dad8cff518 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 66a73ac92bb5660a00c358014b4b317acad6f40b..b89e908df7d4907f9412b06d99d17216742266dd 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 98762d8fb0e4b48907910e6a7e154ed524f57262..8275072748123a4f4fa28b0e8401b967b0d2b099 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 0000000000000000000000000000000000000000..4cef926f2ef74e72ed371bea85e2e385db6aa2a7
--- /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 e158f8edd2e30386afad73f688a25c0f7c56fc46..b43f87be29d86c06ac422cf86b05c7e086f8cff4 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
-
- 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
-
- 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)
+ # 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
+
+ # 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)
- 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
+ # 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 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 0000000000000000000000000000000000000000..939f53154aebbfee22cf5d49cae13ae002fab879
--- /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 7dd7621d0b429caeb2e54c0215b29c4a0b396124..0e7030b230cc73ba2a79222ccdeda03ac02160f9 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 276b5e6e34cdcfe06df82eb03214262293adfd1d..1ab64917367f374af31ac11f8646849834b2d457 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 cd8ba0ff15c135bdf845af57e39d5085c0fbcb20..d623adacf941e26d0de74c0c582beb7ca83c9c13 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 23d217444892e5bd8dc1c83b569dc22616c42e78..2a862c0464497536ff1e004fb8db87d41c8d32c8 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 921f1611fb5ea80bbeb746b693d7c529c421ef27..f0d8c10b7e32ca51342a4bb548fd8332e4d5c350 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 6651c7aa8f726d5d42d52a4c8f3a9395e7a12151..7a2c58fc66e5b61ce3449f3dcfacdec22612b449 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 02979203617cf9da2b8e5b18bf326b56a45734d7..d6eea5d291c4add6bd40ae36492a1366c67f2cfd 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 fede960a6ae1709f8fc267856b2a243f6dd349f4..f24e32279d9e9782af547891a2bc7376c723b276 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 efe7ff99cfdd7bfb79c614dbaafd021b004cdfdc..3979ef1ec1a82ec822d6ac6724046c70037b98ba 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 1dbec2c04d0db3974a55cf7bccb757dc99f35016..16cd2bb3b0a6eb5537c9461611feefa3c2a51b00 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 0000000000000000000000000000000000000000..15ad13b6fa4208d4cac3eca5ad5427328d09ea6b
--- /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 0000000000000000000000000000000000000000..35a246629789a629b86a75ce7702097c174fd832
--- /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 0000000000000000000000000000000000000000..6641ce053ccbf5bdd10984793acd699050207fcd
--- /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 0000000000000000000000000000000000000000..63639877ee6108f1a6f9a337a4eb3b560b70c479
--- /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 0000000000000000000000000000000000000000..91679a7e812bf66201dbb06223cf715c290e4bc6
--- /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 f23d75d78b432d5f69391b18a5bb0318e93af08b..94ca2f6550c2c52f42ffebe96fff94621686e8ff 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 f730f2fb676e32fa0652a9ef4f6dfe2e250b5430..d4d158ede0b9d0023246095f7797e89a6863b87f 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
-
-sql_error create database d2 vgroups 2;
-
-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][2] != redoAction 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_error create database d2 vgroups 2;
-
-print =============== kill transaction
-sql kill transaction 8;
-sleep 2000
-
-sql show transactions
-if $rows != 0 then
- return -1
+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;
+
+ 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][2] != redoAction 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_error create database d2 vgroups 2;
+
+ print =============== kill transaction
+ sql kill transaction 8;
+ sleep 2000
+
+ 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 9ed58a90d1ba6bd781d306070e03f56b75984093..1aa27202c6a0b3da4da01741d8f2ba67de39bfef 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 a84d93404a9f082ffa85c50d1eb8c015309308ec..33ef7e65db0fbb3d40730f9cc012fd5d0d7b9d15 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 83f535856ee8b9456d7759128063d5149df82ea1..86e201ea9a6cdf1d2e0cccd8904cbede19b41282 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}')
+ 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')
- 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")
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 0000000000000000000000000000000000000000..b400e503d9b7197718c3cd7feb09a8a7bac8b6a7
--- /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 0000000000000000000000000000000000000000..542894574bcba9818ef8c859538a3c41a6f02876
--- /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 68adaa412603e71413152257ad7d005d4017c753..9b23056546de3d7e74cd2bae9c3503d95df53a44 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 ee946caf536f1593aeb75e72923f11e2bb392cc0..0e7c4673eebf8befeb62e3aadc3474b89d80039d 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 f97a13d2c5867ef35ceda35e716461400544371c..aaad76bb530cbb4f4ae1fa6f401f08db56adedbc 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 28a49b447f71c4f014ebbac858b7215b897d57fd..d3c29fb492514cbaf08cb533976121bff5d94dea 160000
--- a/tools/taos-tools
+++ b/tools/taos-tools
@@ -1 +1 @@
-Subproject commit 28a49b447f71c4f014ebbac858b7215b897d57fd
+Subproject commit d3c29fb492514cbaf08cb533976121bff5d94dea