diff --git a/CMakeLists.txt b/CMakeLists.txt index 90e841d5e0..566d4ad29d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,11 +17,12 @@ include(${TD_SUPPORT_DIR}/cmake.platform) include(${TD_SUPPORT_DIR}/cmake.define) include(${TD_SUPPORT_DIR}/cmake.options) include(${TD_SUPPORT_DIR}/cmake.version) -include(${TD_SUPPORT_DIR}/cmake.install) # contrib add_subdirectory(contrib) +set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_NO_CYCLES OFF) + # api add_library(api INTERFACE) target_include_directories(api INTERFACE "include/client") @@ -36,8 +37,7 @@ add_subdirectory(source) add_subdirectory(tools) add_subdirectory(utils) add_subdirectory(examples/c) +include(${TD_SUPPORT_DIR}/cmake.install) # docs -add_subdirectory(docs/doxgen) - -# tests (TODO) +add_subdirectory(docs/doxgen) \ No newline at end of file diff --git a/README.md b/README.md index 67ca560130..00d36efb5a 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ [![Coverage Status](https://coveralls.io/repos/github/taosdata/TDengine/badge.svg?branch=develop)](https://coveralls.io/github/taosdata/TDengine?branch=develop) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4201/badge)](https://bestpractices.coreinfrastructure.org/projects/4201) -English | [简体中文](README-CN.md) | [Learn more about TSDB](https://tdengine.com/tsdb/) +English | [简体中文](README-CN.md) | [TDengine Cloud](https://cloud.tdengine.com) | [Learn more about TSDB](https://tdengine.com/tsdb/) # What is TDengine? @@ -33,7 +33,7 @@ TDengine is an open source, high-performance, cloud native [time-series database - **[Open Source](https://tdengine.com/tdengine/open-source-time-series-database/)**: TDengine’s core modules, including cluster feature, are all available under open source licenses. It has gathered 18.8k stars on GitHub. There is an active developer community, and over 139k running instances worldwide. -For a full list of TDengine competitive advantages, please [check here](https://tdengine.com/tdengine/) +For a full list of TDengine competitive advantages, please [check here](https://tdengine.com/tdengine/). The easiest way to experience TDengine is through [TDengine Cloud](https://cloud.tdengine.com). # Documentation diff --git a/cmake/taosadapter_CMakeLists.txt.in b/cmake/taosadapter_CMakeLists.txt.in index 16444c07f2..a9f8868f50 100644 --- a/cmake/taosadapter_CMakeLists.txt.in +++ b/cmake/taosadapter_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taosadapter ExternalProject_Add(taosadapter GIT_REPOSITORY https://github.com/taosdata/taosadapter.git - GIT_TAG be729ab + GIT_TAG cc43ef0 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index 2d90d8c49f..7bde332c8c 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG 85179e9 + GIT_TAG d58230c SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 2dc7622f46..a1a6cd4519 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -37,6 +37,11 @@ if(${BUILD_WITH_ICONV}) cat("${TD_SUPPORT_DIR}/iconv_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) endif() +# jemalloc +if(${JEMALLOC_ENABLED}) + cat("${TD_SUPPORT_DIR}/jemalloc_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) +endif() + # msvc regex if(${BUILD_MSVCREGEX}) cat("${TD_SUPPORT_DIR}/msvcregex_CMakeLists.txt.in" ${CONTRIB_TMP_FILE}) @@ -258,6 +263,19 @@ if(${BUILD_PTHREAD}) target_link_libraries(pthread INTERFACE libpthreadVC3) endif() +# jemalloc +if(${JEMALLOC_ENABLED}) + include(ExternalProject) + ExternalProject_Add(jemalloc + PREFIX "jemalloc" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/jemalloc + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND ./autogen.sh COMMAND ./configure --prefix=${CMAKE_BINARY_DIR}/build/ --disable-initial-exec-tls + BUILD_COMMAND ${MAKE} + ) + INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/build/include) +endif() + # crashdump if(${BUILD_CRASHDUMP}) add_executable(dumper "crashdump/dumper/dumper.c") diff --git a/docs/en/02-intro/index.md b/docs/en/02-intro/index.md index 2084088352..a60bfab2cc 100644 --- a/docs/en/02-intro/index.md +++ b/docs/en/02-intro/index.md @@ -23,8 +23,8 @@ The major features are listed below: 4. [Stream Processing](../develop/stream/): Not only is the continuous query is supported, but TDengine also supports event driven stream processing, so Flink or Spark is not needed for time-series data processing. 5. [Data Subscription](../develop/tmq/): Application can subscribe a table or a set of tables. API is the same as Kafka, but you can specify filter conditions. 6. Visualization - - Supports seamless integration with [Grafana](../third-party/grafana/) for visualization. - - Supports seamless integration with Google Data Studio. + - Supports seamless integration with [Grafana](../third-party/grafana/). + - Supports seamless integration with [Google Data Studio](../third-party/google-data-studio/). 7. Cluster - Supports [cluster](../deployment/) with the capability of increasing processing power by adding more nodes. - Supports [deployment on Kubernetes](../deployment/k8s/). @@ -33,7 +33,7 @@ The major features are listed below: - Provides [monitoring](../operation/monitor) on running instances of TDengine. - Provides many ways to [import](../operation/import) and [export](../operation/export) data. 9. Tools - - Provides an interactive [Command-line Interface (CLI)](../reference/taos-shell) for management, maintenance and ad-hoc queries. + - Provides an interactive [Command Line Interface (CLI)](../reference/taos-shell) for management, maintenance and ad-hoc queries. - Provides a tool [taosBenchmark](../reference/taosbenchmark/) for testing the performance of TDengine. 10. Programming - Provides [connectors](../reference/connector/) for [C/C++](../reference/connector/cpp), [Java](../reference/connector/java), [Python](../reference/connector/python), [Go](../reference/connector/go), [Rust](../reference/connector/rust), [Node.js](../reference/connector/node) and other programming languages. diff --git a/docs/en/05-get-started/01-docker.md b/docs/en/05-get-started/01-docker.md index 39fdfeeb06..ac273daba4 100644 --- a/docs/en/05-get-started/01-docker.md +++ b/docs/en/05-get-started/01-docker.md @@ -5,13 +5,25 @@ title: Quick Install on Docker This document describes how to install TDengine in a Docker container and perform queries and inserts. -- The easiest way to explore TDengine is through [TDengine Cloud](http://cloud.tdengine.com). +- The easiest way to explore TDengine is through [TDengine Cloud](http://cloud.tdengine.com). - To get started with TDengine in a non-containerized environment, see [Quick Install from Package](../../get-started/package). - If you want to view the source code, build TDengine yourself, or contribute to the project, see the [TDengine GitHub repository](https://github.com/taosdata/TDengine). ## Run TDengine -If Docker is already installed on your computer, run the following command: +If Docker is already installed on your computer, pull the latest TDengine Docker container image: + +```shell +docker pull tdengine/tdengine:latest +``` + +Or the container image of specific version: + +```shell +docker pull tdengine/tdengine:3.0.1.4 +``` + +And then run the following command: ```shell docker run -d -p 6030:6030 -p 6041:6041 -p 6043-6049:6043-6049 -p 6043-6049:6043-6049/udp tdengine/tdengine diff --git a/docs/en/05-get-started/03-package.md b/docs/en/05-get-started/03-package.md index 4dadbb0151..f734e354fb 100644 --- a/docs/en/05-get-started/03-package.md +++ b/docs/en/05-get-started/03-package.md @@ -122,7 +122,7 @@ Note: TDengine only supports Windows Server 2016/2019 and Windows 10/11 on the W :::info -For information about TDengine releases, see [Release History](../../releases/tdengine). +For information about TDengine other releases, check [Release History](../../releases/tdengine). ::: :::note diff --git a/docs/en/12-taos-sql/04-stable.md b/docs/en/12-taos-sql/04-stable.md index 6a0a0922cc..a20e33163b 100644 --- a/docs/en/12-taos-sql/04-stable.md +++ b/docs/en/12-taos-sql/04-stable.md @@ -49,6 +49,55 @@ The preceding SQL statement can be used in migration scenarios. It returns the C DESCRIBE [db_name.]stb_name; ``` +### View tag information for all child tables in the supertable + +``` +taos> SHOW TABLE TAGS FROM st1; + tbname | id | loc | +====================================================================== + st1s1 | 1 | beijing | + st1s2 | 2 | shanghai | + st1s3 | 3 | guangzhou | +Query OK, 3 rows in database (0.004455s) +``` + +The first column of the returned result set is the subtable name, and the subsequent columns are the tag columns. + +If you already know the name of the tag column, you can use the following statement to get the value of the specified tag column. + +``` +taos> SELECT DISTINCT TBNAME, id FROM st1; + tbname | id | +=============================================== + st1s1 | 1 | + st1s2 | 2 | + st1s3 | 3 | +Query OK, 3 rows in database (0.002891s) +``` + +It should be noted that DISTINCT and TBNAME in the SELECT statement are essential, and TDengine will optimize the statement according to them, so that it can return the tag value correctly and quickly even when there is no data or a lot of data. + +### View the tag information of a subtable + +``` +taos> SHOW TAGS FROM st1s1; + table_name | db_name | stable_name | tag_name | tag_type | tag_value | +============================================================================================================ + st1s1 | test | st1 | id | INT | 1 | + st1s1 | test | st1 | loc | VARCHAR(20) | beijing | +Query OK, 2 rows in database (0.003684s) +``` + +Similarly, you can also use the SELECT statement to query the value of the specified tag column. + +``` +taos> SELECT DISTINCT TBNAME, id, loc FROM st1s1; + tbname | id | loc | +================================================== + st1s1 | 1 | beijing | +Query OK, 1 rows in database (0.001884s) +``` + ## Drop STable ``` diff --git a/docs/en/12-taos-sql/10-function.md b/docs/en/12-taos-sql/10-function.md index 243ede5fcb..2b39c4b9e5 100644 --- a/docs/en/12-taos-sql/10-function.md +++ b/docs/en/12-taos-sql/10-function.md @@ -864,7 +864,7 @@ INTERP(expr) - `INTERP` is used to get the value that matches the specified time slice from a column. If no such value exists an interpolation value will be returned based on `FILL` parameter. - The input data of `INTERP` is the value of the specified column and a `where` clause can be used to filter the original data. If no `where` condition is specified then all original data is the input. - The output time range of `INTERP` is specified by `RANGE(timestamp1,timestamp2)` parameter, with timestamp1<=timestamp2. timestamp1 is the starting point of the output time range and must be specified. timestamp2 is the ending point of the output time range and must be specified. -- The number of rows in the result set of `INTERP` is determined by the parameter `EVERY`. Starting from timestamp1, one interpolation is performed for every time interval specified `EVERY` parameter. +- The number of rows in the result set of `INTERP` is determined by the parameter `EVERY`. Starting from timestamp1, one interpolation is performed for every time interval specified `EVERY` parameter. The parameter `EVERY` must be an integer, with no quotes, with a time unit of: b(nanosecond), u(microsecond), a(millisecond)), s(second), m(minute), h(hour), d(day), or w(week). For example, `EVERY(500a)` will interpolate every 500 milliseconds. - Interpolation is performed based on `FILL` parameter. - `INTERP` can only be used to interpolate in single timeline. So it must be used with `partition by tbname` when it's used on a STable. - Pseudo column `_irowts` can be used along with `INTERP` to return the timestamps associated with interpolation points(support after version 3.0.1.4). diff --git a/docs/en/12-taos-sql/21-node.md b/docs/en/12-taos-sql/21-node.md index 8bb895f73c..81a7931cbf 100644 --- a/docs/en/12-taos-sql/21-node.md +++ b/docs/en/12-taos-sql/21-node.md @@ -136,19 +136,3 @@ The parameters that you can modify through this statement are the same as those ```sql SHOW LOCAL VARIABLES; ``` - -## Combine Vgroups - -```sql -MERGE VGROUP vgroup_no1 vgroup_no2; -``` - -If load and data are not properly balanced among vgroups due to the data in different tim lines having different characteristics, you can combine or separate vgroups. - -## Separate Vgroups - -```sql -SPLIT VGROUP vgroup_no; -``` - -This statement creates a new vgroup and migrates part of the data from the original vgroup to the new vgroup with consistent hashing. During this process, the original vgroup can continue to provide services normally. diff --git a/docs/en/12-taos-sql/22-meta.md b/docs/en/12-taos-sql/22-meta.md index 0a59777946..1cd759742a 100644 --- a/docs/en/12-taos-sql/22-meta.md +++ b/docs/en/12-taos-sql/22-meta.md @@ -29,8 +29,8 @@ Provides information about dnodes. Similar to SHOW DNODES. | # | **Column** | **Data Type** | **Description** | | --- | :------------: | ------------ | ------------------------- | -| 1 | vnodes | SMALLINT | Current number of vnodes on the dnode | -| 2 | vnodes | SMALLINT | Maximum number of vnodes on the dnode | +| 1 | vnodes | SMALLINT | Current number of vnodes on the dnode. It should be noted that `vnodes` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 2 | support_vnodes | SMALLINT | Maximum number of vnodes on the dnode | | 3 | status | BINARY(10) | Current status | | 4 | note | BINARY(256) | Reason for going offline or other information | | 5 | id | SMALLINT | Dnode ID | @@ -49,16 +49,6 @@ Provides information about mnodes. Similar to SHOW MNODES. | 4 | role_time | TIMESTAMP | Time at which the current role was assumed | | 5 | create_time | TIMESTAMP | Creation time | -## INS_MODULES - -Provides information about modules. Similar to SHOW MODULES. - -| # | **Column** | **Data Type** | **Description** | -| --- | :------: | ------------ | ---------- | -| 1 | id | SMALLINT | Module ID | -| 2 | endpoint | BINARY(134) | Module endpoint | -| 3 | module | BINARY(10) | Module status | - ## INS_QNODES Provides information about qnodes. Similar to SHOW QNODES. @@ -88,33 +78,33 @@ Provides information about user-created databases. Similar to SHOW DATABASES. | 1| name| BINARY(32)| Database name | | 2 | create_time | TIMESTAMP | Creation time | | 3 | ntables | INT | Number of standard tables and subtables (not including supertables) | -| 4 | vgroups | INT | Number of vgroups | -| 6 | replica | INT | Number of replicas | -| 7 | quorum | BINARY(3) | Strong consistency | -| 8 | duration | INT | Duration for storage of single files | -| 9 | keep | INT | Data retention period | -| 10 | buffer | INT | Write cache size per vnode, in MB | -| 11 | pagesize | INT | Page size for vnode metadata storage engine, in KB | -| 12 | pages | INT | Number of pages per vnode metadata storage engine | -| 13 | minrows | INT | Maximum number of records per file block | -| 14 | maxrows | INT | Minimum number of records per file block | -| 15 | comp | INT | Compression method | -| 16 | precision | BINARY(2) | Time precision | +| 4 | vgroups | INT | Number of vgroups. It should be noted that `vnodes` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 6 | replica | INT | Number of replicas. It should be noted that `replica` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 7 | strict | BINARY(3) | Strong consistency. It should be noted that `strict` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 8 | duration | INT | Duration for storage of single files. It should be noted that `duration` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 9 | keep | INT | Data retention period. It should be noted that `keep` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 10 | buffer | INT | Write cache size per vnode, in MB. It should be noted that `buffer` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 11 | pagesize | INT | Page size for vnode metadata storage engine, in KB. It should be noted that `pagesize` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 12 | pages | INT | Number of pages per vnode metadata storage engine. It should be noted that `pages` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 13 | minrows | INT | Maximum number of records per file block. It should be noted that `minrows` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 14 | maxrows | INT | Minimum number of records per file block. It should be noted that `maxrows` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 15 | comp | INT | Compression method. It should be noted that `comp` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 16 | precision | BINARY(2) | Time precision. It should be noted that `precision` is a TDengine keyword and needs to be escaped with ` when used as a column name. | | 17 | status | BINARY(10) | Current database status | -| 18 | retention | BINARY (60) | Aggregation interval and retention period | -| 19 | single_stable | BOOL | Whether the database can contain multiple supertables | -| 20 | cachemodel | BINARY(60) | Caching method for the newest data | -| 21 | cachesize | INT | Memory per vnode used for caching the newest data | -| 22 | wal_level | INT | WAL level | -| 23 | wal_fsync_period | INT | Interval at which WAL is written to disk | -| 24 | wal_retention_period | INT | WAL retention period | -| 25 | wal_retention_size | INT | Maximum WAL size | -| 26 | wal_roll_period | INT | WAL rotation period | -| 27 | wal_segment_size | BIGINT | WAL file size | -| 28 | stt_trigger | SMALLINT | The threshold for number of files to trigger file merging | -| 29 | table_prefix | SMALLINT | The prefix length in the table name that is ignored when distributing table to vnode based on table name | -| 30 | table_suffix | SMALLINT | The suffix length in the table name that is ignored when distributing table to vnode based on table name | -| 31 | tsdb_pagesize | INT | The page size for internal storage engine, its unit is KB | +| 18 | retentions | BINARY (60) | Aggregation interval and retention period. It should be noted that `retentions` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 19 | single_stable | BOOL | Whether the database can contain multiple supertables. It should be noted that `single_stable` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 20 | cachemodel | BINARY(60) | Caching method for the newest data. It should be noted that `cachemodel` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 21 | cachesize | INT | Memory per vnode used for caching the newest data. It should be noted that `cachesize` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 22 | wal_level | INT | WAL level. It should be noted that `wal_level` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 23 | wal_fsync_period | INT | Interval at which WAL is written to disk. It should be noted that `wal_fsync_period` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 24 | wal_retention_period | INT | WAL retention period. It should be noted that `wal_retention_period` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 25 | wal_retention_size | INT | Maximum WAL size. It should be noted that `wal_retention_size` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 26 | wal_roll_period | INT | WAL rotation period. It should be noted that `wal_roll_period` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 27 | wal_segment_size | BIGINT | WAL file size. It should be noted that `wal_segment_size` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 28 | stt_trigger | SMALLINT | The threshold for number of files to trigger file merging. It should be noted that `stt_trigger` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 29 | table_prefix | SMALLINT | The prefix length in the table name that is ignored when distributing table to vnode based on table name. It should be noted that `table_prefix` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 30 | table_suffix | SMALLINT | The suffix length in the table name that is ignored when distributing table to vnode based on table name. It should be noted that `table_suffix` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 31 | tsdb_pagesize | INT | The page size for internal storage engine, its unit is KB. It should be noted that `tsdb_pagesize` is a TDengine keyword and needs to be escaped with ` when used as a column name. | ## INS_FUNCTIONS @@ -123,8 +113,8 @@ Provides information about user-defined functions. | # | **Column** | **Data Type** | **Description** | | --- | :---------: | ------------ | -------------- | | 1 | name | BINARY(64) | Function name | -| 2 | comment | BINARY(255) | Function description | -| 3 | aggregate | INT | Whether the UDF is an aggregate function | +| 2 | comment | BINARY(255) | Function description. It should be noted that `comment` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 3 | aggregate | INT | Whether the UDF is an aggregate function. It should be noted that `aggregate` is a TDengine keyword and needs to be escaped with ` when used as a column name. | | 4 | output_type | BINARY(31) | Output data type | | 5 | create_time | TIMESTAMP | Creation time | | 6 | code_len | INT | Length of the source code | @@ -153,12 +143,12 @@ Provides information about supertables. | 2 | db_name | BINARY(64) | All databases in the supertable | | 3 | create_time | TIMESTAMP | Creation time | | 4 | columns | INT | Number of columns | -| 5 | tags | INT | Number of tags | +| 5 | tags | INT | Number of tags. It should be noted that `tags` is a TDengine keyword and needs to be escaped with ` when used as a column name. | | 6 | last_update | TIMESTAMP | Last updated time | | 7 | table_comment | BINARY(1024) | Table description | -| 8 | watermark | BINARY(64) | Window closing time | -| 9 | max_delay | BINARY(64) | Maximum delay for pushing stream processing results | -| 10 | rollup | BINARY(128) | Rollup aggregate function | +| 8 | watermark | BINARY(64) | Window closing time. It should be noted that `watermark` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 9 | max_delay | BINARY(64) | Maximum delay for pushing stream processing results. It should be noted that `max_delay` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 10 | rollup | BINARY(128) | Rollup aggregate function. It should be noted that `rollup` is a TDengine keyword and needs to be escaped with ` when used as a column name. | ## INS_TABLES @@ -173,7 +163,7 @@ Provides information about standard tables and subtables. | 5 | stable_name | BINARY(192) | Supertable name | | 6 | uid | BIGINT | Table ID | | 7 | vgroup_id | INT | Vgroup ID | -| 8 | ttl | INT | Table time-to-live | +| 8 | ttl | INT | Table time-to-live. It should be noted that `ttl` is a TDengine keyword and needs to be escaped with ` when used as a column name. | | 9 | table_comment | BINARY(1024) | Table description | | 10 | type | BINARY(20) | Table type | @@ -206,13 +196,13 @@ Provides information about TDengine Enterprise Edition permissions. | --- | :---------: | ------------ | -------------------------------------------------- | | 1 | version | BINARY(9) | Whether the deployment is a licensed or trial version | | 2 | cpu_cores | BINARY(9) | CPU cores included in license | -| 3 | dnodes | BINARY(10) | Dnodes included in license | -| 4 | streams | BINARY(10) | Streams included in license | -| 5 | users | BINARY(10) | Users included in license | -| 6 | streams | BINARY(10) | Accounts included in license | -| 7 | storage | BINARY(21) | Storage space included in license | -| 8 | connections | BINARY(21) | Client connections included in license | -| 9 | databases | BINARY(11) | Databases included in license | +| 3 | dnodes | BINARY(10) | Dnodes included in license. It should be noted that `dnodes` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 4 | streams | BINARY(10) | Streams included in license. It should be noted that `streams` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 5 | users | BINARY(10) | Users included in license. It should be noted that `users` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 6 | accounts | BINARY(10) | Accounts included in license. It should be noted that `accounts` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 7 | storage | BINARY(21) | Storage space included in license. It should be noted that `storage` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 8 | connections | BINARY(21) | Client connections included in license. It should be noted that `connections` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 9 | databases | BINARY(11) | Databases included in license. It should be noted that `databases` is a TDengine keyword and needs to be escaped with ` when used as a column name. | | 10 | speed | BINARY(9) | Write speed specified in license (data points per second) | | 11 | querytime | BINARY(9) | Total query time specified in license | | 12 | timeseries | BINARY(21) | Number of metrics included in license | @@ -227,7 +217,7 @@ Provides information about vgroups. | --- | :-------: | ------------ | ------------------------------------------------------ | | 1 | vgroup_id | INT | Vgroup ID | | 2 | db_name | BINARY(32) | Database name | -| 3 | tables | INT | Tables in vgroup | +| 3 | tables | INT | Tables in vgroup. It should be noted that `tables` is a TDengine keyword and needs to be escaped with ` when used as a column name. | | 4 | status | BINARY(10) | Vgroup status | | 5 | v1_dnode | INT | Dnode ID of first vgroup member | | 6 | v1_status | BINARY(10) | Status of first vgroup member | @@ -246,7 +236,7 @@ Provides system configuration information. | # | **Column** | **Data Type** | **Description** | | --- | :------: | ------------ | ------------ | | 1 | name | BINARY(32) | Parameter | -| 2 | value | BINARY(64) | Value | +| 2 | value | BINARY(64) | Value. It should be noted that `value` is a TDengine keyword and needs to be escaped with ` when used as a column name. | ## INS_DNODE_VARIABLES @@ -256,7 +246,7 @@ Provides dnode configuration information. | --- | :------: | ------------ | ------------ | | 1 | dnode_id | INT | Dnode ID | | 2 | name | BINARY(32) | Parameter | -| 3 | value | BINARY(64) | Value | +| 3 | value | BINARY(64) | Value. It should be noted that `value` is a TDengine keyword and needs to be escaped with ` when used as a column name. | ## INS_TOPICS @@ -287,5 +277,5 @@ Provides dnode configuration information. | 5 | source_db | BINARY(64) | Source database | | 6 | target_db | BIANRY(64) | Target database | | 7 | target_table | BINARY(192) | Target table | -| 8 | watermark | BIGINT | Watermark (see stream processing documentation) | -| 9 | trigger | INT | Method of triggering the result push (see stream processing documentation) | +| 8 | watermark | BIGINT | Watermark (see stream processing documentation). It should be noted that `watermark` is a TDengine keyword and needs to be escaped with ` when used as a column name. | +| 9 | trigger | INT | Method of triggering the result push (see stream processing documentation). It should be noted that `trigger` is a TDengine keyword and needs to be escaped with ` when used as a column name. | diff --git a/docs/en/12-taos-sql/24-show.md b/docs/en/12-taos-sql/24-show.md index 5f3bef3546..1bda4a118d 100644 --- a/docs/en/12-taos-sql/24-show.md +++ b/docs/en/12-taos-sql/24-show.md @@ -13,14 +13,6 @@ SHOW APPS; Shows all clients (such as applications) that connect to the cluster. -## SHOW BNODES - -```sql -SHOW BNODES; -``` - -Shows information about backup nodes (bnodes) in the system. - ## SHOW CLUSTER ```sql @@ -128,14 +120,6 @@ SHOW MNODES; Shows information about mnodes in the system. -## SHOW MODULES - -```sql -SHOW MODULES; -``` - -Shows information about modules installed in the system. - ## SHOW QNODES ```sql @@ -154,14 +138,6 @@ Shows information about the storage space allowed by the license. Note: TDengine Enterprise Edition only. -## SHOW SNODES - -```sql -SHOW SNODES; -``` - -Shows information about stream processing nodes (snodes) in the system. - ## SHOW STABLES ```sql diff --git a/docs/en/14-reference/03-connector/07-python.mdx b/docs/en/14-reference/03-connector/07-python.mdx index 8f92d5076a..25e6b2188a 100644 --- a/docs/en/14-reference/03-connector/07-python.mdx +++ b/docs/en/14-reference/03-connector/07-python.mdx @@ -32,7 +32,7 @@ We recommend using the latest version of `taospy`, regardless of the version of ### Preparation -1. Install Python. Python >= 3.6 is recommended. If Python is not available on your system, refer to the [Python BeginnersGuide](https://wiki.python.org/moin/BeginnersGuide/Download) to install it. +1. Install Python. Python >= 3.7 is recommended. If Python is not available on your system, refer to the [Python BeginnersGuide](https://wiki.python.org/moin/BeginnersGuide/Download) to install it. 2. Install [pip](https://pypi.org/project/pip/). In most cases, the Python installer comes with the pip utility. If not, please refer to [pip documentation](https://pip.pypa.io/en/stable/installation/) to install it. If you use a native connection, you will also need to [Install Client Driver](/reference/connector#Install-Client-Driver). The client install package includes the TDengine client dynamic link library (`libtaos.so` or `taos.dll`) and the TDengine CLI. @@ -121,7 +121,7 @@ Before establishing a connection with the connector, we recommend testing the co -Ensure that the TDengine instance is up and that the FQDN of the machines in the cluster (the FQDN defaults to hostname if you are starting a standalone version) can be resolved locally, by testing with the `ping` command. +Ensure that the TDengine instance is up and that the FQDN of the machines in the cluster (the FQDN defaults to hostname if you are starting a stand-alone version) can be resolved locally, by testing with the `ping` command. ``` ping diff --git a/docs/en/14-reference/05-taosbenchmark.md b/docs/en/14-reference/05-taosbenchmark.md index 8f63dddfb7..d95086d4c4 100644 --- a/docs/en/14-reference/05-taosbenchmark.md +++ b/docs/en/14-reference/05-taosbenchmark.md @@ -5,7 +5,7 @@ toc_max_heading_level: 4 description: "taosBenchmark (once called taosdemo ) is a tool for testing the performance of TDengine." --- -## Introduction +# Introduction taosBenchmark (formerly taosdemo ) is a tool for testing the performance of TDengine products. taosBenchmark can test the performance of TDengine's insert, query, and subscription functions and simulate large amounts of data generated by many devices. taosBenchmark can be configured to generate user defined databases, supertables, subtables, and the time series data to populate these for performance benchmarking. taosBenchmark is highly configurable and some of the configurations include the time interval for inserting data, the number of working threads and the capability to insert disordered data. The installer provides taosdemo as a soft link to taosBenchmark for compatibility with past users. @@ -23,7 +23,7 @@ There are two ways to install taosBenchmark: TaosBenchmark needs to be executed on the terminal of the operating system, it supports two configuration methods: [Command-line arguments](#command-line-arguments-in-detail) and [JSON configuration file](#configuration-file-parameters-in-detail). These two methods are mutually exclusive. Users can use `-f ` to specify a configuration file. When running taosBenchmark with command-line arguments to control its behavior, users should use other parameters for configuration, but not the `-f` parameter. In addition, taosBenchmark offers a special way of running without parameters. -taosBenchmark supports the complete performance testing of TDengine by providing functionally to write, query, and subscribe. These three functions are mutually exclusive, users can only select one of them each time taosBenchmark runs. The query and subscribe functionalities are only configurable using a json configuration file by specifying the parameter `filetype`, while write can be performed through both the command-line and a configuration file. If you want to test the performance of queries or data subscriptionm configure taosBenchmark with the configuration file. You can modify the value of the `filetype` parameter to specify the function that you want to test. +taosBenchmark supports the complete performance testing of TDengine by providing functionally to write, query, and subscribe. These three functions are mutually exclusive, users can only select one of them each time taosBenchmark runs. The query and subscribe functionalities are only configurable using a json configuration file by specifying the parameter `filetype`, while write can be performed through both the command-line and a configuration file. If you want to test the performance of queries or data subscription configure taosBenchmark with the configuration file. You can modify the value of the `filetype` parameter to specify the function that you want to test. **Make sure that the TDengine cluster is running correctly before running taosBenchmark. ** @@ -334,13 +334,13 @@ The configuration parameters for specifying super table tag columns and data col - **name** : The name of the column, if used together with count, e.g. "name": "current", "count":3, then the names of the 3 columns are current, current_2. current_3. -- **min**: The minimum value of the column/label of the data type. +- **min**: The minimum value of the column/label of the data type. The generated value will equal or large than the minimum value. -- **max**: The maximum value of the column/label of the data type. +- **max**: The maximum value of the column/label of the data type. The generated value will less than the maxium value. - **values**: The value field of the nchar/binary column/label, which will be chosen randomly from the values. -- **sma**: Insert the column into the BSMA. Enter `yes` or `no`. The default is `no`. +- **sma**: Insert the column into the SMA. Enter `yes` or `no`. The default is `no`. #### insertion behavior configuration parameters diff --git a/docs/examples/c/tmq_example.c b/docs/examples/c/tmq_example.c index 19adaad116..a3bade308a 100644 --- a/docs/examples/c/tmq_example.c +++ b/docs/examples/c/tmq_example.c @@ -184,22 +184,54 @@ void tmq_commit_cb_print(tmq_t* tmq, int32_t code, void* param) { tmq_t* build_consumer() { tmq_conf_res_t code; tmq_conf_t* conf = tmq_conf_new(); + code = tmq_conf_set(conf, "enable.auto.commit", "true"); - if (TMQ_CONF_OK != code) return NULL; + if (TMQ_CONF_OK != code) { + tmq_conf_destroy(conf); + return NULL; + } + code = tmq_conf_set(conf, "auto.commit.interval.ms", "1000"); - if (TMQ_CONF_OK != code) return NULL; + if (TMQ_CONF_OK != code) { + tmq_conf_destroy(conf); + return NULL; + } + code = tmq_conf_set(conf, "group.id", "cgrpName"); - if (TMQ_CONF_OK != code) return NULL; + if (TMQ_CONF_OK != code) { + tmq_conf_destroy(conf); + return NULL; + } + code = tmq_conf_set(conf, "client.id", "user defined name"); - if (TMQ_CONF_OK != code) return NULL; + if (TMQ_CONF_OK != code) { + tmq_conf_destroy(conf); + return NULL; + } + code = tmq_conf_set(conf, "td.connect.user", "root"); - if (TMQ_CONF_OK != code) return NULL; + if (TMQ_CONF_OK != code) { + tmq_conf_destroy(conf); + return NULL; + } + code = tmq_conf_set(conf, "td.connect.pass", "taosdata"); - if (TMQ_CONF_OK != code) return NULL; + if (TMQ_CONF_OK != code) { + tmq_conf_destroy(conf); + return NULL; + } + code = tmq_conf_set(conf, "auto.offset.reset", "earliest"); - if (TMQ_CONF_OK != code) return NULL; + if (TMQ_CONF_OK != code) { + tmq_conf_destroy(conf); + return NULL; + } + code = tmq_conf_set(conf, "experimental.snapshot.enable", "false"); - if (TMQ_CONF_OK != code) return NULL; + if (TMQ_CONF_OK != code) { + tmq_conf_destroy(conf); + return NULL; + } tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL); diff --git a/docs/zh/05-get-started/01-docker.md b/docs/zh/05-get-started/01-docker.md index c65e00384d..e772447db0 100644 --- a/docs/zh/05-get-started/01-docker.md +++ b/docs/zh/05-get-started/01-docker.md @@ -8,7 +8,19 @@ description: 使用 Docker 快速体验 TDengine 的高效写入和查询 ## 启动 TDengine -如果已经安装了 Docker,只需执行下面的命令: +如果已经安装了 Docker,首先拉取最新的 TDengine 容器镜像: + +```shell +docker pull tdengine/tdengine:latest +``` + +或者指定版本的容器镜像: + +```shell +docker pull tdengine/tdengine:3.0.1.4 +``` + +然后只需执行下面的命令: ```shell docker run -d -p 6030:6030 -p 6041:6041 -p 6043-6049:6043-6049 -p 6043-6049:6043-6049/udp tdengine/tdengine diff --git a/docs/zh/08-connector/14-java.mdx b/docs/zh/08-connector/14-java.mdx index acdebac57d..d13e21ad54 100644 --- a/docs/zh/08-connector/14-java.mdx +++ b/docs/zh/08-connector/14-java.mdx @@ -375,7 +375,7 @@ public class ParameterBindingDemo { private static final String host = "127.0.0.1"; private static final Random random = new Random(System.currentTimeMillis()); - private static final int BINARY_COLUMN_SIZE = 20; + private static final int BINARY_COLUMN_SIZE = 30; private static final String[] schemaList = { "create table stable1(ts timestamp, f1 tinyint, f2 smallint, f3 int, f4 bigint) tags(t1 tinyint, t2 smallint, t3 int, t4 bigint)", "create table stable2(ts timestamp, f1 float, f2 double) tags(t1 float, t2 double)", diff --git a/docs/zh/08-connector/30-python.mdx b/docs/zh/08-connector/30-python.mdx index 082f70ed47..2ca11800c8 100644 --- a/docs/zh/08-connector/30-python.mdx +++ b/docs/zh/08-connector/30-python.mdx @@ -1,7 +1,7 @@ --- sidebar_label: Python title: TDengine Python Connector -description: "taospy 是 TDengine 的官方 Python 连接器。taospy 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。tasopy 对 TDengine 的原生接口和 REST 接口都进行了封装, 分别对应 tasopy 的两个子模块:tasos 和 taosrest。除了对原生接口和 REST 接口的封装,taospy 还提供了符合 Python 数据访问规范(PEP 249)的编程接口。这使得 taospy 和很多第三方工具集成变得简单,比如 SQLAlchemy 和 pandas" +description: "taospy 是 TDengine 的官方 Python 连接器。taospy 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。tasopy 对 TDengine 的原生接口和 REST 接口都进行了封装, 分别对应 tasopy 的两个子模块:taos 和 taosrest。除了对原生接口和 REST 接口的封装,taospy 还提供了符合 Python 数据访问规范(PEP 249)的编程接口。这使得 taospy 和很多第三方工具集成变得简单,比如 SQLAlchemy 和 pandas" --- import Tabs from "@theme/Tabs"; @@ -25,15 +25,15 @@ Python 连接器的源码托管在 [GitHub](https://github.com/taosdata/taos-con ## 支持的功能 -- 原生连接支持 TDeingine 的所有核心功能, 包括: 连接管理、执行 SQL、参数绑定、订阅、无模式写入(schemaless)。 +- 原生连接支持 TDengine 的所有核心功能, 包括: 连接管理、执行 SQL、参数绑定、订阅、无模式写入(schemaless)。 - REST 连接支持的功能包括:连接管理、执行 SQL。 (通过执行 SQL 可以: 管理数据库、管理表和超级表、写入数据、查询数据、创建连续查询等)。 ## 安装 ### 准备 -1. 安装 Python。建议使用 Python >= 3.6。如果系统上还没有 Python 可参考 [Python BeginnersGuide](https://wiki.python.org/moin/BeginnersGuide/Download) 安装。 -2. 安装 [pip](https://pypi.org/project/pip/)。大部分情况下 Python 的安装包都自带了 pip 工具, 如果没有请参考 [pip docuemntation](https://pip.pypa.io/en/stable/installation/) 安装。 +1. 安装 Python。建议使用 Python >= 3.7。如果系统上还没有 Python 可参考 [Python BeginnersGuide](https://wiki.python.org/moin/BeginnersGuide/Download) 安装。 +2. 安装 [pip](https://pypi.org/project/pip/)。大部分情况下 Python 的安装包都自带了 pip 工具, 如果没有请参考 [pip documentation](https://pip.pypa.io/en/stable/installation/) 安装。 3. 如果使用原生连接,还需[安装客户端驱动](../#安装客户端驱动)。客户端软件包含了 TDengine 客户端动态链接库(libtaos.so 或 taos.dll) 和 TDengine CLI。 ### 使用 pip 安装 @@ -208,8 +208,8 @@ curl -u root:taosdata http://:/rest/sql -d "select server_version()" `connect()` 函数的所有参数都是可选的关键字参数。下面是连接参数的具体说明: - `url`: taosAdapter REST 服务的 URL。默认是 。 -- `user`: TDenigne 用户名。默认是 root。 -- `password`: TDeingine 用户密码。默认是 taosdata。 +- `user`: TDengine 用户名。默认是 root。 +- `password`: TDengine 用户密码。默认是 taosdata。 - `timeout`: HTTP 请求超时时间。单位为秒。默认为 `socket._GLOBAL_DEFAULT_TIMEOUT`。 一般无需配置。 diff --git a/docs/zh/12-taos-sql/01-data-type.md b/docs/zh/12-taos-sql/01-data-type.md index 128fa20930..a59330546b 100644 --- a/docs/zh/12-taos-sql/01-data-type.md +++ b/docs/zh/12-taos-sql/01-data-type.md @@ -39,7 +39,7 @@ CREATE DATABASE db_name PRECISION 'ns'; | 11 | TINYINT | 1 | 单字节整型,范围 [-128, 127] | | 12 | TINYINT UNSIGNED | 1 | 无符号单字节整型,范围 [0, 255] | | 13 | BOOL | 1 | 布尔型,{true, false} | -| 14 | NCHAR | 自定义 | 记录包含多字节字符在内的字符串,如中文字符。每个 NCHAR 字符占用 4 字节的存储空间。字符串两端使用单引号引用,字符串内的单引号需用转义字符 `\'`。NCHAR 使用时须指定字符串大小,类型为 NCHAR(10) 的列表示此列的字符串最多存储 10 个 NCHAR 字符,会固定占用 40 字节的空间。如果用户字符串长度超出声明长度,将会报错。 | +| 14 | NCHAR | 自定义 | 记录包含多字节字符在内的字符串,如中文字符。每个 NCHAR 字符占用 4 字节的存储空间。字符串两端使用单引号引用,字符串内的单引号需用转义字符 `\'`。NCHAR 使用时须指定字符串大小,类型为 NCHAR(10) 的列表示此列的字符串最多存储 10 个 NCHAR 字符。如果用户字符串长度超出声明长度,将会报错。 | | 15 | JSON | | JSON 数据类型, 只有 Tag 可以是 JSON 格式 | | 16 | VARCHAR | 自定义 | BINARY 类型的别名 | diff --git a/docs/zh/12-taos-sql/04-stable.md b/docs/zh/12-taos-sql/04-stable.md index 95ef405fa7..7dff30e443 100644 --- a/docs/zh/12-taos-sql/04-stable.md +++ b/docs/zh/12-taos-sql/04-stable.md @@ -50,6 +50,56 @@ SHOW CREATE STABLE stb_name; DESCRIBE [db_name.]stb_name; ``` +### 获取超级表中所有子表的标签信息 + +``` +taos> SHOW TABLE TAGS FROM st1; + tbname | id | loc | +====================================================================== + st1s1 | 1 | beijing | + st1s2 | 2 | shanghai | + st1s3 | 3 | guangzhou | +Query OK, 3 rows in database (0.004455s) +``` + +返回结果集的第一列为子表名,后续列为标签列。 + +如果已经知道标签列的名称,可以使用下面的语句来获取指定标签列的值。 + +``` +taos> SELECT DISTINCT TBNAME, id FROM st1; + tbname | id | +=============================================== + st1s1 | 1 | + st1s2 | 2 | + st1s3 | 3 | +Query OK, 3 rows in database (0.002891s) +``` + +需要注意,SELECT 语句中的 DISTINCT 和 TBNAME 都是必不可少的,TDengine 会根据它们对语句进行优化,使之在没有数据或数据非常多的情况下都可以正确并快速的返回标签值。 + +### 获取某个子表的标签信息 + +``` +taos> SHOW TAGS FROM st1s1; + table_name | db_name | stable_name | tag_name | tag_type | tag_value | +============================================================================================================ + st1s1 | test | st1 | id | INT | 1 | + st1s1 | test | st1 | loc | VARCHAR(20) | beijing | +Query OK, 2 rows in database (0.003684s) +``` + +同样的,也可以用 SELECT 语句来查询指定标签列的值。 + +``` +taos> SELECT DISTINCT TBNAME, id, loc FROM st1s1; + tbname | id | loc | +================================================== + st1s1 | 1 | beijing | +Query OK, 1 rows in database (0.001884s) +``` + + ## 删除超级表 ``` diff --git a/docs/zh/12-taos-sql/21-node.md b/docs/zh/12-taos-sql/21-node.md index d47dc8198f..ab6a49ea96 100644 --- a/docs/zh/12-taos-sql/21-node.md +++ b/docs/zh/12-taos-sql/21-node.md @@ -137,19 +137,3 @@ local_option: { ```sql SHOW LOCAL VARIABLES; ``` - -## 合并 vgroup - -```sql -MERGE VGROUP vgroup_no1 vgroup_no2; -``` - -如果在系统实际运行一段时间后,因为不同时间线的数据特征不同导致在 vgroups 之间的数据和负载分布不均衡,可以通过合并或拆分 vgroups 的方式逐步实现负载均衡。 - -## 拆分 vgroup - -```sql -SPLIT VGROUP vgroup_no; -``` - -会创建一个新的 vgroup,并将指定 vgroup 中的数据按照一致性 HASH 迁移一部分到新的 vgroup 中。此过程中,原 vgroup 可以正常提供读写服务。 diff --git a/docs/zh/12-taos-sql/22-meta.md b/docs/zh/12-taos-sql/22-meta.md index c192d0e5e8..c05dbf9c2a 100644 --- a/docs/zh/12-taos-sql/22-meta.md +++ b/docs/zh/12-taos-sql/22-meta.md @@ -30,7 +30,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | # | **列名** | **数据类型** | **说明** | | --- | :------------: | ------------ | ------------------------- | -| 1 | vnodes | SMALLINT | dnode 中的实际 vnode 个数 | +| 1 | vnodes | SMALLINT | dnode 中的实际 vnode 个数。需要注意,`vnodes` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | | 2 | support_vnodes | SMALLINT | 最多支持的 vnode 个数 | | 3 | status | BINARY(10) | 当前状态 | | 4 | note | BINARY(256) | 离线原因等信息 | @@ -50,16 +50,6 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | 4 | role_time | TIMESTAMP | 成为当前角色的时间 | | 5 | create_time | TIMESTAMP | 创建时间 | -## INS_MODULES - -提供组件的相关信息。也可以使用 SHOW MODULES 来查询这些信息 - -| # | **列名** | **数据类型** | **说明** | -| --- | :------: | ------------ | ---------- | -| 1 | id | SMALLINT | module id | -| 2 | endpoint | BINARY(134) | 组件的地址 | -| 3 | module | BINARY(10) | 组件状态 | - ## INS_QNODES 当前系统中 QNODE 的信息。也可以使用 SHOW QNODES 来查询这些信息。 @@ -89,33 +79,33 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | 1 | name | BINARY(32) | 数据库名 | | 2 | create_time | TIMESTAMP | 创建时间 | | 3 | ntables | INT | 数据库中表的数量,包含子表和普通表但不包含超级表 | -| 4 | vgroups | INT | 数据库中有多少个 vgroup | -| 6 | replica | INT | 副本数 | -| 7 | quorum | BINARY(3) | 强一致性 | -| 8 | duration | INT | 单文件存储数据的时间跨度 | -| 9 | keep | INT | 数据保留时长 | -| 10 | buffer | INT | 每个 vnode 写缓存的内存块大小,单位 MB | -| 11 | pagesize | INT | 每个 VNODE 中元数据存储引擎的页大小,单位为 KB | -| 12 | pages | INT | 每个 vnode 元数据存储引擎的缓存页个数 | -| 13 | minrows | INT | 文件块中记录的最大条数 | -| 14 | maxrows | INT | 文件块中记录的最小条数 | -| 15 | comp | INT | 数据压缩方式 | -| 16 | precision | BINARY(2) | 时间分辨率 | +| 4 | vgroups | INT | 数据库中有多少个 vgroup。需要注意,`vgroups` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 6 | replica | INT | 副本数。需要注意,`replica` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 7 | strict | BINARY(3) | 强一致性。需要注意,`strict` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 8 | duration | INT | 单文件存储数据的时间跨度。需要注意,`duration` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 9 | keep | INT | 数据保留时长。需要注意,`keep` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 10 | buffer | INT | 每个 vnode 写缓存的内存块大小,单位 MB。需要注意,`buffer` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 11 | pagesize | INT | 每个 VNODE 中元数据存储引擎的页大小,单位为 KB。需要注意,`pagesize` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 12 | pages | INT | 每个 vnode 元数据存储引擎的缓存页个数。需要注意,`pages` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 13 | minrows | INT | 文件块中记录的最大条数。需要注意,`minrows` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 14 | maxrows | INT | 文件块中记录的最小条数。需要注意,`maxrows` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 15 | comp | INT | 数据压缩方式。需要注意,`comp` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 16 | precision | BINARY(2) | 时间分辨率。需要注意,`precision` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | | 17 | status | BINARY(10) | 数据库状态 | -| 18 | retention | BINARY (60) | 数据的聚合周期和保存时长 | -| 19 | single_stable | BOOL | 表示此数据库中是否只可以创建一个超级表 | -| 20 | cachemodel | BINARY(60) | 表示是否在内存中缓存子表的最近数据 | -| 21 | cachesize | INT | 表示每个 vnode 中用于缓存子表最近数据的内存大小 | -| 22 | wal_level | INT | WAL 级别 | -| 23 | wal_fsync_period | INT | 数据落盘周期 | -| 24 | wal_retention_period | INT | WAL 的保存时长 | -| 25 | wal_retention_size | INT | WAL 的保存上限 | -| 26 | wal_roll_period | INT | wal 文件切换时长 | -| 27 | wal_segment_size | BIGINT | wal 单个文件大小 | -| 28 | stt_trigger | SMALLINT | 触发文件合并的落盘文件的个数 | -| 29 | table_prefix | SMALLINT | 内部存储引擎根据表名分配存储该表数据的 VNODE 时要忽略的前缀的长度 | -| 30 | table_suffix | SMALLINT | 内部存储引擎根据表名分配存储该表数据的 VNODE 时要忽略的后缀的长度 | -| 31 | tsdb_pagesize | INT | 时序数据存储引擎中的页大小 | +| 18 | retentions | BINARY (60) | 数据的聚合周期和保存时长。需要注意,`retentions` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 19 | single_stable | BOOL | 表示此数据库中是否只可以创建一个超级表。需要注意,`single_stable` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 20 | cachemodel | BINARY(60) | 表示是否在内存中缓存子表的最近数据。需要注意,`cachemodel` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 21 | cachesize | INT | 表示每个 vnode 中用于缓存子表最近数据的内存大小。需要注意,`cachesize` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 22 | wal_level | INT | WAL 级别。需要注意,`wal_level` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 23 | wal_fsync_period | INT | 数据落盘周期。需要注意,`wal_fsync_period` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 24 | wal_retention_period | INT | WAL 的保存时长。需要注意,`wal_retention_period` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 25 | wal_retention_size | INT | WAL 的保存上限。需要注意,`wal_retention_size` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 26 | wal_roll_period | INT | wal 文件切换时长。需要注意,`wal_roll_period` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 27 | wal_segment_size | BIGINT | wal 单个文件大小。需要注意,`wal_segment_size` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 28 | stt_trigger | SMALLINT | 触发文件合并的落盘文件的个数。需要注意,`stt_trigger` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 29 | table_prefix | SMALLINT | 内部存储引擎根据表名分配存储该表数据的 VNODE 时要忽略的前缀的长度。需要注意,`table_prefix` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 30 | table_suffix | SMALLINT | 内部存储引擎根据表名分配存储该表数据的 VNODE 时要忽略的后缀的长度。需要注意,`table_suffix` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 31 | tsdb_pagesize | INT | 时序数据存储引擎中的页大小。需要注意,`tsdb_pagesize` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | ## INS_FUNCTIONS @@ -124,8 +114,8 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | # | **列名** | **数据类型** | **说明** | | --- | :---------: | ------------ | -------------- | | 1 | name | BINARY(64) | 函数名 | -| 2 | comment | BINARY(255) | 补充说明 | -| 3 | aggregate | INT | 是否为聚合函数 | +| 2 | comment | BINARY(255) | 补充说明。需要注意,`comment` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 3 | aggregate | INT | 是否为聚合函数。需要注意,`aggregate` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | | 4 | output_type | BINARY(31) | 输出类型 | | 5 | create_time | TIMESTAMP | 创建时间 | | 6 | code_len | INT | 代码长度 | @@ -154,12 +144,12 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | 2 | db_name | BINARY(64) | 超级表所在的数据库的名称 | | 3 | create_time | TIMESTAMP | 创建时间 | | 4 | columns | INT | 列数目 | -| 5 | tags | INT | 标签数目 | +| 5 | tags | INT | 标签数目。需要注意,`tags` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | | 6 | last_update | TIMESTAMP | 最后更新时间 | | 7 | table_comment | BINARY(1024) | 表注释 | -| 8 | watermark | BINARY(64) | 窗口的关闭时间 | -| 9 | max_delay | BINARY(64) | 推送计算结果的最大延迟 | -| 10 | rollup | BINARY(128) | rollup 聚合函数 | +| 8 | watermark | BINARY(64) | 窗口的关闭时间。需要注意,`watermark` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 9 | max_delay | BINARY(64) | 推送计算结果的最大延迟。需要注意,`max_delay` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 10 | rollup | BINARY(128) | rollup 聚合函数。需要注意,`rollup` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | ## INS_TABLES @@ -174,7 +164,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | 5 | stable_name | BINARY(192) | 所属的超级表表名 | | 6 | uid | BIGINT | 表 id | | 7 | vgroup_id | INT | vgroup id | -| 8 | ttl | INT | 表的生命周期 | +| 8 | ttl | INT | 表的生命周期。需要注意,`ttl` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | | 9 | table_comment | BINARY(1024) | 表注释 | | 10 | type | BINARY(20) | 表类型 | @@ -207,13 +197,13 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | --- | :---------: | ------------ | -------------------------------------------------- | | 1 | version | BINARY(9) | 企业版授权说明:official(官方授权的)/trial(试用的) | | 2 | cpu_cores | BINARY(9) | 授权使用的 CPU 核心数量 | -| 3 | dnodes | BINARY(10) | 授权使用的 dnode 节点数量 | -| 4 | streams | BINARY(10) | 授权创建的流数量 | -| 5 | users | BINARY(10) | 授权创建的用户数量 | -| 6 | accounts | BINARY(10) | 授权创建的帐户数量 | -| 7 | storage | BINARY(21) | 授权使用的存储空间大小 | -| 8 | connections | BINARY(21) | 授权使用的客户端连接数量 | -| 9 | databases | BINARY(11) | 授权使用的数据库数量 | +| 3 | dnodes | BINARY(10) | 授权使用的 dnode 节点数量。需要注意,`dnodes` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 4 | streams | BINARY(10) | 授权创建的流数量。需要注意,`streams` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 5 | users | BINARY(10) | 授权创建的用户数量。需要注意,`users` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 6 | accounts | BINARY(10) | 授权创建的帐户数量。需要注意,`accounts` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 7 | storage | BINARY(21) | 授权使用的存储空间大小。需要注意,`storage` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 8 | connections | BINARY(21) | 授权使用的客户端连接数量。需要注意,`connections` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 9 | databases | BINARY(11) | 授权使用的数据库数量。需要注意,`databases` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | | 10 | speed | BINARY(9) | 授权使用的数据点每秒写入数量 | | 11 | querytime | BINARY(9) | 授权使用的查询总时长 | | 12 | timeseries | BINARY(21) | 授权使用的测点数量 | @@ -228,7 +218,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | --- | :-------: | ------------ | ------------------------------------------------------ | | 1 | vgroup_id | INT | vgroup id | | 2 | db_name | BINARY(32) | 数据库名 | -| 3 | tables | INT | 此 vgroup 内有多少表 | +| 3 | tables | INT | 此 vgroup 内有多少表。需要注意,`tables` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | | 4 | status | BINARY(10) | 此 vgroup 的状态 | | 5 | v1_dnode | INT | 第一个成员所在的 dnode 的 id | | 6 | v1_status | BINARY(10) | 第一个成员的状态 | @@ -247,7 +237,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | # | **列名** | **数据类型** | **说明** | | --- | :------: | ------------ | ------------ | | 1 | name | BINARY(32) | 配置项名称 | -| 2 | value | BINARY(64) | 该配置项的值 | +| 2 | value | BINARY(64) | 该配置项的值。需要注意,`value` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | ## INS_DNODE_VARIABLES @@ -257,7 +247,7 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | --- | :------: | ------------ | ------------ | | 1 | dnode_id | INT | dnode 的 ID | | 2 | name | BINARY(32) | 配置项名称 | -| 3 | value | BINARY(64) | 该配置项的值 | +| 3 | value | BINARY(64) | 该配置项的值。需要注意,`value` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | ## INS_TOPICS @@ -288,5 +278,5 @@ TDengine 内置了一个名为 `INFORMATION_SCHEMA` 的数据库,提供对数 | 5 | source_db | BINARY(64) | 源数据库 | | 6 | target_db | BIANRY(64) | 目的数据库 | | 7 | target_table | BINARY(192) | 流计算写入的目标表 | -| 8 | watermark | BIGINT | watermark,详见 SQL 手册流式计算 | -| 9 | trigger | INT | 计算结果推送模式,详见 SQL 手册流式计算 | +| 8 | watermark | BIGINT | watermark,详见 SQL 手册流式计算。需要注意,`watermark` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | +| 9 | trigger | INT | 计算结果推送模式,详见 SQL 手册流式计算。需要注意,`trigger` 为 TDengine 关键字,作为列名使用时需要使用 ` 进行转义。 | diff --git a/docs/zh/12-taos-sql/24-show.md b/docs/zh/12-taos-sql/24-show.md index 31b7c085a1..ef0c8b90ed 100644 --- a/docs/zh/12-taos-sql/24-show.md +++ b/docs/zh/12-taos-sql/24-show.md @@ -14,14 +14,6 @@ SHOW APPS; 显示接入集群的应用(客户端)信息。 -## SHOW BNODES - -```sql -SHOW BNODES; -``` - -显示当前系统中存在的 BNODE (backup node, 即备份节点)的信息。 - ## SHOW CLUSTER ```sql @@ -129,14 +121,6 @@ SHOW MNODES; 显示当前系统中 MNODE 的信息。 -## SHOW MODULES - -```sql -SHOW MODULES; -``` - -显示当前系统中所安装的组件的信息。 - ## SHOW QNODES ```sql @@ -153,15 +137,7 @@ SHOW SCORES; 显示系统被许可授权的容量的信息。 -注:企业版独有 - -## SHOW SNODES - -```sql -SHOW SNODES; -``` - -显示当前系统中 SNODE (流计算节点)的信息。 +注:企业版独有。 ## SHOW STABLES diff --git a/docs/zh/14-reference/05-taosbenchmark.md b/docs/zh/14-reference/05-taosbenchmark.md index 0d6aad6240..9f4f728f78 100644 --- a/docs/zh/14-reference/05-taosbenchmark.md +++ b/docs/zh/14-reference/05-taosbenchmark.md @@ -334,13 +334,13 @@ taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\) - **name** : 列的名字,若与 count 同时使用,比如 "name":"current", "count":3, 则 3 个列的名字分别为 current, current_2. current_3。 -- **min** : 数据类型的 列/标签 的最小值。 +- **min** : 数据类型的 列/标签 的最小值。生成的值将大于或等于最小值。 -- **max** : 数据类型的 列/标签 的最大值。 +- **max** : 数据类型的 列/标签 的最大值。生成的值将小于最小值。 - **values** : nchar/binary 列/标签的值域,将从值中随机选择。 -- **sma**: 将该列加入bsma中,值为 "yes" 或者 "no",默认为 "no"。 +- **sma**: 将该列加入 SMA 中,值为 "yes" 或者 "no",默认为 "no"。 #### 插入行为配置参数 diff --git a/examples/c/stream_demo.c b/examples/c/stream_demo.c index 1c9d11b755..46c8297fba 100644 --- a/examples/c/stream_demo.c +++ b/examples/c/stream_demo.c @@ -49,28 +49,28 @@ int32_t init_env() { } taos_free_result(pRes); - pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int) tags(a int)"); + pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int, j varchar(20)) tags(a varchar(20))"); if (taos_errno(pRes) != 0) { printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes)); return -1; } taos_free_result(pRes); - pRes = taos_query(pConn, "create table if not exists tu1 using st1 tags(1)"); + pRes = taos_query(pConn, "create table if not exists tu1 using st1 tags('c1')"); if (taos_errno(pRes) != 0) { printf("failed to create child table tu1, reason:%s\n", taos_errstr(pRes)); return -1; } taos_free_result(pRes); - pRes = taos_query(pConn, "create table if not exists tu2 using st1 tags(2)"); + pRes = taos_query(pConn, "create table if not exists tu2 using st1 tags('c2')"); if (taos_errno(pRes) != 0) { printf("failed to create child table tu2, reason:%s\n", taos_errstr(pRes)); return -1; } taos_free_result(pRes); - pRes = taos_query(pConn, "create table if not exists tu3 using st1 tags(3)"); + pRes = taos_query(pConn, "create table if not exists tu3 using st1 tags('c3')"); if (taos_errno(pRes) != 0) { printf("failed to create child table tu3, reason:%s\n", taos_errstr(pRes)); return -1; @@ -96,7 +96,8 @@ int32_t create_stream() { taos_free_result(pRes); pRes = taos_query(pConn, - "create stream stream1 trigger at_once watermark 10s into outstb as select _wstart start, avg(k) from st1 partition by tbname interval(10s)"); + /*"create stream stream1 trigger at_once watermark 10s into outstb as select _wstart start, avg(k) from st1 partition by tbname interval(10s)");*/ + "create stream stream2 into outstb subtable(concat(concat(concat('prefix_', tname), '_suffix_'), cast(k1 as varchar(20)))) as select _wstart wstart, avg(k) from st1 partition by tbname tname, a k1 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 2add3332ab..eaddf4e983 100644 --- a/include/common/tcommon.h +++ b/include/common/tcommon.h @@ -49,7 +49,7 @@ typedef struct { TSKEY ts; } SWinKey; -static inline int SWinKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) { +static inline int sWinKeyCmprImpl(const void* pKey1, const void* pKey2) { SWinKey* pWin1 = (SWinKey*)pKey1; SWinKey* pWin2 = (SWinKey*)pKey2; @@ -68,6 +68,10 @@ static inline int SWinKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, i return 0; } +static inline int winKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) { + return sWinKeyCmprImpl(pKey1, pKey2); +} + typedef struct { uint64_t groupId; TSKEY ts; @@ -157,7 +161,7 @@ typedef struct SDataBlockInfo { int32_t rowSize; uint64_t uid; // the uid of table, from which current data block comes uint16_t blockId; // block id, generated by physical planner - uint64_t groupId; // no need to serialize + uint64_t groupId; int16_t hasVarCol; uint32_t capacity; // TODO: optimize and remove following @@ -166,6 +170,9 @@ typedef struct SDataBlockInfo { EStreamType type; // used for stream, do not serialize STimeWindow calWin; // used for stream, do not serialize TSKEY watermark; // used for stream + + char parTbName[TSDB_TABLE_NAME_LEN]; // used for stream partition + STag* pTag; // used for stream partition } SDataBlockInfo; typedef struct SSDataBlock { @@ -334,6 +341,7 @@ typedef struct SSortExecInfo { #define GROUPID_COLUMN_INDEX 3 #define CALCULATE_START_TS_COLUMN_INDEX 4 #define CALCULATE_END_TS_COLUMN_INDEX 5 +#define TABLE_NAME_COLUMN_INDEX 6 #ifdef __cplusplus } diff --git a/include/common/tdatablock.h b/include/common/tdatablock.h index 73d043b2d0..24dfa5958d 100644 --- a/include/common/tdatablock.h +++ b/include/common/tdatablock.h @@ -235,7 +235,8 @@ void blockDataFreeRes(SSDataBlock* pBlock); SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData); SSDataBlock* createSpecialDataBlock(EStreamType type); -int32_t blockDataAppendColInfo(SSDataBlock* pBlock, SColumnInfoData* pColInfoData); +SSDataBlock* blockCopyOneRow(const SSDataBlock* pDataBlock, int32_t rowIdx); +int32_t blockDataAppendColInfo(SSDataBlock* pBlock, SColumnInfoData* pColInfoData); SColumnInfoData createColumnInfoData(int16_t type, int32_t bytes, int16_t colId); SColumnInfoData* bdGetColumnInfoData(const SSDataBlock* pBlock, int32_t index); diff --git a/include/common/tglobal.h b/include/common/tglobal.h index bd5e74387e..350cd785d9 100644 --- a/include/common/tglobal.h +++ b/include/common/tglobal.h @@ -103,6 +103,7 @@ extern bool tsKeepColumnName; // client extern int32_t tsMinSlidingTime; extern int32_t tsMinIntervalTime; +extern int32_t tsMaxMemUsedByInsert; // build info extern char version[]; diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 7aec00c7c1..9f21ee007f 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -676,7 +676,6 @@ typedef struct { col_id_t colId; int16_t slotId; }; - bool output; // TODO remove it later int8_t type; int32_t bytes; @@ -1395,8 +1394,9 @@ typedef struct { int32_t numOfCols; int64_t skey; int64_t ekey; - int64_t version; // for stream - TSKEY watermark; // for stream + int64_t version; // for stream + TSKEY watermark; // for stream + char parTbName[TSDB_TABLE_NAME_LEN]; // for stream char data[]; } SRetrieveTableRsp; @@ -2025,7 +2025,7 @@ typedef struct SVCreateTbReq { int8_t type; union { struct { - char* name; // super table name + char* stbName; // super table name uint8_t tagNum; tb_uid_t suid; SArray* tagName; @@ -2045,7 +2045,7 @@ static FORCE_INLINE void tdDestroySVCreateTbReq(SVCreateTbReq* req) { taosMemoryFreeClear(req->comment); if (req->type == TSDB_CHILD_TABLE) { taosMemoryFreeClear(req->ctb.pTag); - taosMemoryFreeClear(req->ctb.name); + taosMemoryFreeClear(req->ctb.stbName); taosArrayDestroy(req->ctb.tagName); req->ctb.tagName = NULL; } else if (req->type == TSDB_NORMAL_TABLE) { diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h index ee566d759a..c3caac00ad 100644 --- a/include/libs/catalog/catalog.h +++ b/include/libs/catalog/catalog.h @@ -303,6 +303,10 @@ int32_t ctgdLaunchAsyncCall(SCatalog* pCtg, SRequestConnInfo* pConn, uint64_t re int32_t catalogClearCache(void); +SMetaData* catalogCloneMetaData(SMetaData* pData); + +void catalogFreeMetaData(SMetaData* pData); + /** * Destroy catalog and relase all resources */ diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index 78eedaf921..b4b60f804d 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -89,13 +89,6 @@ qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* readers, int32_t* n */ int32_t qSetMultiStreamInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numOfBlocks, int32_t type); -/** - * @brief Cleanup SSDataBlock for StreamScanInfo - * - * @param tinfo - */ -void tdCleanupStreamInputDataBlock(qTaskInfo_t tinfo); - /** * Update the table id list, add or remove. * @@ -137,7 +130,7 @@ int32_t qGetQueryTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* table * @return */ -int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bool* hasMore, SLocalFetch *pLocal); +int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bool* hasMore, SLocalFetch* pLocal); int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pBlock, uint64_t* useconds); /** diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index 5ee097bd92..e1acf0dd6a 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -385,7 +385,6 @@ typedef struct SCmdMsgInfo { SEpSet epSet; void* pMsg; int32_t msgLen; - void* pExtension; // todo remove it soon } SCmdMsgInfo; typedef enum EQueryExecMode { diff --git a/include/libs/parser/parser.h b/include/libs/parser/parser.h index b1a937910d..bcd2316baf 100644 --- a/include/libs/parser/parser.h +++ b/include/libs/parser/parser.h @@ -33,6 +33,13 @@ typedef struct SStmtCallback { int32_t (*getExecInfoFn)(TAOS_STMT*, SHashObj**, SHashObj**); } SStmtCallback; +typedef struct SParseCsvCxt { + TdFilePtr fp; // last parsed file + int32_t tableNo; // last parsed table + SName tableName; // last parsed table + const char* pLastSqlPos; // the location of the last parsed sql +} SParseCsvCxt; + typedef struct SParseContext { uint64_t requestId; int64_t requestRid; @@ -57,6 +64,8 @@ typedef struct SParseContext { SArray* pTableMetaPos; // sql table pos => catalog data pos SArray* pTableVgroupPos; // sql table pos => catalog data pos int64_t allocatorId; + bool needMultiParse; + SParseCsvCxt csvCxt; } SParseContext; int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery); @@ -67,6 +76,8 @@ int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCatalogReq, const struct SMetaData* pMetaData, SQuery* pQuery); +void qDestroyParseContext(SParseContext* pCxt); + void qDestroyQuery(SQuery* pQueryNode); int32_t qExtractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pSchema); diff --git a/include/os/os.h b/include/os/os.h index 71966061a1..d646ffe4fd 100644 --- a/include/os/os.h +++ b/include/os/os.h @@ -51,6 +51,9 @@ extern "C" { #endif #else +#ifndef __func__ +#define __func__ __FUNCTION__ +#endif #include #include #ifndef TD_USE_WINSOCK diff --git a/include/os/osTime.h b/include/os/osTime.h index 965ec61671..48f046d4d0 100644 --- a/include/os/osTime.h +++ b/include/os/osTime.h @@ -82,8 +82,9 @@ static FORCE_INLINE int64_t taosGetTimestampNs() { return (int64_t)systemTime.tv_sec * 1000000000LL + (int64_t)systemTime.tv_nsec; } -char * taosStrpTime(const char *buf, const char *fmt, struct tm *tm); +char *taosStrpTime(const char *buf, const char *fmt, struct tm *tm); struct tm *taosLocalTime(const time_t *timep, struct tm *result); +struct tm *taosLocalTimeNolock(struct tm *result, const time_t *timep, int dst); time_t taosTime(time_t *t); time_t taosMktime(struct tm *timep); diff --git a/include/util/taoserror.h b/include/util/taoserror.h index f6940b2895..add8f33cc2 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -632,6 +632,10 @@ int32_t* taosGetErrno(); #define TSDB_CODE_TMQ_CONSUMER_MISMATCH TAOS_DEF_ERROR_CODE(0, 0x4001) #define TSDB_CODE_TMQ_CONSUMER_CLOSED TAOS_DEF_ERROR_CODE(0, 0x4002) +// TDLite +#define TSDB_CODE_TDLITE_IVLD_OPEN_FLAGS TAOS_DEF_ERROR_CODE(0, 0x4100) +#define TSDB_CODE_TDLITE_IVLD_OPEN_DIR TAOS_DEF_ERROR_CODE(0, 0x4101) + #ifdef __cplusplus } #endif diff --git a/include/util/tdef.h b/include/util/tdef.h index 43fd31afa7..e6d28ae341 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -297,7 +297,7 @@ typedef enum ELogicConditionType { #define TSDB_MAX_BUFFER_PER_VNODE 16384 // unit MB #define TSDB_DEFAULT_BUFFER_PER_VNODE 96 #define TSDB_MIN_PAGES_PER_VNODE 64 -#define TSDB_MAX_PAGES_PER_VNODE 16384 +#define TSDB_MAX_PAGES_PER_VNODE (INT32_MAX - 1) #define TSDB_DEFAULT_PAGES_PER_VNODE 256 #define TSDB_MIN_PAGESIZE_PER_VNODE 1 // unit KB #define TSDB_MAX_PAGESIZE_PER_VNODE 16384 @@ -483,7 +483,7 @@ enum { #define SNODE_HANDLE -2 #define VNODE_HANDLE -3 #define BNODE_HANDLE -4 -#define CLIENT_HANDLE -5 +#define CLIENT_HANDLE -5 #define TSDB_CONFIG_OPTION_LEN 32 #define TSDB_CONFIG_VALUE_LEN 64 diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh index a71614ad6e..b8796ddf09 100755 --- a/packaging/tools/make_install.sh +++ b/packaging/tools/make_install.sh @@ -317,10 +317,6 @@ function install_lib() { ${csudo}chmod 777 ${install_main_dir}/driver/libtaosws.so ||: ${csudo}ln -sf ${install_main_dir}/driver/libtaosws.so ${lib_link_dir}/libtaosws.so || : - - if [ -d "${lib64_link_dir}" ]; then - ${csudo}ln -sf ${lib64_link_dir}/libtaosws.so ${lib64_link_dir}/libtaosws.so || : - fi fi else ${csudo}cp -Rf ${binary_dir}/build/lib/libtaos.${verNumber}.dylib \ diff --git a/packaging/tools/makepkg.sh b/packaging/tools/makepkg.sh index fb0ef4f9a3..60d7440487 100755 --- a/packaging/tools/makepkg.sh +++ b/packaging/tools/makepkg.sh @@ -47,7 +47,7 @@ if [ -d ${top_dir}/tools/taos-tools/packaging/deb ]; then cd ${top_dir}/tools/taos-tools/packaging/deb [ -z "$taos_tools_ver" ] && taos_tools_ver="0.1.0" - taostools_ver=$(git describe --tags | sed -e 's/ver-//g' | awk -F '-' '{print $1}') + taostools_ver=$(git tag |grep -v taos | sort | tail -1) taostools_install_dir="${release_dir}/${clientName}Tools-${taostools_ver}" cd ${curr_dir} diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index 535a436c6c..f815adfeaa 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -380,16 +380,25 @@ void hbDeregisterConn(SAppHbMgr* pAppHbMgr, SClientHbKey connKey); // --- mq void hbMgrInitMqHbRspHandle(); +typedef struct SSqlCallbackWrapper { + SParseContext* pParseCtx; + SCatalogReq* pCatalogReq; + SMetaData* pResultMeta; + SRequestObj* pRequest; +} SSqlCallbackWrapper; + SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQuery, void** res); int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList); -void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultMeta); -int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest); -int32_t updateQnodeList(SAppInstInfo* pInfo, SArray* pNodeList); -void doAsyncQuery(SRequestObj* pRequest, bool forceUpdateMeta); -int32_t removeMeta(STscObj* pTscObj, SArray* tbList); -int32_t handleAlterTbExecRes(void* res, struct SCatalog* pCatalog); -int32_t handleCreateTbExecRes(void* res, SCatalog* pCatalog); -bool qnodeRequired(SRequestObj* pRequest); +void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultMeta, SSqlCallbackWrapper* pWrapper); +int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest); +int32_t updateQnodeList(SAppInstInfo* pInfo, SArray* pNodeList); +void doAsyncQuery(SRequestObj* pRequest, bool forceUpdateMeta); +int32_t removeMeta(STscObj* pTscObj, SArray* tbList); +int32_t handleAlterTbExecRes(void* res, struct SCatalog* pCatalog); +int32_t handleCreateTbExecRes(void* res, SCatalog* pCatalog); +bool qnodeRequired(SRequestObj* pRequest); +int32_t continueInsertFromCsv(SSqlCallbackWrapper* pWrapper, SRequestObj* pRequest); +void destorySqlCallbackWrapper(SSqlCallbackWrapper* pWrapper); #ifdef __cplusplus } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 8ffc88ec28..58bfcc8a09 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -868,10 +868,11 @@ int32_t handleQueryExecRsp(SRequestObj* pRequest) { return code; } -//todo refacto the error code mgmt +// todo refacto the error code mgmt void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { - SRequestObj* pRequest = (SRequestObj*)param; - STscObj* pTscObj = pRequest->pTscObj; + SSqlCallbackWrapper* pWrapper = param; + SRequestObj* pRequest = pWrapper->pRequest; + STscObj* pTscObj = pRequest->pTscObj; pRequest->code = code; if (pResult) { @@ -882,7 +883,7 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { int32_t type = pRequest->type; if (TDMT_VND_SUBMIT == type || TDMT_VND_DELETE == type || TDMT_VND_CREATE_TABLE == type) { if (pResult) { - pRequest->body.resInfo.numOfRows = pResult->numOfRows; + pRequest->body.resInfo.numOfRows += pResult->numOfRows; // record the insert rows if (TDMT_VND_SUBMIT == type) { @@ -899,12 +900,13 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { pRequest->requestId); if (code != TSDB_CODE_SUCCESS && NEED_CLIENT_HANDLE_ERROR(code) && pRequest->sqlstr != NULL) { - tscDebug("0x%" PRIx64 " client retry to handle the error, code:%s, tryCount:%d, reqId:0x%" PRIx64, - pRequest->self, tstrerror(code), pRequest->retry, pRequest->requestId); + tscDebug("0x%" PRIx64 " client retry to handle the error, code:%s, tryCount:%d, reqId:0x%" PRIx64, pRequest->self, + tstrerror(code), pRequest->retry, pRequest->requestId); pRequest->prevCode = code; schedulerFreeJob(&pRequest->body.queryJob, 0); qDestroyQuery(pRequest->pQuery); pRequest->pQuery = NULL; + destorySqlCallbackWrapper(pWrapper); doAsyncQuery(pRequest, true); return; } @@ -920,6 +922,15 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { pRequest->code = code1; } + if (pRequest->code == TSDB_CODE_SUCCESS && NULL != pWrapper->pParseCtx && pWrapper->pParseCtx->needMultiParse) { + code = continueInsertFromCsv(pWrapper, pRequest); + if (TSDB_CODE_SUCCESS == code) { + return; + } + } + + destorySqlCallbackWrapper(pWrapper); + // return to client pRequest->body.queryFp(pRequest->body.param, pRequest, code); } @@ -1020,76 +1031,86 @@ SRequestObj* launchQuery(uint64_t connId, const char* sql, int sqlLen, bool vali return launchQueryImpl(pRequest, pQuery, false, NULL); } -void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultMeta) { +static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultMeta, + SSqlCallbackWrapper* pWrapper) { + pRequest->type = pQuery->msgType; + + SArray* pMnodeList = taosArrayInit(4, sizeof(SQueryNodeLoad)); + SPlanContext cxt = {.queryId = pRequest->requestId, + .acctId = pRequest->pTscObj->acctId, + .mgmtEpSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp), + .pAstRoot = pQuery->pRoot, + .showRewrite = pQuery->showRewrite, + .pMsg = pRequest->msgBuf, + .msgLen = ERROR_MSG_BUF_DEFAULT_SIZE, + .pUser = pRequest->pTscObj->user, + .sysInfo = pRequest->pTscObj->sysInfo, + .allocatorId = pRequest->allocatorRefId}; + SQueryPlan* pDag = NULL; + int32_t code = qCreateQueryPlan(&cxt, &pDag, pMnodeList); + if (code) { + tscError("0x%" PRIx64 " failed to create query plan, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code), + pRequest->requestId); + } else { + pRequest->body.subplanNum = pDag->numOfSubplans; + } + + pRequest->metric.planEnd = taosGetTimestampUs(); + + if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) { + SArray* pNodeList = NULL; + buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta); + + SRequestConnInfo conn = {.pTrans = getAppInfo(pRequest)->pTransporter, + .requestId = pRequest->requestId, + .requestObjRefId = pRequest->self}; + SSchedulerReq req = { + .syncReq = false, + .localReq = (tsQueryPolicy == QUERY_POLICY_CLIENT), + .pConn = &conn, + .pNodeList = pNodeList, + .pDag = pDag, + .allocatorRefId = pRequest->allocatorRefId, + .sql = pRequest->sqlstr, + .startTs = pRequest->metric.start, + .execFp = schedulerExecCb, + .cbParam = pWrapper, + .chkKillFp = chkRequestKilled, + .chkKillParam = (void*)pRequest->self, + .pExecRes = NULL, + }; + code = schedulerExecJob(&req, &pRequest->body.queryJob); + taosArrayDestroy(pNodeList); + } else { + tscDebug("0x%" PRIx64 " plan not executed, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code), + pRequest->requestId); + destorySqlCallbackWrapper(pWrapper); + pRequest->body.queryFp(pRequest->body.param, pRequest, code); + } + + // todo not to be released here + taosArrayDestroy(pMnodeList); + + return code; +} + +void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultMeta, SSqlCallbackWrapper* pWrapper) { int32_t code = 0; pRequest->body.execMode = pQuery->execMode; + if (QUERY_EXEC_MODE_SCHEDULE != pRequest->body.execMode) { + destorySqlCallbackWrapper(pWrapper); + } switch (pQuery->execMode) { case QUERY_EXEC_MODE_LOCAL: asyncExecLocalCmd(pRequest, pQuery); - return; + break; case QUERY_EXEC_MODE_RPC: code = asyncExecDdlQuery(pRequest, pQuery); break; case QUERY_EXEC_MODE_SCHEDULE: { - SArray* pMnodeList = taosArrayInit(4, sizeof(SQueryNodeLoad)); - - pRequest->type = pQuery->msgType; - - SPlanContext cxt = {.queryId = pRequest->requestId, - .acctId = pRequest->pTscObj->acctId, - .mgmtEpSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp), - .pAstRoot = pQuery->pRoot, - .showRewrite = pQuery->showRewrite, - .pMsg = pRequest->msgBuf, - .msgLen = ERROR_MSG_BUF_DEFAULT_SIZE, - .pUser = pRequest->pTscObj->user, - .sysInfo = pRequest->pTscObj->sysInfo, - .allocatorId = pRequest->allocatorRefId}; - - SAppInstInfo* pAppInfo = getAppInfo(pRequest); - SQueryPlan* pDag = NULL; - code = qCreateQueryPlan(&cxt, &pDag, pMnodeList); - if (code) { - tscError("0x%" PRIx64 " failed to create query plan, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code), - pRequest->requestId); - } else { - pRequest->body.subplanNum = pDag->numOfSubplans; - } - - pRequest->metric.planEnd = taosGetTimestampUs(); - if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) { - SArray* pNodeList = NULL; - buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta); - - SRequestConnInfo conn = { - .pTrans = pAppInfo->pTransporter, .requestId = pRequest->requestId, .requestObjRefId = pRequest->self}; - SSchedulerReq req = { - .syncReq = false, - .localReq = (tsQueryPolicy == QUERY_POLICY_CLIENT), - .pConn = &conn, - .pNodeList = pNodeList, - .pDag = pDag, - .allocatorRefId = pRequest->allocatorRefId, - .sql = pRequest->sqlstr, - .startTs = pRequest->metric.start, - .execFp = schedulerExecCb, - .cbParam = pRequest, - .chkKillFp = chkRequestKilled, - .chkKillParam = (void*)pRequest->self, - .pExecRes = NULL, - }; - code = schedulerExecJob(&req, &pRequest->body.queryJob); - taosArrayDestroy(pNodeList); - } else { - tscDebug("0x%" PRIx64 " plan not executed, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code), - pRequest->requestId); - pRequest->body.queryFp(pRequest->body.param, pRequest, code); - } - - // todo not to be released here - taosArrayDestroy(pMnodeList); + code = asyncExecSchQuery(pRequest, pQuery, pResultMeta, pWrapper); break; } case QUERY_EXEC_MODE_EMPTY_RESULT: diff --git a/source/client/src/TSDBJNIConnector.c b/source/client/src/clientJniConnector.c similarity index 100% rename from source/client/src/TSDBJNIConnector.c rename to source/client/src/clientJniConnector.c diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index 5b255a28ea..6f8cef7c0d 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -667,43 +667,47 @@ const char *taos_get_server_info(TAOS *taos) { return pTscObj->sDetailVer; } -typedef struct SqlParseWrapper { - SParseContext *pCtx; - SCatalogReq catalogReq; - SRequestObj *pRequest; -} SqlParseWrapper; - static void destoryTablesReq(void *p) { STablesReq *pRes = (STablesReq *)p; taosArrayDestroy(pRes->pTables); } -static void destorySqlParseWrapper(SqlParseWrapper *pWrapper) { - taosArrayDestroy(pWrapper->catalogReq.pDbVgroup); - taosArrayDestroy(pWrapper->catalogReq.pDbCfg); - taosArrayDestroy(pWrapper->catalogReq.pDbInfo); - taosArrayDestroyEx(pWrapper->catalogReq.pTableMeta, destoryTablesReq); - taosArrayDestroyEx(pWrapper->catalogReq.pTableHash, destoryTablesReq); - taosArrayDestroy(pWrapper->catalogReq.pUdf); - taosArrayDestroy(pWrapper->catalogReq.pIndex); - taosArrayDestroy(pWrapper->catalogReq.pUser); - taosArrayDestroy(pWrapper->catalogReq.pTableIndex); - taosArrayDestroy(pWrapper->pCtx->pTableMetaPos); - taosArrayDestroy(pWrapper->pCtx->pTableVgroupPos); - taosMemoryFree(pWrapper->pCtx); +static void destoryCatalogReq(SCatalogReq *pCatalogReq) { + if (NULL == pCatalogReq) { + return; + } + taosArrayDestroy(pCatalogReq->pDbVgroup); + taosArrayDestroy(pCatalogReq->pDbCfg); + taosArrayDestroy(pCatalogReq->pDbInfo); + taosArrayDestroyEx(pCatalogReq->pTableMeta, destoryTablesReq); + taosArrayDestroyEx(pCatalogReq->pTableHash, destoryTablesReq); + taosArrayDestroy(pCatalogReq->pUdf); + taosArrayDestroy(pCatalogReq->pIndex); + taosArrayDestroy(pCatalogReq->pUser); + taosArrayDestroy(pCatalogReq->pTableIndex); + taosMemoryFree(pCatalogReq); +} + +void destorySqlCallbackWrapper(SSqlCallbackWrapper *pWrapper) { + if (NULL == pWrapper) { + return; + } + destoryCatalogReq(pWrapper->pCatalogReq); + qDestroyParseContext(pWrapper->pParseCtx); + catalogFreeMetaData(pWrapper->pResultMeta); taosMemoryFree(pWrapper); } void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) { - SqlParseWrapper *pWrapper = (SqlParseWrapper *)param; - SRequestObj *pRequest = pWrapper->pRequest; - SQuery *pQuery = pRequest->pQuery; + SSqlCallbackWrapper *pWrapper = (SSqlCallbackWrapper *)param; + SRequestObj *pRequest = pWrapper->pRequest; + SQuery *pQuery = pRequest->pQuery; pRequest->metric.ctgEnd = taosGetTimestampUs(); qDebug("0x%" PRIx64 " start to semantic analysis, reqId:0x%" PRIx64, pRequest->self, pRequest->requestId); if (code == TSDB_CODE_SUCCESS) { - code = qAnalyseSqlSemantic(pWrapper->pCtx, &pWrapper->catalogReq, pResultMeta, pQuery); + code = qAnalyseSqlSemantic(pWrapper->pParseCtx, pWrapper->pCatalogReq, pResultMeta, pQuery); pRequest->stableQuery = pQuery->stableQuery; if (pQuery->pRoot) { pRequest->stmtType = pQuery->pRoot->type; @@ -712,6 +716,13 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) { pRequest->metric.semanticEnd = taosGetTimestampUs(); + if (code == TSDB_CODE_SUCCESS && pWrapper->pParseCtx->needMultiParse) { + pWrapper->pResultMeta = catalogCloneMetaData(pResultMeta); + if (NULL == pWrapper->pResultMeta) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + } + if (code == TSDB_CODE_SUCCESS) { if (pQuery->haveResultSet) { setResSchemaInfo(&pRequest->body.resInfo, pQuery->pResSchema, pQuery->numOfResCols); @@ -722,15 +733,13 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) { TSWAP(pRequest->tableList, (pQuery)->pTableList); TSWAP(pRequest->targetTableList, (pQuery)->pTargetTableList); - destorySqlParseWrapper(pWrapper); - - double el = (pRequest->metric.semanticEnd - pRequest->metric.ctgEnd)/1000.0; + double el = (pRequest->metric.semanticEnd - pRequest->metric.ctgEnd) / 1000.0; tscDebug("0x%" PRIx64 " analysis semantics completed, start async query, elapsed time:%.2f ms, reqId:0x%" PRIx64, pRequest->self, el, pRequest->requestId); - launchAsyncQuery(pRequest, pQuery, pResultMeta); + launchAsyncQuery(pRequest, pQuery, pResultMeta, pWrapper); } else { - destorySqlParseWrapper(pWrapper); + destorySqlCallbackWrapper(pWrapper); qDestroyQuery(pRequest->pQuery); pRequest->pQuery = NULL; @@ -750,6 +759,16 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) { } } +int32_t continueInsertFromCsv(SSqlCallbackWrapper *pWrapper, SRequestObj *pRequest) { + qDestroyQuery(pRequest->pQuery); + pRequest->pQuery = (SQuery *)nodesMakeNode(QUERY_NODE_QUERY); + if (NULL == pRequest->pQuery) { + return TSDB_CODE_OUT_OF_MEMORY; + } + retrieveMetaCallback(pWrapper->pResultMeta, pWrapper, TSDB_CODE_SUCCESS); + return TSDB_CODE_SUCCESS; +} + void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param) { int64_t connId = *(int64_t *)taos; taosAsyncQueryImpl(connId, sql, fp, param, false); @@ -786,37 +805,48 @@ int32_t createParseContext(const SRequestObj *pRequest, SParseContext **pCxt) { } void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { - SParseContext *pCxt = NULL; - STscObj *pTscObj = pRequest->pTscObj; - int32_t code = 0; + STscObj *pTscObj = pRequest->pTscObj; + SSqlCallbackWrapper *pWrapper = NULL; + int32_t code = TSDB_CODE_SUCCESS; if (pRequest->retry++ > REQUEST_TOTAL_EXEC_TIMES) { code = pRequest->prevCode; - goto _error; } - code = createParseContext(pRequest, &pCxt); - if (code != TSDB_CODE_SUCCESS) { - goto _error; + if (TSDB_CODE_SUCCESS == code) { + pWrapper = taosMemoryCalloc(1, sizeof(SSqlCallbackWrapper)); + if (pWrapper == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + } else { + pWrapper->pRequest = pRequest; + } } - pCxt->mgmtEpSet = getEpSet_s(&pTscObj->pAppInfo->mgmtEp); - code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &pCxt->pCatalog); - if (code != TSDB_CODE_SUCCESS) { - goto _error; + if (TSDB_CODE_SUCCESS == code) { + code = createParseContext(pRequest, &pWrapper->pParseCtx); } - pRequest->metric.syntaxStart = taosGetTimestampUs(); - - SCatalogReq catalogReq = {.forceUpdate = updateMetaForce, .qNodeRequired = qnodeRequired(pRequest)}; - code = qParseSqlSyntax(pCxt, &pRequest->pQuery, &catalogReq); - if (code != TSDB_CODE_SUCCESS) { - goto _error; + if (TSDB_CODE_SUCCESS == code) { + pWrapper->pParseCtx->mgmtEpSet = getEpSet_s(&pTscObj->pAppInfo->mgmtEp); + code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &pWrapper->pParseCtx->pCatalog); } - pRequest->metric.syntaxEnd = taosGetTimestampUs(); + if (TSDB_CODE_SUCCESS == code) { + pRequest->metric.syntaxStart = taosGetTimestampUs(); - if (!updateMetaForce) { + pWrapper->pCatalogReq = taosMemoryCalloc(1, sizeof(SCatalogReq)); + if (pWrapper->pCatalogReq == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + } else { + pWrapper->pCatalogReq->forceUpdate = updateMetaForce; + pWrapper->pCatalogReq->qNodeRequired = qnodeRequired(pRequest); + code = qParseSqlSyntax(pWrapper->pParseCtx, &pRequest->pQuery, pWrapper->pCatalogReq); + } + + pRequest->metric.syntaxEnd = taosGetTimestampUs(); + } + + if (TSDB_CODE_SUCCESS == code && !updateMetaForce) { SAppClusterSummary *pActivity = &pTscObj->pAppInfo->summary; if (NULL == pRequest->pQuery->pRoot) { atomic_add_fetch_64((int64_t *)&pActivity->numOfInsertsReq, 1); @@ -825,38 +855,26 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { } } - SqlParseWrapper *pWrapper = taosMemoryCalloc(1, sizeof(SqlParseWrapper)); - if (pWrapper == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _error; + if (TSDB_CODE_SUCCESS == code) { + SRequestConnInfo conn = {.pTrans = pWrapper->pParseCtx->pTransporter, + .requestId = pWrapper->pParseCtx->requestId, + .requestObjRefId = pWrapper->pParseCtx->requestRid, + .mgmtEps = pWrapper->pParseCtx->mgmtEpSet}; + + pRequest->metric.ctgStart = taosGetTimestampUs(); + + code = catalogAsyncGetAllMeta(pWrapper->pParseCtx->pCatalog, &conn, pWrapper->pCatalogReq, retrieveMetaCallback, + pWrapper, &pRequest->body.queryJob); } - pWrapper->pCtx = pCxt; - pWrapper->pRequest = pRequest; - pWrapper->catalogReq = catalogReq; - - SRequestConnInfo conn = {.pTrans = pCxt->pTransporter, - .requestId = pCxt->requestId, - .requestObjRefId = pCxt->requestRid, - .mgmtEps = pCxt->mgmtEpSet}; - - pRequest->metric.ctgStart = taosGetTimestampUs(); - - code = catalogAsyncGetAllMeta(pCxt->pCatalog, &conn, &catalogReq, retrieveMetaCallback, pWrapper, - &pRequest->body.queryJob); - pCxt = NULL; - if (code == TSDB_CODE_SUCCESS) { - return; + if (TSDB_CODE_SUCCESS != code) { + tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code), + pRequest->requestId); + destorySqlCallbackWrapper(pWrapper); + terrno = code; + pRequest->code = code; + pRequest->body.queryFp(pRequest->body.param, pRequest, code); } - -_error: - tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code), - pRequest->requestId); - taosMemoryFree(pCxt); - - terrno = code; - pRequest->code = code; - pRequest->body.queryFp(pRequest->body.param, pRequest, code); } static void fetchCallback(void *pResult, void *param, int32_t code) { diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c index eb7b45cc05..a257335931 100644 --- a/source/client/src/clientRawBlockWrite.c +++ b/source/client/src/clientRawBlockWrite.c @@ -225,10 +225,10 @@ _err: return string; } -static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq){ - STag* pTag = (STag*)pCreateReq->ctb.pTag; - char* sname = pCreateReq->ctb.name; - char* name = pCreateReq->name; +static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq) { + STag* pTag = (STag*)pCreateReq->ctb.pTag; + char* sname = pCreateReq->ctb.stbName; + char* name = pCreateReq->name; SArray* tagName = pCreateReq->ctb.tagName; int64_t id = pCreateReq->uid; uint8_t tagNum = pCreateReq->ctb.tagNum; @@ -302,14 +302,14 @@ static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq){ cJSON_AddItemToArray(tags, tag); } - end: +end: cJSON_AddItemToObject(json, "tags", tags); taosArrayDestroy(pTagVals); } static char* buildCreateCTableJson(SVCreateTbReq* pCreateReq, int32_t nReqs) { - char* string = NULL; - cJSON* json = cJSON_CreateObject(); + char* string = NULL; + cJSON* json = cJSON_CreateObject(); if (json == NULL) { return NULL; } @@ -325,7 +325,7 @@ static char* buildCreateCTableJson(SVCreateTbReq* pCreateReq, int32_t nReqs) { buildChildElement(json, pCreateReq); cJSON* createList = cJSON_CreateArray(); - for(int i = 0; nReqs > 1 && i < nReqs; i++){ + for (int i = 0; nReqs > 1 && i < nReqs; i++) { cJSON* create = cJSON_CreateObject(); buildChildElement(create, pCreateReq + i); cJSON_AddItemToArray(createList, create); @@ -355,7 +355,8 @@ static char* processCreateTable(SMqMetaRsp* metaRsp) { if (pCreateReq->type == TSDB_CHILD_TABLE) { string = buildCreateCTableJson(req.pReqs, req.nReqs); } else if (pCreateReq->type == TSDB_NORMAL_TABLE) { - string = buildCreateTableJson(&pCreateReq->ntb.schemaRow, NULL, pCreateReq->name, pCreateReq->uid, TSDB_NORMAL_TABLE); + string = + buildCreateTableJson(&pCreateReq->ntb.schemaRow, NULL, pCreateReq->name, pCreateReq->uid, TSDB_NORMAL_TABLE); } } @@ -374,15 +375,15 @@ _exit: static char* processAutoCreateTable(STaosxRsp* rsp) { ASSERT(rsp->createTableNum != 0); - SDecoder* decoder = taosMemoryCalloc(rsp->createTableNum, sizeof(SDecoder)); - SVCreateTbReq* pCreateReq = taosMemoryCalloc(rsp->createTableNum, sizeof(SVCreateTbReq)); - char* string = NULL; + SDecoder* decoder = taosMemoryCalloc(rsp->createTableNum, sizeof(SDecoder)); + SVCreateTbReq* pCreateReq = taosMemoryCalloc(rsp->createTableNum, sizeof(SVCreateTbReq)); + char* string = NULL; // loop to create table for (int32_t iReq = 0; iReq < rsp->createTableNum; iReq++) { // decode void** data = taosArrayGet(rsp->createTableReq, iReq); - int32_t *len = taosArrayGet(rsp->createTableLen, iReq); + int32_t* len = taosArrayGet(rsp->createTableLen, iReq); tDecoderInit(&decoder[iReq], *data, *len); if (tDecodeSVCreateTbReq(&decoder[iReq], pCreateReq + iReq) < 0) { goto _exit; @@ -393,7 +394,7 @@ static char* processAutoCreateTable(STaosxRsp* rsp) { string = buildCreateCTableJson(pCreateReq, rsp->createTableNum); _exit: - for(int i = 0; i < rsp->createTableNum; i++){ + for (int i = 0; i < rsp->createTableNum; i++) { tDecoderClear(&decoder[i]); taosMemoryFreeClear(pCreateReq[i].comment); if (pCreateReq[i].type == TSDB_CHILD_TABLE) { @@ -828,10 +829,10 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) { if (pCreateReq->type == TSDB_CHILD_TABLE) { STableMeta* pTableMeta = NULL; SName sName = {0}; - toName(pTscObj->acctId, pRequest->pDb, pCreateReq->ctb.name, &sName); + toName(pTscObj->acctId, pRequest->pDb, pCreateReq->ctb.stbName, &sName); code = catalogGetTableMeta(pCatalog, &conn, &sName, &pTableMeta); if (code != TSDB_CODE_SUCCESS) { - uError("taosCreateTable:catalogGetTableMeta failed. table name: %s", pCreateReq->ctb.name); + uError("taosCreateTable:catalogGetTableMeta failed. table name: %s", pCreateReq->ctb.stbName); goto end; } @@ -1661,12 +1662,12 @@ end: } static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) { - int32_t code = TSDB_CODE_SUCCESS; - SHashObj* pVgHash = NULL; - SQuery* pQuery = NULL; - SMqTaosxRspObj rspObj = {0}; - SDecoder decoder = {0}; - STableMeta* pTableMeta = NULL; + int32_t code = TSDB_CODE_SUCCESS; + SHashObj* pVgHash = NULL; + SQuery* pQuery = NULL; + SMqTaosxRspObj rspObj = {0}; + SDecoder decoder = {0}; + STableMeta* pTableMeta = NULL; terrno = TSDB_CODE_SUCCESS; SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT); @@ -1745,13 +1746,13 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) // find schema data info int32_t schemaLen = 0; - void* schemaData = NULL; - for(int j = 0; j < rspObj.rsp.createTableNum; j++){ - void** dataTmp = taosArrayGet(rspObj.rsp.createTableReq, j); + void* schemaData = NULL; + for (int j = 0; j < rspObj.rsp.createTableNum; j++) { + void** dataTmp = taosArrayGet(rspObj.rsp.createTableReq, j); int32_t* lenTmp = taosArrayGet(rspObj.rsp.createTableLen, j); - SDecoder decoderTmp = {0}; - SVCreateTbReq pCreateReq = {0}; + SDecoder decoderTmp = {0}; + SVCreateTbReq pCreateReq = {0}; tDecoderInit(&decoderTmp, *dataTmp, *lenTmp); if (tDecodeSVCreateTbReq(&decoderTmp, &pCreateReq) < 0) { @@ -1761,11 +1762,11 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) goto end; } - ASSERT (pCreateReq.type == TSDB_CHILD_TABLE); - if(strcmp(tbName, pCreateReq.name) == 0){ + ASSERT(pCreateReq.type == TSDB_CHILD_TABLE); + if (strcmp(tbName, pCreateReq.name) == 0) { schemaLen = *lenTmp; schemaData = *dataTmp; - strcpy(pName.tname, pCreateReq.ctb.name); + strcpy(pName.tname, pCreateReq.ctb.stbName); tDecoderClear(&decoderTmp); taosMemoryFreeClear(pCreateReq.comment); taosArrayDestroy(pCreateReq.ctb.tagName); @@ -1843,8 +1844,8 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) uint64_t uid = pTableMeta->uid; int16_t sver = pTableMeta->sversion; - void* blkSchema = POINTER_SHIFT(blk, sizeof(SSubmitBlk)); - if(schemaData){ + void* blkSchema = POINTER_SHIFT(blk, sizeof(SSubmitBlk)); + if (schemaData) { memcpy(blkSchema, schemaData, schemaLen); } STSRow* rowData = POINTER_SHIFT(blkSchema, schemaLen); @@ -1952,7 +1953,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) launchQueryImpl(pRequest, pQuery, true, NULL); code = pRequest->code; - end: +end: tDeleteSTaosxRsp(&rspObj.rsp); rspObj.resInfo.pRspMsg = NULL; doFreeReqResultInfo(&rspObj.resInfo); @@ -1969,7 +1970,7 @@ char* tmq_get_json_meta(TAOS_RES* res) { return NULL; } - if(TD_RES_TMQ_METADATA(res)){ + if (TD_RES_TMQ_METADATA(res)) { SMqTaosxRspObj* pMetaDataRspObj = (SMqTaosxRspObj*)res; return processAutoCreateTable(&pMetaDataRspObj->rsp); } diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 195466061d..c5633e73d0 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -209,7 +209,7 @@ static inline bool smlCheckDuplicateKey(const char *key, int32_t keyLen, SHashOb } static int32_t smlBuildInvalidDataMsg(SSmlMsgBuf *pBuf, const char *msg1, const char *msg2) { - if(pBuf->buf){ + if (pBuf->buf) { memset(pBuf->buf, 0, pBuf->len); if (msg1) strncat(pBuf->buf, msg1, pBuf->len); int32_t left = pBuf->len - strlen(pBuf->buf); @@ -256,15 +256,15 @@ static int32_t smlFindNearestPowerOf2(int32_t length, uint8_t type) { while (result <= length) { result *= 2; } - if (type == TSDB_DATA_TYPE_BINARY && result > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE){ + if (type == TSDB_DATA_TYPE_BINARY && result > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) { result = TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE; - } else if (type == TSDB_DATA_TYPE_NCHAR && result > (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE){ + } else if (type == TSDB_DATA_TYPE_NCHAR && result > (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) { result = (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE; } - if (type == TSDB_DATA_TYPE_NCHAR){ + if (type == TSDB_DATA_TYPE_NCHAR) { result = result * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE; - }else if (type == TSDB_DATA_TYPE_BINARY){ + } else if (type == TSDB_DATA_TYPE_BINARY) { result = result + VARSTR_HEADER_SIZE; } return result; @@ -274,7 +274,7 @@ static int32_t smlProcessSchemaAction(SSmlHandle *info, SSchema *schemaField, SH ESchemaAction *action, bool isTag) { int32_t code = TSDB_CODE_SUCCESS; for (int j = 0; j < taosArrayGetSize(cols); ++j) { - if(j == 0 && !isTag) continue; + if (j == 0 && !isTag) continue; SSmlKv *kv = (SSmlKv *)taosArrayGetP(cols, j); code = smlGenerateSchemaAction(schemaField, schemaHash, kv, isTag, action, info); if (code != TSDB_CODE_SUCCESS) { @@ -286,12 +286,12 @@ static int32_t smlProcessSchemaAction(SSmlHandle *info, SSchema *schemaField, SH static int32_t smlCheckMeta(SSchema *schema, int32_t length, SArray *cols, bool isTag) { SHashObj *hashTmp = taosHashInit(length, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); - int32_t i = 0; - for ( ;i < length; i++) { + int32_t i = 0; + for (; i < length; i++) { taosHashPut(hashTmp, schema[i].name, strlen(schema[i].name), &i, SHORT_BYTES); } - if (isTag){ + if (isTag) { i = 0; } else { i = 1; @@ -306,7 +306,7 @@ static int32_t smlCheckMeta(SSchema *schema, int32_t length, SArray *cols, bool return 0; } -static int32_t getBytes(uint8_t type, int32_t length){ +static int32_t getBytes(uint8_t type, int32_t length) { if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) { return smlFindNearestPowerOf2(length, type); } else { @@ -314,21 +314,22 @@ static int32_t getBytes(uint8_t type, int32_t length){ } } -static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashObj *schemaHash, SArray *cols, SArray* results, int32_t numOfCols, bool isTag) { +static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashObj *schemaHash, SArray *cols, + SArray *results, int32_t numOfCols, bool isTag) { for (int j = 0; j < taosArrayGetSize(cols); ++j) { - SSmlKv *kv = (SSmlKv *)taosArrayGetP(cols, j); + SSmlKv *kv = (SSmlKv *)taosArrayGetP(cols, j); ESchemaAction action = SCHEMA_ACTION_NULL; smlGenerateSchemaAction(schemaField, schemaHash, kv, isTag, &action, info); - if(action == SCHEMA_ACTION_ADD_COLUMN || action == SCHEMA_ACTION_ADD_TAG){ + if (action == SCHEMA_ACTION_ADD_COLUMN || action == SCHEMA_ACTION_ADD_TAG) { SField field = {0}; field.type = kv->type; field.bytes = getBytes(kv->type, kv->length); memcpy(field.name, kv->key, kv->keyLen); taosArrayPush(results, &field); - }else if(action == SCHEMA_ACTION_CHANGE_COLUMN_SIZE || action == SCHEMA_ACTION_CHANGE_TAG_SIZE){ + } else if (action == SCHEMA_ACTION_CHANGE_COLUMN_SIZE || action == SCHEMA_ACTION_CHANGE_TAG_SIZE) { uint16_t *index = (uint16_t *)taosHashGet(schemaHash, kv->key, kv->keyLen); - uint16_t newIndex = *index; - if(isTag) newIndex -= numOfCols; + uint16_t newIndex = *index; + if (isTag) newIndex -= numOfCols; SField *field = (SField *)taosArrayGet(results, newIndex); field->bytes = getBytes(kv->type, kv->length); } @@ -336,12 +337,11 @@ static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashO return TSDB_CODE_SUCCESS; } -//static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SSmlSTableMeta *sTableData, -// int32_t colVer, int32_t tagVer, int8_t source, uint64_t suid){ -static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray* pColumns, SArray* pTags, - STableMeta *pTableMeta, ESchemaAction action){ - - SRequestObj* pRequest = NULL; +// static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SSmlSTableMeta *sTableData, +// int32_t colVer, int32_t tagVer, int8_t source, uint64_t suid){ +static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray *pColumns, SArray *pTags, STableMeta *pTableMeta, + ESchemaAction action) { + SRequestObj *pRequest = NULL; SMCreateStbReq pReq = {0}; int32_t code = TSDB_CODE_SUCCESS; SCmdMsgInfo pCmdMsg = {0}; @@ -363,24 +363,24 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray* pColumns, goto end; } - if (action == SCHEMA_ACTION_CREATE_STABLE){ + if (action == SCHEMA_ACTION_CREATE_STABLE) { pReq.colVer = 1; pReq.tagVer = 1; pReq.suid = 0; pReq.source = TD_REQ_FROM_APP; - } else if (action == SCHEMA_ACTION_ADD_TAG || action == SCHEMA_ACTION_CHANGE_TAG_SIZE){ + } else if (action == SCHEMA_ACTION_ADD_TAG || action == SCHEMA_ACTION_CHANGE_TAG_SIZE) { pReq.colVer = pTableMeta->sversion; pReq.tagVer = pTableMeta->tversion + 1; pReq.suid = pTableMeta->uid; pReq.source = TD_REQ_FROM_TAOX; - } else if (action == SCHEMA_ACTION_ADD_COLUMN || action == SCHEMA_ACTION_CHANGE_COLUMN_SIZE){ + } else if (action == SCHEMA_ACTION_ADD_COLUMN || action == SCHEMA_ACTION_CHANGE_COLUMN_SIZE) { pReq.colVer = pTableMeta->sversion + 1; pReq.tagVer = pTableMeta->tversion; pReq.suid = pTableMeta->uid; pReq.source = TD_REQ_FROM_TAOX; } - if (pReq.numOfTags == 0){ + if (pReq.numOfTags == 0) { pReq.numOfTags = 1; SField field = {0}; field.type = TSDB_DATA_TYPE_NCHAR; @@ -412,7 +412,7 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray* pColumns, launchQueryImpl(pRequest, &pQuery, true, NULL); - if(pRequest->code == TSDB_CODE_SUCCESS){ + if (pRequest->code == TSDB_CODE_SUCCESS) { catalogRemoveTableMeta(info->pCatalog, pName); } code = pRequest->code; @@ -425,11 +425,11 @@ end: } static int32_t smlModifyDBSchemas(SSmlHandle *info) { - int32_t code = 0; - SHashObj *hashTmp = NULL; - STableMeta *pTableMeta = NULL; + int32_t code = 0; + SHashObj *hashTmp = NULL; + STableMeta *pTableMeta = NULL; - SName pName = {TSDB_TABLE_NAME_T, info->taos->acctId, {0}, {0}}; + SName pName = {TSDB_TABLE_NAME_T, info->taos->acctId, {0}, {0}}; strcpy(pName.dbname, info->pRequest->pDb); SRequestConnInfo conn = {0}; @@ -451,8 +451,8 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta); if (code == TSDB_CODE_PAR_TABLE_NOT_EXIST || code == TSDB_CODE_MND_STB_NOT_EXIST) { - SArray* pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols), sizeof(SField)); - SArray* pTags = taosArrayInit(taosArrayGetSize(sTableData->tags), sizeof(SField)); + SArray *pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols), sizeof(SField)); + SArray *pTags = taosArrayInit(taosArrayGetSize(sTableData->tags), sizeof(SField)); smlBuildFieldsList(info, NULL, NULL, sTableData->tags, pTags, 0, true); smlBuildFieldsList(info, NULL, NULL, sTableData->cols, pColumns, 0, false); @@ -463,8 +463,8 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { } info->cost.numOfCreateSTables++; } else if (code == TSDB_CODE_SUCCESS) { - hashTmp = taosHashInit(pTableMeta->tableInfo.numOfTags, - taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); + hashTmp = taosHashInit(pTableMeta->tableInfo.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, + HASH_NO_LOCK); for (uint16_t i = pTableMeta->tableInfo.numOfColumns; i < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; i++) { taosHashPut(hashTmp, pTableMeta->schema[i].name, strlen(pTableMeta->schema[i].name), &i, SHORT_BYTES); @@ -475,22 +475,25 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { if (code != TSDB_CODE_SUCCESS) { goto end; } - if (action != SCHEMA_ACTION_NULL){ - SArray* pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols) + pTableMeta->tableInfo.numOfColumns, sizeof(SField)); - SArray* pTags = taosArrayInit(taosArrayGetSize(sTableData->tags) + pTableMeta->tableInfo.numOfTags, sizeof(SField)); + if (action != SCHEMA_ACTION_NULL) { + SArray *pColumns = + taosArrayInit(taosArrayGetSize(sTableData->cols) + pTableMeta->tableInfo.numOfColumns, sizeof(SField)); + SArray *pTags = + taosArrayInit(taosArrayGetSize(sTableData->tags) + pTableMeta->tableInfo.numOfTags, sizeof(SField)); for (uint16_t i = 0; i < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; i++) { SField field = {0}; field.type = pTableMeta->schema[i].type; field.bytes = pTableMeta->schema[i].bytes; strcpy(field.name, pTableMeta->schema[i].name); - if(i < pTableMeta->tableInfo.numOfColumns){ + if (i < pTableMeta->tableInfo.numOfColumns) { taosArrayPush(pColumns, &field); - }else{ + } else { taosArrayPush(pTags, &field); } } - smlBuildFieldsList(info, pTableMeta->schema, hashTmp, sTableData->tags, pTags, pTableMeta->tableInfo.numOfColumns, true); + smlBuildFieldsList(info, pTableMeta->schema, hashTmp, sTableData->tags, pTags, + pTableMeta->tableInfo.numOfColumns, true); code = smlSendMetaMsg(info, &pName, pColumns, pTags, pTableMeta, action); if (code != TSDB_CODE_SUCCESS) { @@ -518,23 +521,26 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { if (code != TSDB_CODE_SUCCESS) { goto end; } - if (action != SCHEMA_ACTION_NULL){ - SArray* pColumns = taosArrayInit(taosArrayGetSize(sTableData->cols) + pTableMeta->tableInfo.numOfColumns, sizeof(SField)); - SArray* pTags = taosArrayInit(taosArrayGetSize(sTableData->tags) + pTableMeta->tableInfo.numOfTags, sizeof(SField)); + if (action != SCHEMA_ACTION_NULL) { + SArray *pColumns = + taosArrayInit(taosArrayGetSize(sTableData->cols) + pTableMeta->tableInfo.numOfColumns, sizeof(SField)); + SArray *pTags = + taosArrayInit(taosArrayGetSize(sTableData->tags) + pTableMeta->tableInfo.numOfTags, sizeof(SField)); for (uint16_t i = 0; i < pTableMeta->tableInfo.numOfColumns + pTableMeta->tableInfo.numOfTags; i++) { SField field = {0}; field.type = pTableMeta->schema[i].type; field.bytes = pTableMeta->schema[i].bytes; strcpy(field.name, pTableMeta->schema[i].name); - if(i < pTableMeta->tableInfo.numOfColumns){ + if (i < pTableMeta->tableInfo.numOfColumns) { taosArrayPush(pColumns, &field); - }else{ + } else { taosArrayPush(pTags, &field); } } - smlBuildFieldsList(info, pTableMeta->schema, hashTmp, sTableData->cols, pColumns, pTableMeta->tableInfo.numOfColumns, false); + smlBuildFieldsList(info, pTableMeta->schema, hashTmp, sTableData->cols, pColumns, + pTableMeta->tableInfo.numOfColumns, false); code = smlSendMetaMsg(info, &pName, pColumns, pTags, pTableMeta, action); if (code != TSDB_CODE_SUCCESS) { @@ -847,7 +853,7 @@ static int64_t smlParseOpenTsdbTime(SSmlHandle *info, const char *data, int32_t static int32_t smlParseTS(SSmlHandle *info, const char *data, int32_t len, SArray *cols) { int64_t ts = 0; if (info->protocol == TSDB_SML_LINE_PROTOCOL) { -// uError("SML:data:%s,len:%d", data, len); + // uError("SML:data:%s,len:%d", data, len); ts = smlParseInfluxTime(info, data, len); } else if (info->protocol == TSDB_SML_TELNET_PROTOCOL) { ts = smlParseOpenTsdbTime(info, data, len); @@ -877,7 +883,7 @@ static int32_t smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) { if (smlIsBinary(pVal->value, pVal->length)) { pVal->type = TSDB_DATA_TYPE_BINARY; pVal->length -= BINARY_ADD_LEN; - if (pVal->length > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE){ + if (pVal->length > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) { return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; } pVal->value += (BINARY_ADD_LEN - 1); @@ -887,7 +893,7 @@ static int32_t smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) { if (smlIsNchar(pVal->value, pVal->length)) { pVal->type = TSDB_DATA_TYPE_NCHAR; pVal->length -= NCHAR_ADD_LEN; - if(pVal->length > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE){ + if (pVal->length > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) { return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; } pVal->value += (NCHAR_ADD_LEN - 1); @@ -1063,7 +1069,7 @@ static int32_t smlParseTelnetTags(const char *data, SArray *cols, char *childTab continue; } - if(valueLen > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE){ + if (valueLen > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) { return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; } @@ -1224,7 +1230,7 @@ static int32_t smlParseCols(const char *data, int32_t len, SArray *cols, char *c kv->value = value; kv->length = valueLen; if (isTag) { - if(valueLen > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE){ + if (valueLen > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) { return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; } kv->type = TSDB_DATA_TYPE_NCHAR; @@ -1362,8 +1368,8 @@ static int32_t smlKvTimeArrayCompare(const void *key1, const void *key2) { static int32_t smlKvTimeHashCompare(const void *key1, const void *key2) { SHashObj *s1 = *(SHashObj **)key1; SHashObj *s2 = *(SHashObj **)key2; - SSmlKv *kv1 = *(SSmlKv **)taosHashGet(s1, TS, TS_LEN); - SSmlKv *kv2 = *(SSmlKv **)taosHashGet(s2, TS, TS_LEN); + SSmlKv *kv1 = *(SSmlKv **)taosHashGet(s1, TS, TS_LEN); + SSmlKv *kv2 = *(SSmlKv **)taosHashGet(s2, TS, TS_LEN); ASSERT(kv1->type == TSDB_DATA_TYPE_TIMESTAMP); ASSERT(kv2->type == TSDB_DATA_TYPE_TIMESTAMP); if (kv1->i < kv2->i) { @@ -1375,12 +1381,12 @@ static int32_t smlKvTimeHashCompare(const void *key1, const void *key2) { } } -static int32_t smlDealCols(SSmlTableInfo* oneTable, bool dataFormat, SArray *cols){ - if(dataFormat){ +static int32_t smlDealCols(SSmlTableInfo *oneTable, bool dataFormat, SArray *cols) { + if (dataFormat) { void *p = taosArraySearch(oneTable->cols, &cols, smlKvTimeArrayCompare, TD_GT); - if(p == NULL){ + if (p == NULL) { taosArrayPush(oneTable->cols, &cols); - }else{ + } else { taosArrayInsert(oneTable->cols, TARRAY_ELEM_IDX(oneTable->cols, p), &cols); } return TSDB_CODE_SUCCESS; @@ -1397,9 +1403,9 @@ static int32_t smlDealCols(SSmlTableInfo* oneTable, bool dataFormat, SArray *col } void *p = taosArraySearch(oneTable->cols, &kvHash, smlKvTimeHashCompare, TD_GT); - if(p == NULL){ + if (p == NULL) { taosArrayPush(oneTable->cols, &kvHash); - }else{ + } else { taosArrayInsert(oneTable->cols, TARRAY_ELEM_IDX(oneTable->cols, p), &kvHash); } return TSDB_CODE_SUCCESS; @@ -1488,15 +1494,15 @@ static void smlDestroyInfo(SSmlHandle *info) { taosMemoryFreeClear(info); } -static SSmlHandle* smlBuildSmlInfo(STscObj* pTscObj, SRequestObj* request, SMLProtocolType protocol, int8_t precision){ - int32_t code = TSDB_CODE_SUCCESS; - SSmlHandle* info = (SSmlHandle*)taosMemoryCalloc(1, sizeof(SSmlHandle)); +static SSmlHandle *smlBuildSmlInfo(STscObj *pTscObj, SRequestObj *request, SMLProtocolType protocol, int8_t precision) { + int32_t code = TSDB_CODE_SUCCESS; + SSmlHandle *info = (SSmlHandle *)taosMemoryCalloc(1, sizeof(SSmlHandle)); if (NULL == info) { return NULL; } info->id = smlGenId(); - info->pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY); + info->pQuery = (SQuery *)nodesMakeNode(QUERY_NODE_QUERY); if (NULL == info->pQuery) { uError("SML:0x%" PRIx64 " create info->pQuery error", info->id); goto cleanup; @@ -1511,8 +1517,8 @@ static SSmlHandle* smlBuildSmlInfo(STscObj* pTscObj, SRequestObj* request, SMLPr } ((SVnodeModifOpStmt *)(info->pQuery->pRoot))->payloadType = PAYLOAD_TYPE_KV; - if (pTscObj){ - info->taos = pTscObj; + if (pTscObj) { + info->taos = pTscObj; code = catalogGetHandle(info->taos->pAppInfo->clusterId, &info->pCatalog); if (code != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " get catalog error %d", info->id, code); @@ -1528,7 +1534,7 @@ static SSmlHandle* smlBuildSmlInfo(STscObj* pTscObj, SRequestObj* request, SMLPr info->dataFormat = true; } - if(request){ + if (request) { info->pRequest = request; info->msgBuf.buf = info->pRequest->msgBuf; info->msgBuf.len = ERROR_MSG_BUF_DEFAULT_SIZE; @@ -1827,10 +1833,11 @@ static int32_t smlConvertJSONString(SSmlKv *pVal, char *typeStr, cJSON *value) { } pVal->length = (int16_t)strlen(value->valuestring); - if (pVal->type == TSDB_DATA_TYPE_BINARY && pVal->length > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE){ + if (pVal->type == TSDB_DATA_TYPE_BINARY && pVal->length > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) { return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; } - if (pVal->type == TSDB_DATA_TYPE_NCHAR && pVal->length > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE){ + if (pVal->type == TSDB_DATA_TYPE_NCHAR && + pVal->length > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) { return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; } @@ -2058,7 +2065,7 @@ static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql) { SSmlLineInfo elements = {0}; uDebug("SML:0x%" PRIx64 " smlParseInfluxLine sql:%s, hello", info->id, sql); - int ret = smlParseInfluxString(sql, &elements, &info->msgBuf); + int ret = smlParseInfluxString(sql, &elements, &info->msgBuf); if (ret != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " smlParseInfluxLine failed", info->id); return ret; @@ -2314,7 +2321,8 @@ static int32_t smlInsertData(SSmlHandle *info) { (*pMeta)->tableMeta->uid = tableData->uid; // one table merge data block together according uid code = smlBindData(info->exec, tableData->tags, (*pMeta)->cols, tableData->cols, info->dataFormat, - (*pMeta)->tableMeta, tableData->childTableName, tableData->sTableName, tableData->sTableNameLen, info->msgBuf.buf, info->msgBuf.len); + (*pMeta)->tableMeta, tableData->childTableName, tableData->sTableName, tableData->sTableNameLen, + info->msgBuf.buf, info->msgBuf.len); if (code != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " smlBindData failed", info->id); return code; @@ -2336,7 +2344,12 @@ static int32_t smlInsertData(SSmlHandle *info) { SAppClusterSummary *pActivity = &info->taos->pAppInfo->summary; atomic_add_fetch_64((int64_t *)&pActivity->numOfInsertsReq, 1); - launchAsyncQuery(info->pRequest, info->pQuery, NULL); + SSqlCallbackWrapper *pWrapper = (SSqlCallbackWrapper *)taosMemoryCalloc(1, sizeof(SSqlCallbackWrapper)); + if (pWrapper == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + pWrapper->pRequest = info->pRequest; + launchAsyncQuery(info->pRequest, info->pQuery, NULL, pWrapper); return TSDB_CODE_SUCCESS; } @@ -2417,41 +2430,41 @@ static int smlProcess(SSmlHandle *info, char *lines[], int numLines) { } static int32_t isSchemalessDb(STscObj *taos, SRequestObj *request) { -// SCatalog *catalog = NULL; -// int32_t code = catalogGetHandle(((STscObj *)taos)->pAppInfo->clusterId, &catalog); -// if (code != TSDB_CODE_SUCCESS) { -// uError("SML get catalog error %d", code); -// return code; -// } -// -// SName name; -// tNameSetDbName(&name, taos->acctId, taos->db, strlen(taos->db)); -// char dbFname[TSDB_DB_FNAME_LEN] = {0}; -// tNameGetFullDbName(&name, dbFname); -// SDbCfgInfo pInfo = {0}; -// -// SRequestConnInfo conn = {0}; -// conn.pTrans = taos->pAppInfo->pTransporter; -// conn.requestId = request->requestId; -// conn.requestObjRefId = request->self; -// conn.mgmtEps = getEpSet_s(&taos->pAppInfo->mgmtEp); -// -// code = catalogGetDBCfg(catalog, &conn, dbFname, &pInfo); -// if (code != TSDB_CODE_SUCCESS) { -// return code; -// } -// taosArrayDestroy(pInfo.pRetensions); -// -// if (!pInfo.schemaless) { -// return TSDB_CODE_SML_INVALID_DB_CONF; -// } + // SCatalog *catalog = NULL; + // int32_t code = catalogGetHandle(((STscObj *)taos)->pAppInfo->clusterId, &catalog); + // if (code != TSDB_CODE_SUCCESS) { + // uError("SML get catalog error %d", code); + // return code; + // } + // + // SName name; + // tNameSetDbName(&name, taos->acctId, taos->db, strlen(taos->db)); + // char dbFname[TSDB_DB_FNAME_LEN] = {0}; + // tNameGetFullDbName(&name, dbFname); + // SDbCfgInfo pInfo = {0}; + // + // SRequestConnInfo conn = {0}; + // conn.pTrans = taos->pAppInfo->pTransporter; + // conn.requestId = request->requestId; + // conn.requestObjRefId = request->self; + // conn.mgmtEps = getEpSet_s(&taos->pAppInfo->mgmtEp); + // + // code = catalogGetDBCfg(catalog, &conn, dbFname, &pInfo); + // if (code != TSDB_CODE_SUCCESS) { + // return code; + // } + // taosArrayDestroy(pInfo.pRetensions); + // + // if (!pInfo.schemaless) { + // return TSDB_CODE_SML_INVALID_DB_CONF; + // } return TSDB_CODE_SUCCESS; } 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); + int32_t rows = taos_affected_rows(pRequest); uDebug("SML:0x%" PRIx64 " result. code:%d, msg:%s", info->id, pRequest->code, pRequest->msgBuf); Params *pParam = info->params; @@ -2461,7 +2474,7 @@ static void smlInsertCallback(void *param, void *res, int32_t code) { if (code != TSDB_CODE_SUCCESS) { pParam->request->code = code; pParam->request->body.resInfo.numOfRows += rows; - }else{ + } else { pParam->request->body.resInfo.numOfRows += info->affectedRows; } if (pParam->cnt == pParam->total) { @@ -2497,20 +2510,20 @@ static void smlInsertCallback(void *param, void *res, int32_t code) { * */ -TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int protocol, int precision) { +TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision) { if (NULL == taos) { terrno = TSDB_CODE_TSC_DISCONNECTED; return NULL; } - SRequestObj* request = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT); - if(!request){ + SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT); + if (!request) { uError("SML:taos_schemaless_insert error request is null"); return NULL; } - int batchs = 0; - STscObj* pTscObj = request->pTscObj; + int batchs = 0; + STscObj *pTscObj = request->pTscObj; pTscObj->schemalessType = 1; SSmlMsgBuf msg = {ERROR_MSG_BUF_DEFAULT_SIZE, request->msgBuf}; @@ -2526,7 +2539,7 @@ TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int pr goto end; } - if(isSchemalessDb(pTscObj, request) != TSDB_CODE_SUCCESS){ + if (isSchemalessDb(pTscObj, request) != TSDB_CODE_SUCCESS) { request->code = TSDB_CODE_SML_INVALID_DB_CONF; smlBuildInvalidDataMsg(&msg, "Cannot write data to a non schemaless database", NULL); goto end; @@ -2551,9 +2564,9 @@ TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int pr goto end; } - if(protocol == TSDB_SML_JSON_PROTOCOL){ + if (protocol == TSDB_SML_JSON_PROTOCOL) { numLines = 1; - }else if(numLines <= 0){ + } else if (numLines <= 0) { request->code = TSDB_CODE_SML_INVALID_DATA; smlBuildInvalidDataMsg(&msg, "line num is invalid", NULL); goto end; @@ -2562,14 +2575,14 @@ TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int pr batchs = ceil(((double)numLines) / LINE_BATCH); params.total = batchs; for (int i = 0; i < batchs; ++i) { - SRequestObj* req = (SRequestObj*)createRequest(pTscObj->id, TSDB_SQL_INSERT); - if(!req){ + SRequestObj *req = (SRequestObj *)createRequest(pTscObj->id, TSDB_SQL_INSERT); + if (!req) { request->code = TSDB_CODE_OUT_OF_MEMORY; uError("SML:taos_schemaless_insert error request is null"); goto end; } - SSmlHandle* info = smlBuildSmlInfo(pTscObj, req, (SMLProtocolType)protocol, precision); - if(!info){ + SSmlHandle *info = smlBuildSmlInfo(pTscObj, req, (SMLProtocolType)protocol, precision); + if (!info) { request->code = TSDB_CODE_OUT_OF_MEMORY; uError("SML:taos_schemaless_insert error SSmlHandle is null"); goto end; @@ -2599,8 +2612,8 @@ TAOS_RES* taos_schemaless_insert(TAOS* taos, char* lines[], int numLines, int pr end: taosThreadSpinDestroy(¶ms.lock); tsem_destroy(¶ms.sem); -// ((STscObj *)taos)->schemalessType = 0; + // ((STscObj *)taos)->schemalessType = 0; pTscObj->schemalessType = 1; uDebug("resultend:%s", request->msgBuf); - return (TAOS_RES*)request; + return (TAOS_RES *)request; } diff --git a/source/client/src/TMQConnector.c b/source/client/src/clientTmqConnector.c similarity index 100% rename from source/client/src/TMQConnector.c rename to source/client/src/clientTmqConnector.c diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 23cc868658..1028a899b6 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -1235,6 +1235,7 @@ void blockDataFreeRes(SSDataBlock* pBlock) { taosArrayDestroy(pBlock->pDataBlock); pBlock->pDataBlock = NULL; taosMemoryFreeClear(pBlock->pBlockAgg); + taosMemoryFree(pBlock->info.pTag); memset(&pBlock->info, 0, sizeof(SDataBlockInfo)); } @@ -1316,8 +1317,8 @@ SSDataBlock* createSpecialDataBlock(EStreamType type) { pBlock->info.groupId = 0; pBlock->info.rows = 0; pBlock->info.type = type; - pBlock->info.rowSize = - sizeof(TSKEY) + sizeof(TSKEY) + sizeof(uint64_t) + sizeof(uint64_t) + sizeof(TSKEY) + sizeof(TSKEY); + pBlock->info.rowSize = sizeof(TSKEY) + sizeof(TSKEY) + sizeof(uint64_t) + sizeof(uint64_t) + sizeof(TSKEY) + + sizeof(TSKEY) + VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN; pBlock->info.watermark = INT64_MIN; pBlock->pDataBlock = taosArrayInit(6, sizeof(SColumnInfoData)); @@ -1343,6 +1344,48 @@ SSDataBlock* createSpecialDataBlock(EStreamType type) { // calculate end ts taosArrayPush(pBlock->pDataBlock, &infoData); + // table name + infoData.info.type = TSDB_DATA_TYPE_VARCHAR; + infoData.info.bytes = VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN; + taosArrayPush(pBlock->pDataBlock, &infoData); + + return pBlock; +} + +SSDataBlock* blockCopyOneRow(const SSDataBlock* pDataBlock, int32_t rowIdx) { + if (pDataBlock == NULL) { + return NULL; + } + + SSDataBlock* pBlock = createDataBlock(); + pBlock->info = pDataBlock->info; + pBlock->info.rows = 0; + pBlock->info.capacity = 0; + + size_t numOfCols = taosArrayGetSize(pDataBlock->pDataBlock); + for (int32_t i = 0; i < numOfCols; ++i) { + SColumnInfoData* p = taosArrayGet(pDataBlock->pDataBlock, i); + SColumnInfoData colInfo = {.hasNull = true, .info = p->info}; + blockDataAppendColInfo(pBlock, &colInfo); + } + + int32_t code = blockDataEnsureCapacity(pBlock, 1); + if (code != TSDB_CODE_SUCCESS) { + terrno = code; + blockDataDestroy(pBlock); + return NULL; + } + + for (int32_t i = 0; i < numOfCols; ++i) { + SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, i); + SColumnInfoData* pSrc = taosArrayGet(pDataBlock->pDataBlock, i); + void* pData = colDataGetData(pSrc, rowIdx); + bool isNull = colDataIsNull(pSrc, pDataBlock->info.rows, rowIdx, NULL); + colDataAppend(pDst, 0, pData, isNull); + } + + pBlock->info.rows = 1; + return pBlock; } diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 110c3bc8f4..ad5772e0fe 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -411,7 +411,7 @@ _exit: int32_t tTSRowClone(const STSRow2 *pRow, STSRow2 **ppRow) { int32_t code = 0; - int32_t rLen; + int32_t rLen = 0; TSROW_LEN(pRow, rLen); (*ppRow) = (STSRow2 *)taosMemoryMalloc(rLen); @@ -1678,8 +1678,8 @@ int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest) { int32_t size; ASSERT(pColDataSrc->nVal > 0); - ASSERT(pColDataDest->cid = pColDataSrc->cid); - ASSERT(pColDataDest->type = pColDataSrc->type); + ASSERT(pColDataDest->cid == pColDataSrc->cid); + ASSERT(pColDataDest->type == pColDataSrc->type); pColDataDest->smaOn = pColDataSrc->smaOn; pColDataDest->nVal = pColDataSrc->nVal; @@ -1711,4 +1711,4 @@ int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest) { _exit: return code; -} \ No newline at end of file +} diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index ce9a9a7b50..88df54a9ea 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -85,7 +85,8 @@ uint16_t tsTelemPort = 80; char tsSmlTagName[TSDB_COL_NAME_LEN] = "_tag_null"; char tsSmlChildTableName[TSDB_TABLE_NAME_LEN] = ""; // user defined child table name can be specified in tag value. // If set to empty system will generate table name using MD5 hash. -bool tsSmlDataFormat = false; // true means that the name and order of cols in each line are the same(only for influx protocol) +// true means that the name and order of cols in each line are the same(only for influx protocol) +bool tsSmlDataFormat = false; // query int32_t tsQueryPolicy = 1; @@ -125,6 +126,9 @@ int32_t tsMaxNumOfDistinctResults = 1000 * 10000; // 1 database precision unit for interval time range, changed accordingly int32_t tsMinIntervalTime = 1; +// maximum memory allowed to be allocated for a single csv load (in MB) +int32_t tsMaxMemUsedByInsert = 1024; + // the maximum allowed query buffer size during query processing for each data node. // -1 no limit (default) // 0 no query allowed, queries are disabled @@ -296,6 +300,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { if (cfgAddString(pCfg, "smlChildTableName", "", 1) != 0) return -1; if (cfgAddString(pCfg, "smlTagName", tsSmlTagName, 1) != 0) return -1; if (cfgAddBool(pCfg, "smlDataFormat", tsSmlDataFormat, 1) != 0) return -1; + if (cfgAddInt32(pCfg, "maxMemUsedByInsert", tsMaxMemUsedByInsert, 1, INT32_MAX, true) != 0) return -1; tsNumOfTaskQueueThreads = tsNumOfCores / 2; tsNumOfTaskQueueThreads = TMAX(tsNumOfTaskQueueThreads, 4); @@ -374,8 +379,8 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { tsNumOfVnodeStreamThreads = TMAX(tsNumOfVnodeStreamThreads, 4); if (cfgAddInt32(pCfg, "numOfVnodeStreamThreads", tsNumOfVnodeStreamThreads, 4, 1024, 0) != 0) return -1; -// tsNumOfVnodeFetchThreads = 1; -// if (cfgAddInt32(pCfg, "numOfVnodeFetchThreads", tsNumOfVnodeFetchThreads, 1, 1, 0) != 0) return -1; + // tsNumOfVnodeFetchThreads = 1; + // if (cfgAddInt32(pCfg, "numOfVnodeFetchThreads", tsNumOfVnodeFetchThreads, 1, 1, 0) != 0) return -1; tsNumOfVnodeWriteThreads = tsNumOfCores; tsNumOfVnodeWriteThreads = TMAX(tsNumOfVnodeWriteThreads, 1); @@ -497,15 +502,15 @@ static int32_t taosUpdateServerCfg(SConfig *pCfg) { pItem->stype = stype; } -/* - pItem = cfgGetItem(tsCfg, "numOfVnodeFetchThreads"); - if (pItem != NULL && pItem->stype == CFG_STYPE_DEFAULT) { - tsNumOfVnodeFetchThreads = numOfCores / 4; - tsNumOfVnodeFetchThreads = TMAX(tsNumOfVnodeFetchThreads, 4); - pItem->i32 = tsNumOfVnodeFetchThreads; - pItem->stype = stype; - } -*/ + /* + pItem = cfgGetItem(tsCfg, "numOfVnodeFetchThreads"); + if (pItem != NULL && pItem->stype == CFG_STYPE_DEFAULT) { + tsNumOfVnodeFetchThreads = numOfCores / 4; + tsNumOfVnodeFetchThreads = TMAX(tsNumOfVnodeFetchThreads, 4); + pItem->i32 = tsNumOfVnodeFetchThreads; + pItem->stype = stype; + } + */ pItem = cfgGetItem(tsCfg, "numOfVnodeWriteThreads"); if (pItem != NULL && pItem->stype == CFG_STYPE_DEFAULT) { @@ -648,6 +653,8 @@ static int32_t taosSetClientCfg(SConfig *pCfg) { tstrncpy(tsSmlTagName, cfgGetItem(pCfg, "smlTagName")->str, TSDB_COL_NAME_LEN); tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval; + tsMaxMemUsedByInsert = cfgGetItem(pCfg, "maxMemUsedByInsert")->i32; + tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32; tsCompressMsgSize = cfgGetItem(pCfg, "compressMsgSize")->i32; tsCompressColData = cfgGetItem(pCfg, "compressColData")->i32; @@ -705,7 +712,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { tsNumOfMnodeReadThreads = cfgGetItem(pCfg, "numOfMnodeReadThreads")->i32; tsNumOfVnodeQueryThreads = cfgGetItem(pCfg, "numOfVnodeQueryThreads")->i32; tsNumOfVnodeStreamThreads = cfgGetItem(pCfg, "numOfVnodeStreamThreads")->i32; -// tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32; + // tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32; tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32; tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32; tsNumOfVnodeRsmaThreads = cfgGetItem(pCfg, "numOfVnodeRsmaThreads")->i32; @@ -877,6 +884,8 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) { tsMaxShellConns = cfgGetItem(pCfg, "maxShellConns")->i32; } else if (strcasecmp("maxNumOfDistinctRes", name) == 0) { tsMaxNumOfDistinctResults = cfgGetItem(pCfg, "maxNumOfDistinctRes")->i32; + } else if (strcasecmp("maxMemUsedByInsert", name) == 0) { + tsMaxMemUsedByInsert = cfgGetItem(pCfg, "maxMemUsedByInsert")->i32; } break; } @@ -955,10 +964,10 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) { tsNumOfMnodeReadThreads = cfgGetItem(pCfg, "numOfMnodeReadThreads")->i32; } else if (strcasecmp("numOfVnodeQueryThreads", name) == 0) { tsNumOfVnodeQueryThreads = cfgGetItem(pCfg, "numOfVnodeQueryThreads")->i32; -/* - } else if (strcasecmp("numOfVnodeFetchThreads", name) == 0) { - tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32; -*/ + /* + } else if (strcasecmp("numOfVnodeFetchThreads", name) == 0) { + tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32; + */ } else if (strcasecmp("numOfVnodeWriteThreads", name) == 0) { tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32; } else if (strcasecmp("numOfVnodeSyncThreads", name) == 0) { diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index f4ffc4c996..55e5616dd5 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -5075,7 +5075,7 @@ int tEncodeSVCreateTbReq(SEncoder *pCoder, const SVCreateTbReq *pReq) { } if (pReq->type == TSDB_CHILD_TABLE) { - if (tEncodeCStr(pCoder, pReq->ctb.name) < 0) return -1; + if (tEncodeCStr(pCoder, pReq->ctb.stbName) < 0) return -1; if (tEncodeU8(pCoder, pReq->ctb.tagNum) < 0) return -1; if (tEncodeI64(pCoder, pReq->ctb.suid) < 0) return -1; if (tEncodeTag(pCoder, (const STag *)pReq->ctb.pTag) < 0) return -1; @@ -5112,7 +5112,7 @@ int tDecodeSVCreateTbReq(SDecoder *pCoder, SVCreateTbReq *pReq) { } if (pReq->type == TSDB_CHILD_TABLE) { - if (tDecodeCStr(pCoder, &pReq->ctb.name) < 0) return -1; + if (tDecodeCStr(pCoder, &pReq->ctb.stbName) < 0) return -1; if (tDecodeU8(pCoder, &pReq->ctb.tagNum) < 0) return -1; if (tDecodeI64(pCoder, &pReq->ctb.suid) < 0) return -1; if (tDecodeTag(pCoder, (STag **)&pReq->ctb.pTag) < 0) return -1; diff --git a/source/common/src/ttszip.c b/source/common/src/ttszip.c index c86bf08e81..3dd865e91f 100644 --- a/source/common/src/ttszip.c +++ b/source/common/src/ttszip.c @@ -35,7 +35,7 @@ STSBuf* tsBufCreate(bool autoDelete, int32_t order) { // tscError("tmp file created failed since %s", terrstr()); return NULL; } - + STSBuf* pTSBuf = taosMemoryCalloc(1, sizeof(STSBuf)); if (pTSBuf == NULL) { return NULL; @@ -52,10 +52,13 @@ STSBuf* tsBufCreate(bool autoDelete, int32_t order) { } if (!autoDelete) { - taosRemoveFile(pTSBuf->path); + if (taosRemoveFile(pTSBuf->path) != 0) { + taosMemoryFree(pTSBuf); + return NULL; + } } - if (NULL == allocResForTSBuf(pTSBuf)) { + if (allocResForTSBuf(pTSBuf) == NULL) { return NULL; } diff --git a/source/dnode/mgmt/CMakeLists.txt b/source/dnode/mgmt/CMakeLists.txt index 45bef7f98e..581686ba90 100644 --- a/source/dnode/mgmt/CMakeLists.txt +++ b/source/dnode/mgmt/CMakeLists.txt @@ -14,7 +14,4 @@ target_include_directories( taosd PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/node_mgmt/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) - add_dependencies(taosd jemalloc) -ENDIF () target_link_libraries(taosd dnode) diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmFile.c b/source/dnode/mgmt/mgmt_vnode/src/vmFile.c index 2ae9faf7df..a49e855e39 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmFile.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmFile.c @@ -94,6 +94,7 @@ int32_t vmGetVnodeListFromFile(SVnodeMgmt *pMgmt, SWrapperCfg **ppCfgs, int32_t pCfgs = taosMemoryCalloc(vnodesNum, sizeof(SWrapperCfg)); if (pCfgs == NULL) { dError("failed to read %s since out of memory", file); + code = TSDB_CODE_OUT_OF_MEMORY; goto _OVER; } @@ -104,6 +105,7 @@ int32_t vmGetVnodeListFromFile(SVnodeMgmt *pMgmt, SWrapperCfg **ppCfgs, int32_t cJSON *vgId = cJSON_GetObjectItem(vnode, "vgId"); if (!vgId || vgId->type != cJSON_Number) { dError("failed to read %s since vgId not found", file); + taosMemoryFree(pCfgs); goto _OVER; } pCfg->vgId = vgId->valueint; @@ -112,6 +114,7 @@ int32_t vmGetVnodeListFromFile(SVnodeMgmt *pMgmt, SWrapperCfg **ppCfgs, int32_t cJSON *dropped = cJSON_GetObjectItem(vnode, "dropped"); if (!dropped || dropped->type != cJSON_Number) { dError("failed to read %s since dropped not found", file); + taosMemoryFree(pCfgs); goto _OVER; } pCfg->dropped = dropped->valueint; @@ -119,6 +122,7 @@ int32_t vmGetVnodeListFromFile(SVnodeMgmt *pMgmt, SWrapperCfg **ppCfgs, int32_t cJSON *vgVersion = cJSON_GetObjectItem(vnode, "vgVersion"); if (!vgVersion || vgVersion->type != cJSON_Number) { dError("failed to read %s since vgVersion not found", file); + taosMemoryFree(pCfgs); goto _OVER; } pCfg->vgVersion = vgVersion->valueint; @@ -135,16 +139,15 @@ _OVER: if (content != NULL) taosMemoryFree(content); if (root != NULL) cJSON_Delete(root); if (pFile != NULL) taosCloseFile(&pFile); - if (code != 0) taosMemoryFree(pCfgs); terrno = code; return code; } int32_t vmWriteVnodeListToFile(SVnodeMgmt *pMgmt) { - int32_t ret = 0; - char file[PATH_MAX] = {0}; - char realfile[PATH_MAX] = {0}; + int32_t code = 0; + char file[PATH_MAX] = {0}; + char realfile[PATH_MAX] = {0}; snprintf(file, sizeof(file), "%s%svnodes.json.bak", pMgmt->path, TD_DIRSEP); snprintf(realfile, sizeof(file), "%s%svnodes.json", pMgmt->path, TD_DIRSEP); @@ -156,10 +159,10 @@ int32_t vmWriteVnodeListToFile(SVnodeMgmt *pMgmt) { } int32_t numOfVnodes = 0; - SVnodeObj **pVnodes = vmGetVnodeListFromHash(pMgmt, &numOfVnodes); - if (pVnodes == NULL) { + SVnodeObj **ppVnodes = vmGetVnodeListFromHash(pMgmt, &numOfVnodes); + if (ppVnodes == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; - ret = -1; + code = -1; goto _OVER; } @@ -168,14 +171,14 @@ int32_t vmWriteVnodeListToFile(SVnodeMgmt *pMgmt) { char *content = taosMemoryCalloc(1, maxLen + 1); if (content == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; - ret = -1; + code = -1; goto _OVER; } len += snprintf(content + len, maxLen - len, "{\n"); len += snprintf(content + len, maxLen - len, " \"vnodes\": [\n"); for (int32_t i = 0; i < numOfVnodes; ++i) { - SVnodeObj *pVnode = pVnodes[i]; + SVnodeObj *pVnode = ppVnodes[i]; if (pVnode == NULL) continue; len += snprintf(content + len, maxLen - len, " {\n"); @@ -198,16 +201,17 @@ _OVER: taosCloseFile(&pFile); taosMemoryFree(content); - for (int32_t i = 0; i < numOfVnodes; ++i) { - SVnodeObj *pVnode = pVnodes[i]; - vmReleaseVnode(pMgmt, pVnode); + if (ppVnodes != NULL) { + for (int32_t i = 0; i < numOfVnodes; ++i) { + SVnodeObj *pVnode = ppVnodes[i]; + if (pVnode != NULL) { + vmReleaseVnode(pMgmt, pVnode); + } + } + taosMemoryFree(ppVnodes); } - if (pVnodes != NULL) { - taosMemoryFree(pVnodes); - } - - if (ret != 0) return -1; + if (code != 0) return -1; dDebug("successed to write %s, numOfVnodes:%d", realfile, numOfVnodes); return taosRenameFile(file, realfile); diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c index 4047bc2340..d8456ad626 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c @@ -16,7 +16,7 @@ #define _DEFAULT_SOURCE #include "vmInt.h" -void vmGetVnodeLoads(SVnodeMgmt *pMgmt, SMonVloadInfo *pInfo) { +void vmGetVnodeLoads(SVnodeMgmt *pMgmt, SMonVloadInfo *pInfo, bool isReset) { pInfo->pVloads = taosArrayInit(pMgmt->state.totalVnodes, sizeof(SVnodeLoad)); if (pInfo->pVloads == NULL) return; @@ -30,6 +30,7 @@ void vmGetVnodeLoads(SVnodeMgmt *pMgmt, SMonVloadInfo *pInfo) { SVnodeObj *pVnode = *ppVnode; SVnodeLoad vload = {0}; vnodeGetLoad(pVnode->pImpl, &vload); + if (isReset) vnodeResetLoad(pVnode->pImpl, &vload); taosArrayPush(pInfo->pVloads, &vload); pIter = taosHashIterate(pMgmt->hash, pIter); } @@ -39,7 +40,7 @@ void vmGetVnodeLoads(SVnodeMgmt *pMgmt, SMonVloadInfo *pInfo) { void vmGetMonitorInfo(SVnodeMgmt *pMgmt, SMonVmInfo *pInfo) { SMonVloadInfo vloads = {0}; - vmGetVnodeLoads(pMgmt, &vloads); + vmGetVnodeLoads(pMgmt, &vloads, true); SArray *pVloads = vloads.pVloads; if (pVloads == NULL) return; @@ -66,10 +67,10 @@ void vmGetMonitorInfo(SVnodeMgmt *pMgmt, SMonVmInfo *pInfo) { pInfo->vstat.totalVnodes = totalVnodes; pInfo->vstat.masterNum = masterNum; pInfo->vstat.numOfSelectReqs = numOfSelectReqs - pMgmt->state.numOfSelectReqs; - pInfo->vstat.numOfInsertReqs = numOfInsertReqs - pMgmt->state.numOfInsertReqs; - pInfo->vstat.numOfInsertSuccessReqs = numOfInsertSuccessReqs - pMgmt->state.numOfInsertSuccessReqs; - pInfo->vstat.numOfBatchInsertReqs = numOfBatchInsertReqs - pMgmt->state.numOfBatchInsertReqs; - pInfo->vstat.numOfBatchInsertSuccessReqs = numOfBatchInsertSuccessReqs - pMgmt->state.numOfBatchInsertSuccessReqs; + pInfo->vstat.numOfInsertReqs = numOfInsertReqs; // delta + pInfo->vstat.numOfInsertSuccessReqs = numOfInsertSuccessReqs; // delta + pInfo->vstat.numOfBatchInsertReqs = numOfBatchInsertReqs; // delta + pInfo->vstat.numOfBatchInsertSuccessReqs = numOfBatchInsertSuccessReqs; // delta pMgmt->state.totalVnodes = totalVnodes; pMgmt->state.masterNum = masterNum; pMgmt->state.numOfSelectReqs = numOfSelectReqs; @@ -109,7 +110,7 @@ int32_t vmProcessGetMonitorInfoReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { int32_t vmProcessGetLoadsReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { SMonVloadInfo vloads = {0}; - vmGetVnodeLoads(pMgmt, &vloads); + vmGetVnodeLoads(pMgmt, &vloads, false); int32_t rspLen = tSerializeSMonVloadInfo(NULL, 0, &vloads); if (rspLen < 0) { @@ -212,38 +213,47 @@ static int32_t vmTsmaProcessCreate(SVnode *pVnode, SCreateVnodeReq *pReq) { } int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { - SCreateVnodeReq createReq = {0}; + SCreateVnodeReq req = {0}; SVnodeCfg vnodeCfg = {0}; SWrapperCfg wrapperCfg = {0}; int32_t code = -1; char path[TSDB_FILENAME_LEN] = {0}; - if (tDeserializeSCreateVnodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) { + if (tDeserializeSCreateVnodeReq(pMsg->pCont, pMsg->contLen, &req) != 0) { terrno = TSDB_CODE_INVALID_MSG; return -1; } dInfo( - "vgId:%d, start to create vnode, tsma:%d standby:%d cacheLast:%d cacheLastSize:%d sstTrigger:%d " - "tsdbPageSize:%d", - createReq.vgId, createReq.isTsma, createReq.standby, createReq.cacheLast, createReq.cacheLastSize, - createReq.sstTrigger, createReq.tsdbPageSize); - dInfo("vgId:%d, hashMethod:%d begin:%u end:%u prefix:%d surfix:%d", createReq.vgId, createReq.hashMethod, - createReq.hashBegin, createReq.hashEnd, createReq.hashPrefix, createReq.hashSuffix); - vmGenerateVnodeCfg(&createReq, &vnodeCfg); + "vgId:%d, start to create vnode, page:%d pageSize:%d buffer:%d szPage:%d szBuf:%" PRIu64 + " cacheLast:%d cacheLastSize:%d sstTrigger:%d tsdbPageSize:%d %d dbname:%s dbId:%" PRId64 + "days:%d keep0:%d keep1:%d keep2:%d tsma:%d precision:%d compression:%d minRows:%d maxRows:%d, wal " + "fsync:%d level:%d retentionPeriod:%d retentionSize:%d rollPeriod:%d segSize:%d, hash method:%d begin:%u end:%u " + "prefix:%d surfix:%d replica:%d selfIndex:%d strict:%d", + req.vgId, req.pages, req.pageSize, req.buffer, req.pageSize * 1024, (uint64_t)req.buffer * 1024 * 1024, + req.cacheLast, req.cacheLastSize, req.sstTrigger, req.tsdbPageSize, req.tsdbPageSize * 1024, req.db, req.dbUid, + req.daysPerFile, req.daysToKeep0, req.daysToKeep1, req.daysToKeep2, req.isTsma, req.precision, req.compression, + req.minRows, req.maxRows, req.walFsyncPeriod, req.walLevel, req.walRetentionPeriod, req.walRetentionSize, + req.walRollPeriod, req.walSegmentSize, req.hashMethod, req.hashBegin, req.hashEnd, req.hashPrefix, req.hashSuffix, + req.replica, req.selfIndex, req.strict); + for (int32_t i = 0; i < req.replica; ++i) { + dInfo("vgId:%d, replica:%d fqdn:%s port:%u", req.vgId, req.replicas[i].id, req.replicas[i].fqdn, + req.replicas[i].port); + } + vmGenerateVnodeCfg(&req, &vnodeCfg); - if (vmTsmaAdjustDays(&vnodeCfg, &createReq) < 0) { - dError("vgId:%d, failed to adjust tsma days since %s", createReq.vgId, terrstr()); + if (vmTsmaAdjustDays(&vnodeCfg, &req) < 0) { + dError("vgId:%d, failed to adjust tsma days since %s", req.vgId, terrstr()); code = terrno; goto _OVER; } - vmGenerateWrapperCfg(pMgmt, &createReq, &wrapperCfg); + vmGenerateWrapperCfg(pMgmt, &req, &wrapperCfg); - SVnodeObj *pVnode = vmAcquireVnode(pMgmt, createReq.vgId); + SVnodeObj *pVnode = vmAcquireVnode(pMgmt, req.vgId); if (pVnode != NULL) { - dDebug("vgId:%d, already exist", createReq.vgId); - tFreeSCreateVnodeReq(&createReq); + dDebug("vgId:%d, already exist", req.vgId); + tFreeSCreateVnodeReq(&req); vmReleaseVnode(pMgmt, pVnode); terrno = TSDB_CODE_NODE_ALREADY_DEPLOYED; code = terrno; @@ -252,36 +262,36 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { snprintf(path, TSDB_FILENAME_LEN, "vnode%svnode%d", TD_DIRSEP, vnodeCfg.vgId); if (vnodeCreate(path, &vnodeCfg, pMgmt->pTfs) < 0) { - tFreeSCreateVnodeReq(&createReq); - dError("vgId:%d, failed to create vnode since %s", createReq.vgId, terrstr()); + tFreeSCreateVnodeReq(&req); + dError("vgId:%d, failed to create vnode since %s", req.vgId, terrstr()); code = terrno; goto _OVER; } SVnode *pImpl = vnodeOpen(path, pMgmt->pTfs, pMgmt->msgCb); if (pImpl == NULL) { - dError("vgId:%d, failed to open vnode since %s", createReq.vgId, terrstr()); + dError("vgId:%d, failed to open vnode since %s", req.vgId, terrstr()); code = terrno; goto _OVER; } code = vmOpenVnode(pMgmt, &wrapperCfg, pImpl); if (code != 0) { - dError("vgId:%d, failed to open vnode since %s", createReq.vgId, terrstr()); + dError("vgId:%d, failed to open vnode since %s", req.vgId, terrstr()); code = terrno; goto _OVER; } - code = vmTsmaProcessCreate(pImpl, &createReq); + code = vmTsmaProcessCreate(pImpl, &req); if (code != 0) { - dError("vgId:%d, failed to create tsma since %s", createReq.vgId, terrstr()); + dError("vgId:%d, failed to create tsma since %s", req.vgId, terrstr()); code = terrno; goto _OVER; } code = vnodeStart(pImpl); if (code != 0) { - dError("vgId:%d, failed to start sync since %s", createReq.vgId, terrstr()); + dError("vgId:%d, failed to start sync since %s", req.vgId, terrstr()); goto _OVER; } @@ -296,10 +306,10 @@ _OVER: vnodeClose(pImpl); vnodeDestroy(path, pMgmt->pTfs); } else { - dInfo("vgId:%d, vnode is created", createReq.vgId); + dInfo("vgId:%d, vnode is created", req.vgId); } - tFreeSCreateVnodeReq(&createReq); + tFreeSCreateVnodeReq(&req); terrno = code; return code; } diff --git a/source/dnode/mgmt/node_mgmt/inc/dmNodes.h b/source/dnode/mgmt/node_mgmt/inc/dmNodes.h index 8c2d57808f..d3f1044f88 100644 --- a/source/dnode/mgmt/node_mgmt/inc/dmNodes.h +++ b/source/dnode/mgmt/node_mgmt/inc/dmNodes.h @@ -35,7 +35,7 @@ void qmGetMonitorInfo(void *pMgmt, SMonQmInfo *pInfo); void smGetMonitorInfo(void *pMgmt, SMonSmInfo *pInfo); void bmGetMonitorInfo(void *pMgmt, SMonBmInfo *pInfo); -void vmGetVnodeLoads(void *pMgmt, SMonVloadInfo *pInfo); +void vmGetVnodeLoads(void *pMgmt, SMonVloadInfo *pInfo, bool isReset); void mmGetMnodeLoads(void *pMgmt, SMonMloadInfo *pInfo); void qmGetQnodeLoads(void *pMgmt, SQnodeLoad *pInfo); diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c index ecad390ef9..50d6aca53e 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c @@ -152,7 +152,7 @@ void dmGetVnodeLoads(SMonVloadInfo *pInfo) { if (tsMultiProcess) { dmSendLocalRecv(pDnode, TDMT_MON_VM_LOAD, tDeserializeSMonVloadInfo, pInfo); } else if (pWrapper->pMgmt != NULL) { - vmGetVnodeLoads(pWrapper->pMgmt, pInfo); + vmGetVnodeLoads(pWrapper->pMgmt, pInfo, false); } dmReleaseWrapper(pWrapper); } diff --git a/source/dnode/mgmt/node_mgmt/src/dmProc.c b/source/dnode/mgmt/node_mgmt/src/dmProc.c index bb71044dd6..ce03d767fe 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmProc.c +++ b/source/dnode/mgmt/node_mgmt/src/dmProc.c @@ -65,6 +65,7 @@ static SProcQueue *dmInitProcQueue(SProc *proc, char *ptr, int32_t size) { } if (proc->ptype & DND_PROC_PARENT) { + memset(ptr, 0, sizeof(SProcQueue)); if (dmInitProcMutex(queue) != 0) { return NULL; } @@ -76,11 +77,11 @@ static SProcQueue *dmInitProcQueue(SProc *proc, char *ptr, int32_t size) { tstrncpy(queue->name, proc->name, sizeof(queue->name)); taosThreadMutexLock(&queue->mutex); - queue->head = 0; - queue->tail = 0; + // queue->head = 0; + // queue->tail = 0; queue->total = bufSize; queue->avail = bufSize; - queue->items = 0; + // queue->items = 0; taosThreadMutexUnlock(&queue->mutex); } diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index c3d03a6c5e..9cc920de04 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -639,6 +639,7 @@ typedef struct { char* physicalPlan; SArray* tasks; // SArray> SSchemaWrapper outputSchema; + SSchemaWrapper tagSchema; } SStreamObj; int32_t tEncodeSStreamObj(SEncoder* pEncoder, const SStreamObj* pObj); diff --git a/source/dnode/mnode/impl/inc/mndVgroup.h b/source/dnode/mnode/impl/inc/mndVgroup.h index c8237d17d8..ad5fbef34c 100644 --- a/source/dnode/mnode/impl/inc/mndVgroup.h +++ b/source/dnode/mnode/impl/inc/mndVgroup.h @@ -44,7 +44,8 @@ int32_t mndAddAlterVnodeAction(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pV int32_t mndAddDropVnodeAction(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid, bool isRedo); int32_t mndSetMoveVgroupInfoToTrans(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, int32_t vn, SArray *pArray); int32_t mndSetMoveVgroupsInfoToTrans(SMnode *, STrans *pTrans, int32_t dropDnodeId); -int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SArray *pArray); +int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb, SVgObj *pVgroup, + SArray *pArray); void *mndBuildCreateVnodeReq(SMnode *, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *cntlen, bool standby); void *mndBuildDropVnodeReq(SMnode *, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen); diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c index 3dfc10e554..7ffa3cef99 100644 --- a/source/dnode/mnode/impl/src/mndConsumer.c +++ b/source/dnode/mnode/impl/src/mndConsumer.c @@ -117,6 +117,7 @@ static int32_t mndProcessConsumerLostMsg(SRpcMsg *pMsg) { if (mndTransPrepare(pMnode, pTrans) != 0) goto FAIL; mndTransDrop(pTrans); + tDeleteSMqConsumerObj(pConsumerNew); return 0; FAIL: tDeleteSMqConsumerObj(pConsumerNew); @@ -149,10 +150,13 @@ static int32_t mndProcessConsumerRecoverMsg(SRpcMsg *pMsg) { if (mndSetConsumerCommitLogs(pMnode, pTrans, pConsumerNew) != 0) goto FAIL; if (mndTransPrepare(pMnode, pTrans) != 0) goto FAIL; + tDeleteSMqConsumerObj(pConsumerNew); + taosMemoryFree(pConsumerNew); mndTransDrop(pTrans); return 0; FAIL: tDeleteSMqConsumerObj(pConsumerNew); + taosMemoryFree(pConsumerNew); mndTransDrop(pTrans); return -1; } diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 9f0cb0b510..6670211d78 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -631,7 +631,7 @@ static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) { terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED; if (pAlter->buffer > 0 && pAlter->buffer != pDb->cfg.buffer) { -#if 1 +#if 0 terrno = TSDB_CODE_OPS_NOT_SUPPORT; return terrno; #else @@ -641,7 +641,7 @@ static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) { } if (pAlter->pages > 0 && pAlter->pages != pDb->cfg.pages) { -#if 1 +#if 0 terrno = TSDB_CODE_OPS_NOT_SUPPORT; return terrno; #else @@ -746,7 +746,7 @@ static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *p return 0; } -static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) { +static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) { SSdb *pSdb = pMnode->pSdb; void *pIter = NULL; SArray *pArray = mndBuildDnodesArray(pMnode, 0); @@ -756,8 +756,8 @@ static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj * pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup); if (pIter == NULL) break; - if (mndVgroupInDb(pVgroup, pNew->uid)) { - if (mndBuildAlterVgroupAction(pMnode, pTrans, pNew, pVgroup, pArray) != 0) { + if (mndVgroupInDb(pVgroup, pNewDb->uid)) { + if (mndBuildAlterVgroupAction(pMnode, pTrans, pOldDb, pNewDb, pVgroup, pArray) != 0) { sdbCancelFetch(pSdb, pIter); sdbRelease(pSdb, pVgroup); taosArrayDestroy(pArray); @@ -1311,7 +1311,7 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs, continue; } else { mInfo("db:%s, vgroup version changed from %d to %d", pDbVgVersion->dbFName, pDbVgVersion->vgVersion, - pDb->vgVersion); + pDb->vgVersion); } usedbRsp.pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo)); diff --git a/source/dnode/mnode/impl/src/mndDef.c b/source/dnode/mnode/impl/src/mndDef.c index 42e56cd488..462b068a73 100644 --- a/source/dnode/mnode/impl/src/mndDef.c +++ b/source/dnode/mnode/impl/src/mndDef.c @@ -117,8 +117,15 @@ int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj) { SArray *pArray = taosArrayInit(innerSz, sizeof(void *)); for (int32_t j = 0; j < innerSz; j++) { SStreamTask *pTask = taosMemoryCalloc(1, sizeof(SStreamTask)); - if (pTask == NULL) return -1; - if (tDecodeSStreamTask(pDecoder, pTask) < 0) return -1; + if (pTask == NULL) { + taosArrayDestroy(pArray); + return -1; + } + if (tDecodeSStreamTask(pDecoder, pTask) < 0) { + taosMemoryFree(pTask); + taosArrayDestroy(pArray); + return -1; + } taosArrayPush(pArray, &pTask); } taosArrayPush(pObj->tasks, &pArray); @@ -353,7 +360,7 @@ SMqConsumerEp *tCloneSMqConsumerEp(const SMqConsumerEp *pConsumerEpOld) { } void tDeleteSMqConsumerEp(void *data) { - SMqConsumerEp *pConsumerEp = (SMqConsumerEp*)data; + SMqConsumerEp *pConsumerEp = (SMqConsumerEp *)data; taosArrayDestroyP(pConsumerEp->vgs, (FDelete)tDeleteSMqVgEp); } diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 94317f7ac8..31d7571363 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -103,7 +103,7 @@ static int32_t mndCreateDefaultDnode(SMnode *pMnode) { dnodeObj.port = tsServerPort; tstrncpy(dnodeObj.fqdn, tsLocalFqdn, TSDB_FQDN_LEN); dnodeObj.fqdn[TSDB_FQDN_LEN - 1] = 0; - snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", dnodeObj.fqdn, dnodeObj.port); + snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", tsLocalFqdn, tsServerPort); pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, NULL, "create-dnode"); if (pTrans == NULL) goto _OVER; @@ -490,7 +490,7 @@ static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pC dnodeObj.updateTime = dnodeObj.createdTime; dnodeObj.port = pCreate->port; tstrncpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN); - snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", dnodeObj.fqdn, dnodeObj.port); + snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", pCreate->fqdn, pCreate->port); pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_GLOBAL, pReq, "create-dnode"); if (pTrans == NULL) goto _OVER; diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index b3b9927a34..275fc76e36 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -814,9 +814,11 @@ int32_t mndAcquireRpcRef(SMnode *pMnode) { int32_t code = 0; taosThreadRwlockRdlock(&pMnode->lock); if (pMnode->stopped) { + mTrace("mnode not running"); terrno = TSDB_CODE_APP_NOT_READY; code = -1; } else if (!mndIsMaster(pMnode)) { + mTrace("mnode not ready, role:%s restored:%d", syncGetMyRoleStr(pMnode->syncMgmt.sync), pMnode->restored); code = -1; } else { int32_t ref = atomic_add_fetch_32(&pMnode->rpcRef, 1); diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index cfb362c51c..09eef7b4d6 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -87,7 +87,7 @@ static int32_t mndCreateDefaultMnode(SMnode *pMnode) { SSdbRaw *pRaw = mndMnodeActionEncode(&mnodeObj); if (pRaw == NULL) return -1; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); mInfo("mnode:%d, will be created when deploying, raw:%p", mnodeObj.id, pRaw); @@ -104,7 +104,7 @@ static int32_t mndCreateDefaultMnode(SMnode *pMnode) { mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); @@ -239,7 +239,9 @@ void mndGetMnodeEpSet(SMnode *pMnode, SEpSet *pEpSet) { pEpSet->inUse = (pEpSet->numOfEps + 1) % totalMnodes; } } - addEpIntoEpSet(pEpSet, pObj->pDnode->fqdn, pObj->pDnode->port); + if (pObj->pDnode != NULL) { + addEpIntoEpSet(pEpSet, pObj->pDnode->fqdn, pObj->pDnode->port); + } sdbRelease(pSdb, pObj); } diff --git a/source/dnode/mnode/impl/src/mndOffset.c b/source/dnode/mnode/impl/src/mndOffset.c index 2ada3e00bb..8d779f0021 100644 --- a/source/dnode/mnode/impl/src/mndOffset.c +++ b/source/dnode/mnode/impl/src/mndOffset.c @@ -182,6 +182,11 @@ static int32_t mndProcessCommitOffsetReq(SRpcMsg *pMsg) { tDecodeSMqCMCommitOffsetReq(&decoder, &commitOffsetReq); STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pMsg, "commit-offset"); + if (pTrans == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + tDecoderClear(&decoder); + return -1; + } for (int32_t i = 0; i < commitOffsetReq.num; i++) { SMqOffset *pOffset = &commitOffsetReq.offsets[i]; diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index 70e134a088..ce6b3b0656 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -343,6 +343,20 @@ static int32_t mndBuildStreamObjFromCreateReq(SMnode *pMnode, SStreamObj *pObj, goto FAIL; } + pObj->tagSchema.nCols = pCreate->numOfTags; + if (pCreate->numOfTags) { + pObj->tagSchema.pSchema = taosMemoryCalloc(pCreate->numOfTags, sizeof(SSchema)); + } + ASSERT(pCreate->numOfTags == taosArrayGetSize(pCreate->pTags)); + for (int32_t i = 0; i < pCreate->numOfTags; i++) { + SField *pField = taosArrayGet(pCreate->pTags, i); + pObj->tagSchema.pSchema[i].colId = pObj->outputSchema.nCols + i + 1; + pObj->tagSchema.pSchema[i].bytes = pField->bytes; + pObj->tagSchema.pSchema[i].flags = pField->flags; + pObj->tagSchema.pSchema[i].type = pField->type; + memcpy(pObj->tagSchema.pSchema[i].name, pField->name, TSDB_COL_NAME_LEN); + } + FAIL: if (pAst != NULL) nodesDestroyNode(pAst); if (pPlan != NULL) qDestroyQueryPlan(pPlan); @@ -663,7 +677,6 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) { // build stream obj from request if (mndBuildStreamObjFromCreateReq(pMnode, &streamObj, &createStreamReq) < 0) { - /*ASSERT(0);*/ mError("stream:%s, failed to create since %s", createStreamReq.name, terrstr()); goto _OVER; } @@ -673,7 +686,7 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) { mError("stream:%s, failed to create since %s", createStreamReq.name, terrstr()); goto _OVER; } - mndTransSetDbName(pTrans, createStreamReq.sourceDB, streamObj.targetDb); // hack way + mndTransSetDbName(pTrans, createStreamReq.sourceDB, streamObj.targetDb); // hack way mInfo("trans:%d, used to create stream:%s", pTrans->id, createStreamReq.name); // create stb for stream diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c index f2fec27bc5..b797bfb4b2 100644 --- a/source/dnode/mnode/impl/src/mndSubscribe.c +++ b/source/dnode/mnode/impl/src/mndSubscribe.c @@ -678,25 +678,30 @@ static int32_t mndProcessDropCgroupReq(SRpcMsg *pReq) { if (pTrans == NULL) { mError("cgroup: %s on topic:%s, failed to drop since %s", dropReq.cgroup, dropReq.topic, terrstr()); mndReleaseSubscribe(pMnode, pSub); + mndTransDrop(pTrans); return -1; } mInfo("trans:%d, used to drop cgroup:%s on topic %s", pTrans->id, dropReq.cgroup, dropReq.topic); if (mndDropOffsetBySubKey(pMnode, pTrans, pSub->key) < 0) { - ASSERT(0); mndReleaseSubscribe(pMnode, pSub); + mndTransDrop(pTrans); return -1; } if (mndSetDropSubCommitLogs(pMnode, pTrans, pSub) < 0) { mError("cgroup %s on topic:%s, failed to drop since %s", dropReq.cgroup, dropReq.topic, terrstr()); mndReleaseSubscribe(pMnode, pSub); + mndTransDrop(pTrans); return -1; } - mndTransPrepare(pMnode, pTrans); - + if (mndTransPrepare(pMnode, pTrans) < 0) { + mndReleaseSubscribe(pMnode, pSub); + mndTransDrop(pTrans); + return -1; + } mndReleaseSubscribe(pMnode, pSub); return TSDB_CODE_ACTION_IN_PROGRESS; diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index 5d3a2be79a..ae259b95be 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -222,6 +222,7 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) { } SDB_GET_BINARY(pRaw, dataPos, buf, len, TOPIC_DECODE_OVER); if (taosDecodeSSchemaWrapper(buf, &pTopic->schema) == NULL) { + taosMemoryFree(buf); goto TOPIC_DECODE_OVER; } taosMemoryFree(buf); diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index a31bf6b8e2..8e91ec90f5 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -405,7 +405,7 @@ static bool mndBuildDnodesArrayFp(SMnode *pMnode, void *pObj, void *p1, void *p2 pDnode->memUsed = mndGetVnodesMemory(pMnode, pDnode->id); mInfo("dnode:%d, vnodes:%d supportVnodes:%d isMnode:%d online:%d memory avail:%" PRId64 " used:%" PRId64, pDnode->id, - pDnode->numOfVnodes, pDnode->numOfSupportVnodes, isMnode, online, pDnode->memAvail, pDnode->memUsed); + pDnode->numOfVnodes, pDnode->numOfSupportVnodes, isMnode, online, pDnode->memAvail, pDnode->memUsed); if (isMnode) { pDnode->numOfVnodes++; @@ -1293,7 +1293,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, mError("db:%s, vgId:%d, no enough memory:%" PRId64 " in dnode:%d avail:%" PRId64 " used:%" PRId64, pVgroup->dbName, pVgroup->vgId, vgMem, pNew3->id, pNew3->memAvail, pNew3->memUsed); terrno = TSDB_CODE_MND_NO_ENOUGH_MEM_IN_DNODE; - goto _OVER; + goto _OVER; } else { pNew3->memUsed += vgMem; } @@ -1530,67 +1530,102 @@ _OVER: #endif } -int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SArray *pArray) { - if (pVgroup->replica <= 0 || pVgroup->replica == pDb->cfg.replications) { - if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, pVgroup, TDMT_VND_ALTER_CONFIG) != 0) { - return -1; +static int32_t mndCheckDnodeMemory(SMnode *pMnode, SDbObj *pOldDb, SDbObj *pNewDb, SVgObj *pOldVgroup, + SVgObj *pNewVgroup, SArray *pArray) { + for (int32_t i = 0; i < (int32_t)taosArrayGetSize(pArray); ++i) { + SDnodeObj *pDnode = taosArrayGet(pArray, i); + bool inVgroup = false; + for (int32_t j = 0; j < pOldVgroup->replica; ++j) { + SVnodeGid *pVgId = &pOldVgroup->vnodeGid[i]; + if (pDnode->id == pVgId->dnodeId) { + pDnode->memUsed -= mndGetVgroupMemory(pMnode, pOldDb, pOldVgroup); + inVgroup = true; + } } - } else { - SVgObj newVgroup = {0}; - memcpy(&newVgroup, pVgroup, sizeof(SVgObj)); - mndTransSetSerial(pTrans); - - if (newVgroup.replica < pDb->cfg.replications) { - mInfo("db:%s, vgId:%d, vn:0 dnode:%d, will add 2 vnodes", pVgroup->dbName, pVgroup->vgId, - pVgroup->vnodeGid[0].dnodeId); - - if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) return -1; - if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &newVgroup.vnodeGid[1], true) != 0) return -1; - if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; - if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVgroup) != 0) return -1; - - if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) return -1; - if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &newVgroup.vnodeGid[2], true) != 0) return -1; - if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; - if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVgroup) != 0) return -1; - } else if (newVgroup.replica > pDb->cfg.replications) { - mInfo("db:%s, vgId:%d, will remove 2 vnodes", pVgroup->dbName, pVgroup->vgId); - - SVnodeGid del1 = {0}; - if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del1) != 0) return -1; - if (mndAddSetVnodeStandByAction(pMnode, pTrans, pDb, pVgroup, &del1, true) != 0) return -1; - if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; - if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del1, true) != 0) return -1; - if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVgroup) != 0) return -1; - - SVnodeGid del2 = {0}; - if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del2) != 0) return -1; - if (mndAddSetVnodeStandByAction(pMnode, pTrans, pDb, pVgroup, &del2, true) != 0) return -1; - if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; - if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del2, true) != 0) return -1; - if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVgroup) != 0) return -1; + for (int32_t j = 0; j < pNewVgroup->replica; ++j) { + SVnodeGid *pVgId = &pNewVgroup->vnodeGid[i]; + if (pDnode->id == pVgId->dnodeId) { + pDnode->memUsed += mndGetVgroupMemory(pMnode, pNewDb, pNewVgroup); + inVgroup = true; + } + } + if (pDnode->memAvail - pDnode->memUsed <= 0) { + mError("db:%s, vgId:%d, no enough memory in dnode:%d, avail:%" PRId64 " used:%" PRId64, pNewVgroup->dbName, + pNewVgroup->vgId, pDnode->id, pDnode->memAvail, pDnode->memUsed); + terrno = TSDB_CODE_MND_NO_ENOUGH_MEM_IN_DNODE; + return -1; + } else if (inVgroup) { + mInfo("db:%s, vgId:%d, memory in dnode:%d, avail:%" PRId64 " used:%" PRId64, pNewVgroup->dbName, + pNewVgroup->vgId, pDnode->id, pDnode->memAvail, pDnode->memUsed); } else { } + } + return 0; +} - { - SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup); - if (pVgRaw == NULL) return -1; - if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) { - sdbFreeRaw(pVgRaw); - return -1; - } - (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); - } +int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb, SVgObj *pVgroup, + SArray *pArray) { + SVgObj newVgroup = {0}; + memcpy(&newVgroup, pVgroup, sizeof(SVgObj)); - { - SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup); - if (pVgRaw == NULL) return -1; - if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) { - sdbFreeRaw(pVgRaw); - return -1; - } - (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); + if (pVgroup->replica <= 0 || pVgroup->replica == pNewDb->cfg.replications) { + if (mndAddAlterVnodeAction(pMnode, pTrans, pNewDb, pVgroup, TDMT_VND_ALTER_CONFIG) != 0) return -1; + if (mndCheckDnodeMemory(pMnode, pOldDb, pNewDb, &newVgroup, pVgroup, pArray) != 0) return -1; + return 0; + } + + mndTransSetSerial(pTrans); + + if (newVgroup.replica < pNewDb->cfg.replications) { + mInfo("db:%s, vgId:%d, vn:0 dnode:%d, will add 2 vnodes", pVgroup->dbName, pVgroup->vgId, + pVgroup->vnodeGid[0].dnodeId); + + if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) return -1; + if (mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &newVgroup.vnodeGid[1], true) != 0) return -1; + if (mndAddAlterVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; + if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1; + + if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) return -1; + if (mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &newVgroup.vnodeGid[2], true) != 0) return -1; + if (mndAddAlterVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; + if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1; + } else if (newVgroup.replica > pNewDb->cfg.replications) { + mInfo("db:%s, vgId:%d, will remove 2 vnodes", pVgroup->dbName, pVgroup->vgId); + + SVnodeGid del1 = {0}; + if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del1) != 0) return -1; + if (mndAddSetVnodeStandByAction(pMnode, pTrans, pNewDb, pVgroup, &del1, true) != 0) return -1; + if (mndAddAlterVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; + if (mndAddDropVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &del1, true) != 0) return -1; + if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1; + + SVnodeGid del2 = {0}; + if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del2) != 0) return -1; + if (mndAddSetVnodeStandByAction(pMnode, pTrans, pNewDb, pVgroup, &del2, true) != 0) return -1; + if (mndAddAlterVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1; + if (mndAddDropVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &del2, true) != 0) return -1; + if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1; + } else { + } + + { + SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup); + if (pVgRaw == NULL) return -1; + if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) { + sdbFreeRaw(pVgRaw); + return -1; } + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); + } + + { + SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup); + if (pVgRaw == NULL) return -1; + if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) { + sdbFreeRaw(pVgRaw); + return -1; + } + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); } return 0; @@ -1650,8 +1685,8 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVg2, TDMT_VND_ALTER_HASHRANGE) != 0) goto _OVER; // adjust vgroup - if (mndBuildAlterVgroupAction(pMnode, pTrans, pDb, &newVg1, pArray) != 0) goto _OVER; - if (mndBuildAlterVgroupAction(pMnode, pTrans, pDb, &newVg2, pArray) != 0) goto _OVER; + if (mndBuildAlterVgroupAction(pMnode, pTrans, pDb, pDb, &newVg1, pArray) != 0) goto _OVER; + if (mndBuildAlterVgroupAction(pMnode, pTrans, pDb, pDb, &newVg2, pArray) != 0) goto _OVER; _OVER: mndTransDrop(pTrans); @@ -1784,7 +1819,7 @@ static int32_t mndBalanceVgroup(SMnode *pMnode, SRpcMsg *pReq, SArray *pArray) { for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) { SDnodeObj *pDnode = taosArrayGet(pArray, i); mInfo("dnode:%d, equivalent vnodes:%d support:%d, score:%f", pDnode->id, pDnode->numOfVnodes, - pDnode->numOfSupportVnodes, (float)pDnode->numOfVnodes / pDnode->numOfSupportVnodes); + pDnode->numOfSupportVnodes, (float)pDnode->numOfVnodes / pDnode->numOfSupportVnodes); } SDnodeObj *pSrc = taosArrayGet(pArray, taosArrayGetSize(pArray) - 1); @@ -1793,7 +1828,7 @@ static int32_t mndBalanceVgroup(SMnode *pMnode, SRpcMsg *pReq, SArray *pArray) { float srcScore = (float)(pSrc->numOfVnodes - 1) / pSrc->numOfSupportVnodes; float dstScore = (float)(pDst->numOfVnodes + 1) / pDst->numOfSupportVnodes; mInfo("trans:%d, after balance, src dnode:%d score:%f, dst dnode:%d score:%f", pTrans->id, pSrc->id, srcScore, - pDst->id, dstScore); + pDst->id, dstScore); if (srcScore > dstScore - 0.000001) { code = mndBalanceVgroupBetweenDnode(pMnode, pTrans, pSrc, pDst, pBalancedVgroups); diff --git a/source/dnode/mnode/impl/test/db/db.cpp b/source/dnode/mnode/impl/test/db/db.cpp index 94ba7f2968..7ded199520 100644 --- a/source/dnode/mnode/impl/test/db/db.cpp +++ b/source/dnode/mnode/impl/test/db/db.cpp @@ -30,6 +30,7 @@ TEST_F(MndTestDb, 01_ShowDb) { EXPECT_EQ(test.GetShowRows(), 2); } +#if 0 TEST_F(MndTestDb, 02_Create_Alter_Drop_Db) { { SCreateDbReq createReq = {0}; @@ -125,6 +126,7 @@ TEST_F(MndTestDb, 02_Create_Alter_Drop_Db) { test.SendShowReq(TSDB_MGMT_TABLE_DB, "ins_databases", ""); EXPECT_EQ(test.GetShowRows(), 2); } +#endif TEST_F(MndTestDb, 03_Create_Use_Restart_Use_Db) { { diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index ba16bad7cf..d006f12a3f 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -73,6 +73,7 @@ int32_t vnodeGetCtbNum(SVnode *pVnode, int64_t suid, int64_t *num); int32_t vnodeGetTimeSeriesNum(SVnode *pVnode, int64_t *num); int32_t vnodeGetAllCtbNum(SVnode *pVnode, int64_t *num); +void vnodeResetLoad(SVnode *pVnode, SVnodeLoad *pLoad); int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad); int32_t vnodeValidateTableHash(SVnode *pVnode, char *tableFName); @@ -91,6 +92,8 @@ typedef struct SMeta SMeta; // todo: remove typedef struct SMetaReader SMetaReader; typedef struct SMetaEntry SMetaEntry; +#define META_READER_NOLOCK 0x1 + void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags); void metaReaderClear(SMetaReader *pReader); int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid); diff --git a/source/dnode/vnode/src/inc/meta.h b/source/dnode/vnode/src/inc/meta.h index adfbb91920..dbe2f80150 100644 --- a/source/dnode/vnode/src/inc/meta.h +++ b/source/dnode/vnode/src/inc/meta.h @@ -67,6 +67,10 @@ void metaCacheClose(SMeta* pMeta); int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo); int32_t metaCacheDrop(SMeta* pMeta, int64_t uid); +int32_t metaStatsCacheUpsert(SMeta* pMeta, SMetaStbStats* pInfo); +int32_t metaStatsCacheDrop(SMeta* pMeta, int64_t uid); +int32_t metaStatsCacheGet(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo); + struct SMeta { TdThreadRwlock lock; diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h index 900d29b97e..aca99ecd2f 100644 --- a/source/dnode/vnode/src/inc/vnd.h +++ b/source/dnode/vnode/src/inc/vnd.h @@ -72,7 +72,7 @@ struct SVBufPool { SVBufPoolNode node; }; -int32_t vnodeOpenBufPool(SVnode* pVnode, int64_t size); +int32_t vnodeOpenBufPool(SVnode* pVnode); int32_t vnodeCloseBufPool(SVnode* pVnode); void vnodeBufPoolReset(SVBufPool* pPool); diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index ec570b4540..712f8bd15b 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -56,6 +56,7 @@ typedef struct SSma SSma; typedef struct STsdb STsdb; typedef struct STQ STQ; typedef struct SVState SVState; +typedef struct SVStatis SVStatis; typedef struct SVBufPool SVBufPool; typedef struct SQWorker SQHandle; typedef struct STsdbKeepCfg STsdbKeepCfg; @@ -107,16 +108,17 @@ int metaCreateTable(SMeta* pMeta, int64_t version, SVCreateTbReq* pR int metaDropTable(SMeta* pMeta, int64_t version, SVDropTbReq* pReq, SArray* tbUids, int64_t* tbUid); int metaTtlDropTable(SMeta* pMeta, int64_t ttl, SArray* tbUids); int metaAlterTable(SMeta* pMeta, int64_t version, SVAlterTbReq* pReq, STableMetaRsp* pMetaRsp); -SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, bool isinline); -STSchema* metaGetTbTSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver); +SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, int lock); +STSchema* metaGetTbTSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, int lock); int32_t metaGetTbTSchemaEx(SMeta* pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sver, STSchema** ppTSchema); int metaGetTableEntryByName(SMetaReader* pReader, const char* name); +int metaAlterCache(SMeta* pMeta, int32_t nPage); tb_uid_t metaGetTableEntryUidByName(SMeta* pMeta, const char* name); int64_t metaGetTbNum(SMeta* pMeta); int64_t metaGetTimeSeriesNum(SMeta* pMeta); -SMCtbCursor* metaOpenCtbCursor(SMeta* pMeta, tb_uid_t uid); -void metaCloseCtbCursor(SMCtbCursor* pCtbCur); +SMCtbCursor* metaOpenCtbCursor(SMeta* pMeta, tb_uid_t uid, int lock); +void metaCloseCtbCursor(SMCtbCursor* pCtbCur, int lock); tb_uid_t metaCtbCursorNext(SMCtbCursor* pCtbCur); SMStbCursor* metaOpenStbCursor(SMeta* pMeta, tb_uid_t uid); void metaCloseStbCursor(SMStbCursor* pStbCur); @@ -140,6 +142,12 @@ typedef struct SMetaInfo { } SMetaInfo; int32_t metaGetInfo(SMeta* pMeta, int64_t uid, SMetaInfo* pInfo); +typedef struct { + int64_t uid; + int64_t ctbNum; +} SMetaStbStats; +int32_t metaGetStbStats(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo); + // tsdb int tsdbOpen(SVnode* pVnode, STsdb** ppTsdb, const char* dir, STsdbKeepCfg* pKeepCfg); int tsdbClose(STsdb** pTsdb); @@ -283,9 +291,17 @@ struct SVState { int64_t commitTerm; }; +struct SVStatis { + int64_t nInsert; // delta + int64_t nInsertSuccess; // delta + int64_t nBatchInsert; // delta + int64_t nBatchInsertSuccess; // delta +}; + struct SVnodeInfo { SVnodeCfg config; SVState state; + SVStatis statis; }; typedef enum { @@ -308,6 +324,7 @@ struct SVnode { char* path; SVnodeCfg config; SVState state; + SVStatis statis; STfs* pTfs; SMsgCb msgCb; TdThreadMutex mutex; diff --git a/source/dnode/vnode/src/meta/metaCache.c b/source/dnode/vnode/src/meta/metaCache.c index b8cc9f0df2..6f19d43e69 100644 --- a/source/dnode/vnode/src/meta/metaCache.c +++ b/source/dnode/vnode/src/meta/metaCache.c @@ -14,7 +14,8 @@ */ #include "meta.h" -#define META_CACHE_BASE_BUCKET 1024 +#define META_CACHE_BASE_BUCKET 1024 +#define META_CACHE_STATS_BUCKET 16 // (uid , suid) : child table // (uid, 0) : normal table @@ -25,12 +26,59 @@ struct SMetaCacheEntry { SMetaInfo info; }; +typedef struct SMetaStbStatsEntry { + struct SMetaStbStatsEntry* next; + SMetaStbStats info; +} SMetaStbStatsEntry; + struct SMetaCache { - int32_t nEntry; - int32_t nBucket; - SMetaCacheEntry** aBucket; + // child, normal, super, table entry cache + struct SEntryCache { + int32_t nEntry; + int32_t nBucket; + SMetaCacheEntry** aBucket; + } sEntryCache; + + // stable stats cache + struct SStbStatsCache { + int32_t nEntry; + int32_t nBucket; + SMetaStbStatsEntry** aBucket; + } sStbStatsCache; + + // query cache }; +static void entryCacheClose(SMeta* pMeta) { + if (pMeta->pCache) { + // close entry cache + for (int32_t iBucket = 0; iBucket < pMeta->pCache->sEntryCache.nBucket; iBucket++) { + SMetaCacheEntry* pEntry = pMeta->pCache->sEntryCache.aBucket[iBucket]; + while (pEntry) { + SMetaCacheEntry* tEntry = pEntry->next; + taosMemoryFree(pEntry); + pEntry = tEntry; + } + } + taosMemoryFree(pMeta->pCache->sEntryCache.aBucket); + } +} + +static void statsCacheClose(SMeta* pMeta) { + if (pMeta->pCache) { + // close entry cache + for (int32_t iBucket = 0; iBucket < pMeta->pCache->sStbStatsCache.nBucket; iBucket++) { + SMetaStbStatsEntry* pEntry = pMeta->pCache->sStbStatsCache.aBucket[iBucket]; + while (pEntry) { + SMetaStbStatsEntry* tEntry = pEntry->next; + taosMemoryFree(pEntry); + pEntry = tEntry; + } + } + taosMemoryFree(pMeta->pCache->sStbStatsCache.aBucket); + } +} + int32_t metaCacheOpen(SMeta* pMeta) { int32_t code = 0; SMetaCache* pCache = NULL; @@ -41,36 +89,45 @@ int32_t metaCacheOpen(SMeta* pMeta) { goto _err; } - pCache->nEntry = 0; - pCache->nBucket = META_CACHE_BASE_BUCKET; - pCache->aBucket = (SMetaCacheEntry**)taosMemoryCalloc(pCache->nBucket, sizeof(SMetaCacheEntry*)); - if (pCache->aBucket == NULL) { + // open entry cache + pCache->sEntryCache.nEntry = 0; + pCache->sEntryCache.nBucket = META_CACHE_BASE_BUCKET; + pCache->sEntryCache.aBucket = + (SMetaCacheEntry**)taosMemoryCalloc(pCache->sEntryCache.nBucket, sizeof(SMetaCacheEntry*)); + if (pCache->sEntryCache.aBucket == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - taosMemoryFree(pCache); goto _err; } + // open stats cache + pCache->sStbStatsCache.nEntry = 0; + pCache->sStbStatsCache.nBucket = META_CACHE_STATS_BUCKET; + pCache->sStbStatsCache.aBucket = + (SMetaStbStatsEntry**)taosMemoryCalloc(pCache->sStbStatsCache.nBucket, sizeof(SMetaStbStatsEntry*)); + if (pCache->sStbStatsCache.aBucket == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err2; + } + pMeta->pCache = pCache; _exit: return code; +_err2: + entryCacheClose(pMeta); + _err: + taosMemoryFree(pCache); + metaError("vgId:%d meta open cache failed since %s", TD_VID(pMeta->pVnode), tstrerror(code)); return code; } void metaCacheClose(SMeta* pMeta) { if (pMeta->pCache) { - for (int32_t iBucket = 0; iBucket < pMeta->pCache->nBucket; iBucket++) { - SMetaCacheEntry* pEntry = pMeta->pCache->aBucket[iBucket]; - while (pEntry) { - SMetaCacheEntry* tEntry = pEntry->next; - taosMemoryFree(pEntry); - pEntry = tEntry; - } - } - taosMemoryFree(pMeta->pCache->aBucket); + entryCacheClose(pMeta); + statsCacheClose(pMeta); taosMemoryFree(pMeta->pCache); pMeta->pCache = NULL; } @@ -81,9 +138,9 @@ static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { int32_t nBucket; if (expand) { - nBucket = pCache->nBucket * 2; + nBucket = pCache->sEntryCache.nBucket * 2; } else { - nBucket = pCache->nBucket / 2; + nBucket = pCache->sEntryCache.nBucket / 2; } SMetaCacheEntry** aBucket = (SMetaCacheEntry**)taosMemoryCalloc(nBucket, sizeof(SMetaCacheEntry*)); @@ -93,8 +150,8 @@ static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { } // rehash - for (int32_t iBucket = 0; iBucket < pCache->nBucket; iBucket++) { - SMetaCacheEntry* pEntry = pCache->aBucket[iBucket]; + for (int32_t iBucket = 0; iBucket < pCache->sEntryCache.nBucket; iBucket++) { + SMetaCacheEntry* pEntry = pCache->sEntryCache.aBucket[iBucket]; while (pEntry) { SMetaCacheEntry* pTEntry = pEntry->next; @@ -107,9 +164,9 @@ static int32_t metaRehashCache(SMetaCache* pCache, int8_t expand) { } // final set - taosMemoryFree(pCache->aBucket); - pCache->nBucket = nBucket; - pCache->aBucket = aBucket; + taosMemoryFree(pCache->sEntryCache.aBucket); + pCache->sEntryCache.nBucket = nBucket; + pCache->sEntryCache.aBucket = aBucket; _exit: return code; @@ -122,8 +179,8 @@ int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo) { // search SMetaCache* pCache = pMeta->pCache; - int32_t iBucket = TABS(pInfo->uid) % pCache->nBucket; - SMetaCacheEntry** ppEntry = &pCache->aBucket[iBucket]; + int32_t iBucket = TABS(pInfo->uid) % pCache->sEntryCache.nBucket; + SMetaCacheEntry** ppEntry = &pCache->sEntryCache.aBucket[iBucket]; while (*ppEntry && (*ppEntry)->info.uid != pInfo->uid) { ppEntry = &(*ppEntry)->next; } @@ -135,11 +192,11 @@ int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo) { (*ppEntry)->info.skmVer = pInfo->skmVer; } } else { // insert - if (pCache->nEntry >= pCache->nBucket) { + if (pCache->sEntryCache.nEntry >= pCache->sEntryCache.nBucket) { code = metaRehashCache(pCache, 1); if (code) goto _exit; - iBucket = TABS(pInfo->uid) % pCache->nBucket; + iBucket = TABS(pInfo->uid) % pCache->sEntryCache.nBucket; } SMetaCacheEntry* pEntryNew = (SMetaCacheEntry*)taosMemoryMalloc(sizeof(*pEntryNew)); @@ -149,9 +206,9 @@ int32_t metaCacheUpsert(SMeta* pMeta, SMetaInfo* pInfo) { } pEntryNew->info = *pInfo; - pEntryNew->next = pCache->aBucket[iBucket]; - pCache->aBucket[iBucket] = pEntryNew; - pCache->nEntry++; + pEntryNew->next = pCache->sEntryCache.aBucket[iBucket]; + pCache->sEntryCache.aBucket[iBucket] = pEntryNew; + pCache->sEntryCache.nEntry++; } _exit: @@ -162,8 +219,8 @@ int32_t metaCacheDrop(SMeta* pMeta, int64_t uid) { int32_t code = 0; SMetaCache* pCache = pMeta->pCache; - int32_t iBucket = TABS(uid) % pCache->nBucket; - SMetaCacheEntry** ppEntry = &pCache->aBucket[iBucket]; + int32_t iBucket = TABS(uid) % pCache->sEntryCache.nBucket; + SMetaCacheEntry** ppEntry = &pCache->sEntryCache.aBucket[iBucket]; while (*ppEntry && (*ppEntry)->info.uid != uid) { ppEntry = &(*ppEntry)->next; } @@ -172,8 +229,9 @@ int32_t metaCacheDrop(SMeta* pMeta, int64_t uid) { if (pEntry) { *ppEntry = pEntry->next; taosMemoryFree(pEntry); - pCache->nEntry--; - if (pCache->nEntry < pCache->nBucket / 4 && pCache->nBucket > META_CACHE_BASE_BUCKET) { + pCache->sEntryCache.nEntry--; + if (pCache->sEntryCache.nEntry < pCache->sEntryCache.nBucket / 4 && + pCache->sEntryCache.nBucket > META_CACHE_BASE_BUCKET) { code = metaRehashCache(pCache, 0); if (code) goto _exit; } @@ -189,8 +247,134 @@ int32_t metaCacheGet(SMeta* pMeta, int64_t uid, SMetaInfo* pInfo) { int32_t code = 0; SMetaCache* pCache = pMeta->pCache; - int32_t iBucket = TABS(uid) % pCache->nBucket; - SMetaCacheEntry* pEntry = pCache->aBucket[iBucket]; + int32_t iBucket = TABS(uid) % pCache->sEntryCache.nBucket; + SMetaCacheEntry* pEntry = pCache->sEntryCache.aBucket[iBucket]; + + while (pEntry && pEntry->info.uid != uid) { + pEntry = pEntry->next; + } + + if (pEntry) { + *pInfo = pEntry->info; + } else { + code = TSDB_CODE_NOT_FOUND; + } + + return code; +} + +static int32_t metaRehashStatsCache(SMetaCache* pCache, int8_t expand) { + int32_t code = 0; + int32_t nBucket; + + if (expand) { + nBucket = pCache->sStbStatsCache.nBucket * 2; + } else { + nBucket = pCache->sStbStatsCache.nBucket / 2; + } + + SMetaStbStatsEntry** aBucket = (SMetaStbStatsEntry**)taosMemoryCalloc(nBucket, sizeof(SMetaStbStatsEntry*)); + if (aBucket == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + // rehash + for (int32_t iBucket = 0; iBucket < pCache->sStbStatsCache.nBucket; iBucket++) { + SMetaStbStatsEntry* pEntry = pCache->sStbStatsCache.aBucket[iBucket]; + + while (pEntry) { + SMetaStbStatsEntry* pTEntry = pEntry->next; + + pEntry->next = aBucket[TABS(pEntry->info.uid) % nBucket]; + aBucket[TABS(pEntry->info.uid) % nBucket] = pEntry; + + pEntry = pTEntry; + } + } + + // final set + taosMemoryFree(pCache->sStbStatsCache.aBucket); + pCache->sStbStatsCache.nBucket = nBucket; + pCache->sStbStatsCache.aBucket = aBucket; + +_exit: + return code; +} + +int32_t metaStatsCacheUpsert(SMeta* pMeta, SMetaStbStats* pInfo) { + int32_t code = 0; + + // ASSERT(metaIsWLocked(pMeta)); + + // search + SMetaCache* pCache = pMeta->pCache; + int32_t iBucket = TABS(pInfo->uid) % pCache->sStbStatsCache.nBucket; + SMetaStbStatsEntry** ppEntry = &pCache->sStbStatsCache.aBucket[iBucket]; + while (*ppEntry && (*ppEntry)->info.uid != pInfo->uid) { + ppEntry = &(*ppEntry)->next; + } + + if (*ppEntry) { // update + (*ppEntry)->info.ctbNum = pInfo->ctbNum; + } else { // insert + if (pCache->sStbStatsCache.nEntry >= pCache->sStbStatsCache.nBucket) { + code = metaRehashStatsCache(pCache, 1); + if (code) goto _exit; + + iBucket = TABS(pInfo->uid) % pCache->sStbStatsCache.nBucket; + } + + SMetaStbStatsEntry* pEntryNew = (SMetaStbStatsEntry*)taosMemoryMalloc(sizeof(*pEntryNew)); + if (pEntryNew == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + pEntryNew->info = *pInfo; + pEntryNew->next = pCache->sStbStatsCache.aBucket[iBucket]; + pCache->sStbStatsCache.aBucket[iBucket] = pEntryNew; + pCache->sStbStatsCache.nEntry++; + } + +_exit: + return code; +} + +int32_t metaStatsCacheDrop(SMeta* pMeta, int64_t uid) { + int32_t code = 0; + + SMetaCache* pCache = pMeta->pCache; + int32_t iBucket = TABS(uid) % pCache->sStbStatsCache.nBucket; + SMetaStbStatsEntry** ppEntry = &pCache->sStbStatsCache.aBucket[iBucket]; + while (*ppEntry && (*ppEntry)->info.uid != uid) { + ppEntry = &(*ppEntry)->next; + } + + SMetaStbStatsEntry* pEntry = *ppEntry; + if (pEntry) { + *ppEntry = pEntry->next; + taosMemoryFree(pEntry); + pCache->sStbStatsCache.nEntry--; + if (pCache->sStbStatsCache.nEntry < pCache->sStbStatsCache.nBucket / 4 && + pCache->sStbStatsCache.nBucket > META_CACHE_STATS_BUCKET) { + code = metaRehashStatsCache(pCache, 0); + if (code) goto _exit; + } + } else { + code = TSDB_CODE_NOT_FOUND; + } + +_exit: + return code; +} + +int32_t metaStatsCacheGet(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo) { + int32_t code = TSDB_CODE_SUCCESS; + + SMetaCache* pCache = pMeta->pCache; + int32_t iBucket = TABS(uid) % pCache->sStbStatsCache.nBucket; + SMetaStbStatsEntry* pEntry = pCache->sStbStatsCache.aBucket[iBucket]; while (pEntry && pEntry->info.uid != uid) { pEntry = pEntry->next; diff --git a/source/dnode/vnode/src/meta/metaOpen.c b/source/dnode/vnode/src/meta/metaOpen.c index 034d6260da..515fd31e9d 100644 --- a/source/dnode/vnode/src/meta/metaOpen.c +++ b/source/dnode/vnode/src/meta/metaOpen.c @@ -35,7 +35,11 @@ int metaOpen(SVnode *pVnode, SMeta **ppMeta) { *ppMeta = NULL; // create handle - slen = strlen(tfsGetPrimaryPath(pVnode->pTfs)) + strlen(pVnode->path) + strlen(VNODE_META_DIR) + 3; + if (pVnode->pTfs) { + slen = strlen(tfsGetPrimaryPath(pVnode->pTfs)) + strlen(pVnode->path) + strlen(VNODE_META_DIR) + 3; + } else { + slen = strlen(pVnode->path) + strlen(VNODE_META_DIR) + 2; + } if ((pMeta = taosMemoryCalloc(1, sizeof(*pMeta) + slen)) == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; return -1; @@ -43,8 +47,12 @@ int metaOpen(SVnode *pVnode, SMeta **ppMeta) { metaInitLock(pMeta); pMeta->path = (char *)&pMeta[1]; - sprintf(pMeta->path, "%s%s%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path, TD_DIRSEP, - VNODE_META_DIR); + if (pVnode->pTfs) { + sprintf(pMeta->path, "%s%s%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path, TD_DIRSEP, + VNODE_META_DIR); + } else { + sprintf(pMeta->path, "%s%s%s", pVnode->path, TD_DIRSEP, VNODE_META_DIR); + } taosRealPath(pMeta->path, NULL, slen); pMeta->pVnode = pVnode; @@ -197,6 +205,18 @@ int metaClose(SMeta *pMeta) { return 0; } +int metaAlterCache(SMeta *pMeta, int32_t nPage) { + metaWLock(pMeta); + + if (tdbAlter(pMeta->pEnv, nPage) < 0) { + metaULock(pMeta); + return -1; + } + + metaULock(pMeta); + return 0; +} + int32_t metaRLock(SMeta *pMeta) { int32_t ret = 0; diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 07e917931b..b4fc2c010b 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -19,11 +19,13 @@ void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags) { memset(pReader, 0, sizeof(*pReader)); pReader->flags = flags; pReader->pMeta = pMeta; - metaRLock(pMeta); + if (!(flags & META_READER_NOLOCK)) { + metaRLock(pMeta); + } } void metaReaderClear(SMetaReader *pReader) { - if (pReader->pMeta) { + if (pReader->pMeta && !(pReader->flags & META_READER_NOLOCK)) { metaULock(pReader->pMeta); } tDecoderClear(&pReader->coder); @@ -297,15 +299,16 @@ int metaTbCursorNext(SMTbCursor *pTbCur) { return 0; } -SSchemaWrapper *metaGetTableSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, bool isinline) { +SSchemaWrapper *metaGetTableSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, int lock) { void *pData = NULL; int nData = 0; int64_t version; SSchemaWrapper schema = {0}; SSchemaWrapper *pSchema = NULL; SDecoder dc = {0}; - - metaRLock(pMeta); + if (lock) { + metaRLock(pMeta); + } _query: if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pData, &nData) < 0) { goto _err; @@ -384,13 +387,17 @@ _query: _exit: tDecoderClear(&dc); - metaULock(pMeta); + if (lock) { + metaULock(pMeta); + } tdbFree(pData); return pSchema; _err: tDecoderClear(&dc); - metaULock(pMeta); + if (lock) { + metaULock(pMeta); + } tdbFree(pData); return NULL; } @@ -436,7 +443,7 @@ struct SMCtbCursor { int vLen; }; -SMCtbCursor *metaOpenCtbCursor(SMeta *pMeta, tb_uid_t uid) { +SMCtbCursor *metaOpenCtbCursor(SMeta *pMeta, tb_uid_t uid, int lock) { SMCtbCursor *pCtbCur = NULL; SCtbIdxKey ctbIdxKey; int ret = 0; @@ -449,7 +456,9 @@ SMCtbCursor *metaOpenCtbCursor(SMeta *pMeta, tb_uid_t uid) { pCtbCur->pMeta = pMeta; pCtbCur->suid = uid; - metaRLock(pMeta); + if (lock) { + metaRLock(pMeta); + } ret = tdbTbcOpen(pMeta->pCtbIdx, &pCtbCur->pCur, NULL); if (ret < 0) { @@ -469,9 +478,9 @@ SMCtbCursor *metaOpenCtbCursor(SMeta *pMeta, tb_uid_t uid) { return pCtbCur; } -void metaCloseCtbCursor(SMCtbCursor *pCtbCur) { +void metaCloseCtbCursor(SMCtbCursor *pCtbCur, int lock) { if (pCtbCur) { - if (pCtbCur->pMeta) metaULock(pCtbCur->pMeta); + if (pCtbCur->pMeta && lock) metaULock(pCtbCur->pMeta); if (pCtbCur->pCur) { tdbTbcClose(pCtbCur->pCur); @@ -566,14 +575,14 @@ tb_uid_t metaStbCursorNext(SMStbCursor *pStbCur) { return *(tb_uid_t *)pStbCur->pKey; } -STSchema *metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver) { +STSchema *metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, int lock) { // SMetaReader mr = {0}; STSchema *pTSchema = NULL; SSchemaWrapper *pSW = NULL; STSchemaBuilder sb = {0}; SSchema *pSchema; - pSW = metaGetTableSchema(pMeta, uid, sver, 0); + pSW = metaGetTableSchema(pMeta, uid, sver, lock); if (!pSW) return NULL; tdInitTSchemaBuilder(&sb, pSW->version); @@ -1181,7 +1190,7 @@ int32_t metaGetTableTagsByUids(SMeta *pMeta, int64_t suid, SArray *uidList, SHas } int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) { - SMCtbCursor *pCur = metaOpenCtbCursor(pMeta, suid); + SMCtbCursor *pCur = metaOpenCtbCursor(pMeta, suid, 1); SHashObj *uHash = NULL; size_t len = taosArrayGetSize(uidList); // len > 0 means there already have uids @@ -1208,7 +1217,7 @@ int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj } taosHashCleanup(uHash); - metaCloseCtbCursor(pCur); + metaCloseCtbCursor(pCur, 1); return TSDB_CODE_SUCCESS; } @@ -1251,3 +1260,32 @@ _exit: tdbFree(pData); return code; } + +int32_t metaGetStbStats(SMeta *pMeta, int64_t uid, SMetaStbStats *pInfo) { + int32_t code = 0; + + metaRLock(pMeta); + + // fast path: search cache + if (metaStatsCacheGet(pMeta, uid, pInfo) == TSDB_CODE_SUCCESS) { + metaULock(pMeta); + goto _exit; + } + + // slow path: search TDB + int64_t ctbNum = 0; + vnodeGetCtbNum(pMeta->pVnode, uid, &ctbNum); + + metaULock(pMeta); + + pInfo->uid = uid; + pInfo->ctbNum = ctbNum; + + // upsert the cache + metaWLock(pMeta); + metaStatsCacheUpsert(pMeta, pInfo); + metaULock(pMeta); + +_exit: + return code; +} diff --git a/source/dnode/vnode/src/meta/metaSnapshot.c b/source/dnode/vnode/src/meta/metaSnapshot.c index 9fdbe50f88..a40bbd7d87 100644 --- a/source/dnode/vnode/src/meta/metaSnapshot.c +++ b/source/dnode/vnode/src/meta/metaSnapshot.c @@ -196,11 +196,11 @@ _err: return code; } -typedef struct STableInfoForChildTable{ - char *tableName; - SSchemaWrapper *schemaRow; - SSchemaWrapper *tagRow; -}STableInfoForChildTable; +typedef struct STableInfoForChildTable { + char* tableName; + SSchemaWrapper* schemaRow; + SSchemaWrapper* tagRow; +} STableInfoForChildTable; static void destroySTableInfoForChildTable(void* data) { STableInfoForChildTable* pData = (STableInfoForChildTable*)data; @@ -209,35 +209,35 @@ static void destroySTableInfoForChildTable(void* data) { tDeleteSSchemaWrapper(pData->tagRow); } -static void MoveToSnapShotVersion(SSnapContext* ctx){ +static void MoveToSnapShotVersion(SSnapContext* ctx) { tdbTbcClose(ctx->pCur); tdbTbcOpen(ctx->pMeta->pTbDb, &ctx->pCur, NULL); STbDbKey key = {.version = ctx->snapVersion, .uid = INT64_MAX}; - int c = 0; + int c = 0; tdbTbcMoveTo(ctx->pCur, &key, sizeof(key), &c); - if(c < 0){ + if (c < 0) { tdbTbcMoveToPrev(ctx->pCur); } } -static int32_t MoveToPosition(SSnapContext* ctx, int64_t ver, int64_t uid){ +static int32_t MoveToPosition(SSnapContext* ctx, int64_t ver, int64_t uid) { tdbTbcClose(ctx->pCur); tdbTbcOpen(ctx->pMeta->pTbDb, &ctx->pCur, NULL); STbDbKey key = {.version = ver, .uid = uid}; - int c = 0; + int c = 0; tdbTbcMoveTo(ctx->pCur, &key, sizeof(key), &c); return c; } -static void MoveToFirst(SSnapContext* ctx){ +static void MoveToFirst(SSnapContext* ctx) { tdbTbcClose(ctx->pCur); tdbTbcOpen(ctx->pMeta->pTbDb, &ctx->pCur, NULL); tdbTbcMoveToFirst(ctx->pCur); } -static void saveSuperTableInfoForChildTable(SMetaEntry *me, SHashObj *suidInfo){ +static void saveSuperTableInfoForChildTable(SMetaEntry* me, SHashObj* suidInfo) { STableInfoForChildTable* data = (STableInfoForChildTable*)taosHashGet(suidInfo, &me->uid, sizeof(tb_uid_t)); - if(data){ + if (data) { return; } STableInfoForChildTable dataTmp = {0}; @@ -248,9 +248,10 @@ static void saveSuperTableInfoForChildTable(SMetaEntry *me, SHashObj *suidInfo){ taosHashPut(suidInfo, &me->uid, sizeof(tb_uid_t), &dataTmp, sizeof(STableInfoForChildTable)); } -int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t subType, bool withMeta, SSnapContext** ctxRet){ +int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t subType, bool withMeta, + SSnapContext** ctxRet) { SSnapContext* ctx = taosMemoryCalloc(1, sizeof(SSnapContext)); - if(ctx == NULL) return -1; + if (ctx == NULL) return -1; *ctxRet = ctx; ctx->pMeta = pMeta; ctx->snapVersion = snapVersion; @@ -259,36 +260,37 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t ctx->queryMetaOrData = withMeta; ctx->withMeta = withMeta; ctx->idVersion = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); - if(ctx->idVersion == NULL){ + if (ctx->idVersion == NULL) { return -1; } ctx->suidInfo = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); - if(ctx->suidInfo == NULL){ + if (ctx->suidInfo == NULL) { return -1; } taosHashSetFreeFp(ctx->suidInfo, destroySTableInfoForChildTable); ctx->index = 0; ctx->idList = taosArrayInit(100, sizeof(int64_t)); - void *pKey = NULL; - void *pVal = NULL; + void* pKey = NULL; + void* pVal = NULL; int vLen = 0, kLen = 0; metaDebug("tmqsnap init snapVersion:%" PRIi64, ctx->snapVersion); MoveToFirst(ctx); - while(1){ + while (1) { int32_t ret = tdbTbcNext(ctx->pCur, &pKey, &kLen, &pVal, &vLen); if (ret < 0) break; - STbDbKey *tmp = (STbDbKey*)pKey; + STbDbKey* tmp = (STbDbKey*)pKey; if (tmp->version > ctx->snapVersion) break; SIdInfo* idData = (SIdInfo*)taosHashGet(ctx->idVersion, &tmp->uid, sizeof(tb_uid_t)); - if(idData) { + if (idData) { continue; } - if (tdbTbGet(pMeta->pUidIdx, &tmp->uid, sizeof(tb_uid_t), NULL, NULL) < 0) { // check if table exist for now, need optimize later + if (tdbTbGet(pMeta->pUidIdx, &tmp->uid, sizeof(tb_uid_t), NULL, NULL) < + 0) { // check if table exist for now, need optimize later continue; } @@ -296,9 +298,9 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t SMetaEntry me = {0}; tDecoderInit(&dc, pVal, vLen); metaDecodeEntry(&dc, &me); - if(ctx->subType == TOPIC_SUB_TYPE__TABLE){ + if (ctx->subType == TOPIC_SUB_TYPE__TABLE) { if ((me.uid != ctx->suid && me.type == TSDB_SUPER_TABLE) || - (me.ctbEntry.suid != ctx->suid && me.type == TSDB_CHILD_TABLE)){ + (me.ctbEntry.suid != ctx->suid && me.type == TSDB_CHILD_TABLE)) { tDecoderClear(&dc); continue; } @@ -314,13 +316,13 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t taosHashClear(ctx->idVersion); MoveToSnapShotVersion(ctx); - while(1){ + while (1) { int32_t ret = tdbTbcPrev(ctx->pCur, &pKey, &kLen, &pVal, &vLen); if (ret < 0) break; - STbDbKey *tmp = (STbDbKey*)pKey; - SIdInfo* idData = (SIdInfo*)taosHashGet(ctx->idVersion, &tmp->uid, sizeof(tb_uid_t)); - if(idData){ + STbDbKey* tmp = (STbDbKey*)pKey; + SIdInfo* idData = (SIdInfo*)taosHashGet(ctx->idVersion, &tmp->uid, sizeof(tb_uid_t)); + if (idData) { continue; } SIdInfo info = {.version = tmp->version, .index = 0}; @@ -330,27 +332,28 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t SMetaEntry me = {0}; tDecoderInit(&dc, pVal, vLen); metaDecodeEntry(&dc, &me); - if(ctx->subType == TOPIC_SUB_TYPE__TABLE){ + if (ctx->subType == TOPIC_SUB_TYPE__TABLE) { if ((me.uid != ctx->suid && me.type == TSDB_SUPER_TABLE) || - (me.ctbEntry.suid != ctx->suid && me.type == TSDB_CHILD_TABLE)){ + (me.ctbEntry.suid != ctx->suid && me.type == TSDB_CHILD_TABLE)) { tDecoderClear(&dc); continue; } } - if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_SUPER_TABLE) - || (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.uid == ctx->suid)) { + if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_SUPER_TABLE) || + (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.uid == ctx->suid)) { saveSuperTableInfoForChildTable(&me, ctx->suidInfo); } tDecoderClear(&dc); } - for(int i = 0; i < taosArrayGetSize(ctx->idList); i++){ - int64_t *uid = taosArrayGet(ctx->idList, i); + for (int i = 0; i < taosArrayGetSize(ctx->idList); i++) { + int64_t* uid = taosArrayGet(ctx->idList, i); SIdInfo* idData = (SIdInfo*)taosHashGet(ctx->idVersion, uid, sizeof(int64_t)); ASSERT(idData); idData->index = i; - metaDebug("tmqsnap init idVersion uid:%" PRIi64 " version:%" PRIi64 " index:%d", *uid, idData->version, idData->index); + metaDebug("tmqsnap init idVersion uid:%" PRIi64 " version:%" PRIi64 " index:%d", *uid, idData->version, + idData->index); } tdbFree(pKey); @@ -358,7 +361,7 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t return TDB_CODE_SUCCESS; } -int32_t destroySnapContext(SSnapContext* ctx){ +int32_t destroySnapContext(SSnapContext* ctx) { tdbTbcClose(ctx->pCur); taosArrayDestroy(ctx->idList); taosHashCleanup(ctx->idVersion); @@ -367,12 +370,12 @@ int32_t destroySnapContext(SSnapContext* ctx){ return 0; } -static int32_t buildNormalChildTableInfo(SVCreateTbReq *req, void **pBuf, int32_t *contLen){ - int32_t ret = 0; +static int32_t buildNormalChildTableInfo(SVCreateTbReq* req, void** pBuf, int32_t* contLen) { + int32_t ret = 0; SVCreateTbBatchReq reqs = {0}; reqs.pArray = taosArrayInit(1, sizeof(struct SVCreateTbReq)); - if (NULL == reqs.pArray){ + if (NULL == reqs.pArray) { ret = -1; goto end; } @@ -380,7 +383,7 @@ static int32_t buildNormalChildTableInfo(SVCreateTbReq *req, void **pBuf, int32_ reqs.nReqs = 1; tEncodeSize(tEncodeSVCreateTbBatchReq, &reqs, *contLen, ret); - if(ret < 0){ + if (ret < 0) { ret = -1; goto end; } @@ -405,7 +408,7 @@ end: return ret; } -static int32_t buildSuperTableInfo(SVCreateStbReq *req, void **pBuf, int32_t *contLen){ +static int32_t buildSuperTableInfo(SVCreateStbReq* req, void** pBuf, int32_t* contLen) { int32_t ret = 0; tEncodeSize(tEncodeSVCreateStbReq, req, *contLen, ret); if (ret < 0) { @@ -418,7 +421,7 @@ static int32_t buildSuperTableInfo(SVCreateStbReq *req, void **pBuf, int32_t *co return -1; } - SEncoder encoder = {0}; + SEncoder encoder = {0}; tEncoderInit(&encoder, POINTER_SHIFT(*pBuf, sizeof(SMsgHead)), *contLen); if (tEncodeSVCreateStbReq(&encoder, req) < 0) { taosMemoryFreeClear(*pBuf); @@ -429,16 +432,16 @@ static int32_t buildSuperTableInfo(SVCreateStbReq *req, void **pBuf, int32_t *co return 0; } -int32_t setForSnapShot(SSnapContext* ctx, int64_t uid){ +int32_t setForSnapShot(SSnapContext* ctx, int64_t uid) { int c = 0; - if(uid == 0){ + if (uid == 0) { ctx->index = 0; return c; } SIdInfo* idInfo = (SIdInfo*)taosHashGet(ctx->idVersion, &uid, sizeof(tb_uid_t)); - if(!idInfo){ + if (!idInfo) { return -1; } @@ -447,17 +450,17 @@ int32_t setForSnapShot(SSnapContext* ctx, int64_t uid){ return c; } -int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, int16_t *type, int64_t *uid){ +int32_t getMetafromSnapShot(SSnapContext* ctx, void** pBuf, int32_t* contLen, int16_t* type, int64_t* uid) { int32_t ret = 0; - void *pKey = NULL; - void *pVal = NULL; - int vLen = 0, kLen = 0; + void* pKey = NULL; + void* pVal = NULL; + int vLen = 0, kLen = 0; - while(1){ - if(ctx->index >= taosArrayGetSize(ctx->idList)){ + while (1) { + if (ctx->index >= taosArrayGetSize(ctx->idList)) { metaDebug("tmqsnap get meta end"); ctx->index = 0; - ctx->queryMetaOrData = false; // change to get data + ctx->queryMetaOrData = false; // change to get data return 0; } @@ -468,7 +471,7 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in *uid = *uidTmp; ret = MoveToPosition(ctx, idInfo->version, *uidTmp); - if(ret == 0){ + if (ret == 0) { break; } metaDebug("tmqsnap get meta not exist uid:%" PRIi64 " version:%" PRIi64, *uid, idInfo->version); @@ -479,10 +482,10 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in SMetaEntry me = {0}; tDecoderInit(&dc, pVal, vLen); metaDecodeEntry(&dc, &me); - metaDebug("tmqsnap get meta uid:%" PRIi64 " name:%s index:%d", *uid, me.name, ctx->index-1); + metaDebug("tmqsnap get meta uid:%" PRIi64 " name:%s index:%d", *uid, me.name, ctx->index - 1); - if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_SUPER_TABLE) - || (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.uid == ctx->suid)) { + if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_SUPER_TABLE) || + (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.uid == ctx->suid)) { SVCreateStbReq req = {0}; req.name = me.name; req.suid = me.uid; @@ -494,9 +497,10 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in ret = buildSuperTableInfo(&req, pBuf, contLen); *type = TDMT_VND_CREATE_STB; - } else if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_CHILD_TABLE) - || (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.type == TSDB_CHILD_TABLE && me.ctbEntry.suid == ctx->suid)) { - STableInfoForChildTable* data = (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t)); + } else if ((ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_CHILD_TABLE) || + (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.type == TSDB_CHILD_TABLE && me.ctbEntry.suid == ctx->suid)) { + STableInfoForChildTable* data = + (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t)); ASSERT(data); SVCreateTbReq req = {0}; @@ -506,16 +510,16 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in req.commentLen = -1; req.ctb.suid = me.ctbEntry.suid; req.ctb.tagNum = data->tagRow->nCols; - req.ctb.name = data->tableName; + req.ctb.stbName = data->tableName; SArray* tagName = taosArrayInit(req.ctb.tagNum, TSDB_COL_NAME_LEN); - STag* p = (STag*)me.ctbEntry.pTags; - if(tTagIsJson(p)){ + STag* p = (STag*)me.ctbEntry.pTags; + if (tTagIsJson(p)) { if (p->nTag != 0) { SSchema* schema = &data->tagRow->pSchema[0]; taosArrayPush(tagName, schema->name); } - }else{ + } else { SArray* pTagVals = NULL; if (tTagToValArray((const STag*)p, &pTagVals) != 0) { ASSERT(0); @@ -523,36 +527,36 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in int16_t nCols = taosArrayGetSize(pTagVals); for (int j = 0; j < nCols; ++j) { STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j); - for(int i = 0; i < data->tagRow->nCols; i++){ - SSchema *schema = &data->tagRow->pSchema[i]; - if(schema->colId == pTagVal->cid){ + for (int i = 0; i < data->tagRow->nCols; i++) { + SSchema* schema = &data->tagRow->pSchema[i]; + if (schema->colId == pTagVal->cid) { taosArrayPush(tagName, schema->name); } } } taosArrayDestroy(pTagVals); } -// SIdInfo* sidInfo = (SIdInfo*)taosHashGet(ctx->idVersion, &me.ctbEntry.suid, sizeof(tb_uid_t)); -// if(sidInfo->version >= idInfo->version){ -// // need parse tag -// STag* p = (STag*)me.ctbEntry.pTags; -// SArray* pTagVals = NULL; -// if (tTagToValArray((const STag*)p, &pTagVals) != 0) { -// } -// -// int16_t nCols = taosArrayGetSize(pTagVals); -// for (int j = 0; j < nCols; ++j) { -// STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j); -// } -// }else{ - req.ctb.pTag = me.ctbEntry.pTags; -// } + // SIdInfo* sidInfo = (SIdInfo*)taosHashGet(ctx->idVersion, &me.ctbEntry.suid, sizeof(tb_uid_t)); + // if(sidInfo->version >= idInfo->version){ + // // need parse tag + // STag* p = (STag*)me.ctbEntry.pTags; + // SArray* pTagVals = NULL; + // if (tTagToValArray((const STag*)p, &pTagVals) != 0) { + // } + // + // int16_t nCols = taosArrayGetSize(pTagVals); + // for (int j = 0; j < nCols; ++j) { + // STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j); + // } + // }else{ + req.ctb.pTag = me.ctbEntry.pTags; + // } req.ctb.tagName = tagName; ret = buildNormalChildTableInfo(&req, pBuf, contLen); *type = TDMT_VND_CREATE_TABLE; taosArrayDestroy(tagName); - } else if(ctx->subType == TOPIC_SUB_TYPE__DB){ + } else if (ctx->subType == TOPIC_SUB_TYPE__DB) { SVCreateTbReq req = {0}; req.type = TSDB_NORMAL_TABLE; req.name = me.name; @@ -561,7 +565,7 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in req.ntb.schemaRow = me.ntbEntry.schemaRow; ret = buildNormalChildTableInfo(&req, pBuf, contLen); *type = TDMT_VND_CREATE_TABLE; - } else{ + } else { ASSERT(0); } tDecoderClear(&dc); @@ -569,14 +573,14 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in return ret; } -SMetaTableInfo getUidfromSnapShot(SSnapContext* ctx){ +SMetaTableInfo getUidfromSnapShot(SSnapContext* ctx) { SMetaTableInfo result = {0}; - void *pKey = NULL; - void *pVal = NULL; - int vLen, kLen; + void* pKey = NULL; + void* pVal = NULL; + int vLen, kLen; - while(1){ - if(ctx->index >= taosArrayGetSize(ctx->idList)){ + while (1) { + if (ctx->index >= taosArrayGetSize(ctx->idList)) { metaDebug("tmqsnap get uid info end"); return result; } @@ -586,7 +590,7 @@ SMetaTableInfo getUidfromSnapShot(SSnapContext* ctx){ ASSERT(idInfo); int32_t ret = MoveToPosition(ctx, idInfo->version, *uidTmp); - if(ret != 0) { + if (ret != 0) { metaDebug("tmqsnap getUidfromSnapShot not exist uid:%" PRIi64 " version:%" PRIi64, *uidTmp, idInfo->version); continue; } @@ -595,10 +599,11 @@ SMetaTableInfo getUidfromSnapShot(SSnapContext* ctx){ SMetaEntry me = {0}; tDecoderInit(&dc, pVal, vLen); metaDecodeEntry(&dc, &me); - metaDebug("tmqsnap get uid info uid:%" PRIi64 " name:%s index:%d", me.uid, me.name, ctx->index-1); + metaDebug("tmqsnap get uid info uid:%" PRIi64 " name:%s index:%d", me.uid, me.name, ctx->index - 1); - if (ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_CHILD_TABLE){ - STableInfoForChildTable* data = (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t)); + if (ctx->subType == TOPIC_SUB_TYPE__DB && me.type == TSDB_CHILD_TABLE) { + STableInfoForChildTable* data = + (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t)); result.uid = me.uid; result.suid = me.ctbEntry.suid; result.schema = tCloneSSchemaWrapper(data->schemaRow); @@ -612,15 +617,16 @@ SMetaTableInfo getUidfromSnapShot(SSnapContext* ctx){ result.schema = tCloneSSchemaWrapper(&me.ntbEntry.schemaRow); tDecoderClear(&dc); break; - } else if(ctx->subType == TOPIC_SUB_TYPE__TABLE && me.type == TSDB_CHILD_TABLE && me.ctbEntry.suid == ctx->suid) { - STableInfoForChildTable* data = (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t)); + } else if (ctx->subType == TOPIC_SUB_TYPE__TABLE && me.type == TSDB_CHILD_TABLE && me.ctbEntry.suid == ctx->suid) { + STableInfoForChildTable* data = + (STableInfoForChildTable*)taosHashGet(ctx->suidInfo, &me.ctbEntry.suid, sizeof(tb_uid_t)); result.uid = me.uid; result.suid = me.ctbEntry.suid; strcpy(result.tbName, me.name); result.schema = tCloneSSchemaWrapper(data->schemaRow); tDecoderClear(&dc); break; - } else{ + } else { metaDebug("tmqsnap get uid continue"); tDecoderClear(&dc); continue; diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 932afe8937..c8a4ff945d 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -362,6 +362,8 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { // update uid index metaUpdateUidIdx(pMeta, &nStbEntry); + metaStatsCacheDrop(pMeta, nStbEntry.uid); + metaULock(pMeta); if (oStbEntry.pBuf) taosMemoryFree(oStbEntry.pBuf); @@ -382,7 +384,7 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq, STableMe } if (pReq->type == TSDB_CHILD_TABLE) { - tb_uid_t suid = metaGetTableEntryUidByName(pMeta, pReq->ctb.name); + tb_uid_t suid = metaGetTableEntryUidByName(pMeta, pReq->ctb.stbName); if (suid != pReq->ctb.suid) { terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; return -1; @@ -615,6 +617,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) { tdbTbDelete(pMeta->pSuidIdx, &e.uid, sizeof(tb_uid_t), &pMeta->txn); // drop schema.db (todo) + metaStatsCacheDrop(pMeta, uid); --pMeta->pVnode->config.vndStats.numOfSTables; } diff --git a/source/dnode/vnode/src/sma/smaCommit.c b/source/dnode/vnode/src/sma/smaCommit.c index fb5caad269..db5f4c55b9 100644 --- a/source/dnode/vnode/src/sma/smaCommit.c +++ b/source/dnode/vnode/src/sma/smaCommit.c @@ -161,10 +161,12 @@ static int32_t tdProcessRSmaSyncPreCommitImpl(SSma *pSma) { * @return int32_t */ static int32_t tdProcessRSmaSyncCommitImpl(SSma *pSma) { +#if 0 SSmaEnv *pSmaEnv = SMA_RSMA_ENV(pSma); if (!pSmaEnv) { return TSDB_CODE_SUCCESS; } +#endif return TSDB_CODE_SUCCESS; } diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index 27da9da02c..155086a5a8 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -326,7 +326,6 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat terrno = TSDB_CODE_RSMA_STREAM_STATE_OPEN; return TSDB_CODE_FAILED; } - SReadHandle handle = { .meta = pVnode->pMeta, @@ -412,7 +411,7 @@ int32_t tdRSmaProcessCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, con return TSDB_CODE_FAILED; } - STSchema *pTSchema = metaGetTbTSchema(SMA_META(pSma), suid, -1); + STSchema *pTSchema = metaGetTbTSchema(SMA_META(pSma), suid, -1, 1); if (!pTSchema) { terrno = TSDB_CODE_TDB_IVD_TB_SCHEMA_VERSION; goto _err; @@ -692,7 +691,7 @@ static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSma while (1) { uint64_t ts; - bool hasMore = false; + bool hasMore = false; int32_t code = qExecTaskOpt(taskInfo, pResList, &ts, &hasMore, NULL); if (code < 0) { if (code == TSDB_CODE_QRY_IN_EXEC) { @@ -1821,11 +1820,9 @@ static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo) { goto _err; } if (tdRSmaExecAndSubmitResult(pSma, taskInfo, pItem, pInfo->pTSchema, pInfo->suid) < 0) { - tdCleanupStreamInputDataBlock(taskInfo); goto _err; } - tdCleanupStreamInputDataBlock(taskInfo); smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi8 " maxDelay:%d, fetch finished", SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay); } else { @@ -1935,7 +1932,8 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) { int8_t oldStat = atomic_val_compare_exchange_8(RSMA_COMMIT_STAT(pRSmaStat), 0, 2); if (oldStat == 0 || ((oldStat == 2) && atomic_load_8(RSMA_TRIGGER_STAT(pRSmaStat)) < TASK_TRIGGER_STAT_PAUSED)) { - atomic_fetch_add_32(&pRSmaStat->nFetchAll, 1); + int32_t oldVal = atomic_fetch_add_32(&pRSmaStat->nFetchAll, 1); + ASSERT(oldVal >= 0); tdRSmaFetchAllResult(pSma, pInfo); if (0 == atomic_sub_fetch_32(&pRSmaStat->nFetchAll, 1)) { atomic_store_8(RSMA_COMMIT_STAT(pRSmaStat), 0); diff --git a/source/dnode/vnode/src/sma/smaSnapshot.c b/source/dnode/vnode/src/sma/smaSnapshot.c index 4939fce20c..34f884f9f9 100644 --- a/source/dnode/vnode/src/sma/smaSnapshot.c +++ b/source/dnode/vnode/src/sma/smaSnapshot.c @@ -373,7 +373,11 @@ int32_t rsmaSnapWriterClose(SRSmaSnapWriter** ppWriter, int8_t rollback) { // TODO: rsma1/rsma2 // qtaskinfo if (pWriter->pQTaskFWriter) { - taosRemoveFile(pWriter->pQTaskFWriter->fname); + if (taosRemoveFile(pWriter->pQTaskFWriter->fname) != 0) { + smaWarn("vgId:%d, vnode snapshot rsma writer failed to remove %s since %s", SMA_VID(pWriter->pSma), + pWriter->pQTaskFWriter->fname ? pWriter->pQTaskFWriter->fname : "NULL", + tstrerror(TAOS_SYSTEM_ERROR(errno))); + } } } else { // rsma1/rsma2 diff --git a/source/dnode/vnode/src/sma/smaTimeRange.c b/source/dnode/vnode/src/sma/smaTimeRange.c index 6c32fbbc84..b0ae972635 100644 --- a/source/dnode/vnode/src/sma/smaTimeRange.c +++ b/source/dnode/vnode/src/sma/smaTimeRange.c @@ -188,7 +188,7 @@ static int32_t tdProcessTSmaInsertImpl(SSma *pSma, int64_t indexUid, const char goto _err; } pTsmaStat->pTSma = pTSma; - pTsmaStat->pTSchema = metaGetTbTSchema(SMA_META(pSma), pTSma->dstTbUid, -1); + pTsmaStat->pTSchema = metaGetTbTSchema(SMA_META(pSma), pTSma->dstTbUid, -1, 1); if (!pTsmaStat->pTSchema) { smaError("vgId:%d, failed to get STSchema while tsma insert for smaIndex %" PRIi64 " since %s", SMA_VID(pSma), indexUid, tstrerror(terrno)); @@ -204,8 +204,9 @@ static int32_t tdProcessTSmaInsertImpl(SSma *pSma, int64_t indexUid, const char } SBatchDeleteReq deleteReq; - SSubmitReq *pSubmitReq = tqBlockToSubmit(pSma->pVnode, (const SArray *)msg, pTsmaStat->pTSchema, &pTsmaStat->pTSma->schemaTag, true, - pTsmaStat->pTSma->dstTbUid, pTsmaStat->pTSma->dstTbName, &deleteReq); + SSubmitReq *pSubmitReq = + tqBlockToSubmit(pSma->pVnode, (const SArray *)msg, pTsmaStat->pTSchema, &pTsmaStat->pTSma->schemaTag, true, + pTsmaStat->pTSma->dstTbUid, pTsmaStat->pTSma->dstTbName, &deleteReq); if (!pSubmitReq) { smaError("vgId:%d, failed to gen submit blk while tsma insert for smaIndex %" PRIi64 " since %s", SMA_VID(pSma), diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index ed5a894416..83cb3955e3 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -93,7 +93,8 @@ STQ* tqOpen(const char* path, SVnode* pVnode) { ASSERT(0); } - if (tqOffsetOpen(pTq) < 0) { + pTq->pOffsetStore = tqOffsetOpen(pTq); + if (pTq->pOffsetStore == NULL) { ASSERT(0); } @@ -648,7 +649,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { code = -1; } tDeleteSTaosxRsp(&taosxRsp); - if (pCkHead) taosMemoryFree(pCkHead); + taosMemoryFreeClear(pCkHead); return code; } @@ -671,7 +672,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { code = -1; } tDeleteSTaosxRsp(&taosxRsp); - if (pCkHead) taosMemoryFree(pCkHead); + taosMemoryFreeClear(pCkHead); return code; } else { fetchVer++; @@ -687,18 +688,19 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { metaRsp.metaRsp = pHead->body; if (tqSendMetaPollRsp(pTq, pMsg, pReq, &metaRsp) < 0) { code = -1; - taosMemoryFree(pCkHead); + taosMemoryFreeClear(pCkHead); tDeleteSTaosxRsp(&taosxRsp); return code; } code = 0; - if (pCkHead) taosMemoryFree(pCkHead); + taosMemoryFreeClear(pCkHead); tDeleteSTaosxRsp(&taosxRsp); return code; } } } tDeleteSTaosxRsp(&taosxRsp); + taosMemoryFreeClear(pCkHead); return 0; } @@ -767,7 +769,7 @@ int32_t tqProcessVgChangeReq(STQ* pTq, int64_t version, char* msg, int32_t msgLe STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey)); if (pHandle == NULL) { if (req.oldConsumerId != -1) { - tqError("vgId:%d, build new consumer handle %s for consumer %d, but old consumerId is %ld", req.vgId, req.subKey, + tqError("vgId:%d, build new consumer handle %s for consumer %ld, but old consumerId is %ld", req.vgId, req.subKey, req.newConsumerId, req.oldConsumerId); } if (req.newConsumerId == -1) { diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index c55e1059cf..1c5eee7378 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -170,14 +170,18 @@ int32_t tqMetaRestoreCheckInfo(STQ* pTq) { tDecoderInit(&decoder, (uint8_t*)pVal, vLen); if (tDecodeSTqCheckInfo(&decoder, &info) < 0) { terrno = TSDB_CODE_OUT_OF_MEMORY; + tdbFree(pKey); + tdbTbcClose(pCur); return -1; } tDecoderClear(&decoder); if (taosHashPut(pTq->pCheckInfo, info.topic, strlen(info.topic), &info, sizeof(STqCheckInfo)) < 0) { terrno = TSDB_CODE_OUT_OF_MEMORY; + tdbTbcClose(pCur); return -1; } } + tdbFree(pKey); tdbTbcClose(pCur); return 0; } @@ -188,7 +192,7 @@ int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle) { tEncodeSize(tEncodeSTqHandle, pHandle, vlen, code); ASSERT(code == 0); - tqDebug("tq save %s(%d) consumer %" PRId64 " vgId:%d", pHandle->subKey, strlen(pHandle->subKey), pHandle->consumerId, + tqDebug("tq save %s(%d) consumer %ld vgId:%d", pHandle->subKey, (int32_t)strlen(pHandle->subKey), pHandle->consumerId, TD_VID(pTq->pVnode)); void* buf = taosMemoryCalloc(1, vlen); diff --git a/source/dnode/vnode/src/tq/tqOffsetSnapshot.c b/source/dnode/vnode/src/tq/tqOffsetSnapshot.c index 292c234f49..b63ff8af1d 100644 --- a/source/dnode/vnode/src/tq/tqOffsetSnapshot.c +++ b/source/dnode/vnode/src/tq/tqOffsetSnapshot.c @@ -54,8 +54,8 @@ int32_t tqOffsetSnapRead(STqOffsetReader* pReader, uint8_t** ppData) { char* fname = tqOffsetBuildFName(pReader->pTq->path, 0); TdFilePtr pFile = taosOpenFile(fname, TD_FILE_READ); - taosMemoryFree(fname); - if (pFile != NULL) { + if (pFile == NULL) { + taosMemoryFree(fname); return 0; } @@ -63,6 +63,7 @@ int32_t tqOffsetSnapRead(STqOffsetReader* pReader, uint8_t** ppData) { if (taosStatFile(fname, &sz, NULL) < 0) { ASSERT(0); } + taosMemoryFree(fname); SSnapDataHdr* buf = taosMemoryCalloc(1, sz + sizeof(SSnapDataHdr)); if (buf == NULL) { @@ -120,9 +121,13 @@ int32_t tqOffsetWriterClose(STqOffsetWriter** ppWriter, int8_t rollback) { char* fname = tqOffsetBuildFName(pTq->path, 0); if (rollback) { - taosRemoveFile(pWriter->fname); + if (taosRemoveFile(pWriter->fname) < 0) { + ASSERT(0); + } } else { - taosRenameFile(pWriter->fname, fname); + if (taosRenameFile(pWriter->fname, fname) < 0) { + ASSERT(0); + } if (tqOffsetRestoreFromFile(pTq->pOffsetStore, fname) < 0) { ASSERT(0); } diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c index dcfb07f0ff..bcdac1941a 100644 --- a/source/dnode/vnode/src/tq/tqPush.c +++ b/source/dnode/vnode/src/tq/tqPush.c @@ -226,6 +226,8 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) if (data == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; tqError("failed to copy data for stream since out of memory"); + taosArrayDestroyP(cachedKeys, (FDelete)taosMemoryFree); + taosArrayDestroy(cachedKeyLens); return -1; } memcpy(data, msg, msgLen); @@ -299,6 +301,7 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) } taosArrayDestroyP(cachedKeys, (FDelete)taosMemoryFree); taosArrayDestroy(cachedKeyLens); + taosMemoryFree(data); } // unlock taosWUnLockLatch(&pTq->pushLock); diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index 3bd31e6660..0e8b366113 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -253,6 +253,7 @@ STqReader* tqOpenReader(SVnode* pVnode) { pReader->pWalReader = walOpenReader(pVnode->pWal, NULL); if (pReader->pWalReader == NULL) { + taosMemoryFree(pReader); return NULL; } @@ -413,7 +414,7 @@ int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, STqReader* pReader) { if (pReader->cachedSchemaSuid == 0 || pReader->cachedSchemaVer != sversion || pReader->cachedSchemaSuid != pReader->msgIter.suid) { if (pReader->pSchema) taosMemoryFree(pReader->pSchema); - pReader->pSchema = metaGetTbTSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion); + pReader->pSchema = metaGetTbTSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion, 1); if (pReader->pSchema == NULL) { tqWarn("cannot found tsschema for table: uid:%" PRId64 " (suid:%" PRId64 "), version %d, possibly dropped table", pReader->msgIter.uid, pReader->msgIter.suid, pReader->cachedSchemaVer); @@ -423,7 +424,7 @@ int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, STqReader* pReader) { } if (pReader->pSchemaWrapper) tDeleteSSchemaWrapper(pReader->pSchemaWrapper); - pReader->pSchemaWrapper = metaGetTableSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion, true); + pReader->pSchemaWrapper = metaGetTableSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion, 1); if (pReader->pSchemaWrapper == NULL) { tqWarn("cannot found schema wrapper for table: suid:%" PRId64 ", version %d, possibly dropped table", pReader->msgIter.uid, pReader->cachedSchemaVer); diff --git a/source/dnode/vnode/src/tq/tqSink.c b/source/dnode/vnode/src/tq/tqSink.c index 16c2a5d033..521d12fdab 100644 --- a/source/dnode/vnode/src/tq/tqSink.c +++ b/source/dnode/vnode/src/tq/tqSink.c @@ -23,10 +23,19 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl int32_t totRow = pDataBlock->info.rows; SColumnInfoData* pTsCol = taosArrayGet(pDataBlock->pDataBlock, START_TS_COLUMN_INDEX); SColumnInfoData* pGidCol = taosArrayGet(pDataBlock->pDataBlock, GROUPID_COLUMN_INDEX); + SColumnInfoData* pTbNameCol = taosArrayGet(pDataBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX); + for (int32_t row = 0; row < totRow; row++) { int64_t ts = *(int64_t*)colDataGetData(pTsCol, row); int64_t groupId = *(int64_t*)colDataGetData(pGidCol, row); - char* name = buildCtbNameByGroupId(stbFullName, groupId); + char* name; + void* varTbName = colDataGetVarData(pTbNameCol, row); + if (varTbName != NULL && varTbName != (void*)-1) { + name = taosMemoryCalloc(1, TSDB_TABLE_NAME_LEN); + memcpy(name, varDataVal(varTbName), varDataLen(varTbName)); + } else { + name = buildCtbNameByGroupId(stbFullName, groupId); + } tqDebug("stream delete msg: groupId :%ld, name: %s", groupId, name); SMetaReader mr = {0}; metaReaderInit(&mr, pVnode->pMeta, 0); @@ -48,8 +57,9 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl return 0; } -SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchema* pTSchema, SSchemaWrapper* pTagSchemaWrapper, bool createTb, - int64_t suid, const char* stbFullName, SBatchDeleteReq* pDeleteReq) { +SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchema* pTSchema, + SSchemaWrapper* pTagSchemaWrapper, bool createTb, int64_t suid, const char* stbFullName, + SBatchDeleteReq* pDeleteReq) { SSubmitReq* ret = NULL; SArray* schemaReqs = NULL; SArray* schemaReqSz = NULL; @@ -74,78 +84,98 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem continue; } + // STag* pTag = NULL; + // taosArrayClear(tagArray); + // SArray *tagName = taosArrayInit(1, TSDB_COL_NAME_LEN); + // for(int j = 0; j < pTagSchemaWrapper->nCols; j++){ + // STagVal tagVal = { + // .cid = pTagSchemaWrapper->pSchema[j].colId, + // .type = pTagSchemaWrapper->pSchema[j].type, + // .i64 = (int64_t)pDataBlock->info.groupId, + // }; + // taosArrayPush(tagArray, &tagVal); + // taosArrayPush(tagName, pTagSchemaWrapper->pSchema[j].name); + // } + // + // tTagNew(tagArray, 1, false, &pTag); + // if (pTag == NULL) { + // terrno = TSDB_CODE_OUT_OF_MEMORY; + // taosArrayDestroy(tagArray); + // taosArrayDestroy(tagName); + // return NULL; + // } + + SVCreateTbReq createTbReq = {0}; + + // set const + createTbReq.flags = 0; + createTbReq.type = TSDB_CHILD_TABLE; + createTbReq.ctb.suid = suid; + + // set super table name + SName name = {0}; + tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + createTbReq.ctb.stbName = strdup((char*)tNameGetTableName(&name)); // strdup(stbFullName); + + // set tag content + taosArrayClear(tagArray); STagVal tagVal = { .cid = taosArrayGetSize(pDataBlock->pDataBlock) + 1, .type = TSDB_DATA_TYPE_UBIGINT, .i64 = (int64_t)pDataBlock->info.groupId, }; - STag* pTag = NULL; - taosArrayClear(tagArray); taosArrayPush(tagArray, &tagVal); + createTbReq.ctb.tagNum = taosArrayGetSize(tagArray); + + STag* pTag = NULL; tTagNew(tagArray, 1, false, &pTag); if (pTag == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; taosArrayDestroy(tagArray); + taosArrayDestroyP(schemaReqs, taosMemoryFree); + taosArrayDestroy(schemaReqSz); return NULL; } + createTbReq.ctb.pTag = (uint8_t*)pTag; - SArray *tagName = taosArrayInit(1, TSDB_COL_NAME_LEN); - char tagNameStr[TSDB_COL_NAME_LEN] = {0}; + // set tag name + SArray* tagName = taosArrayInit(1, TSDB_COL_NAME_LEN); + char tagNameStr[TSDB_COL_NAME_LEN] = {0}; strcpy(tagNameStr, "group_id"); taosArrayPush(tagName, tagNameStr); - -// STag* pTag = NULL; -// taosArrayClear(tagArray); -// SArray *tagName = taosArrayInit(1, TSDB_COL_NAME_LEN); -// for(int j = 0; j < pTagSchemaWrapper->nCols; j++){ -// STagVal tagVal = { -// .cid = pTagSchemaWrapper->pSchema[j].colId, -// .type = pTagSchemaWrapper->pSchema[j].type, -// .i64 = (int64_t)pDataBlock->info.groupId, -// }; -// taosArrayPush(tagArray, &tagVal); -// taosArrayPush(tagName, pTagSchemaWrapper->pSchema[j].name); -// } -// -// tTagNew(tagArray, 1, false, &pTag); -// if (pTag == NULL) { -// terrno = TSDB_CODE_OUT_OF_MEMORY; -// taosArrayDestroy(tagArray); -// taosArrayDestroy(tagName); -// return NULL; -// } - - SVCreateTbReq createTbReq = {0}; - SName name = {0}; - tNameFromString(&name, stbFullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - - createTbReq.name = buildCtbNameByGroupId(stbFullName, pDataBlock->info.groupId); - createTbReq.ctb.name = strdup((char*)tNameGetTableName(&name)); // strdup(stbFullName); - createTbReq.flags = 0; - createTbReq.type = TSDB_CHILD_TABLE; - createTbReq.ctb.suid = suid; - createTbReq.ctb.pTag = (uint8_t*)pTag; - createTbReq.ctb.tagNum = taosArrayGetSize(tagArray); createTbReq.ctb.tagName = tagName; + // set table name + if (pDataBlock->info.parTbName[0]) { + createTbReq.name = strdup(pDataBlock->info.parTbName); + } else { + createTbReq.name = buildCtbNameByGroupId(stbFullName, pDataBlock->info.groupId); + } + + // save schema len int32_t code; int32_t schemaLen; tEncodeSize(tEncodeSVCreateTbReq, &createTbReq, schemaLen, code); if (code < 0) { tdDestroySVCreateTbReq(&createTbReq); taosArrayDestroy(tagArray); - taosMemoryFreeClear(ret); + taosArrayDestroyP(schemaReqs, taosMemoryFree); + taosArrayDestroy(schemaReqSz); return NULL; } + taosArrayPush(schemaReqSz, &schemaLen); + // save schema str void* schemaStr = taosMemoryMalloc(schemaLen); if (schemaStr == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; tdDestroySVCreateTbReq(&createTbReq); + taosArrayDestroy(tagArray); + taosArrayDestroyP(schemaReqs, taosMemoryFree); + taosArrayDestroy(schemaReqSz); return NULL; } taosArrayPush(schemaReqs, &schemaStr); - taosArrayPush(schemaReqSz, &schemaLen); SEncoder encoder = {0}; tEncoderInit(&encoder, schemaStr, schemaLen); @@ -153,6 +183,10 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem if (code < 0) { terrno = TSDB_CODE_OUT_OF_MEMORY; tdDestroySVCreateTbReq(&createTbReq); + taosArrayDestroy(tagArray); + taosArrayDestroyP(schemaReqs, taosMemoryFree); + taosArrayDestroy(schemaReqSz); + tEncoderClear(&encoder); return NULL; } tEncoderClear(&encoder); @@ -205,10 +239,8 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem tqDebug("tq sink, convert block %d, rows: %d", i, rows); int32_t dataLen = 0; - - void* blkSchema = POINTER_SHIFT(blkHead, sizeof(SSubmitBlk)); - int32_t schemaLen = 0; + void* blkSchema = POINTER_SHIFT(blkHead, sizeof(SSubmitBlk)); if (createTb) { schemaLen = *(int32_t*)taosArrayGet(schemaReqSz, i); void* schemaStr = taosArrayGetP(schemaReqs, i); @@ -246,7 +278,7 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem ret->length = htonl(ret->length); - if (schemaReqs) taosArrayDestroyP(schemaReqs, taosMemoryFree); + taosArrayDestroyP(schemaReqs, taosMemoryFree); taosArrayDestroy(schemaReqSz); return ret; @@ -261,8 +293,8 @@ void tqTableSink(SStreamTask* pTask, void* vnode, int64_t ver, void* data) { ASSERT(pTask->tbSink.pTSchema); deleteReq.deleteReqs = taosArrayInit(0, sizeof(SSingleDeleteReq)); - SSubmitReq* submitReq = tqBlockToSubmit(pVnode, pRes, pTask->tbSink.pTSchema, pTask->tbSink.pSchemaWrapper, true, pTask->tbSink.stbUid, - pTask->tbSink.stbFullName, &deleteReq); + SSubmitReq* submitReq = tqBlockToSubmit(pVnode, pRes, pTask->tbSink.pTSchema, pTask->tbSink.pSchemaWrapper, true, + pTask->tbSink.stbUid, pTask->tbSink.stbFullName, &deleteReq); tqDebug("vgId:%d, task %d convert blocks over, put into write-queue", TD_VID(pVnode), pTask->taskId); diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 05c941cc4d..ac6be9af2d 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -182,7 +182,7 @@ int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, ST if (row->ts == cacheRow->ts) { STSRow *mergedRow = NULL; SRowMerger merger = {0}; - STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1); + STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); tRowMergerInit(&merger, &tsdbRowFromTSRow(0, cacheRow), pTSchema); @@ -249,7 +249,7 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb getTableCacheKey(uid, 1, key, &keyLen); LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); if (h) { - STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1); + STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); TSKEY keyTs = row->ts; bool invalidate = false; @@ -418,9 +418,9 @@ typedef enum { } SFSLASTNEXTROWSTATES; typedef struct { - SFSLASTNEXTROWSTATES state; // [input] - STsdb *pTsdb; // [input] - STSchema *pTSchema;// [input] + SFSLASTNEXTROWSTATES state; // [input] + STsdb *pTsdb; // [input] + STSchema *pTSchema; // [input] tb_uid_t suid; tb_uid_t uid; int32_t nFileSet; @@ -456,10 +456,10 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) { code = tsdbDataFReaderOpen(&state->pDataFReader, state->pTsdb, pFileSet); if (code) goto _err; - SSttBlockLoadInfo* pLoadInfo = tCreateLastBlockLoadInfo(state->pTSchema, NULL, 0); + SSttBlockLoadInfo *pLoadInfo = tCreateLastBlockLoadInfo(state->pTSchema, NULL, 0); tMergeTreeOpen(&state->mergeTree, 1, state->pDataFReader, state->suid, state->uid, &(STimeWindow){.skey = TSKEY_MIN, .ekey = TSKEY_MAX}, - &(SVersionRange){.minVer = 0, .maxVer = UINT64_MAX}, pLoadInfo,true, NULL); + &(SVersionRange){.minVer = 0, .maxVer = UINT64_MAX}, pLoadInfo, true, NULL); bool hasVal = tMergeTreeNext(&state->mergeTree); if (!hasVal) { state->state = SFSLASTNEXTROW_FILESET; @@ -1034,7 +1034,7 @@ _err: static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRow) { int32_t code = 0; - STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1); + STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); int16_t nCol = pTSchema->numOfCols; int16_t iCol = 0; int16_t noneCol = 0; @@ -1131,7 +1131,7 @@ _err: static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) { int32_t code = 0; - STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1); + STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); int16_t nCol = pTSchema->numOfCols; int16_t iCol = 0; int16_t noneCol = 0; diff --git a/source/dnode/vnode/src/tsdb/tsdbCacheRead.c b/source/dnode/vnode/src/tsdb/tsdbCacheRead.c index 7a000253d5..81219e1442 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCacheRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbCacheRead.c @@ -79,7 +79,7 @@ int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, SArray* pTableIdList } STableKeyInfo* pKeyInfo = taosArrayGet(pTableIdList, 0); - p->pSchema = metaGetTbTSchema(p->pVnode->pMeta, pKeyInfo->uid, -1); + p->pSchema = metaGetTbTSchema(p->pVnode->pMeta, pKeyInfo->uid, -1, 1); p->pTableList = pTableIdList; p->transferBuf = taosMemoryCalloc(p->pSchema->numOfCols, POINTER_BYTES); diff --git a/source/dnode/vnode/src/tsdb/tsdbFS.c b/source/dnode/vnode/src/tsdb/tsdbFS.c index 10926ae6ad..85514ed5b6 100644 --- a/source/dnode/vnode/src/tsdb/tsdbFS.c +++ b/source/dnode/vnode/src/tsdb/tsdbFS.c @@ -417,6 +417,7 @@ _err: // EXPOSED APIS ==================================================================================== int32_t tsdbFSOpen(STsdb *pTsdb) { int32_t code = 0; + SVnode *pVnode = pTsdb->pVnode; // open handle pTsdb->fs.pDelFile = NULL; @@ -429,8 +430,12 @@ int32_t tsdbFSOpen(STsdb *pTsdb) { // load fs or keep empty char fname[TSDB_FILENAME_LEN]; - snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sCURRENT", tfsGetPrimaryPath(pTsdb->pVnode->pTfs), TD_DIRSEP, - pTsdb->path, TD_DIRSEP); + if (pVnode->pTfs) { + snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sCURRENT", tfsGetPrimaryPath(pTsdb->pVnode->pTfs), TD_DIRSEP, + pTsdb->path, TD_DIRSEP); + } else { + snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%sCURRENT", pTsdb->path, TD_DIRSEP); + } if (!taosCheckExistFile(fname)) { // empty one diff --git a/source/dnode/vnode/src/tsdb/tsdbOpen.c b/source/dnode/vnode/src/tsdb/tsdbOpen.c index fcbcff9248..e4080ccf1e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbOpen.c +++ b/source/dnode/vnode/src/tsdb/tsdbOpen.c @@ -57,10 +57,13 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee } else { memcpy(&pTsdb->keepCfg, pKeepCfg, sizeof(STsdbKeepCfg)); } - // pTsdb->fs = tsdbNewFS(REPO_KEEP_CFG(pTsdb)); // create dir - tfsMkdir(pVnode->pTfs, pTsdb->path); + if (pVnode->pTfs) { + tfsMkdir(pVnode->pTfs, pTsdb->path); + } else { + taosMkDir(pTsdb->path); + } // open tsdb if (tsdbFSOpen(pTsdb) < 0) { diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index ac2b7a8db3..4bb1f2d2fe 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -78,7 +78,7 @@ typedef struct SBlockLoadSuppInfo { SArray* pColAgg; SColumnDataAgg tsColAgg; SColumnDataAgg** plist; - int16_t* colIds; // column ids for loading file block data + int16_t* colIds; // column ids for loading file block data int32_t numOfCols; char** buildBuf; // build string tmp buffer, todo remove it later after all string format being updated. } SBlockLoadSuppInfo; @@ -355,7 +355,8 @@ static int32_t initFilesetIterator(SFilesetIter* pIter, SArray* aDFileSet, STsdb if (pLReader->pInfo == NULL) { // here we ignore the first column, which is always be the primary timestamp column - pLReader->pInfo = tCreateLastBlockLoadInfo(pReader->pSchema, &pReader->suppInfo.colIds[1], pReader->suppInfo.numOfCols - 1); + pLReader->pInfo = + tCreateLastBlockLoadInfo(pReader->pSchema, &pReader->suppInfo.colIds[1], pReader->suppInfo.numOfCols - 1); if (pLReader->pInfo == NULL) { tsdbDebug("init fileset iterator failed, code:%s %s", tstrerror(terrno), pReader->idStr); return terrno; @@ -841,12 +842,11 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn bool asc = ASCENDING_TRAVERSE(pReader->order); int32_t step = asc ? 1 : -1; - if ((pDumpInfo->rowIndex == 0 && asc) || (pDumpInfo->rowIndex == pBlock->nRow - 1 && (!asc))) { if (asc && pReader->window.skey <= pBlock->minKey.ts) { - //pDumpInfo->rowIndex = 0; + // pDumpInfo->rowIndex = 0; } else if (!asc && pReader->window.ekey >= pBlock->maxKey.ts) { - //pDumpInfo->rowIndex = pBlock->nRow - 1; + // pDumpInfo->rowIndex = pBlock->nRow - 1; } else { int32_t pos = asc ? pBlock->nRow - 1 : 0; int32_t order = (pReader->order == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC; @@ -958,12 +958,14 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn return TSDB_CODE_SUCCESS; } -static int32_t doLoadFileBlockData(STsdbReader* pReader, SDataBlockIter* pBlockIter, SBlockData* pBlockData, uint64_t uid) { +static int32_t doLoadFileBlockData(STsdbReader* pReader, SDataBlockIter* pBlockIter, SBlockData* pBlockData, + uint64_t uid) { int64_t st = taosGetTimestampUs(); tBlockDataReset(pBlockData); TABLEID tid = {.suid = pReader->suid, .uid = uid}; - int32_t code = tBlockDataInit(pBlockData, &tid, pReader->pSchema, &pReader->suppInfo.colIds[1], pReader->suppInfo.numOfCols-1); + int32_t code = + tBlockDataInit(pBlockData, &tid, pReader->pSchema, &pReader->suppInfo.colIds[1], pReader->suppInfo.numOfCols - 1); if (code != TSDB_CODE_SUCCESS) { return code; } @@ -1494,7 +1496,7 @@ static bool tryCopyDistinctRowFromSttBlock(TSDBROW* fRow, SLastBlockReader* pLas static FORCE_INLINE STSchema* doGetSchemaForTSRow(int32_t sversion, STsdbReader* pReader, uint64_t uid) { // always set the newest schema version in pReader->pSchema if (pReader->pSchema == NULL) { - pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, uid, -1); + pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, uid, -1, 1); } if (pReader->pSchema && sversion == pReader->pSchema->version) { @@ -2011,9 +2013,9 @@ static bool initLastBlockReader(SLastBlockReader* pLBlockReader, STableBlockScan w.ekey = pScanInfo->lastKey + step; } - int32_t code = - tMergeTreeOpen(&pLBlockReader->mergeTree, (pLBlockReader->order == TSDB_ORDER_DESC), pReader->pFileReader, - pReader->suid, pScanInfo->uid, &w, &pLBlockReader->verRange, pLBlockReader->pInfo, false, pReader->idStr); + int32_t code = tMergeTreeOpen(&pLBlockReader->mergeTree, (pLBlockReader->order == TSDB_ORDER_DESC), + pReader->pFileReader, pReader->suid, pScanInfo->uid, &w, &pLBlockReader->verRange, + pLBlockReader->pInfo, false, pReader->idStr); if (code != TSDB_CODE_SUCCESS) { return false; } @@ -3368,14 +3370,14 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl // NOTE: the endVersion in pCond is the data version not schema version, so pCond->endVersion is not correct here. if (pCond->suid != 0) { - pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, -1); + pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pReader->suid, -1, 1); if (pReader->pSchema == NULL) { tsdbError("failed to get table schema, suid:%" PRIu64 ", ver:%" PRId64 " , %s", pReader->suid, -1, pReader->idStr); } } else if (taosArrayGetSize(pTableList) > 0) { STableKeyInfo* pKey = taosArrayGet(pTableList, 0); - pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pKey->uid, -1); + pReader->pSchema = metaGetTbTSchema(pReader->pTsdb->pVnode->pMeta, pKey->uid, -1, 1); if (pReader->pSchema == NULL) { tsdbError("failed to get table schema, uid:%" PRIu64 ", ver:%" PRId64 " , %s", pKey->uid, -1, pReader->idStr); } @@ -3908,7 +3910,7 @@ int32_t tsdbGetTableSchema(SVnode* pVnode, int64_t uid, STSchema** pSchema, int6 } metaReaderClear(&mr); - *pSchema = metaGetTbTSchema(pVnode->pMeta, uid, sversion); + *pSchema = metaGetTbTSchema(pVnode->pMeta, uid, sversion, 1); return TSDB_CODE_SUCCESS; } diff --git a/source/dnode/vnode/src/vnd/vnodeBufPool.c b/source/dnode/vnode/src/vnd/vnodeBufPool.c index 6e02425b55..3c0a041197 100644 --- a/source/dnode/vnode/src/vnd/vnodeBufPool.c +++ b/source/dnode/vnode/src/vnd/vnodeBufPool.c @@ -16,20 +16,53 @@ #include "vnd.h" /* ------------------------ STRUCTURES ------------------------ */ +#define VNODE_BUFPOOL_SEGMENTS 3 -static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool); -static int vnodeBufPoolDestroy(SVBufPool *pPool); +static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool) { + SVBufPool *pPool; -int vnodeOpenBufPool(SVnode *pVnode, int64_t size) { + pPool = taosMemoryMalloc(sizeof(SVBufPool) + size); + if (pPool == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return -1; + } + + if (taosThreadSpinInit(&pPool->lock, 0) != 0) { + taosMemoryFree(pPool); + terrno = TAOS_SYSTEM_ERROR(errno); + return -1; + } + + pPool->next = NULL; + pPool->pVnode = pVnode; + pPool->nRef = 0; + pPool->size = 0; + pPool->ptr = pPool->node.data; + pPool->pTail = &pPool->node; + pPool->node.prev = NULL; + pPool->node.pnext = &pPool->pTail; + pPool->node.size = size; + + *ppPool = pPool; + return 0; +} + +static int vnodeBufPoolDestroy(SVBufPool *pPool) { + vnodeBufPoolReset(pPool); + taosThreadSpinDestroy(&pPool->lock); + taosMemoryFree(pPool); + return 0; +} + +int vnodeOpenBufPool(SVnode *pVnode) { SVBufPool *pPool = NULL; - int ret; + int64_t size = pVnode->config.szBuf / VNODE_BUFPOOL_SEGMENTS; ASSERT(pVnode->pPool == NULL); for (int i = 0; i < 3; i++) { // create pool - ret = vnodeBufPoolCreate(pVnode, size, &pPool); - if (ret < 0) { + if (vnodeBufPoolCreate(pVnode, size, &pPool)) { vError("vgId:%d, failed to open vnode buffer pool since %s", TD_VID(pVnode), tstrerror(terrno)); vnodeCloseBufPool(pVnode); return -1; @@ -41,7 +74,6 @@ int vnodeOpenBufPool(SVnode *pVnode, int64_t size) { } vDebug("vgId:%d, vnode buffer pool is opened, size:%" PRId64, TD_VID(pVnode), size); - return 0; } @@ -63,9 +95,7 @@ int vnodeCloseBufPool(SVnode *pVnode) { } void vnodeBufPoolReset(SVBufPool *pPool) { - SVBufPoolNode *pNode; - - for (pNode = pPool->pTail; pNode->prev; pNode = pPool->pTail) { + for (SVBufPoolNode *pNode = pPool->pTail; pNode->prev; pNode = pPool->pTail) { ASSERT(pNode->pnext == &pPool->pTail); pNode->prev->pnext = &pPool->pTail; pPool->pTail = pNode->prev; @@ -81,7 +111,7 @@ void vnodeBufPoolReset(SVBufPool *pPool) { void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) { SVBufPoolNode *pNode; - void *p; + void *p = NULL; taosThreadSpinLock(&pPool->lock); if (pPool->node.size >= pPool->ptr - pPool->node.data + size) { // allocate from the anchor node @@ -124,43 +154,6 @@ void vnodeBufPoolFree(SVBufPool *pPool, void *p) { } } -// STATIC METHODS ------------------- -static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool) { - SVBufPool *pPool; - - pPool = taosMemoryMalloc(sizeof(SVBufPool) + size); - if (pPool == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; - } - - if (taosThreadSpinInit(&pPool->lock, 0) != 0) { - taosMemoryFree(pPool); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; - } - - pPool->next = NULL; - pPool->pVnode = pVnode; - pPool->nRef = 0; - pPool->size = 0; - pPool->ptr = pPool->node.data; - pPool->pTail = &pPool->node; - pPool->node.prev = NULL; - pPool->node.pnext = &pPool->pTail; - pPool->node.size = size; - - *ppPool = pPool; - return 0; -} - -static int vnodeBufPoolDestroy(SVBufPool *pPool) { - vnodeBufPoolReset(pPool); - taosThreadSpinDestroy(&pPool->lock); - taosMemoryFree(pPool); - return 0; -} - void vnodeBufPoolRef(SVBufPool *pPool) { int32_t nRef = atomic_fetch_add_32(&pPool->nRef, 1); ASSERT(nRef > 0); @@ -175,6 +168,19 @@ void vnodeBufPoolUnRef(SVBufPool *pPool) { taosThreadMutexLock(&pVnode->mutex); + int64_t size = pVnode->config.szBuf / VNODE_BUFPOOL_SEGMENTS; + if (pPool->node.size != size) { + SVBufPool *pPoolT = NULL; + if (vnodeBufPoolCreate(pVnode, size, &pPoolT) < 0) { + vWarn("vgId:%d try to change buf pools size from %" PRId64 " to %" PRId64 " since %s", TD_VID(pVnode), + pPool->node.size, size, tstrerror(errno)); + } else { + vnodeBufPoolDestroy(pPool); + pPool = pPoolT; + vDebug("vgId:%d change buf pools size from %" PRId64 " to %" PRId64, TD_VID(pVnode), pPool->node.size, size); + } + } + pPool->next = pVnode->pPool; pVnode->pPool = pPool; taosThreadCondSignal(&pVnode->poolNotEmpty); diff --git a/source/dnode/vnode/src/vnd/vnodeCommit.c b/source/dnode/vnode/src/vnd/vnodeCommit.c index 8c73499229..07d9b96261 100644 --- a/source/dnode/vnode/src/vnd/vnodeCommit.c +++ b/source/dnode/vnode/src/vnd/vnodeCommit.c @@ -73,7 +73,7 @@ int vnodeBegin(SVnode *pVnode) { int vnodeShouldCommit(SVnode *pVnode) { if (pVnode->inUse) { - return pVnode->inUse->size > pVnode->config.szBuf / 3; + return pVnode->inUse->size > pVnode->inUse->node.size; } return false; } @@ -227,7 +227,11 @@ int vnodeCommit(SVnode *pVnode) { info.state.committed = pVnode->state.applied; info.state.commitTerm = pVnode->state.applyTerm; info.state.commitID = pVnode->state.commitID; - snprintf(dir, TSDB_FILENAME_LEN, "%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path); + if (pVnode->pTfs) { + snprintf(dir, TSDB_FILENAME_LEN, "%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path); + } else { + snprintf(dir, TSDB_FILENAME_LEN, "%s", pVnode->path); + } if (vnodeSaveInfo(dir, &info) < 0) { ASSERT(0); return -1; @@ -236,7 +240,7 @@ int vnodeCommit(SVnode *pVnode) { // preCommit // smaSyncPreCommit(pVnode->pSma); - if(smaAsyncPreCommit(pVnode->pSma) < 0){ + if (smaAsyncPreCommit(pVnode->pSma) < 0) { ASSERT(0); return -1; } diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index b5307cecf2..de3af7cde6 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -28,13 +28,24 @@ int vnodeCreate(const char *path, SVnodeCfg *pCfg, STfs *pTfs) { } // create vnode env - if (tfsMkdirAt(pTfs, path, (SDiskID){0}) < 0) { - vError("vgId:%d, failed to create vnode since:%s", pCfg->vgId, tstrerror(terrno)); - return -1; + if (pTfs) { + if (tfsMkdirAt(pTfs, path, (SDiskID){0}) < 0) { + vError("vgId:%d, failed to create vnode since:%s", pCfg->vgId, tstrerror(terrno)); + return -1; + } + snprintf(dir, TSDB_FILENAME_LEN, "%s%s%s", tfsGetPrimaryPath(pTfs), TD_DIRSEP, path); + } else { + if (taosMkDir(path)) { + return TAOS_SYSTEM_ERROR(errno); + } + strcpy(dir, path); } - snprintf(dir, TSDB_FILENAME_LEN, "%s%s%s", tfsGetPrimaryPath(pTfs), TD_DIRSEP, path); - info.config = *pCfg; + if (pCfg) { + info.config = *pCfg; + } else { + info.config = vnodeCfgDefault; + } info.state.committed = -1; info.state.applied = -1; info.state.commitID = 0; @@ -44,7 +55,7 @@ int vnodeCreate(const char *path, SVnodeCfg *pCfg, STfs *pTfs) { return -1; } - vInfo("vgId:%d, vnode is created", pCfg->vgId); + vInfo("vgId:%d, vnode is created", info.config.vgId); return 0; } @@ -58,7 +69,11 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) { char tdir[TSDB_FILENAME_LEN * 2]; int ret; - snprintf(dir, TSDB_FILENAME_LEN, "%s%s%s", tfsGetPrimaryPath(pTfs), TD_DIRSEP, path); + if (pTfs) { + snprintf(dir, TSDB_FILENAME_LEN, "%s%s%s", tfsGetPrimaryPath(pTfs), TD_DIRSEP, path); + } else { + snprintf(dir, TSDB_FILENAME_LEN, "%s", path); + } info.config = vnodeCfgDefault; @@ -96,7 +111,7 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) { taosThreadCondInit(&pVnode->poolNotEmpty, NULL); // open buffer pool - if (vnodeOpenBufPool(pVnode, pVnode->config.isHeap ? 0 : pVnode->config.szBuf / 3) < 0) { + if (vnodeOpenBufPool(pVnode) < 0) { vError("vgId:%d, failed to open vnode buffer pool since %s", TD_VID(pVnode), tstrerror(terrno)); goto _err; } @@ -123,12 +138,6 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) { sprintf(tdir, "%s%s%s", dir, TD_DIRSEP, VNODE_WAL_DIR); taosRealPath(tdir, NULL, sizeof(tdir)); -// for test tsdb snapshot -#if 0 - pVnode->config.walCfg.segSize = 200; - pVnode->config.walCfg.retentionSize = 2000; -#endif - pVnode->pWal = walOpen(tdir, &(pVnode->config.walCfg)); if (pVnode->pWal == NULL) { vError("vgId:%d, failed to open vnode wal since %s", TD_VID(pVnode), tstrerror(terrno)); @@ -144,12 +153,14 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) { goto _err; } +#if !VNODE_AS_LIB // open query if (vnodeQueryOpen(pVnode)) { vError("vgId:%d, failed to open vnode query since %s", TD_VID(pVnode), tstrerror(terrno)); terrno = TSDB_CODE_OUT_OF_MEMORY; goto _err; } +#endif // vnode begin if (vnodeBegin(pVnode) < 0) { @@ -158,11 +169,13 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) { goto _err; } +#if !VNODE_AS_LIB // open sync if (vnodeSyncOpen(pVnode, dir)) { vError("vgId:%d, failed to open sync since %s", TD_VID(pVnode), tstrerror(terrno)); goto _err; } +#endif return pVnode; diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c index 6806c034dc..2b61bc6f33 100644 --- a/source/dnode/vnode/src/vnd/vnodeQuery.c +++ b/source/dnode/vnode/src/vnd/vnodeQuery.c @@ -15,6 +15,12 @@ #include "vnd.h" +#define VNODE_GET_LOAD_RESET_VALS(pVar, oVal, vType) \ + do { \ + int##vType##_t newVal = atomic_sub_fetch_##vType(&(pVar), (oVal)); \ + ASSERT(newVal >= 0); \ + } while (0) + int vnodeQueryOpen(SVnode *pVnode) { return qWorkerInit(NODE_TYPE_VNODE, TD_VID(pVnode), (void **)&pVnode->pQuery, &pVnode->msgCb); } @@ -375,13 +381,26 @@ int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) { pLoad->compStorage = (int64_t)2 * 1073741824; pLoad->pointsWritten = 100; pLoad->numOfSelectReqs = 1; - pLoad->numOfInsertReqs = 3; - pLoad->numOfInsertSuccessReqs = 2; - pLoad->numOfBatchInsertReqs = 5; - pLoad->numOfBatchInsertSuccessReqs = 4; + pLoad->numOfInsertReqs = atomic_load_64(&pVnode->statis.nInsert); + pLoad->numOfInsertSuccessReqs = atomic_load_64(&pVnode->statis.nInsertSuccess); + pLoad->numOfBatchInsertReqs = atomic_load_64(&pVnode->statis.nBatchInsert); + pLoad->numOfBatchInsertSuccessReqs = atomic_load_64(&pVnode->statis.nBatchInsertSuccess); return 0; } +/** + * @brief Reset the statistics value by monitor interval + * + * @param pVnode + * @param pLoad + */ +void vnodeResetLoad(SVnode *pVnode, SVnodeLoad *pLoad) { + VNODE_GET_LOAD_RESET_VALS(pVnode->statis.nInsert, pLoad->numOfInsertReqs, 64); + VNODE_GET_LOAD_RESET_VALS(pVnode->statis.nInsertSuccess, pLoad->numOfInsertSuccessReqs, 64); + VNODE_GET_LOAD_RESET_VALS(pVnode->statis.nBatchInsert, pLoad->numOfBatchInsertReqs, 64); + VNODE_GET_LOAD_RESET_VALS(pVnode->statis.nBatchInsertSuccess, pLoad->numOfBatchInsertSuccessReqs, 64); +} + void vnodeGetInfo(SVnode *pVnode, const char **dbname, int32_t *vgId) { if (dbname) { *dbname = pVnode->config.dbname; @@ -393,7 +412,7 @@ void vnodeGetInfo(SVnode *pVnode, const char **dbname, int32_t *vgId) { } int32_t vnodeGetAllTableList(SVnode *pVnode, uint64_t uid, SArray *list) { - SMCtbCursor *pCur = metaOpenCtbCursor(pVnode->pMeta, uid); + SMCtbCursor *pCur = metaOpenCtbCursor(pVnode->pMeta, uid, 1); while (1) { tb_uid_t id = metaCtbCursorNext(pCur); @@ -405,7 +424,7 @@ int32_t vnodeGetAllTableList(SVnode *pVnode, uint64_t uid, SArray *list) { taosArrayPush(list, &info); } - metaCloseCtbCursor(pCur); + metaCloseCtbCursor(pCur, 1); return TSDB_CODE_SUCCESS; } @@ -413,7 +432,7 @@ int32_t vnodeGetCtbIdListByFilter(SVnode *pVnode, int64_t suid, SArray *list, bo return 0; } int32_t vnodeGetCtbIdList(SVnode *pVnode, int64_t suid, SArray *list) { - SMCtbCursor *pCur = metaOpenCtbCursor(pVnode->pMeta, suid); + SMCtbCursor *pCur = metaOpenCtbCursor(pVnode->pMeta, suid, 1); while (1) { tb_uid_t id = metaCtbCursorNext(pCur); @@ -424,7 +443,7 @@ int32_t vnodeGetCtbIdList(SVnode *pVnode, int64_t suid, SArray *list) { taosArrayPush(list, &id); } - metaCloseCtbCursor(pCur); + metaCloseCtbCursor(pCur, 1); return TSDB_CODE_SUCCESS; } @@ -448,7 +467,7 @@ int32_t vnodeGetStbIdList(SVnode *pVnode, int64_t suid, SArray *list) { } int32_t vnodeGetCtbNum(SVnode *pVnode, int64_t suid, int64_t *num) { - SMCtbCursor *pCur = metaOpenCtbCursor(pVnode->pMeta, suid); + SMCtbCursor *pCur = metaOpenCtbCursor(pVnode->pMeta, suid, 0); if (!pCur) { return TSDB_CODE_FAILED; } @@ -463,12 +482,12 @@ int32_t vnodeGetCtbNum(SVnode *pVnode, int64_t suid, int64_t *num) { ++(*num); } - metaCloseCtbCursor(pCur); + metaCloseCtbCursor(pCur, 0); return TSDB_CODE_SUCCESS; } static int32_t vnodeGetStbColumnNum(SVnode *pVnode, tb_uid_t suid, int *num) { - STSchema *pTSchema = metaGetTbTSchema(pVnode->pMeta, suid, -1); + STSchema *pTSchema = metaGetTbTSchema(pVnode->pMeta, suid, -1, 1); // metaGetTbTSchemaEx(pVnode->pMeta, suid, suid, -1, &pTSchema); if (pTSchema) { @@ -483,27 +502,36 @@ static int32_t vnodeGetStbColumnNum(SVnode *pVnode, tb_uid_t suid, int *num) { } int32_t vnodeGetTimeSeriesNum(SVnode *pVnode, int64_t *num) { - SMStbCursor *pCur = metaOpenStbCursor(pVnode->pMeta, 0); - if (!pCur) { + SArray *suidList = NULL; + + if (!(suidList = taosArrayInit(1, sizeof(tb_uid_t)))) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return TSDB_CODE_FAILED; + } + + if (vnodeGetStbIdList(pVnode, 0, suidList) < 0) { + qError("vgId:%d, failed to get stb id list error: %s", TD_VID(pVnode), terrstr()); + taosArrayDestroy(suidList); return TSDB_CODE_FAILED; } *num = 0; - while (1) { - tb_uid_t id = metaStbCursorNext(pCur); - if (id == 0) { - break; - } + int64_t arrSize = taosArrayGetSize(suidList); + for (int64_t i = 0; i < arrSize; ++i) { + tb_uid_t suid = *(tb_uid_t *)taosArrayGet(suidList, i); + + SMetaStbStats stats = {0}; + metaGetStbStats(pVnode->pMeta, suid, &stats); + int64_t ctbNum = stats.ctbNum; + // vnodeGetCtbNum(pVnode, id, &ctbNum); - int64_t ctbNum = 0; - vnodeGetCtbNum(pVnode, id, &ctbNum); int numOfCols = 0; - vnodeGetStbColumnNum(pVnode, id, &numOfCols); + vnodeGetStbColumnNum(pVnode, suid, &numOfCols); *num += ctbNum * (numOfCols - 1); } - metaCloseStbCursor(pCur); + taosArrayDestroy(suidList); return TSDB_CODE_SUCCESS; } diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 28093dfc70..131327976f 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -770,7 +770,7 @@ static int32_t vnodeDebugPrintSingleSubmitMsg(SMeta *pMeta, SSubmitBlk *pBlock, if (pSchema) { taosMemoryFreeClear(pSchema); } - pSchema = metaGetTbTSchema(pMeta, msgIter->suid, TD_ROW_SVER(blkIter.row)); // TODO: use the real schema + pSchema = metaGetTbTSchema(pMeta, msgIter->suid, TD_ROW_SVER(blkIter.row), 1); // TODO: use the real schema if (pSchema) { suid = msgIter->suid; rv = TD_ROW_SVER(blkIter.row); @@ -812,17 +812,19 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq SSubmitReq *pSubmitReq = (SSubmitReq *)pReq; SSubmitRsp submitRsp = {0}; SSubmitMsgIter msgIter = {0}; - SSubmitBlk *pBlock; + SSubmitBlk *pBlock = NULL; SVCreateTbReq createTbReq = {0}; SDecoder decoder = {0}; - int32_t nRows; + int32_t nRows = 0; int32_t tsize, ret; SEncoder encoder = {0}; SArray *newTbUids = NULL; + SVStatis statis = {0}; terrno = TSDB_CODE_SUCCESS; pRsp->code = 0; pSubmitReq->version = version; + statis.nBatchInsert = 1; #ifdef TD_DEBUG_PRINT_ROW vnodeDebugPrintSubmitMsg(pVnode, pReq, __func__); @@ -947,9 +949,16 @@ _exit: // 1/level 2. // TODO: refactor if ((terrno == TSDB_CODE_SUCCESS) && (pRsp->code == TSDB_CODE_SUCCESS)) { + statis.nBatchInsertSuccess = 1; tdProcessRSmaSubmit(pVnode->pSma, pReq, STREAM_INPUT__DATA_SUBMIT); } + // N.B. not strict as the following procedure is not atomic + atomic_add_fetch_64(&pVnode->statis.nInsert, submitRsp.numOfRows); + atomic_add_fetch_64(&pVnode->statis.nInsertSuccess, submitRsp.affectedRows); + atomic_add_fetch_64(&pVnode->statis.nBatchInsert, statis.nBatchInsert); + atomic_add_fetch_64(&pVnode->statis.nBatchInsertSuccess, statis.nBatchInsertSuccess); + vDebug("vgId:%d, submit success, index:%" PRId64, pVnode->config.vgId, version); return 0; } @@ -1024,54 +1033,75 @@ static int32_t vnodeProcessAlterHashRangeReq(SVnode *pVnode, int64_t version, vo } static int32_t vnodeProcessAlterConfigReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) { - SAlterVnodeReq alterReq = {0}; + SAlterVnodeReq req = {0}; bool walChanged = false; bool tsdbChanged = false; - if (tDeserializeSAlterVnodeReq(pReq, len, &alterReq) != 0) { + if (tDeserializeSAlterVnodeReq(pReq, len, &req) != 0) { terrno = TSDB_CODE_INVALID_MSG; return TSDB_CODE_INVALID_MSG; } - vInfo("vgId:%d, start to alter vnode config, cacheLast:%d cacheLastSize:%d", TD_VID(pVnode), alterReq.cacheLast, - alterReq.cacheLastSize); - if (pVnode->config.cacheLastSize != alterReq.cacheLastSize) { - pVnode->config.cacheLastSize = alterReq.cacheLastSize; + vInfo("vgId:%d, start to alter vnode config, page:%d pageSize:%d buffer:%d szPage:%d szBuf:%" PRIu64 + " cacheLast:%d cacheLastSize:%d days:%d keep0:%d keep1:%d keep2:%d fsync:%d level:%d strict:%d", + TD_VID(pVnode), req.pages, req.pageSize, req.buffer, req.pageSize * 1024, (uint64_t)req.buffer * 1024 * 1024, + req.cacheLast, req.cacheLastSize, req.daysPerFile, req.daysToKeep0, req.daysToKeep1, req.daysToKeep2, + req.walFsyncPeriod, req.walLevel, req.strict); + + if (pVnode->config.cacheLastSize != req.cacheLastSize) { + pVnode->config.cacheLastSize = req.cacheLastSize; tsdbCacheSetCapacity(pVnode, (size_t)pVnode->config.cacheLastSize * 1024 * 1024); } - if (pVnode->config.cacheLast != alterReq.cacheLast) { - pVnode->config.cacheLast = alterReq.cacheLast; + if (pVnode->config.szBuf != req.buffer * 1024LL * 1024LL) { + vInfo("vgId:%d vnode buffer is changed from %" PRId64 " to %" PRId64, TD_VID(pVnode), pVnode->config.szBuf, + req.buffer * 1024LL * 1024LL); + pVnode->config.szBuf = req.buffer * 1024LL * 1024LL; } - if (pVnode->config.walCfg.fsyncPeriod != alterReq.walFsyncPeriod) { - pVnode->config.walCfg.fsyncPeriod = alterReq.walFsyncPeriod; + if (pVnode->config.szCache != req.pages) { + if (metaAlterCache(pVnode->pMeta, req.pages) < 0) { + vError("vgId:%d failed to change vnode pages from %d to %d failed since %s", TD_VID(pVnode), + pVnode->config.szCache, req.pages, tstrerror(errno)); + return errno; + } else { + vInfo("vgId:%d vnode pages is changed from %d to %d", TD_VID(pVnode), pVnode->config.szCache, req.pages); + pVnode->config.szCache = req.pages; + } + } + + if (pVnode->config.cacheLast != req.cacheLast) { + pVnode->config.cacheLast = req.cacheLast; + } + + if (pVnode->config.walCfg.fsyncPeriod != req.walFsyncPeriod) { + pVnode->config.walCfg.fsyncPeriod = req.walFsyncPeriod; walChanged = true; } - if (pVnode->config.walCfg.level != alterReq.walLevel) { - pVnode->config.walCfg.level = alterReq.walLevel; + if (pVnode->config.walCfg.level != req.walLevel) { + pVnode->config.walCfg.level = req.walLevel; walChanged = true; } - if (pVnode->config.tsdbCfg.keep0 != alterReq.daysToKeep0) { - pVnode->config.tsdbCfg.keep0 = alterReq.daysToKeep0; + if (pVnode->config.tsdbCfg.keep0 != req.daysToKeep0) { + pVnode->config.tsdbCfg.keep0 = req.daysToKeep0; if (!VND_IS_RSMA(pVnode)) { tsdbChanged = true; } } - if (pVnode->config.tsdbCfg.keep1 != alterReq.daysToKeep1) { - pVnode->config.tsdbCfg.keep1 = alterReq.daysToKeep1; + if (pVnode->config.tsdbCfg.keep1 != req.daysToKeep1) { + pVnode->config.tsdbCfg.keep1 = req.daysToKeep1; if (!VND_IS_RSMA(pVnode)) { tsdbChanged = true; } } - if (pVnode->config.tsdbCfg.keep2 != alterReq.daysToKeep2) { - pVnode->config.tsdbCfg.keep2 = alterReq.daysToKeep2; + if (pVnode->config.tsdbCfg.keep2 != req.daysToKeep2) { + pVnode->config.tsdbCfg.keep2 = req.daysToKeep2; if (!VND_IS_RSMA(pVnode)) { tsdbChanged = true; } diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index f773de5280..353c3874c0 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -474,6 +474,10 @@ int32_t vnodeProcessSyncMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) { } static int32_t vnodeSyncEqMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) { + if (msgcb == NULL) { + return -1; + } + int32_t code = tmsgPutToQueue(msgcb, SYNC_QUEUE, pMsg); if (code != 0) { rpcFreeCont(pMsg->pCont); diff --git a/source/libs/CMakeLists.txt b/source/libs/CMakeLists.txt index ade2487239..72459f4d35 100644 --- a/source/libs/CMakeLists.txt +++ b/source/libs/CMakeLists.txt @@ -1,20 +1,21 @@ -add_subdirectory(transport) -add_subdirectory(sync) add_subdirectory(tdb) -add_subdirectory(index) +add_subdirectory(cache) +add_subdirectory(transport) add_subdirectory(wal) +add_subdirectory(monitor) +add_subdirectory(tfs) +add_subdirectory(sync) +add_subdirectory(qcom) +add_subdirectory(nodes) +add_subdirectory(catalog) + +add_subdirectory(scalar) +add_subdirectory(function) +add_subdirectory(index) add_subdirectory(parser) add_subdirectory(scheduler) -add_subdirectory(cache) -add_subdirectory(catalog) add_subdirectory(executor) add_subdirectory(stream) add_subdirectory(planner) -add_subdirectory(function) -add_subdirectory(qcom) add_subdirectory(qworker) -add_subdirectory(tfs) -add_subdirectory(monitor) -add_subdirectory(nodes) -add_subdirectory(scalar) add_subdirectory(command) \ No newline at end of file diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c index 97b174de1c..0c0ca9649a 100644 --- a/source/libs/catalog/src/ctgUtil.c +++ b/source/libs/catalog/src/ctgUtil.c @@ -1193,4 +1193,232 @@ SName* ctgGetFetchName(SArray* pNames, SCtgFetch* pFetch) { return (SName*)taosArrayGet(pReq->pTables, pFetch->tbIdx); } +static void* ctgCloneDbVgroup(void* pSrc) { + return taosArrayDup((const SArray*)pSrc); +} +static void ctgFreeDbVgroup(void* p) { + taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); +} + +static void* ctgCloneDbCfgInfo(void* pSrc) { + SDbCfgInfo* pDst = taosMemoryMalloc(sizeof(SDbCfgInfo)); + if (NULL == pDst) { + return NULL; + } + memcpy(pDst, pSrc, sizeof(SDbCfgInfo)); + return pDst; +} + +static void ctgFreeDbCfgInfo(void* p) { + taosMemoryFree(((SMetaRes*)p)->pRes); +} + +static void* ctgCloneDbInfo(void* pSrc) { + SDbInfo* pDst = taosMemoryMalloc(sizeof(SDbInfo)); + if (NULL == pDst) { + return NULL; + } + memcpy(pDst, pSrc, sizeof(SDbInfo)); + return pDst; +} + +static void ctgFreeDbInfo(void* p) { + taosMemoryFree(((SMetaRes*)p)->pRes); +} + +static void* ctgCloneTableMeta(void* pSrc) { + STableMeta* pMeta = pSrc; + int32_t size = sizeof(STableMeta) + (pMeta->tableInfo.numOfColumns + pMeta->tableInfo.numOfTags) * sizeof(SSchema); + STableMeta* pDst = taosMemoryMalloc(size); + if (NULL == pDst) { + return NULL; + } + memcpy(pDst, pSrc, size); + return pDst; +} + +static void ctgFreeTableMeta(void* p) { + taosMemoryFree(((SMetaRes*)p)->pRes); +} + +static void* ctgCloneVgroupInfo(void* pSrc) { + SVgroupInfo* pDst = taosMemoryMalloc(sizeof(SVgroupInfo)); + if (NULL == pDst) { + return NULL; + } + memcpy(pDst, pSrc, sizeof(SVgroupInfo)); + return pDst; +} + +static void ctgFreeVgroupInfo(void* p) { + taosMemoryFree(((SMetaRes*)p)->pRes); +} + +static void* ctgCloneTableIndices(void* pSrc) { + return taosArrayDup((const SArray*)pSrc); +} + +static void ctgFreeTableIndices(void* p) { + taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); +} + +static void* ctgCloneFuncInfo(void* pSrc) { + SFuncInfo* pDst = taosMemoryMalloc(sizeof(SFuncInfo)); + if (NULL == pDst) { + return NULL; + } + memcpy(pDst, pSrc, sizeof(SFuncInfo)); + return pDst; +} + +static void ctgFreeFuncInfo(void* p) { + taosMemoryFree(((SMetaRes*)p)->pRes); +} + +static void* ctgCloneIndexInfo(void* pSrc) { + SIndexInfo* pDst = taosMemoryMalloc(sizeof(SIndexInfo)); + if (NULL == pDst) { + return NULL; + } + memcpy(pDst, pSrc, sizeof(SIndexInfo)); + return pDst; +} + +static void ctgFreeIndexInfo(void* p) { + taosMemoryFree(((SMetaRes*)p)->pRes); +} + +static void* ctgCloneUserAuth(void* pSrc) { + bool* pDst = taosMemoryMalloc(sizeof(bool)); + if (NULL == pDst) { + return NULL; + } + *pDst = *(bool*)pSrc; + return pDst; +} + +static void ctgFreeUserAuth(void* p) { + taosMemoryFree(((SMetaRes*)p)->pRes); +} + +static void* ctgCloneQnodeList(void* pSrc) { + return taosArrayDup((const SArray*)pSrc); +} + +static void ctgFreeQnodeList(void* p) { + taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); +} + +static void* ctgCloneTableCfg(void* pSrc) { + STableCfg* pDst = taosMemoryMalloc(sizeof(STableCfg)); + if (NULL == pDst) { + return NULL; + } + memcpy(pDst, pSrc, sizeof(STableCfg)); + return pDst; +} + +static void ctgFreeTableCfg(void* p) { + taosMemoryFree(((SMetaRes*)p)->pRes); +} + +static void* ctgCloneDnodeList(void* pSrc) { + return taosArrayDup((const SArray*)pSrc); +} + +static void ctgFreeDnodeList(void* p) { + taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); +} + +static int32_t ctgCloneMetaDataArray(SArray* pSrc, FCopy copyFunc, SArray** pDst) { + if (NULL == pSrc) { + return TSDB_CODE_SUCCESS; + } + + int32_t size = taosArrayGetSize(pSrc); + *pDst = taosArrayInit(size, sizeof(SMetaRes)); + if (NULL == *pDst) { + return TSDB_CODE_OUT_OF_MEMORY; + } + for (int32_t i = 0; i < size; ++i) { + SMetaRes* pRes = taosArrayGet(pSrc, i); + SMetaRes res = {.code = pRes->code, .pRes = copyFunc(pRes->pRes)}; + if (NULL == res.pRes) { + return TSDB_CODE_OUT_OF_MEMORY; + } + taosArrayPush(*pDst, &res); + } + + return TSDB_CODE_SUCCESS; +} + +SMetaData* catalogCloneMetaData(SMetaData* pData) { + SMetaData* pRes = taosMemoryCalloc(1, sizeof(SMetaData)); + if (NULL == pRes) { + return NULL; + } + + int32_t code = ctgCloneMetaDataArray(pData->pDbVgroup, ctgCloneDbVgroup, &pRes->pDbVgroup); + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pDbCfg, ctgCloneDbCfgInfo, &pRes->pDbCfg); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pDbInfo, ctgCloneDbInfo, &pRes->pDbInfo); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pTableMeta, ctgCloneTableMeta, &pRes->pTableMeta); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pTableHash, ctgCloneVgroupInfo, &pRes->pTableHash); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pTableIndex, ctgCloneTableIndices, &pRes->pTableIndex); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pUdfList, ctgCloneFuncInfo, &pRes->pUdfList); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pIndex, ctgCloneIndexInfo, &pRes->pIndex); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pUser, ctgCloneUserAuth, &pRes->pUser); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pQnodeList, ctgCloneQnodeList, &pRes->pQnodeList); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pTableCfg, ctgCloneTableCfg, &pRes->pTableCfg); + } + if (TSDB_CODE_SUCCESS == code) { + code = ctgCloneMetaDataArray(pData->pDnodeList, ctgCloneDnodeList, &pRes->pDnodeList); + } + + if (TSDB_CODE_SUCCESS != code) { + catalogFreeMetaData(pRes); + return NULL; + } + + return pRes; +} + +void catalogFreeMetaData(SMetaData* pData) { + if (NULL == pData) { + return; + } + + taosArrayDestroyEx(pData->pDbVgroup, ctgFreeDbVgroup); + taosArrayDestroyEx(pData->pDbCfg, ctgFreeDbCfgInfo); + taosArrayDestroyEx(pData->pDbInfo, ctgFreeDbInfo); + taosArrayDestroyEx(pData->pTableMeta, ctgFreeTableMeta); + taosArrayDestroyEx(pData->pTableHash, ctgFreeVgroupInfo); + taosArrayDestroyEx(pData->pTableIndex, ctgFreeTableIndices); + taosArrayDestroyEx(pData->pUdfList, ctgFreeFuncInfo); + taosArrayDestroyEx(pData->pIndex, ctgFreeIndexInfo); + taosArrayDestroyEx(pData->pUser, ctgFreeUserAuth); + taosArrayDestroyEx(pData->pQnodeList, ctgFreeQnodeList); + taosArrayDestroyEx(pData->pTableCfg, ctgFreeTableCfg); + taosArrayDestroyEx(pData->pDnodeList, ctgFreeDnodeList); + taosMemoryFreeClear(pData->pSvrVer); + taosMemoryFree(pData); +} diff --git a/source/libs/executor/inc/executil.h b/source/libs/executor/inc/executil.h index 9dba29811e..4e960afdb1 100644 --- a/source/libs/executor/inc/executil.h +++ b/source/libs/executor/inc/executil.h @@ -74,7 +74,8 @@ typedef struct SResultRowPosition { typedef struct SResKeyPos { SResultRowPosition pos; uint64_t groupId; - char key[]; + // char parTbName[TSDB_TABLE_NAME_LEN]; + char key[]; } SResKeyPos; typedef struct SResultRowInfo { @@ -123,6 +124,7 @@ SArray* extractPartitionColInfo(SNodeList* pNodeList); SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNodeList, int32_t* numOfOutputCols, int32_t type); +void createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId); void createExprFromTargetNode(SExprInfo* pExp, STargetNode* pTargetNode); SExprInfo* createExprInfo(SNodeList* pNodeList, SNodeList* pGroupKeys, int32_t* numOfExprs); diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 77fa33fb0e..f9e47f92fe 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -460,6 +460,8 @@ typedef struct SPartitionBySupporter { typedef struct SPartitionDataInfo { uint64_t groupId; + char* tbname; + SArray* tags; SArray* rowIds; } SPartitionDataInfo; @@ -476,6 +478,7 @@ typedef struct SStreamScanInfo { uint64_t tableUid; // queried super table uid SExprInfo* pPseudoExpr; int32_t numOfPseudoExpr; + SExprSupp tbnameCalSup; int32_t primaryTsIndex; // primary time stamp slot id SReadHandle readHandle; SInterval interval; // if the upstream is an interval operator, the interval info is also kept here. @@ -606,8 +609,6 @@ typedef struct SStreamIntervalOperatorInfo { SArray* pDelWins; // SWinRes int32_t delIndex; SSDataBlock* pDelRes; - SSDataBlock* pUpdateRes; - bool returnUpdate; SPhysiNode* pPhyNode; // create new child SHashObj* pPullDataMap; SArray* pPullWins; // SPullWindowInfo @@ -617,6 +618,7 @@ typedef struct SStreamIntervalOperatorInfo { SArray* pChildren; SStreamState* pState; SWinKey delKey; + SHashObj* pGroupIdTbNameMap; // uint64_t -> char[TSDB_TABLE_NAME_LEN] } SStreamIntervalOperatorInfo; typedef struct SAggOperatorInfo { @@ -765,12 +767,14 @@ typedef struct SStreamSessionAggOperatorInfo { SPhysiNode* pPhyNode; // create new child bool isFinal; bool ignoreExpiredData; + SHashObj* pGroupIdTbNameMap; } SStreamSessionAggOperatorInfo; typedef struct SStreamPartitionOperatorInfo { SOptrBasicInfo binfo; SPartitionBySupporter partitionSup; SExprSupp scalarSup; + SExprSupp tbnameCalSup; SHashObj* pPartitions; void* parIte; SSDataBlock* pInputDataBlock; @@ -842,6 +846,7 @@ typedef struct SStreamStateAggOperatorInfo { void* pDelIterator; SArray* pChildren; // cache for children's result; bool ignoreExpiredData; + SHashObj* pGroupIdTbNameMap; } SStreamStateAggOperatorInfo; typedef struct SSortOperatorInfo { @@ -896,8 +901,12 @@ void destroyExprInfo(SExprInfo* pExpr, int32_t numOfExprs); int32_t initAggInfo(SExprSupp* pSup, SAggSupporter* pAggSup, SExprInfo* pExprInfo, int32_t numOfCols, size_t keyBufSize, const char* pkey); void initResultSizeInfo(SResultInfo* pResultInfo, int32_t numOfRows); + +void doBuildStreamResBlock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo, + SDiskbasedBuf* pBuf); void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo, SDiskbasedBuf* pBuf); + int32_t handleLimitOffset(SOperatorInfo* pOperator, SLimitInfo* pLimitInfo, SSDataBlock* pBlock, bool holdDataInBuf); bool hasLimitOffsetInfo(SLimitInfo* pLimitInfo); void initLimitInfo(const SNode* pLimit, const SNode* pSLimit, SLimitInfo* pLimitInfo); @@ -1065,7 +1074,7 @@ bool isOverdue(TSKEY ts, STimeWindowAggSupp* pSup); bool isCloseWindow(STimeWindow* pWin, STimeWindowAggSupp* pSup); bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup); bool isDeletedStreamWindow(STimeWindow* pWin, uint64_t groupId, SStreamState* pState, STimeWindowAggSupp* pTwSup); -void appendOneRow(SSDataBlock* pBlock, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t* pUid, uint64_t* pGp); +void appendOneRowToStreamSpecialBlock(SSDataBlock* pBlock, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t* pUid, uint64_t* pGp, void* pTbName); void printDataBlock(SSDataBlock* pBlock, const char* flag); uint64_t calGroupIdByData(SPartitionBySupporter* pParSup, SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t rowId); @@ -1086,7 +1095,7 @@ void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsCol bool groupbyTbname(SNodeList* pGroupList); int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle, SNodeList* groupKey); void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput); -int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SStreamState* pState, SSDataBlock* pBlock, SExprSupp* pSup, +int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock* pBlock, SExprSupp* pSup, SGroupResInfo* pGroupResInfo); int32_t setOutputBuf(SStreamState* pState, STimeWindow* win, SResultRow** pResult, int64_t tableGroupId, SqlFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowEntryInfoOffset, SAggSupporter* pAggSup); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index e6b1948026..2f6b737f79 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -1161,45 +1161,45 @@ static SColumn* createColumn(int32_t blockId, int32_t slotId, int32_t colId, SDa return pCol; } -void createExprFromTargetNode(SExprInfo* pExp, STargetNode* pTargetNode) { +void createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId) { pExp->pExpr = taosMemoryCalloc(1, sizeof(tExprNode)); pExp->pExpr->_function.num = 1; pExp->pExpr->_function.functionId = -1; - int32_t type = nodeType(pTargetNode->pExpr); + int32_t type = nodeType(pNode); // it is a project query, or group by column if (type == QUERY_NODE_COLUMN) { pExp->pExpr->nodeType = QUERY_NODE_COLUMN; - SColumnNode* pColNode = (SColumnNode*)pTargetNode->pExpr; + SColumnNode* pColNode = (SColumnNode*)pNode; pExp->base.pParam = taosMemoryCalloc(1, sizeof(SFunctParam)); pExp->base.numOfParams = 1; SDataType* pType = &pColNode->node.resType; - pExp->base.resSchema = createResSchema(pType->type, pType->bytes, pTargetNode->slotId, pType->scale, - pType->precision, pColNode->colName); + pExp->base.resSchema = + createResSchema(pType->type, pType->bytes, slotId, pType->scale, pType->precision, pColNode->colName); pExp->base.pParam[0].pCol = createColumn(pColNode->dataBlockId, pColNode->slotId, pColNode->colId, pType, pColNode->colType); pExp->base.pParam[0].type = FUNC_PARAM_TYPE_COLUMN; } else if (type == QUERY_NODE_VALUE) { pExp->pExpr->nodeType = QUERY_NODE_VALUE; - SValueNode* pValNode = (SValueNode*)pTargetNode->pExpr; + SValueNode* pValNode = (SValueNode*)pNode; pExp->base.pParam = taosMemoryCalloc(1, sizeof(SFunctParam)); pExp->base.numOfParams = 1; SDataType* pType = &pValNode->node.resType; - pExp->base.resSchema = createResSchema(pType->type, pType->bytes, pTargetNode->slotId, pType->scale, - pType->precision, pValNode->node.aliasName); + pExp->base.resSchema = + createResSchema(pType->type, pType->bytes, slotId, pType->scale, pType->precision, pValNode->node.aliasName); pExp->base.pParam[0].type = FUNC_PARAM_TYPE_VALUE; nodesValueNodeToVariant(pValNode, &pExp->base.pParam[0].param); } else if (type == QUERY_NODE_FUNCTION) { pExp->pExpr->nodeType = QUERY_NODE_FUNCTION; - SFunctionNode* pFuncNode = (SFunctionNode*)pTargetNode->pExpr; + SFunctionNode* pFuncNode = (SFunctionNode*)pNode; SDataType* pType = &pFuncNode->node.resType; - pExp->base.resSchema = createResSchema(pType->type, pType->bytes, pTargetNode->slotId, pType->scale, - pType->precision, pFuncNode->node.aliasName); + pExp->base.resSchema = + createResSchema(pType->type, pType->bytes, slotId, pType->scale, pType->precision, pFuncNode->node.aliasName); pExp->pExpr->_function.functionId = pFuncNode->funcId; pExp->pExpr->_function.pFunctNode = pFuncNode; @@ -1241,20 +1241,24 @@ void createExprFromTargetNode(SExprInfo* pExp, STargetNode* pTargetNode) { } } else if (type == QUERY_NODE_OPERATOR) { pExp->pExpr->nodeType = QUERY_NODE_OPERATOR; - SOperatorNode* pNode = (SOperatorNode*)pTargetNode->pExpr; + SOperatorNode* pOpNode = (SOperatorNode*)pNode; pExp->base.pParam = taosMemoryCalloc(1, sizeof(SFunctParam)); pExp->base.numOfParams = 1; - SDataType* pType = &pNode->node.resType; - pExp->base.resSchema = createResSchema(pType->type, pType->bytes, pTargetNode->slotId, pType->scale, - pType->precision, pNode->node.aliasName); - pExp->pExpr->_optrRoot.pRootNode = pTargetNode->pExpr; + SDataType* pType = &pOpNode->node.resType; + pExp->base.resSchema = + createResSchema(pType->type, pType->bytes, slotId, pType->scale, pType->precision, pOpNode->node.aliasName); + pExp->pExpr->_optrRoot.pRootNode = pNode; } else { ASSERT(0); } } +void createExprFromTargetNode(SExprInfo* pExp, STargetNode* pTargetNode) { + createExprFromOneNode(pExp, pTargetNode->pExpr, pTargetNode->slotId); +} + SExprInfo* createExprInfo(SNodeList* pNodeList, SNodeList* pGroupKeys, int32_t* numOfExprs) { int32_t numOfFuncs = LIST_LENGTH(pNodeList); int32_t numOfGroupKeys = 0; diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c index a8c73f0170..e527f7e7c1 100644 --- a/source/libs/executor/src/executor.c +++ b/source/libs/executor/src/executor.c @@ -49,17 +49,6 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu SStreamScanInfo* pInfo = pOperator->info; -#if 0 - // TODO: if a block was set but not consumed, - // prevent setting a different type of block - pInfo->validBlockIndex = 0; - if (pInfo->blockType == STREAM_INPUT__DATA_BLOCK) { - taosArrayClearP(pInfo->pBlockLists, taosMemoryFree); - } else { - taosArrayClear(pInfo->pBlockLists); - } -#endif - ASSERT(pInfo->validBlockIndex == 0); ASSERT(taosArrayGetSize(pInfo->pBlockLists) == 0); @@ -71,30 +60,13 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu } pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; } else if (type == STREAM_INPUT__DATA_SUBMIT) { - /*if (tqReaderSetDataMsg(pInfo->tqReader, input, 0) < 0) {*/ - /*qError("submit msg messed up when initing stream block, %s" PRIx64, id);*/ - /*return TSDB_CODE_QRY_APP_ERROR;*/ - /*}*/ ASSERT(numOfBlocks == 1); - /*if (numOfBlocks == 1) {*/ taosArrayPush(pInfo->pBlockLists, &input); pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; - /*} else {*/ - /*}*/ } else if (type == STREAM_INPUT__DATA_BLOCK) { for (int32_t i = 0; i < numOfBlocks; ++i) { SSDataBlock* pDataBlock = &((SSDataBlock*)input)[i]; taosArrayPush(pInfo->pBlockLists, &pDataBlock); - -#if 0 - // TODO optimize - SSDataBlock* p = createOneDataBlock(pDataBlock, false); - p->info = pDataBlock->info; - - taosArrayClear(p->pDataBlock); - taosArrayAddAll(p->pDataBlock, pDataBlock->pDataBlock); - taosArrayPush(pInfo->pBlockLists, &p); -#endif } pInfo->blockType = STREAM_INPUT__DATA_BLOCK; } else { @@ -107,27 +79,6 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu static FORCE_INLINE void streamInputBlockDataDestory(void* pBlock) { blockDataDestroy((SSDataBlock*)pBlock); } -void tdCleanupStreamInputDataBlock(qTaskInfo_t tinfo) { -#if 0 - SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo; - if (!pTaskInfo || !pTaskInfo->pRoot || pTaskInfo->pRoot->numOfDownstream <= 0) { - return; - } - SOperatorInfo* pOptrInfo = pTaskInfo->pRoot->pDownstream[0]; - - if (pOptrInfo->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) { - SStreamScanInfo* pInfo = pOptrInfo->info; - if (pInfo->blockType == STREAM_INPUT__DATA_BLOCK) { - taosArrayClearP(pInfo->pBlockLists, streamInputBlockDataDestory); - } else { - ASSERT(0); - } - } else { - ASSERT(0); - } -#endif -} - int32_t qSetMultiStreamInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numOfBlocks, int32_t type) { if (tinfo == NULL) { return TSDB_CODE_QRY_APP_ERROR; @@ -330,8 +281,8 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo } } - bool exists = false; #if 0 + bool exists = false; for (int32_t k = 0; k < taosArrayGetSize(pListInfo->pTableList); ++k) { STableKeyInfo* pKeyInfo = taosArrayGet(pListInfo->pTableList, k); if (pKeyInfo->uid == keyInfo.uid) { @@ -339,14 +290,15 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo exists = true; } } -#endif if (!exists) { - taosArrayPush(pTaskInfo->tableqinfoList.pTableList, &keyInfo); - taosHashPut(pTaskInfo->tableqinfoList.map, uid, sizeof(uid), &keyInfo.groupId, sizeof(keyInfo.groupId)); - } +#endif + taosArrayPush(pTaskInfo->tableqinfoList.pTableList, &keyInfo); + taosHashPut(pTaskInfo->tableqinfoList.map, uid, sizeof(uid), &keyInfo.groupId, sizeof(keyInfo.groupId)); } + /*}*/ + if (keyBuf != NULL) { taosMemoryFree(keyBuf); } diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 5db55b02f8..8c1104f519 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1389,6 +1389,46 @@ int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprS return 0; } +void doBuildStreamResBlock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo, + SDiskbasedBuf* pBuf) { + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + SSDataBlock* pBlock = pbInfo->pRes; + + // set output datablock version + pBlock->info.version = pTaskInfo->version; + + blockDataCleanup(pBlock); + if (!hasRemainResults(pGroupResInfo)) { + return; + } + + // clear the existed group id + pBlock->info.groupId = 0; + ASSERT(!pbInfo->mergeResultBlock); + doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo); + if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) { + SStreamStateAggOperatorInfo* pInfo = pOperator->info; + + char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t)); + if (tbname != NULL) { + memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN); + } else { + pBlock->info.parTbName[0] = 0; + } + } else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION || + pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION || + pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) { + SStreamSessionAggOperatorInfo* pInfo = pOperator->info; + + char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t)); + if (tbname != NULL) { + memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN); + } else { + pBlock->info.parTbName[0] = 0; + } + } +} + void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo, SDiskbasedBuf* pBuf) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -4214,8 +4254,9 @@ int32_t saveOutputBuf(SStreamState* pState, SWinKey* pKey, SResultRow* pResult, return TSDB_CODE_SUCCESS; } -int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SStreamState* pState, SSDataBlock* pBlock, SExprSupp* pSup, +int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock* pBlock, SExprSupp* pSup, SGroupResInfo* pGroupResInfo) { + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SExprInfo* pExprInfo = pSup->pExprInfo; int32_t numOfExprs = pSup->numOfExprs; int32_t* rowEntryOffset = pSup->rowEntryInfoOffset; @@ -4244,6 +4285,13 @@ int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SStreamState* pStat if (pBlock->info.groupId == 0) { pBlock->info.groupId = pPos->groupId; + SStreamIntervalOperatorInfo* pInfo = pOperator->info; + char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t)); + if (tbname != NULL) { + memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN); + } else { + pBlock->info.parTbName[0] = 0; + } } else { // current value belongs to different group, it can't be packed into one datablock if (pBlock->info.groupId != pPos->groupId) { diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 7cb641a943..f3ae652987 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -873,6 +873,29 @@ static SSDataBlock* buildStreamPartitionResult(SOperatorInfo* pOperator) { colDataAppend(pDestCol, pDest->info.rows, pSrcData, isNull); } pDest->info.rows++; + if (pInfo->tbnameCalSup.numOfExprs > 0 && i == 0) { + SSDataBlock* pTmpBlock = blockCopyOneRow(pSrc, rowIndex); + SSDataBlock* pResBlock = createDataBlock(); + pResBlock->info.rowSize = TSDB_TABLE_NAME_LEN; + SColumnInfoData data = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, TSDB_TABLE_NAME_LEN, 0); + taosArrayPush(pResBlock->pDataBlock, &data); + blockDataEnsureCapacity(pResBlock, 1); + projectApplyFunctions(pInfo->tbnameCalSup.pExprInfo, pResBlock, pTmpBlock, pInfo->tbnameCalSup.pCtx, 1, NULL); + ASSERT(pResBlock->info.rows == 1); + ASSERT(taosArrayGetSize(pResBlock->pDataBlock) == 1); + SColumnInfoData* pCol = taosArrayGet(pResBlock->pDataBlock, 0); + ASSERT(pCol->info.type == TSDB_DATA_TYPE_VARCHAR); + void* pData = colDataGetVarData(pCol, 0); + // TODO check tbname validity + if (pData != (void*)-1) { + memcpy(pDest->info.parTbName, varDataVal(pData), varDataLen(pData)); + } else { + pDest->info.parTbName[0] = 0; + } + /*printf("\n\n set name %s\n\n", pDest->info.parTbName);*/ + blockDataDestroy(pTmpBlock); + blockDataDestroy(pResBlock); + } } blockDataUpdateTsWindow(pDest, pInfo->tsColIndex); pDest->info.groupId = pParInfo->groupId; @@ -1000,6 +1023,20 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr } } + if (pPartNode->pSubtable != NULL) { + SExprInfo* pSubTableExpr = taosMemoryCalloc(1, sizeof(SExprInfo)); + if (pSubTableExpr == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _error; + } + pInfo->tbnameCalSup.pExprInfo = pSubTableExpr; + createExprFromOneNode(pSubTableExpr, pPartNode->pSubtable, 0); + code = initExprSupp(&pInfo->tbnameCalSup, pSubTableExpr, 1); + if (code != TSDB_CODE_SUCCESS) { + goto _error; + } + } + int32_t keyLen = 0; code = initGroupOptrInfo(&pInfo->partitionSup.pGroupColVals, &keyLen, &pInfo->partitionSup.keyBuf, pInfo->partitionSup.pGroupCols); diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 1f0d96a2e8..0cfdd2b68e 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -924,29 +924,9 @@ _error: return NULL; } -static void doClearBufferedBlocks(SStreamScanInfo* pInfo) { -#if 0 - if (pInfo->blockType == STREAM_INPUT__DATA_BLOCK) { - size_t total = taosArrayGetSize(pInfo->pBlockLists); - for (int32_t i = 0; i < total; i++) { - SSDataBlock* p = taosArrayGetP(pInfo->pBlockLists, i); - taosArrayDestroy(p->pDataBlock); - taosMemoryFree(p); - } - } -#endif +static FORCE_INLINE void doClearBufferedBlocks(SStreamScanInfo* pInfo) { taosArrayClear(pInfo->pBlockLists); pInfo->validBlockIndex = 0; -#if 0 - size_t total = taosArrayGetSize(pInfo->pBlockLists); - - pInfo->validBlockIndex = 0; - for (int32_t i = 0; i < total; ++i) { - SSDataBlock* p = taosArrayGetP(pInfo->pBlockLists, i); - blockDataDestroy(p); - } - taosArrayClear(pInfo->pBlockLists); -#endif } static bool isSessionWindow(SStreamScanInfo* pInfo) { @@ -1320,19 +1300,73 @@ static int32_t generateScanRange(SStreamScanInfo* pInfo, SSDataBlock* pSrcBlock, return code; } -void appendOneRow(SSDataBlock* pBlock, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t* pUid, uint64_t* pGp) { +static void calBlockTag(SExprSupp* pTagCalSup, SSDataBlock* pBlock, SSDataBlock* pResBlock) { + if (pTagCalSup == NULL || pTagCalSup->numOfExprs == 0) return; + if (pBlock == NULL || pBlock->info.rows == 0) return; + + SSDataBlock* pSrcBlock = blockCopyOneRow(pBlock, 0); + ASSERT(pSrcBlock->info.rows == 1); + + blockDataEnsureCapacity(pResBlock, 1); + + projectApplyFunctions(pTagCalSup->pExprInfo, pResBlock, pSrcBlock, pTagCalSup->pCtx, 1, NULL); + ASSERT(pResBlock->info.rows == 1); + + // build tagArray + // build STag + // set STag + + blockDataDestroy(pSrcBlock); +} + +static void calBlockTbName(SExprSupp* pTbNameCalSup, SSDataBlock* pBlock) { + if (pTbNameCalSup == NULL || pTbNameCalSup->numOfExprs == 0) return; + if (pBlock == NULL || pBlock->info.rows == 0) return; + + SSDataBlock* pSrcBlock = blockCopyOneRow(pBlock, 0); + ASSERT(pSrcBlock->info.rows == 1); + + SSDataBlock* pResBlock = createDataBlock(); + pResBlock->info.rowSize = VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN; + SColumnInfoData data = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, TSDB_TABLE_NAME_LEN, 0); + taosArrayPush(pResBlock->pDataBlock, &data); + blockDataEnsureCapacity(pResBlock, 1); + + projectApplyFunctions(pTbNameCalSup->pExprInfo, pResBlock, pSrcBlock, pTbNameCalSup->pCtx, 1, NULL); + ASSERT(pResBlock->info.rows == 1); + ASSERT(taosArrayGetSize(pResBlock->pDataBlock) == 1); + SColumnInfoData* pCol = taosArrayGet(pResBlock->pDataBlock, 0); + ASSERT(pCol->info.type == TSDB_DATA_TYPE_VARCHAR); + + void* pData = colDataGetData(pCol, 0); + // TODO check tbname validation + if (pData != (void*)-1 && pData != NULL) { + memcpy(pBlock->info.parTbName, varDataVal(pData), TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN)); + pBlock->info.parTbName[TSDB_TABLE_NAME_LEN - 1] = 0; + } else { + pBlock->info.parTbName[0] = 0; + } + + blockDataDestroy(pSrcBlock); + blockDataDestroy(pResBlock); +} + +void appendOneRowToStreamSpecialBlock(SSDataBlock* pBlock, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t* pUid, + uint64_t* pGp, void* pTbName) { SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); SColumnInfoData* pUidCol = taosArrayGet(pBlock->pDataBlock, UID_COLUMN_INDEX); SColumnInfoData* pGpCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX); SColumnInfoData* pCalStartCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX); SColumnInfoData* pCalEndCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX); + SColumnInfoData* pTableCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX); colDataAppend(pStartTsCol, pBlock->info.rows, (const char*)pStartTs, false); colDataAppend(pEndTsCol, pBlock->info.rows, (const char*)pEndTs, false); colDataAppend(pUidCol, pBlock->info.rows, (const char*)pUid, false); colDataAppend(pGpCol, pBlock->info.rows, (const char*)pGp, false); - colDataAppendNULL(pCalStartCol, pBlock->info.rows); - colDataAppendNULL(pCalEndCol, pBlock->info.rows); + colDataAppend(pCalStartCol, pBlock->info.rows, (const char*)pStartTs, false); + colDataAppend(pCalEndCol, pBlock->info.rows, (const char*)pEndTs, false); + colDataAppend(pTableCol, pBlock->info.rows, (const char*)pTbName, pTbName == NULL); pBlock->info.rows++; } @@ -1362,10 +1396,12 @@ static void checkUpdateData(SStreamScanInfo* pInfo, bool invertible, SSDataBlock if ((update || closedWin) && out) { qDebug("stream update check not pass, update %d, closedWin %d", update, closedWin); uint64_t gpId = 0; - appendOneRow(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.uid, &gpId); + appendOneRowToStreamSpecialBlock(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.uid, &gpId, + NULL); if (closedWin && pInfo->partitionSup.needCalc) { gpId = calGroupIdByData(&pInfo->partitionSup, pInfo->pPartScalarSup, pBlock, rowId); - appendOneRow(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.uid, &gpId); + appendOneRowToStreamSpecialBlock(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.uid, &gpId, + NULL); } } } @@ -1376,7 +1412,7 @@ static void checkUpdateData(SStreamScanInfo* pInfo, bool invertible, SSDataBlock } } -static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock) { +static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock, bool filter) { SDataBlockInfo* pBlockInfo = &pInfo->pRes->info; SOperatorInfo* pOperator = pInfo->pStreamScanOp; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -1430,9 +1466,14 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock } } - doFilter(pInfo->pCondition, pInfo->pRes, NULL); + if (filter) { + doFilter(pInfo->pCondition, pInfo->pRes, NULL); + } blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex); blockDataFreeRes((SSDataBlock*)pBlock); + + calBlockTbName(&pInfo->tbnameCalSup, pInfo->pRes); + return 0; } @@ -1466,7 +1507,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { continue; } - setBlockIntoRes(pInfo, &block); + setBlockIntoRes(pInfo, &block, true); if (pBlockInfo->rows > 0) { return pInfo->pRes; @@ -1507,7 +1548,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { tqNextBlock(pInfo->tqReader, &ret); if (ret.fetchType == FETCH_TYPE__DATA) { blockDataCleanup(pInfo->pRes); - if (setBlockIntoRes(pInfo, &ret.data) < 0) { + if (setBlockIntoRes(pInfo, &ret.data, true) < 0) { ASSERT(0); } if (pInfo->pRes->info.rows > 0) { @@ -1769,8 +1810,10 @@ FETCH_NEXT_BLOCK: pSDB->info.type = pInfo->scanMode == STREAM_SCAN_FROM_DATAREADER_RANGE ? STREAM_NORMAL : STREAM_PULL_DATA; checkUpdateData(pInfo, true, pSDB, false); // printDataBlock(pSDB, "stream scan update"); + calBlockTbName(&pInfo->tbnameCalSup, pSDB); return pSDB; } + blockDataCleanup(pInfo->pUpdateDataRes); pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE; } break; default: @@ -1821,7 +1864,7 @@ FETCH_NEXT_BLOCK: continue; } - setBlockIntoRes(pInfo, &block); + setBlockIntoRes(pInfo, &block, false); if (updateInfoIgnore(pInfo->pUpdateInfo, &pInfo->pRes->info.window, pInfo->pRes->info.groupId, pInfo->pRes->info.version)) { @@ -1830,11 +1873,30 @@ FETCH_NEXT_BLOCK: continue; } - if (pBlockInfo->rows > 0) { + if (pInfo->pUpdateInfo) { + checkUpdateData(pInfo, true, pInfo->pRes, true); + pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, pBlockInfo->window.ekey); + if (pInfo->pUpdateDataRes->info.rows > 0) { + pInfo->updateResIndex = 0; + if (pInfo->pUpdateDataRes->info.type == STREAM_CLEAR) { + pInfo->scanMode = STREAM_SCAN_FROM_UPDATERES; + } else if (pInfo->pUpdateDataRes->info.type == STREAM_INVERT) { + pInfo->scanMode = STREAM_SCAN_FROM_RES; + return pInfo->pUpdateDataRes; + } else if (pInfo->pUpdateDataRes->info.type == STREAM_DELETE_DATA) { + pInfo->scanMode = STREAM_SCAN_FROM_DELETE_DATA; + } + } + } + + doFilter(pInfo->pCondition, pInfo->pRes, NULL); + blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex); + + if (pBlockInfo->rows > 0 || pInfo->pUpdateDataRes->info.rows > 0) { break; } } - if (pBlockInfo->rows > 0) { + if (pBlockInfo->rows > 0 || pInfo->pUpdateDataRes->info.rows > 0) { break; } else { pInfo->tqReader->pMsg = NULL; @@ -1848,32 +1910,16 @@ FETCH_NEXT_BLOCK: pOperator->resultInfo.totalRows += pBlockInfo->rows; // printDataBlock(pInfo->pRes, "stream scan"); - if (pBlockInfo->rows == 0) { - updateInfoDestoryColseWinSBF(pInfo->pUpdateInfo); - /*pOperator->status = OP_EXEC_DONE;*/ - } else if (pInfo->pUpdateInfo) { - checkUpdateData(pInfo, true, pInfo->pRes, true); - pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, pBlockInfo->window.ekey); - if (pInfo->pUpdateDataRes->info.rows > 0) { - pInfo->updateResIndex = 0; - if (pInfo->pUpdateDataRes->info.type == STREAM_CLEAR) { - pInfo->scanMode = STREAM_SCAN_FROM_UPDATERES; - } else if (pInfo->pUpdateDataRes->info.type == STREAM_INVERT) { - pInfo->scanMode = STREAM_SCAN_FROM_RES; - return pInfo->pUpdateDataRes; - } else if (pInfo->pUpdateDataRes->info.type == STREAM_DELETE_DATA) { - pInfo->scanMode = STREAM_SCAN_FROM_DELETE_DATA; - } - } - } - qDebug("scan rows: %d", pBlockInfo->rows); if (pBlockInfo->rows > 0) { return pInfo->pRes; - } else { - goto NEXT_SUBMIT_BLK; } - /*return (pBlockInfo->rows == 0) ? NULL : pInfo->pRes;*/ + + if (pInfo->pUpdateDataRes->info.rows > 0) { + goto FETCH_NEXT_BLOCK; + } + + goto NEXT_SUBMIT_BLK; } else { ASSERT(0); return NULL; @@ -2103,6 +2149,19 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys } } + if (pTableScanNode->pSubtable != NULL) { + SExprInfo* pSubTableExpr = taosMemoryCalloc(1, sizeof(SExprInfo)); + if (pSubTableExpr == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + goto _error; + } + pInfo->tbnameCalSup.pExprInfo = pSubTableExpr; + createExprFromOneNode(pSubTableExpr, pTableScanNode->pSubtable, 0); + if (initExprSupp(&pInfo->tbnameCalSup, pSubTableExpr, 1) != 0) { + goto _error; + } + } + pInfo->pBlockLists = taosArrayInit(4, POINTER_BYTES); if (pInfo->pBlockLists == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -2729,7 +2788,7 @@ static SSDataBlock* sysTableScanUserTables(SOperatorInfo* pOperator) { colDataAppend(pColInfoData, numOfRows, (char*)&ts, false); SMetaReader mr = {0}; - metaReaderInit(&mr, pInfo->readHandle.meta, 0); + metaReaderInit(&mr, pInfo->readHandle.meta, META_READER_NOLOCK); uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid; int32_t code = metaGetTableEntryByUid(&mr, suid); diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index cf0bc078d7..85c1d63868 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -105,9 +105,8 @@ static bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, S } else if (pCol->pExpr->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_END) { // TODO: include endpoint SInterval* pInterval = &pFillInfo->interval; - int32_t step = (pFillInfo->order == TSDB_ORDER_ASC) ? 1 : -1; int64_t windowEnd = - taosTimeAdd(pFillInfo->currentKey, pInterval->sliding * step, pInterval->slidingUnit, pInterval->precision); + taosTimeAdd(pFillInfo->currentKey, pInterval->interval, pInterval->intervalUnit, pInterval->precision); colDataAppend(pDstColInfoData, rowIndex, (const char*)&windowEnd, false); return true; } else if (pCol->pExpr->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_DURATION) { @@ -562,10 +561,7 @@ int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, TSKEY ekey, int32_t ma int32_t numOfRows = taosNumOfRemainRows(pFillInfo); TSKEY ekey1 = ekey; - if (!FILL_IS_ASC_FILL(pFillInfo)) { - pFillInfo->end = taosTimeTruncate(ekey, &pFillInfo->interval, pFillInfo->interval.precision); - } - + int64_t numOfRes = -1; if (numOfRows > 0) { // still fill gap within current data block, not generating data after the result set. TSKEY lastKey = tsList[pFillInfo->numOfRows - 1]; diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index 84ea68f3b7..560a1d319a 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -414,14 +414,17 @@ static bool setTimeWindowInterpolationEndTs(SIntervalAggOperatorInfo* pInfo, SEx return true; } -bool inSlidingWindow(SInterval* pInterval, STimeWindow* pWin, SDataBlockInfo* pBlockInfo) { - if (pInterval->interval != pInterval->sliding && - (pWin->ekey < pBlockInfo->calWin.skey || pWin->skey > pBlockInfo->calWin.ekey)) { +bool inCalSlidingWindow(SInterval* pInterval, STimeWindow* pWin, TSKEY calStart, TSKEY calEnd) { + if (pInterval->interval != pInterval->sliding && (pWin->ekey < calStart || pWin->skey > calEnd)) { return false; } return true; } +bool inSlidingWindow(SInterval* pInterval, STimeWindow* pWin, SDataBlockInfo* pBlockInfo) { + return inCalSlidingWindow(pInterval, pWin, pBlockInfo->calWin.skey, pBlockInfo->calWin.ekey); +} + static int32_t getNextQualifiedWindow(SInterval* pInterval, STimeWindow* pNext, SDataBlockInfo* pDataBlockInfo, TSKEY* primaryKeys, int32_t prevPosition, int32_t order) { bool ascQuery = (order == TSDB_ORDER_ASC); @@ -912,6 +915,8 @@ int32_t compareWinRes(void* pKey, void* data, int32_t index) { } static void removeDeleteResults(SHashObj* pUpdatedMap, SArray* pDelWins) { + taosArraySort(pDelWins, sWinKeyCmprImpl); + taosArrayRemoveDuplicate(pDelWins, sWinKeyCmprImpl, NULL); int32_t delSize = taosArrayGetSize(pDelWins); if (taosHashGetSize(pUpdatedMap) == 0 || delSize == 0) { return; @@ -1393,7 +1398,7 @@ static bool doClearWindow(SAggSupporter* pAggSup, SExprSupp* pSup, char* pData, return true; } -static bool doDeleteWindow(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, int32_t numOfOutput) { +static bool doDeleteWindow(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId) { SStreamIntervalOperatorInfo* pInfo = pOperator->info; SWinKey key = {.ts = ts, .groupId = groupId}; tSimpleHashRemove(pInfo->aggSup.pResultRowHashTable, &key, sizeof(SWinKey)); @@ -1401,21 +1406,37 @@ static bool doDeleteWindow(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, return true; } -static void doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, int32_t numOfOutput, SSDataBlock* pBlock, - SArray* pUpWins, SHashObj* pUpdatedMap) { - SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); - TSKEY* startTsCols = (TSKEY*)pStartTsCol->pData; - SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); - TSKEY* endTsCols = (TSKEY*)pEndTsCol->pData; - SColumnInfoData* pGpCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX); - uint64_t* pGpDatas = (uint64_t*)pGpCol->pData; +static void doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, SSDataBlock* pBlock, SArray* pUpWins, + SHashObj* pUpdatedMap) { + SStreamIntervalOperatorInfo* pInfo = pOperator->info; + SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); + TSKEY* startTsCols = (TSKEY*)pStartTsCol->pData; + SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); + TSKEY* endTsCols = (TSKEY*)pEndTsCol->pData; + SColumnInfoData* pCalStTsCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX); + TSKEY* calStTsCols = (TSKEY*)pCalStTsCol->pData; + SColumnInfoData* pCalEnTsCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX); + TSKEY* calEnTsCols = (TSKEY*)pCalEnTsCol->pData; + SColumnInfoData* pGpCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX); + uint64_t* pGpDatas = (uint64_t*)pGpCol->pData; for (int32_t i = 0; i < pBlock->info.rows; i++) { SResultRowInfo dumyInfo; dumyInfo.cur.pageId = -1; - STimeWindow win = getActiveTimeWindow(NULL, &dumyInfo, startTsCols[i], pInterval, TSDB_ORDER_ASC); + STimeWindow win = {0}; + if (IS_FINAL_OP(pInfo)) { + win.skey = startTsCols[i]; + win.ekey = endTsCols[i]; + } else { + win = getActiveTimeWindow(NULL, &dumyInfo, startTsCols[i], pInterval, TSDB_ORDER_ASC); + } + do { + if (!inCalSlidingWindow(pInterval, &win, calStTsCols[i], calEnTsCols[i])) { + getNextTimeWindow(pInterval, pInterval->precision, TSDB_ORDER_ASC, &win); + continue; + } uint64_t winGpId = pGpDatas[i]; - bool res = doDeleteWindow(pOperator, win.skey, winGpId, numOfOutput); + bool res = doDeleteWindow(pOperator, win.skey, winGpId); SWinKey winRes = {.ts = win.skey, .groupId = winGpId}; if (pUpWins && res) { taosArrayPush(pUpWins, &winRes); @@ -1517,16 +1538,43 @@ static int32_t getAllIntervalWindow(SSHashObj* pHashMap, SHashObj* resWins) { return TSDB_CODE_SUCCESS; } +int32_t compareWinKey(void* pKey, void* data, int32_t index) { + SArray* res = (SArray*)data; + SWinKey* pos = taosArrayGet(res, index); + SWinKey* pData = (SWinKey*)pKey; + if (pData->ts == pos->ts) { + if (pData->groupId > pos->groupId) { + return 1; + } else if (pData->groupId < pos->groupId) { + return -1; + } + return 0; + } else if (pData->ts > pos->ts) { + return 1; + } + return -1; +} + static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SInterval* pInterval, - SHashObj* pPullDataMap, SHashObj* closeWins, SOperatorInfo* pOperator) { + SHashObj* pPullDataMap, SHashObj* closeWins, SArray* pDelWins, + SOperatorInfo* pOperator) { qDebug("===stream===close interval window"); void* pIte = NULL; size_t keyLen = 0; int32_t iter = 0; SStreamIntervalOperatorInfo* pInfo = pOperator->info; + int32_t delSize = taosArrayGetSize(pDelWins); while ((pIte = tSimpleHashIterate(pHashMap, pIte, &iter)) != NULL) { - void* key = tSimpleHashGetKey(pIte, &keyLen); - SWinKey* pWinKey = (SWinKey*)key; + void* key = tSimpleHashGetKey(pIte, &keyLen); + SWinKey* pWinKey = (SWinKey*)key; + if (delSize > 0) { + int32_t index = binarySearchCom(pDelWins, delSize, pWinKey, TSDB_ORDER_DESC, compareWinKey); + if (index >= 0 && 0 == compareWinKey(pWinKey, pDelWins, index)) { + taosArrayRemove(pDelWins, index); + delSize = taosArrayGetSize(pDelWins); + } + } + void* chIds = taosHashGet(pPullDataMap, pWinKey, sizeof(SWinKey)); STimeWindow win = { .skey = pWinKey->ts, @@ -1552,6 +1600,7 @@ static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp } } tSimpleHashIterateRemove(pHashMap, pWinKey, sizeof(SWinKey), &pIte, &iter); + /*taosHashRemove(pInfo->pGroupIdTbNameMap, &pWinKey->groupId, sizeof(int64_t));*/ } } return TSDB_CODE_SUCCESS; @@ -1630,7 +1679,7 @@ static void closeChildIntervalWindow(SOperatorInfo* pOperator, SArray* pChildren ASSERT(pChInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE); pChInfo->twAggSup.maxTs = TMAX(pChInfo->twAggSup.maxTs, maxTs); closeStreamIntervalWindow(pChInfo->aggSup.pResultRowHashTable, &pChInfo->twAggSup, &pChInfo->interval, NULL, NULL, - pOperator); + NULL, pOperator); } } @@ -1644,7 +1693,8 @@ static void freeAllPages(SArray* pageIds, SDiskbasedBuf* pDiskBuf) { taosArrayClear(pageIds); } -static void doBuildDeleteResult(SArray* pWins, int32_t* index, SSDataBlock* pBlock) { +static void doBuildDeleteResult(SStreamIntervalOperatorInfo* pInfo, SArray* pWins, int32_t* index, + SSDataBlock* pBlock) { blockDataCleanup(pBlock); int32_t size = taosArrayGetSize(pWins); if (*index == size) { @@ -1656,7 +1706,14 @@ static void doBuildDeleteResult(SArray* pWins, int32_t* index, SSDataBlock* pBlo uint64_t uid = 0; for (int32_t i = *index; i < size; i++) { SWinKey* pWin = taosArrayGet(pWins, i); - appendOneRow(pBlock, &pWin->ts, &pWin->ts, &uid, &pWin->groupId); + char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pWin->groupId, sizeof(int64_t)); + if (tbname == NULL) { + appendOneRowToStreamSpecialBlock(pBlock, &pWin->ts, &pWin->ts, &uid, &pWin->groupId, NULL); + } else { + char parTbName[VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN]; + STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName)); + appendOneRowToStreamSpecialBlock(pBlock, &pWin->ts, &pWin->ts, &uid, &pWin->groupId, parTbName); + } (*index)++; } } @@ -1701,7 +1758,6 @@ void destroyStreamFinalIntervalOperatorInfo(void* param) { taosHashCleanup(pInfo->pPullDataMap); taosArrayDestroy(pInfo->pPullWins); blockDataDestroy(pInfo->pPullDataRes); - blockDataDestroy(pInfo->pUpdateRes); taosArrayDestroy(pInfo->pDelWins); blockDataDestroy(pInfo->pDelRes); taosMemoryFreeClear(pInfo->pState); @@ -1720,6 +1776,7 @@ void destroyStreamFinalIntervalOperatorInfo(void* param) { nodesDestroyNode((SNode*)pInfo->pPhyNode); colDataDestroy(&pInfo->twAggSup.timeWindowData); cleanupGroupResInfo(&pInfo->groupResInfo); + taosHashCleanup(pInfo->pGroupIdTbNameMap); taosMemoryFreeClear(param); } @@ -2878,11 +2935,7 @@ static void rebuildIntervalWindow(SOperatorInfo* pOperator, SExprSupp* pSup, SAr isCloseWindow(&parentWin, &pInfo->twAggSup)) { continue; } - int32_t code = setOutputBuf(pInfo->pState, &parentWin, &pCurResult, pWinRes->groupId, pSup->pCtx, numOfOutput, - pSup->rowEntryInfoOffset, &pInfo->aggSup); - if (code != TSDB_CODE_SUCCESS || pCurResult == NULL) { - T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); - } + int32_t numOfChildren = taosArrayGetSize(pInfo->pChildren); int32_t num = 0; for (int32_t j = 0; j < numOfChildren; j++) { @@ -2892,19 +2945,25 @@ static void rebuildIntervalWindow(SOperatorInfo* pOperator, SExprSupp* pSup, SAr if (!hasIntervalWindow(pChInfo->pState, pWinRes)) { continue; } + if (num == 0) { + int32_t code = setOutputBuf(pInfo->pState, &parentWin, &pCurResult, pWinRes->groupId, pSup->pCtx, numOfOutput, + pSup->rowEntryInfoOffset, &pInfo->aggSup); + if (code != TSDB_CODE_SUCCESS || pCurResult == NULL) { + T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); + } + } num++; SResultRow* pChResult = NULL; setOutputBuf(pChInfo->pState, &parentWin, &pChResult, pWinRes->groupId, pChildSup->pCtx, pChildSup->numOfExprs, pChildSup->rowEntryInfoOffset, &pChInfo->aggSup); updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &parentWin, true); compactFunctions(pSup->pCtx, pChildSup->pCtx, numOfOutput, pTaskInfo, &pInfo->twAggSup.timeWindowData); - releaseOutputBuf(pChInfo->pState, pWinRes, pChResult); } if (num > 0 && pUpdatedMap) { saveWinResultInfo(pCurResult->win.skey, pWinRes->groupId, pUpdatedMap); saveOutputBuf(pInfo->pState, pWinRes, pCurResult, pInfo->aggSup.resultRowSize); + releaseOutputBuf(pInfo->pState, pWinRes, pCurResult); } - releaseOutputBuf(pInfo->pState, pWinRes, pCurResult); } } @@ -3070,7 +3129,7 @@ void doBuildResult(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock* // clear the existed group id pBlock->info.groupId = 0; - buildDataBlockFromGroupRes(pTaskInfo, pState, pBlock, &pOperator->exprSupp, pGroupResInfo); + buildDataBlockFromGroupRes(pOperator, pState, pBlock, &pOperator->exprSupp, pGroupResInfo); } static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBlock, uint64_t groupId, @@ -3204,7 +3263,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { return pInfo->pPullDataRes; } - doBuildDeleteResult(pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); + doBuildDeleteResult(pInfo, pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); if (pInfo->pDelRes->info.rows != 0) { // process the rest of the data printDataBlock(pInfo->pDelRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); @@ -3230,25 +3289,19 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { return NULL; } else { if (!IS_FINAL_OP(pInfo)) { + doBuildDeleteResult(pInfo, pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); + if (pInfo->pDelRes->info.rows != 0) { + // process the rest of the data + printDataBlock(pInfo->pDelRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); + return pInfo->pDelRes; + } + doBuildResult(pOperator, pInfo->pState, pInfo->binfo.pRes, &pInfo->groupResInfo); if (pInfo->binfo.pRes->info.rows != 0) { printDataBlock(pInfo->binfo.pRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); return pInfo->binfo.pRes; } } - if (pInfo->pUpdateRes->info.rows != 0 && pInfo->returnUpdate) { - pInfo->returnUpdate = false; - ASSERT(!IS_FINAL_OP(pInfo)); - printDataBlock(pInfo->pUpdateRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); - // process the rest of the data - return pInfo->pUpdateRes; - } - doBuildDeleteResult(pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); - if (pInfo->pDelRes->info.rows != 0) { - // process the rest of the data - printDataBlock(pInfo->pDelRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); - return pInfo->pDelRes; - } } SArray* pUpdated = taosArrayInit(4, POINTER_BYTES); @@ -3257,45 +3310,30 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { while (1) { SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); if (pBlock == NULL) { - clearSpecialDataBlock(pInfo->pUpdateRes); - removeDeleteResults(pUpdatedMap, pInfo->pDelWins); pOperator->status = OP_RES_TO_RETURN; qDebug("%s return data", IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); break; } printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "interval final recv" : "interval semi recv"); + if (pBlock->info.parTbName[0]) { + taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName, + TSDB_TABLE_NAME_LEN); + } + ASSERT(pBlock->info.type != STREAM_INVERT); if (pBlock->info.type == STREAM_NORMAL || pBlock->info.type == STREAM_PULL_DATA) { pInfo->binfo.pRes->info.type = pBlock->info.type; - } else if (pBlock->info.type == STREAM_CLEAR) { - SArray* pUpWins = taosArrayInit(8, sizeof(SWinKey)); - doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, pUpWins, NULL); - if (IS_FINAL_OP(pInfo)) { - int32_t childIndex = getChildIndex(pBlock); - SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex); - SStreamIntervalOperatorInfo* pChildInfo = pChildOp->info; - SExprSupp* pChildSup = &pChildOp->exprSupp; - - doDeleteWindows(pChildOp, &pChildInfo->interval, pChildOp->exprSupp.numOfExprs, pBlock, NULL, NULL); - rebuildIntervalWindow(pOperator, pSup, pUpWins, pUpdatedMap); - taosArrayDestroy(pUpWins); - continue; - } - removeResults(pUpWins, pUpdatedMap); - copyDataBlock(pInfo->pUpdateRes, pBlock); - pInfo->returnUpdate = true; - taosArrayDestroy(pUpWins); - break; - } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) { + } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT || + pBlock->info.type == STREAM_CLEAR) { SArray* delWins = taosArrayInit(8, sizeof(SWinKey)); - doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, delWins, pUpdatedMap); + doDeleteWindows(pOperator, &pInfo->interval, pBlock, delWins, pUpdatedMap); if (IS_FINAL_OP(pInfo)) { int32_t childIndex = getChildIndex(pBlock); SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex); SStreamIntervalOperatorInfo* pChildInfo = pChildOp->info; SExprSupp* pChildSup = &pChildOp->exprSupp; - doDeleteWindows(pChildOp, &pChildInfo->interval, pChildOp->exprSupp.numOfExprs, pBlock, NULL, NULL); + doDeleteWindows(pChildOp, &pChildInfo->interval, pBlock, NULL, NULL); rebuildIntervalWindow(pOperator, pSup, delWins, pUpdatedMap); addRetriveWindow(delWins, pInfo); taosArrayAddAll(pInfo->pDelWins, delWins); @@ -3310,7 +3348,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { getAllIntervalWindow(pInfo->aggSup.pResultRowHashTable, pUpdatedMap); continue; } else if (pBlock->info.type == STREAM_RETRIEVE && !IS_FINAL_OP(pInfo)) { - doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, NULL, pUpdatedMap); + doDeleteWindows(pOperator, &pInfo->interval, pBlock, NULL, pUpdatedMap); if (taosArrayGetSize(pUpdated) > 0) { break; } @@ -3350,11 +3388,12 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { minTs = TMIN(minTs, pBlock->info.window.skey); } + removeDeleteResults(pUpdatedMap, pInfo->pDelWins); pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs); pInfo->twAggSup.minTs = TMIN(pInfo->twAggSup.minTs, minTs); if (IS_FINAL_OP(pInfo)) { closeStreamIntervalWindow(pInfo->aggSup.pResultRowHashTable, &pInfo->twAggSup, &pInfo->interval, - pInfo->pPullDataMap, pUpdatedMap, pOperator); + pInfo->pPullDataMap, pUpdatedMap, pInfo->pDelWins, pOperator); closeChildIntervalWindow(pOperator, pInfo->pChildren, pInfo->twAggSup.maxTs); } pInfo->binfo.pRes->info.watermark = pInfo->twAggSup.maxTs; @@ -3377,7 +3416,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { return pInfo->pPullDataRes; } - doBuildDeleteResult(pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); + doBuildDeleteResult(pInfo, pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); if (pInfo->pDelRes->info.rows != 0) { // process the rest of the data printDataBlock(pInfo->pDelRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); @@ -3390,13 +3429,6 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { return pInfo->binfo.pRes; } - if (pInfo->pUpdateRes->info.rows != 0 && pInfo->returnUpdate) { - pInfo->returnUpdate = false; - ASSERT(!IS_FINAL_OP(pInfo)); - printDataBlock(pInfo->pUpdateRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); - // process the rest of the data - return pInfo->pUpdateRes; - } return NULL; } @@ -3471,9 +3503,6 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, goto _error; } } - pInfo->pUpdateRes = createSpecialDataBlock(STREAM_CLEAR); - blockDataEnsureCapacity(pInfo->pUpdateRes, 128); - pInfo->returnUpdate = false; pInfo->pPhyNode = (SPhysiNode*)nodesCloneNode((SNode*)pPhyNode); @@ -3502,6 +3531,9 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, pInfo->delKey.ts = INT64_MAX; pInfo->delKey.groupId = 0; + pInfo->pGroupIdTbNameMap = + taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK); + pOperator->operatorType = pPhyNode->type; pOperator->blocking = true; pOperator->status = OP_NOT_OPENED; @@ -3579,6 +3611,7 @@ void destroyStreamSessionAggOperatorInfo(void* param) { blockDataDestroy(pInfo->pUpdateRes); destroySqlFunctionCtx(pInfo->pDummyCtx, 0); taosHashCleanup(pInfo->pStDeleted); + taosHashCleanup(pInfo->pGroupIdTbNameMap); taosMemoryFreeClear(param); } @@ -3696,6 +3729,9 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh pInfo->pPhyNode = pPhyNode; pInfo->ignoreExpiredData = pSessionNode->window.igExpired; + pInfo->pGroupIdTbNameMap = + taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK); + pOperator->name = "StreamSessionWindowAggOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION; pOperator->blocking = true; @@ -4292,23 +4328,6 @@ static void removeSessionResults(SHashObj* pHashMap, SArray* pWins) { } } -int32_t compareWinKey(void* pKey, void* data, int32_t index) { - SArray* res = (SArray*)data; - SResKeyPos* pos = taosArrayGetP(res, index); - SWinKey* pData = (SWinKey*)pKey; - if (pData->ts == *(int64_t*)pos->key) { - if (pData->groupId > pos->groupId) { - return 1; - } else if (pData->groupId < pos->groupId) { - return -1; - } - return 0; - } else if (pData->ts > *(int64_t*)pos->key) { - return 1; - } - return -1; -} - static void removeSessionDeleteResults(SArray* update, SHashObj* pStDeleted) { int32_t size = taosHashGetSize(pStDeleted); if (size == 0) { @@ -4336,7 +4355,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { printDataBlock(pInfo->pDelRes, IS_FINAL_OP(pInfo) ? "final session" : "single session"); return pInfo->pDelRes; } - doBuildResultDatablock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); + doBuildStreamResBlock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); if (pBInfo->pRes->info.rows == 0 || !hasRemainResults(&pInfo->groupResInfo)) { doSetOperatorCompleted(pOperator); } @@ -4355,6 +4374,12 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { } printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "final session recv" : "single session recv"); + if (pBlock->info.parTbName[0]) { + taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName, + TSDB_TABLE_NAME_LEN); + /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/ + } + if (pBlock->info.type == STREAM_CLEAR) { SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo)); doClearSessionWindows(&pInfo->streamAggSup, &pOperator->exprSupp, pBlock, START_TS_COLUMN_INDEX, @@ -4436,7 +4461,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { printDataBlock(pInfo->pDelRes, IS_FINAL_OP(pInfo) ? "final session" : "single session"); return pInfo->pDelRes; } - doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); + doBuildStreamResBlock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); printDataBlock(pBInfo->pRes, IS_FINAL_OP(pInfo) ? "final session" : "single session"); return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes; } @@ -4467,7 +4492,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { } { - doBuildResultDatablock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); + doBuildStreamResBlock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); if (pBInfo->pRes->info.rows > 0) { printDataBlock(pBInfo->pRes, "semi session"); return pBInfo->pRes; @@ -4508,6 +4533,12 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { } printDataBlock(pBlock, "semi session recv"); + if (pBlock->info.parTbName[0]) { + taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName, + TSDB_TABLE_NAME_LEN); + /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/ + } + if (pBlock->info.type == STREAM_CLEAR) { SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo)); doClearSessionWindows(&pInfo->streamAggSup, pSup, pBlock, START_TS_COLUMN_INDEX, pSup->numOfExprs, 0, pWins); @@ -4551,7 +4582,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { initMultiResInfoFromArrayList(&pInfo->groupResInfo, pUpdated); blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity); - doBuildResultDatablock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); + doBuildStreamResBlock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); if (pBInfo->pRes->info.rows > 0) { printDataBlock(pBInfo->pRes, "semi session"); return pBInfo->pRes; @@ -4595,6 +4626,10 @@ SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream createOperatorFpSet(operatorDummyOpenFn, doStreamSessionSemiAgg, NULL, NULL, destroyStreamSessionAggOperatorInfo, aggEncodeResultRow, aggDecodeResultRow, NULL); } + + pInfo->pGroupIdTbNameMap = + taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK); + pOperator->operatorType = pPhyNode->type; if (numOfChild > 0) { pInfo->pChildren = taosArrayInit(numOfChild, sizeof(void*)); @@ -4636,6 +4671,7 @@ void destroyStreamStateOperatorInfo(void* param) { colDataDestroy(&pInfo->twAggSup.timeWindowData); blockDataDestroy(pInfo->pDelRes); taosHashCleanup(pInfo->pSeDeleted); + taosHashCleanup(pInfo->pGroupIdTbNameMap); destroySqlFunctionCtx(pInfo->pDummyCtx, 0); taosMemoryFreeClear(param); @@ -4858,7 +4894,8 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl i, &allEqual, pStDeleted); if (!allEqual) { uint64_t uid = 0; - appendOneRow(pAggSup->pScanBlock, &pCurWin->winInfo.win.skey, &pCurWin->winInfo.win.ekey, &uid, &groupId); + appendOneRowToStreamSpecialBlock(pAggSup->pScanBlock, &pCurWin->winInfo.win.skey, &pCurWin->winInfo.win.ekey, + &uid, &groupId, NULL); taosHashRemove(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition)); deleteWindow(pAggSup->pCurWins, winIndex, destroyStateWinInfo); continue; @@ -4894,7 +4931,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { printDataBlock(pInfo->pDelRes, "single state"); return pInfo->pDelRes; } - doBuildResultDatablock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); + doBuildStreamResBlock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); if (pBInfo->pRes->info.rows == 0 || !hasRemainResults(&pInfo->groupResInfo)) { doSetOperatorCompleted(pOperator); } @@ -4956,7 +4993,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { printDataBlock(pInfo->pDelRes, "single state"); return pInfo->pDelRes; } - doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); + doBuildStreamResBlock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf); printDataBlock(pBInfo->pRes, "single state"); return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes; } @@ -5029,6 +5066,9 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys pInfo->pChildren = NULL; pInfo->ignoreExpiredData = pStateNode->window.igExpired; + pInfo->pGroupIdTbNameMap = + taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK); + pOperator->name = "StreamStateAggOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE; pOperator->blocking = true; @@ -5654,7 +5694,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { } if (pOperator->status == OP_RES_TO_RETURN) { - doBuildDeleteResult(pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); + doBuildDeleteResult(pInfo, pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); if (pInfo->pDelRes->info.rows > 0) { printDataBlock(pInfo->pDelRes, "single interval delete"); return pInfo->pDelRes; @@ -5684,13 +5724,15 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { } printDataBlock(pBlock, "single interval recv"); - if (pBlock->info.type == STREAM_CLEAR) { - doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, NULL, NULL); - qDebug("%s clear existed time window results for updates checked", GET_TASKID(pTaskInfo)); - continue; - } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) { - doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, pInfo->pDelWins, - pUpdatedMap); + if (pBlock->info.parTbName[0]) { + taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName, + TSDB_TABLE_NAME_LEN); + /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/ + } + + if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT || + pBlock->info.type == STREAM_CLEAR) { + doDeleteWindows(pOperator, &pInfo->interval, pBlock, pInfo->pDelWins, pUpdatedMap); continue; } else if (pBlock->info.type == STREAM_GET_ALL) { getAllIntervalWindow(pInfo->aggSup.pResultRowHashTable, pUpdatedMap); @@ -5722,8 +5764,9 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs); pInfo->twAggSup.minTs = TMIN(pInfo->twAggSup.minTs, minTs); pOperator->status = OP_RES_TO_RETURN; + removeDeleteResults(pUpdatedMap, pInfo->pDelWins); closeStreamIntervalWindow(pInfo->aggSup.pResultRowHashTable, &pInfo->twAggSup, &pInfo->interval, NULL, pUpdatedMap, - pOperator); + pInfo->pDelWins, pOperator); void* pIte = NULL; while ((pIte = taosHashIterate(pUpdatedMap, pIte)) != NULL) { @@ -5733,10 +5776,9 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { initMultiResInfoFromArrayList(&pInfo->groupResInfo, pUpdated); blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity); - removeDeleteResults(pUpdatedMap, pInfo->pDelWins); taosHashCleanup(pUpdatedMap); - doBuildDeleteResult(pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); + doBuildDeleteResult(pInfo, pInfo->pDelWins, &pInfo->delIndex, pInfo->pDelRes); if (pInfo->pDelRes->info.rows > 0) { printDataBlock(pInfo->pDelRes, "single interval delete"); return pInfo->pDelRes; @@ -5819,8 +5861,6 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys *(pInfo->pState) = *(pTaskInfo->streamInfo.pState); streamStateSetNumber(pInfo->pState, -1); - pInfo->pUpdateRes = NULL; - pInfo->returnUpdate = false; pInfo->pPhyNode = NULL; // create new child pInfo->pPullDataMap = NULL; pInfo->pPullWins = NULL; // SPullWindowInfo @@ -5831,6 +5871,9 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys pInfo->delKey.ts = INT64_MAX; pInfo->delKey.groupId = 0; + pInfo->pGroupIdTbNameMap = + taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK); + pOperator->name = "StreamIntervalOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL; pOperator->blocking = true; diff --git a/source/libs/function/CMakeLists.txt b/source/libs/function/CMakeLists.txt index dd048a047a..913dd24a49 100644 --- a/source/libs/function/CMakeLists.txt +++ b/source/libs/function/CMakeLists.txt @@ -14,7 +14,14 @@ target_include_directories( target_link_libraries( function - PRIVATE os util common nodes scalar qcom transport stream + PRIVATE os + PRIVATE util + PRIVATE common + PRIVATE nodes + PRIVATE qcom + PRIVATE scalar + PRIVATE transport + PRIVATE stream PUBLIC uv_a ) diff --git a/source/libs/function/src/udfd.c b/source/libs/function/src/udfd.c index 8ff0dc15a5..14e358ea00 100644 --- a/source/libs/function/src/udfd.c +++ b/source/libs/function/src/udfd.c @@ -959,8 +959,8 @@ int32_t udfdInitResidentFuncs() { char* pSave = tsUdfdResFuncs; char* token; while ((token = strtok_r(pSave, ",", &pSave)) != NULL) { - char func[TSDB_FUNC_NAME_LEN] = {0}; - strncpy(func, token, sizeof(func)); + char func[TSDB_FUNC_NAME_LEN+1] = {0}; + strncpy(func, token, TSDB_FUNC_NAME_LEN); taosArrayPush(global.residentFuncs, func); } diff --git a/source/libs/index/src/indexFst.c b/source/libs/index/src/indexFst.c index 5e787f9503..01dffa782d 100644 --- a/source/libs/index/src/indexFst.c +++ b/source/libs/index/src/indexFst.c @@ -24,7 +24,7 @@ static FORCE_INLINE void fstPackDeltaIn(IdxFstFile* wrt, CompiledAddr nodeAddr, CompiledAddr deltaAddr = (transAddr == EMPTY_ADDRESS) ? EMPTY_ADDRESS : nodeAddr - transAddr; idxFilePackUintIn(wrt, deltaAddr, nBytes); } -static FORCE_INLINE uint8_t fstPackDetla(IdxFstFile* wrt, CompiledAddr nodeAddr, CompiledAddr transAddr) { +static FORCE_INLINE uint8_t fstPackDelta(IdxFstFile* wrt, CompiledAddr nodeAddr, CompiledAddr transAddr) { uint8_t nBytes = packDeltaSize(nodeAddr, transAddr); fstPackDeltaIn(wrt, nodeAddr, transAddr, nBytes); return nBytes; @@ -226,7 +226,7 @@ void fstStateCompileForOneTransNext(IdxFstFile* w, CompiledAddr addr, uint8_t in void fstStateCompileForOneTrans(IdxFstFile* w, CompiledAddr addr, FstTransition* trn) { Output out = trn->out; uint8_t outPackSize = (out == 0 ? 0 : idxFilePackUint(w, out)); - uint8_t transPackSize = fstPackDetla(w, addr, trn->addr); + uint8_t transPackSize = fstPackDelta(w, addr, trn->addr); PackSizes packSizes = 0; FST_SET_OUTPUT_PACK_SIZE(packSizes, outPackSize); diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 83fa92041e..6af01eecd5 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -217,13 +217,13 @@ alter_db_options(A) ::= alter_db_options(B) alter_db_option(C). %type alter_db_option { SAlterOption } %destructor alter_db_option { } -//alter_db_option(A) ::= BUFFER NK_INTEGER(B). { A.type = DB_OPTION_BUFFER; A.val = B; } +alter_db_option(A) ::= BUFFER NK_INTEGER(B). { A.type = DB_OPTION_BUFFER; A.val = B; } alter_db_option(A) ::= CACHEMODEL NK_STRING(B). { A.type = DB_OPTION_CACHEMODEL; A.val = B; } alter_db_option(A) ::= CACHESIZE NK_INTEGER(B). { A.type = DB_OPTION_CACHESIZE; A.val = B; } alter_db_option(A) ::= WAL_FSYNC_PERIOD NK_INTEGER(B). { A.type = DB_OPTION_FSYNC; A.val = B; } alter_db_option(A) ::= KEEP integer_list(B). { A.type = DB_OPTION_KEEP; A.pList = B; } alter_db_option(A) ::= KEEP variable_list(B). { A.type = DB_OPTION_KEEP; A.pList = B; } -//alter_db_option(A) ::= PAGES NK_INTEGER(B). { A.type = DB_OPTION_PAGES; A.val = B; } +alter_db_option(A) ::= PAGES NK_INTEGER(B). { A.type = DB_OPTION_PAGES; A.val = B; } //alter_db_option(A) ::= REPLICA NK_INTEGER(B). { A.type = DB_OPTION_REPLICA; A.val = B; } //alter_db_option(A) ::= STRICT NK_STRING(B). { A.type = DB_OPTION_STRICT; A.val = B; } alter_db_option(A) ::= WAL_LEVEL NK_INTEGER(B). { A.type = DB_OPTION_WAL; A.val = B; } diff --git a/source/libs/parser/src/parInsert.c b/source/libs/parser/src/parInsert.c index 4fb55ed373..eec20f91e4 100644 --- a/source/libs/parser/src/parInsert.c +++ b/source/libs/parser/src/parInsert.c @@ -266,7 +266,7 @@ static int32_t getTableVgroup(SInsertParseContext* pCxt, int32_t tbNo, SName* pT return catalogGetTableHashVgroup(pBasicCtx->pCatalog, &conn, pTbName, pVg); } -static int32_t getTableMetaImpl(SInsertParseContext* pCxt, int32_t tbNo, SName* name, char* dbFname, bool isStb) { +static int32_t getTableMetaImpl(SInsertParseContext* pCxt, int32_t tbNo, SName* name, bool isStb) { CHECK_CODE(getTableSchema(pCxt, tbNo, name, isStb, &pCxt->pTableMeta)); if (!isStb) { SVgroupInfo vg; @@ -276,12 +276,12 @@ static int32_t getTableMetaImpl(SInsertParseContext* pCxt, int32_t tbNo, SName* return TSDB_CODE_SUCCESS; } -static int32_t getTableMeta(SInsertParseContext* pCxt, int32_t tbNo, SName* name, char* dbFname) { - return getTableMetaImpl(pCxt, tbNo, name, dbFname, false); +static int32_t getTableMeta(SInsertParseContext* pCxt, int32_t tbNo, SName* name) { + return getTableMetaImpl(pCxt, tbNo, name, false); } -static int32_t getSTableMeta(SInsertParseContext* pCxt, int32_t tbNo, SName* name, char* dbFname) { - return getTableMetaImpl(pCxt, tbNo, name, dbFname, true); +static int32_t getSTableMeta(SInsertParseContext* pCxt, int32_t tbNo, SName* name) { + return getTableMetaImpl(pCxt, tbNo, name, true); } static int32_t getDBCfg(SInsertParseContext* pCxt, const char* pDbFName, SDbCfgInfo* pInfo) { @@ -783,7 +783,7 @@ static void buildCreateTbReq(SVCreateTbReq* pTbReq, const char* tname, STag* pTa pTbReq->name = strdup(tname); pTbReq->ctb.suid = suid; pTbReq->ctb.tagNum = tagNum; - if (sname) pTbReq->ctb.name = strdup(sname); + if (sname) pTbReq->ctb.stbName = strdup(sname); pTbReq->ctb.pTag = (uint8_t*)pTag; pTbReq->ctb.tagName = taosArrayDup(tagName); pTbReq->ttl = TSDB_DEFAULT_TABLE_TTL; @@ -1178,7 +1178,7 @@ static int32_t parseUsingClause(SInsertParseContext* pCxt, int32_t tbNo, SName* tNameGetFullDbName(&sname, dbFName); strcpy(pCxt->sTableName, sname.tname); - CHECK_CODE(getSTableMeta(pCxt, tbNo, &sname, dbFName)); + CHECK_CODE(getSTableMeta(pCxt, tbNo, &sname)); if (TSDB_SUPER_TABLE != pCxt->pTableMeta->tableType) { return buildInvalidOperationMsg(&pCxt->msg, "create table only from super table is allowed"); } @@ -1385,6 +1385,10 @@ static int32_t parseCsvFile(SInsertParseContext* pCxt, TdFilePtr fp, STableDataB (*numOfRows)++; } pCxt->pSql = pRawSql; + + if (pDataBlock->nAllocSize > tsMaxMemUsedByInsert * 1024 * 1024) { + break; + } } if (0 == (*numOfRows) && (!TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT))) { @@ -1393,23 +1397,13 @@ static int32_t parseCsvFile(SInsertParseContext* pCxt, TdFilePtr fp, STableDataB return TSDB_CODE_SUCCESS; } -static int32_t parseDataFromFile(SInsertParseContext* pCxt, SToken filePath, STableDataBlocks* dataBuf) { - char filePathStr[TSDB_FILENAME_LEN] = {0}; - if (TK_NK_STRING == filePath.type) { - trimString(filePath.z, filePath.n, filePathStr, sizeof(filePathStr)); - } else { - strncpy(filePathStr, filePath.z, filePath.n); - } - TdFilePtr fp = taosOpenFile(filePathStr, TD_FILE_READ | TD_FILE_STREAM); - if (NULL == fp) { - return TAOS_SYSTEM_ERROR(errno); - } - +static int32_t parseDataFromFileAgain(SInsertParseContext* pCxt, int16_t tableNo, const SName* pTableName, + STableDataBlocks* dataBuf) { int32_t maxNumOfRows; CHECK_CODE(allocateMemIfNeed(dataBuf, getExtendedRowSize(dataBuf), &maxNumOfRows)); int32_t numOfRows = 0; - CHECK_CODE(parseCsvFile(pCxt, fp, dataBuf, maxNumOfRows, &numOfRows)); + CHECK_CODE(parseCsvFile(pCxt, pCxt->pComCxt->csvCxt.fp, dataBuf, maxNumOfRows, &numOfRows)); SSubmitBlk* pBlocks = (SSubmitBlk*)(dataBuf->pData); if (TSDB_CODE_SUCCESS != setBlockInfo(pBlocks, dataBuf, numOfRows)) { @@ -1417,12 +1411,38 @@ static int32_t parseDataFromFile(SInsertParseContext* pCxt, SToken filePath, STa "too many rows in sql, total number of rows should be less than INT32_MAX"); } + if (!taosEOFFile(pCxt->pComCxt->csvCxt.fp)) { + pCxt->pComCxt->needMultiParse = true; + pCxt->pComCxt->csvCxt.tableNo = tableNo; + memcpy(&pCxt->pComCxt->csvCxt.tableName, pTableName, sizeof(SName)); + pCxt->pComCxt->csvCxt.pLastSqlPos = pCxt->pSql; + } + dataBuf->numOfTables = 1; pCxt->totalNum += numOfRows; return TSDB_CODE_SUCCESS; } +static int32_t parseDataFromFile(SInsertParseContext* pCxt, int16_t tableNo, const SName* pTableName, SToken filePath, + STableDataBlocks* dataBuf) { + char filePathStr[TSDB_FILENAME_LEN] = {0}; + if (TK_NK_STRING == filePath.type) { + trimString(filePath.z, filePath.n, filePathStr, sizeof(filePathStr)); + } else { + strncpy(filePathStr, filePath.z, filePath.n); + } + pCxt->pComCxt->csvCxt.fp = taosOpenFile(filePathStr, TD_FILE_READ | TD_FILE_STREAM); + if (NULL == pCxt->pComCxt->csvCxt.fp) { + return TAOS_SYSTEM_ERROR(errno); + } + + return parseDataFromFileAgain(pCxt, tableNo, pTableName, dataBuf); +} + static void destroyInsertParseContextForTable(SInsertParseContext* pCxt) { + if (!pCxt->pComCxt->needMultiParse) { + taosCloseFile(&pCxt->pComCxt->csvCxt.fp); + } taosMemoryFreeClear(pCxt->pTableMeta); destroyBoundColumnInfo(&pCxt->tags); tdDestroySVCreateTbReq(&pCxt->createTblReq); @@ -1481,7 +1501,8 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) { return buildSyntaxErrMsg(&pCxt->msg, "invalid charactor in SQL", sToken.z); } - if (0 == pCxt->totalNum && (!TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT))) { + if (0 == pCxt->totalNum && (!TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT)) && + !pCxt->pComCxt->needMultiParse) { return buildInvalidOperationMsg(&pCxt->msg, "no data in sql"); } break; @@ -1536,7 +1557,7 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) { NEXT_TOKEN(pCxt->pSql, sToken); autoCreateTbl = true; } else if (!existedUsing) { - CHECK_CODE(getTableMeta(pCxt, tbNum, &name, dbFName)); + CHECK_CODE(getTableMeta(pCxt, tbNum, &name)); if (TSDB_SUPER_TABLE == pCxt->pTableMeta->tableType) { return buildInvalidOperationMsg(&pCxt->msg, "insert data into super table is not supported"); } @@ -1577,17 +1598,22 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) { if (0 == sToken.n || (TK_NK_STRING != sToken.type && TK_NK_ID != sToken.type)) { return buildSyntaxErrMsg(&pCxt->msg, "file path is required following keyword FILE", sToken.z); } - CHECK_CODE(parseDataFromFile(pCxt, sToken, dataBuf)); + CHECK_CODE(parseDataFromFile(pCxt, tbNum, &name, sToken, dataBuf)); pCxt->pOutput->insertType = TSDB_QUERY_TYPE_FILE_INSERT; tbNum++; - continue; + if (!pCxt->pComCxt->needMultiParse) { + continue; + } else { + parserInfo("0x%" PRIx64 " insert from csv. File is too large, do it in batches.", pCxt->pComCxt->requestId); + break; + } } return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is expected", sToken.z); } - qDebug("0x%" PRIx64 " insert input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum); + parserInfo("0x%" PRIx64 " insert input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum); if (TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT)) { SParsedDataColInfo* tags = taosMemoryMalloc(sizeof(pCxt->tags)); @@ -1612,6 +1638,26 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) { return buildOutput(pCxt); } +static int32_t parseInsertBodyAgain(SInsertParseContext* pCxt) { + STableDataBlocks* dataBuf = NULL; + CHECK_CODE(getTableMeta(pCxt, pCxt->pComCxt->csvCxt.tableNo, &pCxt->pComCxt->csvCxt.tableName)); + CHECK_CODE(getDataBlockFromList(pCxt->pTableBlockHashObj, &pCxt->pTableMeta->uid, sizeof(pCxt->pTableMeta->uid), + TSDB_DEFAULT_PAYLOAD_SIZE, sizeof(SSubmitBlk), getTableInfo(pCxt->pTableMeta).rowSize, + pCxt->pTableMeta, &dataBuf, NULL, &pCxt->createTblReq)); + CHECK_CODE(parseDataFromFileAgain(pCxt, pCxt->pComCxt->csvCxt.tableNo, &pCxt->pComCxt->csvCxt.tableName, dataBuf)); + if (taosEOFFile(pCxt->pComCxt->csvCxt.fp)) { + CHECK_CODE(parseInsertBody(pCxt)); + pCxt->pComCxt->needMultiParse = false; + return TSDB_CODE_SUCCESS; + } + parserInfo("0x%" PRIx64 " insert again input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum); + // merge according to vgId + if (taosHashGetSize(pCxt->pTableBlockHashObj) > 0) { + CHECK_CODE(mergeTableDataBlocks(pCxt->pTableBlockHashObj, pCxt->pOutput->payloadType, &pCxt->pVgDataBlocks)); + } + return buildOutput(pCxt); +} + // INSERT INTO // tb_name // [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)] @@ -1621,7 +1667,7 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) { int32_t parseInsertSql(SParseContext* pContext, SQuery** pQuery, SParseMetaCache* pMetaCache) { SInsertParseContext context = { .pComCxt = pContext, - .pSql = (char*)pContext->pSql, + .pSql = pContext->needMultiParse ? (char*)pContext->csvCxt.pLastSqlPos : (char*)pContext->pSql, .msg = {.buf = pContext->pMsg, .len = pContext->msgLen}, .pTableMeta = NULL, .createTblReq = {0}, @@ -1691,10 +1737,16 @@ int32_t parseInsertSql(SParseContext* pContext, SQuery** pQuery, SParseMetaCache context.pOutput->payloadType = PAYLOAD_TYPE_KV; - int32_t code = skipInsertInto(&context.pSql, &context.msg); - if (TSDB_CODE_SUCCESS == code) { - code = parseInsertBody(&context); + int32_t code = TSDB_CODE_SUCCESS; + if (!context.pComCxt->needMultiParse) { + code = skipInsertInto(&context.pSql, &context.msg); + if (TSDB_CODE_SUCCESS == code) { + code = parseInsertBody(&context); + } + } else { + code = parseInsertBodyAgain(&context); } + if (TSDB_CODE_SUCCESS == code || NEED_CLIENT_HANDLE_ERROR(code)) { SName* pTable = taosHashIterate(context.pTableNameHashObj, NULL); while (NULL != pTable) { @@ -2469,9 +2521,9 @@ int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols pTableMeta->tableInfo.numOfTags); taosArrayDestroy(tagName); - smlHandle->tableExecHandle.createTblReq.ctb.name = taosMemoryMalloc(sTableNameLen + 1); - memcpy(smlHandle->tableExecHandle.createTblReq.ctb.name, sTableName, sTableNameLen); - smlHandle->tableExecHandle.createTblReq.ctb.name[sTableNameLen] = 0; + smlHandle->tableExecHandle.createTblReq.ctb.stbName = taosMemoryMalloc(sTableNameLen + 1); + memcpy(smlHandle->tableExecHandle.createTblReq.ctb.stbName, sTableName, sTableNameLen); + smlHandle->tableExecHandle.createTblReq.ctb.stbName[sTableNameLen] = 0; STableDataBlocks* pDataBlock = NULL; ret = getDataBlockFromList(smlHandle->pBlockHash, &pTableMeta->uid, sizeof(pTableMeta->uid), diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 882fa8950c..1c7ef05087 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2914,6 +2914,7 @@ static int32_t checkFill(STranslateContext* pCxt, SFillNode* pFill, SValueNode* } else { intervalRange = pInterval->datum.i; } + if ((timeRange == 0) || (timeRange / intervalRange) >= MAX_INTERVAL_TIME_WINDOW) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE); } @@ -3140,6 +3141,12 @@ static int32_t translateInterpEvery(STranslateContext* pCxt, SNode** pEvery) { code = translateExpr(pCxt, pEvery); } + int64_t interval = ((SValueNode*)(*pEvery))->datum.i; + if (interval == 0) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, + "Unsupported time unit in EVERY clause"); + } + return code; } @@ -5381,9 +5388,9 @@ static EDealRes rewriteSubtable(SNode** pNode, void* pContext) { found = true; break; } - if (!found) { - return generateDealNodeErrMsg(pCxt->pCxt, TSDB_CODE_PAR_INVALID_COLUMN, ((SColumnNode*)*pNode)->colName); - } + } + if (!found) { + return generateDealNodeErrMsg(pCxt->pCxt, TSDB_CODE_PAR_INVALID_COLUMN, ((SColumnNode*)*pNode)->colName); } return DEAL_RES_IGNORE_CHILD; } @@ -6454,7 +6461,7 @@ static void addCreateTbReqIntoVgroup(int32_t acctId, SHashObj* pVgroupHashmap, S } req.ctb.suid = suid; req.ctb.tagNum = tagNum; - req.ctb.name = strdup(sTableNmae); + req.ctb.stbName = strdup(sTableNmae); req.ctb.pTag = (uint8_t*)pTag; req.ctb.tagName = taosArrayDup(tagName); if (pStmt->ignoreExists) { diff --git a/source/libs/parser/src/parser.c b/source/libs/parser/src/parser.c index 2fe6ebfb79..748478778a 100644 --- a/source/libs/parser/src/parser.c +++ b/source/libs/parser/src/parser.c @@ -214,6 +214,16 @@ int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCata return code; } +void qDestroyParseContext(SParseContext* pCxt) { + if (NULL == pCxt) { + return; + } + + taosArrayDestroy(pCxt->pTableMetaPos); + taosArrayDestroy(pCxt->pTableVgroupPos); + taosMemoryFree(pCxt); +} + void qDestroyQuery(SQuery* pQueryNode) { nodesDestroyNode((SNode*)pQueryNode); } int32_t qExtractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pSchema) { diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index 9711aed4ba..aa44365b39 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -139,17 +139,17 @@ typedef union { #define ParseCTX_FETCH #define ParseCTX_STORE #define YYFALLBACK 1 -#define YYNSTATE 693 -#define YYNRULE 521 +#define YYNSTATE 695 +#define YYNRULE 523 #define YYNTOKEN 317 -#define YY_MAX_SHIFT 692 -#define YY_MIN_SHIFTREDUCE 1022 -#define YY_MAX_SHIFTREDUCE 1542 -#define YY_ERROR_ACTION 1543 -#define YY_ACCEPT_ACTION 1544 -#define YY_NO_ACTION 1545 -#define YY_MIN_REDUCE 1546 -#define YY_MAX_REDUCE 2066 +#define YY_MAX_SHIFT 694 +#define YY_MIN_SHIFTREDUCE 1026 +#define YY_MAX_SHIFTREDUCE 1548 +#define YY_ERROR_ACTION 1549 +#define YY_ACCEPT_ACTION 1550 +#define YY_NO_ACTION 1551 +#define YY_MIN_REDUCE 1552 +#define YY_MAX_REDUCE 2074 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -218,516 +218,516 @@ typedef union { *********** Begin parsing tables **********************************************/ #define YY_ACTTAB_COUNT (2993) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 1868, 1797, 447, 1868, 448, 1581, 455, 1882, 448, 1581, - /* 10 */ 1684, 1864, 44, 42, 1864, 354, 544, 394, 1738, 1740, - /* 20 */ 349, 1864, 1323, 43, 41, 40, 39, 38, 52, 2042, - /* 30 */ 34, 267, 585, 1403, 1348, 1321, 1900, 1860, 1866, 337, - /* 40 */ 1860, 1866, 343, 1349, 586, 1693, 1350, 1860, 1866, 1850, - /* 50 */ 592, 598, 30, 592, 1671, 310, 1398, 1055, 37, 36, - /* 60 */ 592, 17, 43, 41, 40, 39, 38, 1882, 1329, 44, - /* 70 */ 42, 1473, 1880, 40, 39, 38, 1916, 349, 570, 1323, - /* 80 */ 97, 1881, 1883, 602, 1885, 1886, 597, 1072, 592, 1071, - /* 90 */ 1403, 62, 1321, 168, 1, 1969, 1900, 1059, 1060, 342, - /* 100 */ 1965, 77, 483, 464, 599, 582, 46, 2037, 58, 1850, - /* 110 */ 585, 598, 173, 1398, 464, 125, 689, 1073, 17, 531, - /* 120 */ 1995, 1532, 569, 171, 1688, 1329, 334, 2038, 571, 1794, - /* 130 */ 1405, 1406, 600, 585, 132, 181, 1916, 1547, 154, 227, - /* 140 */ 98, 348, 1883, 602, 1885, 1886, 597, 1696, 592, 1900, - /* 150 */ 1072, 1, 1071, 1217, 1218, 1969, 58, 564, 109, 314, - /* 160 */ 1965, 108, 107, 106, 105, 104, 103, 102, 101, 100, - /* 170 */ 2037, 130, 74, 689, 58, 73, 1324, 58, 1322, 81, - /* 180 */ 1073, 58, 1669, 1569, 46, 569, 171, 1405, 1406, 266, - /* 190 */ 2038, 571, 584, 169, 1977, 1978, 563, 1982, 1739, 1740, - /* 200 */ 1327, 1328, 635, 1378, 1379, 1381, 1382, 1383, 1384, 1385, - /* 210 */ 1386, 1387, 1388, 594, 590, 1396, 1397, 1399, 1400, 1401, - /* 220 */ 1402, 1404, 1407, 3, 205, 1850, 233, 234, 1349, 633, - /* 230 */ 582, 159, 325, 1324, 1477, 1322, 1650, 387, 161, 386, - /* 240 */ 1348, 174, 635, 481, 477, 473, 469, 204, 145, 144, - /* 250 */ 630, 629, 628, 174, 156, 174, 1558, 1327, 1328, 132, - /* 260 */ 1378, 1379, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - /* 270 */ 594, 590, 1396, 1397, 1399, 1400, 1401, 1402, 1404, 1407, - /* 280 */ 3, 44, 42, 219, 78, 312, 167, 202, 534, 349, - /* 290 */ 335, 1323, 326, 1568, 324, 323, 130, 487, 154, 1732, - /* 300 */ 582, 489, 1403, 174, 1321, 1567, 109, 1695, 1348, 108, - /* 310 */ 107, 106, 105, 104, 103, 102, 101, 100, 170, 1977, - /* 320 */ 1978, 174, 1982, 488, 174, 1398, 565, 1745, 174, 132, - /* 330 */ 17, 1869, 560, 1882, 336, 1850, 232, 1329, 44, 42, - /* 340 */ 79, 312, 1864, 1743, 534, 1787, 349, 1850, 1323, 582, - /* 350 */ 201, 195, 47, 200, 452, 544, 179, 460, 94, 1403, - /* 360 */ 1346, 1321, 1900, 1, 544, 1413, 130, 119, 1860, 1866, - /* 370 */ 586, 1348, 127, 193, 485, 1850, 119, 598, 132, 1745, - /* 380 */ 1685, 592, 1398, 490, 1693, 689, 353, 17, 172, 1977, - /* 390 */ 1978, 395, 1982, 1693, 1329, 1743, 1301, 1302, 1880, 1405, - /* 400 */ 1406, 1499, 1916, 1546, 396, 352, 97, 1881, 1883, 602, - /* 410 */ 1885, 1886, 597, 154, 592, 121, 1135, 566, 561, 168, - /* 420 */ 1, 1969, 1695, 1434, 1380, 342, 1965, 118, 117, 116, - /* 430 */ 115, 114, 113, 112, 111, 110, 2042, 264, 1977, 581, - /* 440 */ 432, 580, 689, 77, 2037, 1324, 1996, 1322, 511, 1137, - /* 450 */ 355, 557, 1497, 1498, 1500, 1501, 1405, 1406, 154, 569, - /* 460 */ 171, 509, 1350, 507, 2038, 571, 1689, 1695, 1347, 1327, - /* 470 */ 1328, 1670, 1378, 1379, 1381, 1382, 1383, 1384, 1385, 1386, - /* 480 */ 1387, 1388, 594, 590, 1396, 1397, 1399, 1400, 1401, 1402, - /* 490 */ 1404, 1407, 3, 31, 11, 446, 185, 184, 450, 174, - /* 500 */ 494, 493, 1324, 1439, 1322, 1329, 1175, 624, 623, 622, - /* 510 */ 1179, 621, 1181, 1182, 620, 1184, 617, 1566, 1190, 614, - /* 520 */ 1192, 1193, 611, 608, 1984, 2042, 1327, 1328, 1532, 1378, - /* 530 */ 1379, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 594, - /* 540 */ 590, 1396, 1397, 1399, 1400, 1401, 1402, 1404, 1407, 3, - /* 550 */ 44, 42, 1981, 544, 2037, 1380, 660, 658, 349, 1850, - /* 560 */ 1323, 11, 1332, 9, 544, 176, 544, 627, 1565, 454, - /* 570 */ 2041, 1403, 450, 1321, 2038, 2040, 392, 633, 393, 1564, - /* 580 */ 37, 36, 1693, 1882, 43, 41, 40, 39, 38, 544, - /* 590 */ 13, 12, 1351, 1693, 1398, 1693, 145, 144, 630, 629, - /* 600 */ 628, 403, 1882, 1668, 544, 266, 1329, 44, 42, 1408, - /* 610 */ 1850, 544, 1900, 1563, 544, 349, 417, 1323, 1693, 1984, - /* 620 */ 599, 1850, 1745, 418, 1562, 1850, 462, 598, 1403, 1745, - /* 630 */ 1321, 1900, 8, 1693, 11, 546, 319, 1941, 1744, 599, - /* 640 */ 1693, 544, 226, 1693, 1850, 1743, 598, 1980, 600, 1561, - /* 650 */ 87, 1398, 1916, 463, 689, 1850, 294, 348, 1883, 602, - /* 660 */ 1885, 1886, 597, 1329, 592, 647, 1850, 1880, 1405, 1406, - /* 670 */ 1693, 1916, 1686, 1560, 570, 97, 1881, 1883, 602, 1885, - /* 680 */ 1886, 597, 80, 592, 1446, 1793, 2037, 307, 2057, 8, - /* 690 */ 1969, 1850, 37, 36, 342, 1965, 43, 41, 40, 39, - /* 700 */ 38, 569, 171, 2037, 2003, 1335, 2038, 571, 544, 633, - /* 710 */ 548, 689, 1941, 383, 1324, 1850, 1322, 1544, 569, 171, - /* 720 */ 356, 1059, 1060, 2038, 571, 1405, 1406, 26, 145, 144, - /* 730 */ 630, 629, 628, 385, 381, 243, 1557, 1693, 1327, 1328, - /* 740 */ 1682, 1378, 1379, 1381, 1382, 1383, 1384, 1385, 1386, 1387, - /* 750 */ 1388, 594, 590, 1396, 1397, 1399, 1400, 1401, 1402, 1404, - /* 760 */ 1407, 3, 37, 36, 544, 1678, 43, 41, 40, 39, - /* 770 */ 38, 1324, 220, 1322, 1787, 1723, 1690, 364, 1850, 174, - /* 780 */ 2041, 1351, 37, 36, 1556, 180, 43, 41, 40, 39, - /* 790 */ 38, 1611, 1555, 1693, 527, 1327, 1328, 7, 1378, 1379, - /* 800 */ 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 594, 590, - /* 810 */ 1396, 1397, 1399, 1400, 1401, 1402, 1404, 1407, 3, 44, - /* 820 */ 42, 544, 1323, 2037, 1554, 1553, 1850, 349, 574, 1323, - /* 830 */ 1552, 531, 1680, 137, 1850, 1321, 544, 1099, 2043, 171, - /* 840 */ 1403, 1795, 1321, 2038, 571, 1676, 1551, 32, 523, 1509, - /* 850 */ 1693, 1470, 1882, 37, 36, 497, 496, 43, 41, 40, - /* 860 */ 39, 38, 126, 1398, 1550, 1693, 1850, 1850, 1329, 2042, - /* 870 */ 1100, 1882, 1850, 492, 495, 1329, 44, 42, 544, 491, - /* 880 */ 544, 1900, 1984, 544, 349, 1792, 1323, 307, 1850, 599, - /* 890 */ 528, 1787, 237, 544, 1850, 540, 598, 1403, 2037, 1321, - /* 900 */ 1900, 8, 183, 1989, 1466, 542, 1850, 1693, 599, 1693, - /* 910 */ 1979, 1348, 1693, 1850, 2041, 598, 689, 1880, 2038, 2039, - /* 920 */ 1398, 1916, 1693, 689, 242, 157, 1881, 1883, 602, 1885, - /* 930 */ 1886, 597, 1329, 592, 489, 223, 1880, 1405, 1406, 1549, - /* 940 */ 1916, 544, 1539, 544, 97, 1881, 1883, 602, 1885, 1886, - /* 950 */ 597, 128, 592, 543, 1940, 268, 488, 2057, 1, 1969, - /* 960 */ 648, 593, 1663, 342, 1965, 631, 549, 2006, 1736, 522, - /* 970 */ 1693, 632, 1693, 2031, 1736, 1598, 1324, 626, 1322, 279, - /* 980 */ 689, 1850, 1723, 1324, 143, 1322, 48, 4, 210, 402, - /* 990 */ 212, 208, 45, 211, 1405, 1406, 214, 498, 1466, 213, - /* 1000 */ 1327, 1328, 1837, 216, 50, 526, 215, 1327, 1328, 1593, - /* 1010 */ 1378, 1379, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - /* 1020 */ 594, 590, 1396, 1397, 1399, 1400, 1401, 1402, 1404, 1407, - /* 1030 */ 3, 500, 1541, 1542, 577, 573, 51, 1538, 72, 1331, - /* 1040 */ 1324, 231, 1322, 1559, 1272, 575, 37, 36, 589, 371, - /* 1050 */ 43, 41, 40, 39, 38, 37, 36, 138, 2009, 43, - /* 1060 */ 41, 40, 39, 38, 1327, 1328, 1608, 1378, 1379, 1381, - /* 1070 */ 1382, 1383, 1384, 1385, 1386, 1387, 1388, 594, 590, 1396, - /* 1080 */ 1397, 1399, 1400, 1401, 1402, 1404, 1407, 3, 309, 1469, - /* 1090 */ 1346, 13, 12, 235, 93, 1380, 1591, 425, 261, 558, - /* 1100 */ 437, 641, 642, 1651, 90, 482, 37, 36, 142, 537, - /* 1110 */ 43, 41, 40, 39, 38, 143, 60, 410, 503, 438, - /* 1120 */ 247, 412, 60, 1119, 1117, 1587, 255, 45, 1901, 666, - /* 1130 */ 665, 664, 663, 359, 45, 662, 661, 133, 656, 655, - /* 1140 */ 654, 653, 652, 651, 650, 649, 147, 645, 644, 643, - /* 1150 */ 358, 357, 640, 639, 638, 637, 636, 155, 360, 1582, - /* 1160 */ 239, 1999, 285, 322, 1733, 583, 263, 1168, 1496, 260, - /* 1170 */ 2, 5, 250, 684, 1440, 398, 283, 66, 388, 1389, - /* 1180 */ 65, 365, 1334, 1871, 606, 142, 278, 1424, 275, 143, - /* 1190 */ 370, 122, 320, 1489, 142, 527, 189, 443, 441, 1288, - /* 1200 */ 182, 153, 397, 436, 401, 1882, 431, 430, 429, 428, + /* 0 */ 1876, 34, 267, 1876, 1805, 1059, 447, 1890, 448, 1587, + /* 10 */ 1692, 1872, 44, 42, 1872, 455, 394, 448, 1587, 1690, + /* 20 */ 349, 1872, 1329, 43, 41, 40, 39, 38, 1355, 40, + /* 30 */ 39, 38, 156, 1409, 1564, 1327, 1908, 1868, 1874, 337, + /* 40 */ 1868, 1874, 343, 587, 588, 1063, 1064, 1868, 1874, 1858, + /* 50 */ 594, 600, 30, 594, 310, 1575, 1404, 587, 37, 36, + /* 60 */ 594, 17, 43, 41, 40, 39, 38, 1890, 1335, 44, + /* 70 */ 42, 1479, 1888, 1076, 464, 1075, 1924, 349, 572, 1329, + /* 80 */ 97, 1889, 1891, 604, 1893, 1894, 599, 1574, 594, 2050, + /* 90 */ 1409, 637, 1327, 168, 1, 1977, 1908, 1858, 1355, 342, + /* 100 */ 1973, 587, 335, 1077, 601, 584, 1356, 2045, 1753, 1858, + /* 110 */ 154, 600, 173, 1404, 1573, 336, 691, 46, 17, 1703, + /* 120 */ 2003, 546, 571, 171, 1751, 1335, 1678, 2046, 573, 1858, + /* 130 */ 1411, 1412, 602, 52, 132, 1845, 1924, 1553, 1223, 1224, + /* 140 */ 98, 348, 1891, 604, 1893, 1894, 599, 533, 594, 354, + /* 150 */ 1701, 1, 1746, 1748, 334, 1977, 1858, 1802, 110, 314, + /* 160 */ 1973, 109, 108, 107, 106, 105, 104, 103, 102, 101, + /* 170 */ 2045, 130, 157, 691, 452, 46, 1330, 1656, 1328, 58, + /* 180 */ 1352, 1538, 371, 513, 1572, 571, 171, 1411, 1412, 227, + /* 190 */ 2046, 573, 586, 169, 1985, 1986, 511, 1990, 509, 1354, + /* 200 */ 1333, 1334, 1992, 1384, 1385, 1387, 1388, 1389, 1390, 1391, + /* 210 */ 1392, 1393, 1394, 596, 592, 1402, 1403, 1405, 1406, 1407, + /* 220 */ 1408, 1410, 1413, 3, 205, 446, 1858, 58, 450, 81, + /* 230 */ 1989, 454, 635, 1330, 450, 1328, 1617, 220, 161, 1676, + /* 240 */ 1731, 174, 1505, 481, 477, 473, 469, 204, 1877, 266, + /* 250 */ 47, 145, 144, 632, 631, 630, 629, 1333, 1334, 1872, + /* 260 */ 1384, 1385, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, + /* 270 */ 596, 592, 1402, 1403, 1405, 1406, 1407, 1408, 1410, 1413, + /* 280 */ 3, 44, 42, 11, 78, 1868, 1874, 202, 11, 349, + /* 290 */ 9, 1329, 559, 1503, 1504, 1506, 1507, 219, 594, 499, + /* 300 */ 498, 497, 1409, 584, 1327, 58, 110, 126, 493, 109, + /* 310 */ 108, 107, 106, 105, 104, 103, 102, 101, 492, 496, + /* 320 */ 567, 635, 174, 546, 491, 1404, 174, 62, 1747, 1748, + /* 330 */ 17, 2050, 132, 1890, 167, 176, 1679, 1335, 44, 42, + /* 340 */ 145, 144, 632, 631, 630, 635, 349, 1740, 1329, 584, + /* 350 */ 201, 195, 1701, 200, 79, 312, 1753, 460, 536, 1409, + /* 360 */ 2045, 1327, 1908, 1, 145, 144, 632, 631, 630, 130, + /* 370 */ 588, 1908, 1752, 193, 174, 1858, 2049, 600, 132, 566, + /* 380 */ 2046, 2048, 1404, 1141, 1354, 691, 387, 17, 386, 233, + /* 390 */ 234, 170, 1985, 1986, 1335, 1990, 464, 174, 1888, 1411, + /* 400 */ 1412, 87, 1924, 1552, 1353, 352, 97, 1889, 1891, 604, + /* 410 */ 1893, 1894, 599, 154, 594, 121, 1143, 58, 565, 168, + /* 420 */ 1, 1977, 1703, 1694, 546, 342, 1973, 119, 118, 117, + /* 430 */ 116, 115, 114, 113, 112, 111, 120, 264, 1985, 583, + /* 440 */ 77, 582, 691, 485, 2045, 1330, 2004, 1328, 312, 495, + /* 450 */ 494, 536, 174, 1701, 125, 1753, 1411, 1412, 58, 571, + /* 460 */ 171, 1571, 353, 1696, 2046, 573, 548, 1686, 1949, 1333, + /* 470 */ 1334, 1751, 1384, 1385, 1387, 1388, 1389, 1390, 1391, 1392, + /* 480 */ 1393, 1394, 596, 592, 1402, 1403, 1405, 1406, 1407, 1408, + /* 490 */ 1410, 1413, 3, 562, 11, 550, 1801, 1949, 307, 432, + /* 500 */ 662, 660, 1330, 1858, 1328, 77, 1181, 626, 625, 624, + /* 510 */ 1185, 623, 1187, 1188, 622, 1190, 619, 1570, 1196, 616, + /* 520 */ 1198, 1199, 613, 610, 1569, 2050, 1333, 1334, 1697, 1384, + /* 530 */ 1385, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 596, + /* 540 */ 592, 1402, 1403, 1405, 1406, 1407, 1408, 1410, 1413, 3, + /* 550 */ 44, 42, 533, 546, 2045, 185, 184, 1568, 349, 1858, + /* 560 */ 1329, 1076, 1803, 1075, 174, 120, 1858, 1992, 1063, 1064, + /* 570 */ 2049, 1409, 490, 1327, 2046, 2047, 483, 383, 568, 563, + /* 580 */ 37, 36, 1701, 1890, 43, 41, 40, 39, 38, 546, + /* 590 */ 1483, 1077, 1357, 1992, 1404, 1988, 1354, 385, 381, 1858, + /* 600 */ 128, 392, 1890, 1948, 546, 174, 1335, 44, 42, 1414, + /* 610 */ 181, 546, 1908, 1567, 546, 349, 393, 1329, 1701, 524, + /* 620 */ 601, 1987, 325, 403, 2049, 1858, 417, 600, 1409, 1753, + /* 630 */ 1327, 1908, 8, 1701, 1335, 1440, 319, 546, 1356, 601, + /* 640 */ 1701, 546, 649, 1701, 1858, 1751, 600, 74, 602, 418, + /* 650 */ 73, 1404, 1924, 462, 691, 1858, 294, 348, 1891, 604, + /* 660 */ 1893, 1894, 599, 1335, 594, 1476, 1701, 1888, 1411, 1412, + /* 670 */ 1701, 1924, 232, 2050, 572, 97, 1889, 1891, 604, 1893, + /* 680 */ 1894, 599, 326, 594, 324, 323, 2045, 487, 2065, 8, + /* 690 */ 1977, 489, 37, 36, 342, 1973, 43, 41, 40, 39, + /* 700 */ 38, 571, 171, 2045, 2011, 31, 2046, 573, 546, 395, + /* 710 */ 1795, 691, 1677, 488, 1330, 1445, 1328, 1550, 571, 171, + /* 720 */ 268, 179, 396, 2046, 573, 1411, 1412, 26, 1419, 1795, + /* 730 */ 13, 12, 1307, 1308, 1354, 243, 1566, 1701, 1333, 1334, + /* 740 */ 180, 1384, 1385, 1387, 1388, 1389, 1390, 1391, 1392, 1393, + /* 750 */ 1394, 596, 592, 1402, 1403, 1405, 1406, 1407, 1408, 1410, + /* 760 */ 1413, 3, 37, 36, 546, 1538, 43, 41, 40, 39, + /* 770 */ 38, 1330, 637, 1328, 1795, 489, 463, 364, 1858, 174, + /* 780 */ 1386, 266, 37, 36, 1563, 183, 43, 41, 40, 39, + /* 790 */ 38, 1357, 1562, 1701, 529, 1333, 1334, 488, 1384, 1385, + /* 800 */ 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 596, 592, + /* 810 */ 1402, 1403, 1405, 1406, 1407, 1408, 1410, 1413, 3, 44, + /* 820 */ 42, 546, 1329, 2045, 1452, 1354, 1858, 349, 1800, 1329, + /* 830 */ 307, 1997, 1472, 1698, 1858, 1327, 1561, 94, 2051, 171, + /* 840 */ 1409, 546, 1327, 2046, 573, 546, 1560, 499, 498, 497, + /* 850 */ 1701, 127, 1890, 137, 1688, 126, 493, 525, 650, 1693, + /* 860 */ 1671, 546, 1559, 1404, 1558, 1557, 492, 496, 1335, 1556, + /* 870 */ 1701, 1890, 491, 530, 1701, 1335, 44, 42, 1858, 575, + /* 880 */ 546, 1908, 1555, 546, 349, 576, 1329, 143, 1858, 601, + /* 890 */ 1701, 7, 237, 546, 1858, 542, 600, 1409, 1684, 1327, + /* 900 */ 1908, 8, 355, 1475, 1858, 544, 1858, 1858, 601, 1701, + /* 910 */ 154, 1858, 1701, 1858, 226, 600, 691, 1888, 1386, 1703, + /* 920 */ 1404, 1924, 1701, 691, 1858, 158, 1889, 1891, 604, 1893, + /* 930 */ 1894, 599, 1335, 594, 242, 402, 1888, 1411, 1412, 51, + /* 940 */ 1924, 546, 1545, 546, 97, 1889, 1891, 604, 1893, 1894, + /* 950 */ 599, 154, 594, 545, 80, 356, 223, 2065, 1, 1977, + /* 960 */ 1704, 595, 633, 342, 1973, 1744, 551, 2014, 634, 591, + /* 970 */ 1701, 1744, 1701, 2039, 279, 1604, 1330, 1731, 1328, 45, + /* 980 */ 691, 48, 4, 1330, 72, 1328, 210, 212, 214, 208, + /* 990 */ 211, 213, 231, 216, 1411, 1412, 215, 500, 50, 528, + /* 1000 */ 1333, 1334, 1547, 1548, 13, 12, 138, 1333, 1334, 1386, + /* 1010 */ 1384, 1385, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, + /* 1020 */ 596, 592, 1402, 1403, 1405, 1406, 1407, 1408, 1410, 1413, + /* 1030 */ 3, 1278, 628, 1657, 1565, 579, 1338, 1544, 1599, 1597, + /* 1040 */ 1330, 142, 1328, 32, 235, 2017, 1879, 60, 261, 37, + /* 1050 */ 36, 143, 60, 43, 41, 40, 39, 38, 539, 1337, + /* 1060 */ 502, 505, 1103, 247, 1333, 1334, 1614, 1384, 1385, 1387, + /* 1070 */ 1388, 1389, 1390, 1391, 1392, 1393, 1394, 596, 592, 1402, + /* 1080 */ 1403, 1405, 1406, 1407, 1408, 1410, 1413, 3, 309, 482, + /* 1090 */ 1352, 93, 1472, 239, 1881, 1104, 643, 425, 644, 1446, + /* 1100 */ 437, 90, 577, 1174, 1502, 255, 37, 36, 1430, 560, + /* 1110 */ 43, 41, 40, 39, 38, 250, 45, 410, 1123, 438, + /* 1120 */ 1121, 412, 1909, 360, 1588, 1741, 2007, 585, 263, 668, + /* 1130 */ 667, 666, 665, 359, 45, 664, 663, 133, 658, 657, + /* 1140 */ 656, 655, 654, 653, 652, 651, 147, 647, 646, 645, + /* 1150 */ 358, 357, 642, 641, 640, 639, 638, 155, 260, 2, + /* 1160 */ 5, 370, 285, 322, 365, 320, 37, 36, 1395, 1294, + /* 1170 */ 43, 41, 40, 39, 38, 398, 283, 66, 388, 1341, + /* 1180 */ 65, 1593, 275, 608, 37, 36, 278, 182, 43, 41, + /* 1190 */ 40, 39, 38, 1515, 142, 529, 189, 443, 441, 1352, + /* 1200 */ 397, 401, 1340, 436, 419, 1890, 431, 430, 429, 428, /* 1210 */ 427, 424, 423, 422, 421, 420, 416, 415, 414, 413, - /* 1220 */ 407, 406, 405, 404, 2037, 400, 399, 321, 1346, 419, - /* 1230 */ 426, 1873, 1789, 58, 1900, 433, 1196, 1200, 434, 2043, - /* 1240 */ 171, 1207, 599, 1205, 2038, 571, 146, 1850, 435, 598, - /* 1250 */ 440, 37, 36, 578, 439, 43, 41, 40, 39, 38, - /* 1260 */ 186, 1352, 442, 444, 445, 453, 1354, 457, 192, 456, - /* 1270 */ 1880, 96, 194, 1353, 1916, 458, 1355, 197, 97, 1881, - /* 1280 */ 1883, 602, 1885, 1886, 597, 459, 592, 497, 496, 129, - /* 1290 */ 461, 141, 1940, 1969, 126, 199, 75, 342, 1965, 76, - /* 1300 */ 465, 530, 203, 362, 315, 492, 495, 71, 70, 391, - /* 1310 */ 361, 491, 178, 120, 484, 486, 1882, 1683, 527, 311, - /* 1320 */ 527, 1828, 207, 1679, 514, 209, 148, 527, 149, 308, - /* 1330 */ 1681, 1677, 379, 276, 377, 373, 369, 366, 363, 150, - /* 1340 */ 516, 221, 151, 518, 517, 1900, 1432, 2037, 224, 2037, - /* 1350 */ 521, 524, 529, 599, 331, 556, 2037, 228, 1850, 538, - /* 1360 */ 598, 515, 2043, 171, 2043, 171, 139, 2038, 571, 2038, - /* 1370 */ 571, 2043, 171, 140, 532, 1827, 2038, 571, 527, 1799, - /* 1380 */ 174, 1880, 535, 333, 84, 1916, 539, 277, 86, 97, - /* 1390 */ 1881, 1883, 602, 1885, 1886, 597, 1694, 592, 1351, 2000, - /* 1400 */ 2010, 1433, 2057, 552, 1969, 559, 245, 2037, 342, 1965, - /* 1410 */ 692, 554, 2015, 555, 338, 249, 6, 2014, 1988, 562, - /* 1420 */ 254, 1882, 2043, 171, 274, 568, 553, 2038, 571, 551, - /* 1430 */ 550, 1991, 162, 256, 339, 259, 579, 257, 165, 576, - /* 1440 */ 1466, 258, 131, 682, 678, 674, 670, 272, 1350, 57, - /* 1450 */ 1900, 1985, 88, 604, 2060, 1950, 1737, 1664, 599, 280, - /* 1460 */ 271, 2036, 685, 1850, 1882, 598, 49, 262, 686, 688, - /* 1470 */ 306, 33, 346, 1427, 1428, 1429, 1430, 1431, 1435, 1436, - /* 1480 */ 1437, 1438, 284, 292, 95, 282, 1880, 240, 1844, 1843, - /* 1490 */ 1916, 68, 303, 1900, 97, 1881, 1883, 602, 1885, 1886, - /* 1500 */ 597, 599, 592, 302, 1842, 1841, 1850, 1944, 598, 1969, - /* 1510 */ 69, 345, 344, 342, 1965, 1838, 367, 1882, 368, 1315, - /* 1520 */ 541, 1337, 1316, 372, 1836, 177, 374, 375, 376, 1880, - /* 1530 */ 1835, 378, 1403, 1916, 1330, 1834, 380, 97, 1881, 1883, - /* 1540 */ 602, 1885, 1886, 597, 384, 592, 1900, 1833, 382, 1832, - /* 1550 */ 1942, 1291, 1969, 229, 599, 1398, 342, 1965, 1290, 1850, - /* 1560 */ 1810, 598, 1809, 1808, 389, 390, 1807, 1329, 1782, 1260, - /* 1570 */ 1882, 1295, 1781, 222, 1779, 134, 1778, 1777, 1780, 135, - /* 1580 */ 1776, 1775, 1880, 1774, 1773, 1772, 1916, 1771, 408, 409, - /* 1590 */ 97, 1881, 1883, 602, 1885, 1886, 597, 1770, 592, 1900, - /* 1600 */ 411, 1769, 1768, 547, 1262, 1969, 1767, 599, 1766, 342, - /* 1610 */ 1965, 1765, 1850, 1882, 598, 588, 1764, 1763, 1762, 1761, - /* 1620 */ 1760, 1759, 1758, 1757, 1756, 1755, 1754, 1753, 136, 1752, - /* 1630 */ 1751, 1750, 1749, 1748, 1747, 1880, 1746, 1613, 1143, 1916, - /* 1640 */ 1612, 1610, 1900, 98, 1881, 1883, 602, 1885, 1886, 597, - /* 1650 */ 599, 592, 187, 1578, 188, 1850, 190, 598, 1969, 1062, - /* 1660 */ 1061, 449, 1968, 1965, 198, 1805, 1882, 123, 1577, 1823, - /* 1670 */ 1817, 1806, 1791, 1672, 124, 1338, 1609, 1333, 1880, 1607, - /* 1680 */ 1605, 166, 1916, 191, 466, 451, 98, 1881, 1883, 602, - /* 1690 */ 1885, 1886, 597, 196, 592, 1900, 468, 467, 470, 1341, - /* 1700 */ 1343, 1969, 471, 596, 1092, 587, 1965, 1603, 1850, 474, - /* 1710 */ 598, 1601, 1590, 590, 1396, 1397, 1399, 1400, 1401, 1402, - /* 1720 */ 472, 476, 1882, 478, 475, 479, 480, 1589, 1574, 1674, - /* 1730 */ 1211, 1880, 1210, 1673, 1134, 1916, 1133, 657, 1130, 300, - /* 1740 */ 1881, 1883, 602, 1885, 1886, 597, 595, 592, 545, 1934, - /* 1750 */ 1129, 1900, 659, 206, 59, 1599, 1128, 327, 1594, 599, - /* 1760 */ 328, 1592, 501, 329, 1850, 504, 598, 1573, 1572, 1571, - /* 1770 */ 510, 99, 506, 1822, 508, 53, 1816, 1297, 1307, 25, - /* 1780 */ 1804, 519, 1802, 1803, 1882, 18, 152, 1880, 1801, 502, - /* 1790 */ 2042, 1916, 1800, 230, 1798, 158, 1881, 1883, 602, 1885, - /* 1800 */ 1886, 597, 236, 592, 512, 1305, 1790, 520, 225, 90, - /* 1810 */ 82, 83, 241, 1900, 85, 1415, 10, 19, 218, 330, - /* 1820 */ 536, 599, 20, 525, 1414, 238, 1850, 1511, 598, 56, - /* 1830 */ 253, 61, 505, 15, 27, 1871, 499, 244, 252, 246, - /* 1840 */ 1493, 217, 1882, 248, 29, 1495, 160, 572, 2058, 1880, - /* 1850 */ 533, 251, 22, 1916, 28, 21, 89, 98, 1881, 1883, - /* 1860 */ 602, 1885, 1886, 597, 1882, 592, 1488, 1526, 1525, 340, - /* 1870 */ 1531, 1900, 1969, 1532, 1530, 1529, 332, 1966, 64, 599, - /* 1880 */ 341, 63, 265, 1870, 1850, 1463, 598, 55, 1462, 163, - /* 1890 */ 12, 1339, 1425, 1900, 1919, 164, 175, 1393, 591, 35, - /* 1900 */ 54, 596, 1391, 1390, 14, 16, 1850, 1880, 598, 23, - /* 1910 */ 24, 1916, 1363, 1371, 1197, 301, 1881, 1883, 602, 1885, - /* 1920 */ 1886, 597, 605, 592, 1882, 601, 603, 351, 609, 1880, - /* 1930 */ 1194, 612, 607, 1916, 615, 610, 613, 300, 1881, 1883, - /* 1940 */ 602, 1885, 1886, 597, 618, 592, 1191, 1935, 1185, 616, - /* 1950 */ 1174, 1183, 619, 1900, 625, 91, 92, 1206, 67, 269, - /* 1960 */ 1202, 599, 1090, 634, 1189, 1188, 1850, 1882, 598, 1125, - /* 1970 */ 1187, 1124, 1186, 1141, 1123, 1122, 1121, 1120, 1118, 1116, - /* 1980 */ 1115, 1114, 1110, 1108, 1882, 646, 1112, 1111, 1109, 1880, - /* 1990 */ 270, 1107, 1106, 1916, 1105, 1138, 1900, 157, 1881, 1883, - /* 2000 */ 602, 1885, 1886, 597, 599, 592, 1136, 1102, 1101, 1850, - /* 2010 */ 1098, 598, 1097, 1900, 1096, 1095, 1606, 667, 669, 1604, - /* 2020 */ 671, 599, 673, 668, 1602, 672, 1850, 677, 598, 675, - /* 2030 */ 1600, 676, 1880, 679, 680, 681, 1916, 1588, 1882, 2007, - /* 2040 */ 296, 1881, 1883, 602, 1885, 1886, 597, 683, 592, 1880, - /* 2050 */ 1052, 1570, 687, 1916, 273, 1325, 1882, 158, 1881, 1883, - /* 2060 */ 602, 1885, 1886, 597, 281, 592, 690, 1900, 691, 1545, - /* 2070 */ 1545, 1545, 347, 1545, 1545, 599, 1545, 1545, 1545, 1545, - /* 2080 */ 1850, 1545, 598, 1545, 567, 1900, 1545, 1545, 1545, 1545, - /* 2090 */ 350, 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, - /* 2100 */ 598, 1545, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, - /* 2110 */ 2059, 301, 1881, 1883, 602, 1885, 1886, 597, 1882, 592, - /* 2120 */ 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1545, 301, - /* 2130 */ 1881, 1883, 602, 1885, 1886, 597, 1545, 592, 1545, 1545, - /* 2140 */ 1545, 1545, 1882, 1545, 1545, 1545, 1545, 1900, 1545, 1545, - /* 2150 */ 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, - /* 2160 */ 1850, 1545, 598, 1545, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2170 */ 1545, 1900, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 599, - /* 2180 */ 1545, 1545, 1545, 513, 1850, 1882, 598, 1916, 1545, 1545, - /* 2190 */ 1545, 294, 1881, 1883, 602, 1885, 1886, 597, 1545, 592, - /* 2200 */ 1545, 1545, 1545, 1545, 1545, 1882, 1545, 1880, 1545, 1545, - /* 2210 */ 1545, 1916, 1545, 1545, 1900, 286, 1881, 1883, 602, 1885, - /* 2220 */ 1886, 597, 599, 592, 1545, 1545, 1545, 1850, 1545, 598, - /* 2230 */ 1545, 1545, 1545, 1545, 1900, 1545, 1545, 1545, 1545, 1545, - /* 2240 */ 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, 598, - /* 2250 */ 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1545, 287, 1881, - /* 2260 */ 1883, 602, 1885, 1886, 597, 1545, 592, 1545, 1882, 1545, - /* 2270 */ 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1545, 288, 1881, - /* 2280 */ 1883, 602, 1885, 1886, 597, 1545, 592, 1882, 1545, 1545, - /* 2290 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1900, 1545, 1545, - /* 2300 */ 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, - /* 2310 */ 1850, 1545, 598, 1545, 1545, 1545, 1900, 1545, 1545, 1545, - /* 2320 */ 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, - /* 2330 */ 1882, 598, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, - /* 2340 */ 1545, 295, 1881, 1883, 602, 1885, 1886, 597, 1545, 592, - /* 2350 */ 1545, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1900, - /* 2360 */ 297, 1881, 1883, 602, 1885, 1886, 597, 599, 592, 1545, - /* 2370 */ 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, 1545, 1545, - /* 2380 */ 1545, 1882, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2390 */ 1545, 1545, 1545, 1545, 1545, 1880, 1545, 1545, 1545, 1916, - /* 2400 */ 1545, 1882, 1545, 289, 1881, 1883, 602, 1885, 1886, 597, - /* 2410 */ 1900, 592, 1545, 1545, 1545, 1545, 1545, 1545, 599, 1545, - /* 2420 */ 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, 1545, - /* 2430 */ 1900, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 599, 1545, - /* 2440 */ 1545, 1545, 1545, 1850, 1545, 598, 1880, 1545, 1545, 1545, - /* 2450 */ 1916, 1545, 1882, 1545, 298, 1881, 1883, 602, 1885, 1886, - /* 2460 */ 597, 1545, 592, 1545, 1545, 1545, 1880, 1545, 1545, 1545, - /* 2470 */ 1916, 1545, 1545, 1545, 290, 1881, 1883, 602, 1885, 1886, - /* 2480 */ 597, 1900, 592, 1545, 1545, 1545, 1545, 1545, 1545, 599, - /* 2490 */ 1545, 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, - /* 2500 */ 1545, 1545, 1545, 1545, 1545, 1882, 1545, 1545, 1545, 1545, - /* 2510 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1880, 1545, 1545, - /* 2520 */ 1545, 1916, 1545, 1545, 1545, 299, 1881, 1883, 602, 1885, - /* 2530 */ 1886, 597, 1545, 592, 1900, 1545, 1545, 1545, 1545, 1545, - /* 2540 */ 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, 1882, 598, - /* 2550 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2560 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1882, 1545, - /* 2570 */ 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1900, 291, 1881, - /* 2580 */ 1883, 602, 1885, 1886, 597, 599, 592, 1545, 1545, 1545, - /* 2590 */ 1850, 1545, 598, 1545, 1545, 1545, 1545, 1900, 1545, 1545, - /* 2600 */ 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, - /* 2610 */ 1850, 1545, 598, 1880, 1545, 1545, 1545, 1916, 1545, 1545, - /* 2620 */ 1545, 304, 1881, 1883, 602, 1885, 1886, 597, 1545, 592, - /* 2630 */ 1545, 1882, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, - /* 2640 */ 1545, 305, 1881, 1883, 602, 1885, 1886, 597, 1545, 592, - /* 2650 */ 1882, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2660 */ 1900, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 599, 1545, - /* 2670 */ 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, 1900, - /* 2680 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, - /* 2690 */ 1545, 1545, 1850, 1882, 598, 1545, 1880, 1545, 1545, 1545, - /* 2700 */ 1916, 1545, 1545, 1545, 1894, 1881, 1883, 602, 1885, 1886, - /* 2710 */ 597, 1545, 592, 1545, 1545, 1880, 1545, 1545, 1545, 1916, - /* 2720 */ 1545, 1545, 1900, 1893, 1881, 1883, 602, 1885, 1886, 597, - /* 2730 */ 599, 592, 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, - /* 2740 */ 1545, 1545, 1545, 1545, 1882, 1545, 1545, 1545, 1545, 1545, - /* 2750 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1880, 1545, - /* 2760 */ 1545, 1545, 1916, 1545, 1882, 1545, 1892, 1881, 1883, 602, - /* 2770 */ 1885, 1886, 597, 1900, 592, 1545, 1545, 1545, 1545, 1545, - /* 2780 */ 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, 598, 1545, - /* 2790 */ 1545, 1545, 1545, 1900, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2800 */ 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, 598, 1880, - /* 2810 */ 1545, 1545, 1545, 1916, 1545, 1882, 1545, 316, 1881, 1883, - /* 2820 */ 602, 1885, 1886, 597, 1545, 592, 1545, 1545, 1545, 1880, - /* 2830 */ 1545, 1545, 1545, 1916, 1545, 1545, 1545, 317, 1881, 1883, - /* 2840 */ 602, 1885, 1886, 597, 1900, 592, 1545, 1545, 1545, 1545, - /* 2850 */ 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, 598, - /* 2860 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1882, 1545, - /* 2870 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2880 */ 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1545, 313, 1881, - /* 2890 */ 1883, 602, 1885, 1886, 597, 1545, 592, 1900, 1545, 1545, - /* 2900 */ 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, - /* 2910 */ 1850, 1882, 598, 1545, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2920 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2930 */ 1545, 1545, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, - /* 2940 */ 1900, 318, 1881, 1883, 602, 1885, 1886, 597, 599, 592, - /* 2950 */ 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, 1545, - /* 2960 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, - /* 2970 */ 1545, 1545, 1545, 1545, 1545, 1545, 1880, 1545, 1545, 1545, - /* 2980 */ 1916, 1545, 1545, 1545, 293, 1881, 1883, 602, 1885, 1886, - /* 2990 */ 597, 1545, 592, + /* 1220 */ 407, 406, 405, 404, 2045, 400, 399, 321, 1797, 686, + /* 1230 */ 426, 440, 434, 58, 1908, 1202, 143, 433, 122, 2051, + /* 1240 */ 171, 435, 601, 186, 2046, 573, 1206, 1858, 439, 600, + /* 1250 */ 142, 37, 36, 1495, 580, 43, 41, 40, 39, 38, + /* 1260 */ 442, 1358, 444, 445, 453, 1360, 456, 192, 457, 194, + /* 1270 */ 1888, 96, 1359, 1361, 1924, 458, 459, 197, 97, 1889, + /* 1280 */ 1891, 604, 1893, 1894, 599, 461, 594, 199, 1213, 129, + /* 1290 */ 1211, 141, 1948, 1977, 75, 465, 76, 342, 1973, 484, + /* 1300 */ 203, 532, 146, 362, 315, 486, 1691, 71, 70, 391, + /* 1310 */ 361, 100, 178, 311, 207, 1687, 1890, 516, 529, 209, + /* 1320 */ 529, 148, 149, 1689, 518, 1685, 276, 529, 150, 308, + /* 1330 */ 151, 1836, 379, 519, 377, 373, 369, 366, 363, 153, + /* 1340 */ 221, 520, 523, 224, 526, 1908, 1438, 2045, 228, 2045, + /* 1350 */ 531, 558, 139, 601, 140, 534, 2045, 541, 1858, 540, + /* 1360 */ 600, 517, 2051, 171, 2051, 171, 331, 2046, 573, 2046, + /* 1370 */ 573, 2051, 171, 1835, 1807, 84, 2046, 573, 529, 537, + /* 1380 */ 174, 1888, 277, 333, 86, 1924, 1702, 1357, 554, 97, + /* 1390 */ 1889, 1891, 604, 1893, 1894, 599, 561, 594, 2008, 2018, + /* 1400 */ 2023, 1439, 2065, 245, 1977, 556, 557, 2045, 342, 1973, + /* 1410 */ 694, 338, 249, 564, 2022, 6, 570, 254, 1996, 555, + /* 1420 */ 1999, 1890, 2051, 171, 274, 553, 257, 2046, 573, 552, + /* 1430 */ 339, 162, 581, 256, 259, 131, 2044, 2068, 165, 578, + /* 1440 */ 258, 1472, 1356, 684, 680, 676, 672, 272, 1993, 57, + /* 1450 */ 1908, 88, 606, 1958, 1745, 1672, 262, 280, 601, 584, + /* 1460 */ 271, 687, 49, 1858, 1890, 600, 688, 292, 690, 306, + /* 1470 */ 303, 33, 346, 1433, 1434, 1435, 1436, 1437, 1441, 1442, + /* 1480 */ 1443, 1444, 284, 1852, 95, 302, 1888, 240, 132, 1851, + /* 1490 */ 1924, 68, 282, 1908, 97, 1889, 1891, 604, 1893, 1894, + /* 1500 */ 599, 601, 594, 1850, 1849, 69, 1858, 1952, 600, 1977, + /* 1510 */ 1846, 345, 344, 342, 1973, 367, 368, 1890, 372, 1321, + /* 1520 */ 543, 1343, 1322, 177, 1844, 130, 374, 375, 376, 1888, + /* 1530 */ 1843, 378, 1409, 1924, 1336, 1842, 380, 97, 1889, 1891, + /* 1540 */ 604, 1893, 1894, 599, 384, 594, 1908, 172, 1985, 1986, + /* 1550 */ 1950, 1990, 1977, 229, 601, 1404, 342, 1973, 1841, 1858, + /* 1560 */ 382, 600, 1840, 1297, 1296, 1818, 1817, 1335, 389, 390, + /* 1570 */ 1890, 1301, 1816, 222, 1815, 1266, 1790, 1789, 1787, 134, + /* 1580 */ 1786, 1785, 1888, 1788, 135, 1784, 1924, 1783, 1782, 1781, + /* 1590 */ 97, 1889, 1891, 604, 1893, 1894, 599, 1780, 594, 1908, + /* 1600 */ 1779, 408, 409, 549, 411, 1977, 1778, 601, 1777, 342, + /* 1610 */ 1973, 1776, 1858, 1890, 600, 590, 1775, 1774, 1773, 1772, + /* 1620 */ 1771, 1770, 1769, 1768, 1767, 1766, 1765, 1764, 136, 1763, + /* 1630 */ 1762, 1761, 1760, 1759, 1758, 1888, 1268, 1757, 1756, 1924, + /* 1640 */ 1755, 1754, 1908, 98, 1889, 1891, 604, 1893, 1894, 599, + /* 1650 */ 601, 594, 1619, 1618, 187, 1858, 1616, 600, 1977, 188, + /* 1660 */ 1584, 449, 1976, 1973, 1066, 1065, 1890, 123, 1583, 1831, + /* 1670 */ 1149, 1825, 1814, 198, 1813, 1344, 1799, 1339, 1888, 166, + /* 1680 */ 1680, 190, 1924, 191, 124, 196, 98, 1889, 1891, 604, + /* 1690 */ 1893, 1894, 599, 1615, 594, 1908, 1613, 466, 468, 1347, + /* 1700 */ 1349, 1977, 467, 598, 451, 589, 1973, 1611, 1858, 472, + /* 1710 */ 600, 1096, 470, 592, 1402, 1403, 1405, 1406, 1407, 1408, + /* 1720 */ 471, 1609, 1890, 474, 476, 475, 1607, 478, 479, 480, + /* 1730 */ 1596, 1888, 1595, 1580, 1682, 1924, 1217, 1216, 1681, 300, + /* 1740 */ 1889, 1891, 604, 1893, 1894, 599, 597, 594, 547, 1942, + /* 1750 */ 1133, 1908, 1140, 659, 1139, 1138, 661, 59, 206, 601, + /* 1760 */ 1135, 1605, 1134, 327, 1858, 1600, 600, 328, 1598, 329, + /* 1770 */ 1132, 503, 506, 1579, 508, 1578, 1577, 510, 512, 99, + /* 1780 */ 1830, 1313, 1824, 25, 1890, 1303, 152, 1888, 521, 504, + /* 1790 */ 1812, 1924, 1810, 1811, 2050, 159, 1889, 1891, 604, 1893, + /* 1800 */ 1894, 599, 1809, 594, 514, 53, 1808, 522, 225, 230, + /* 1810 */ 18, 1806, 1311, 1908, 1798, 90, 241, 236, 218, 1421, + /* 1820 */ 83, 601, 19, 82, 330, 85, 1858, 538, 600, 20, + /* 1830 */ 527, 10, 507, 1420, 238, 15, 501, 27, 56, 1517, + /* 1840 */ 244, 217, 1890, 246, 1499, 248, 160, 574, 2066, 1888, + /* 1850 */ 1501, 535, 251, 1924, 28, 252, 253, 98, 1889, 1891, + /* 1860 */ 604, 1893, 1894, 599, 1890, 594, 1494, 1879, 89, 29, + /* 1870 */ 61, 1908, 1977, 1537, 22, 1532, 332, 1974, 64, 601, + /* 1880 */ 1531, 63, 1538, 340, 1858, 1536, 600, 1535, 341, 1469, + /* 1890 */ 265, 1468, 55, 1908, 12, 1345, 1399, 1878, 1431, 1927, + /* 1900 */ 163, 598, 593, 164, 1397, 175, 1858, 1888, 600, 35, + /* 1910 */ 14, 1924, 21, 1396, 23, 301, 1889, 1891, 604, 1893, + /* 1920 */ 1894, 599, 54, 594, 1890, 1369, 1377, 16, 24, 1888, + /* 1930 */ 605, 1203, 607, 1924, 351, 609, 611, 300, 1889, 1891, + /* 1940 */ 604, 1893, 1894, 599, 614, 594, 617, 1943, 620, 1180, + /* 1950 */ 1200, 1197, 612, 1908, 615, 603, 1191, 618, 1212, 1189, + /* 1960 */ 621, 601, 269, 1208, 1195, 1194, 1858, 1890, 600, 91, + /* 1970 */ 92, 67, 1094, 636, 1129, 627, 1147, 1128, 1127, 1126, + /* 1980 */ 1193, 1125, 1124, 270, 1890, 1122, 1192, 1120, 1119, 1888, + /* 1990 */ 1118, 648, 1116, 1924, 1115, 1114, 1908, 158, 1889, 1891, + /* 2000 */ 604, 1893, 1894, 599, 601, 594, 1113, 1112, 1100, 1858, + /* 2010 */ 1111, 600, 1110, 1908, 1109, 1142, 1106, 1144, 1105, 1102, + /* 2020 */ 1612, 601, 1101, 1099, 669, 670, 1858, 1610, 600, 671, + /* 2030 */ 673, 675, 1888, 1608, 677, 679, 1924, 1606, 1890, 2015, + /* 2040 */ 296, 1889, 1891, 604, 1893, 1894, 599, 674, 594, 1888, + /* 2050 */ 678, 681, 682, 1924, 683, 1594, 1890, 159, 1889, 1891, + /* 2060 */ 604, 1893, 1894, 599, 685, 594, 1056, 1908, 1576, 273, + /* 2070 */ 689, 692, 347, 1331, 281, 601, 693, 1551, 1551, 1551, + /* 2080 */ 1858, 1551, 600, 1551, 569, 1908, 1551, 1551, 1551, 1551, + /* 2090 */ 350, 1551, 1551, 601, 1551, 1551, 1551, 1551, 1858, 1551, + /* 2100 */ 600, 1551, 1551, 1888, 1551, 1551, 1551, 1924, 1551, 1551, + /* 2110 */ 2067, 301, 1889, 1891, 604, 1893, 1894, 599, 1890, 594, + /* 2120 */ 1551, 1888, 1551, 1551, 1551, 1924, 1551, 1551, 1551, 301, + /* 2130 */ 1889, 1891, 604, 1893, 1894, 599, 1551, 594, 1551, 1551, + /* 2140 */ 1551, 1551, 1890, 1551, 1551, 1551, 1551, 1908, 1551, 1551, + /* 2150 */ 1551, 1551, 1551, 1551, 1551, 601, 1551, 1551, 1551, 1551, + /* 2160 */ 1858, 1551, 600, 1551, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2170 */ 1551, 1908, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 601, + /* 2180 */ 1551, 1551, 1551, 515, 1858, 1890, 600, 1924, 1551, 1551, + /* 2190 */ 1551, 294, 1889, 1891, 604, 1893, 1894, 599, 1551, 594, + /* 2200 */ 1551, 1551, 1551, 1551, 1551, 1890, 1551, 1888, 1551, 1551, + /* 2210 */ 1551, 1924, 1551, 1551, 1908, 286, 1889, 1891, 604, 1893, + /* 2220 */ 1894, 599, 601, 594, 1551, 1551, 1551, 1858, 1551, 600, + /* 2230 */ 1551, 1551, 1551, 1551, 1908, 1551, 1551, 1551, 1551, 1551, + /* 2240 */ 1551, 1551, 601, 1551, 1551, 1551, 1551, 1858, 1551, 600, + /* 2250 */ 1888, 1551, 1551, 1551, 1924, 1551, 1551, 1551, 287, 1889, + /* 2260 */ 1891, 604, 1893, 1894, 599, 1551, 594, 1551, 1890, 1551, + /* 2270 */ 1888, 1551, 1551, 1551, 1924, 1551, 1551, 1551, 288, 1889, + /* 2280 */ 1891, 604, 1893, 1894, 599, 1551, 594, 1890, 1551, 1551, + /* 2290 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1908, 1551, 1551, + /* 2300 */ 1551, 1551, 1551, 1551, 1551, 601, 1551, 1551, 1551, 1551, + /* 2310 */ 1858, 1551, 600, 1551, 1551, 1551, 1908, 1551, 1551, 1551, + /* 2320 */ 1551, 1551, 1551, 1551, 601, 1551, 1551, 1551, 1551, 1858, + /* 2330 */ 1890, 600, 1551, 1888, 1551, 1551, 1551, 1924, 1551, 1551, + /* 2340 */ 1551, 295, 1889, 1891, 604, 1893, 1894, 599, 1551, 594, + /* 2350 */ 1551, 1551, 1888, 1551, 1551, 1551, 1924, 1551, 1551, 1908, + /* 2360 */ 297, 1889, 1891, 604, 1893, 1894, 599, 601, 594, 1551, + /* 2370 */ 1551, 1551, 1858, 1551, 600, 1551, 1551, 1551, 1551, 1551, + /* 2380 */ 1551, 1890, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2390 */ 1551, 1551, 1551, 1551, 1551, 1888, 1551, 1551, 1551, 1924, + /* 2400 */ 1551, 1890, 1551, 289, 1889, 1891, 604, 1893, 1894, 599, + /* 2410 */ 1908, 594, 1551, 1551, 1551, 1551, 1551, 1551, 601, 1551, + /* 2420 */ 1551, 1551, 1551, 1858, 1551, 600, 1551, 1551, 1551, 1551, + /* 2430 */ 1908, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 601, 1551, + /* 2440 */ 1551, 1551, 1551, 1858, 1551, 600, 1888, 1551, 1551, 1551, + /* 2450 */ 1924, 1551, 1890, 1551, 298, 1889, 1891, 604, 1893, 1894, + /* 2460 */ 599, 1551, 594, 1551, 1551, 1551, 1888, 1551, 1551, 1551, + /* 2470 */ 1924, 1551, 1551, 1551, 290, 1889, 1891, 604, 1893, 1894, + /* 2480 */ 599, 1908, 594, 1551, 1551, 1551, 1551, 1551, 1551, 601, + /* 2490 */ 1551, 1551, 1551, 1551, 1858, 1551, 600, 1551, 1551, 1551, + /* 2500 */ 1551, 1551, 1551, 1551, 1551, 1890, 1551, 1551, 1551, 1551, + /* 2510 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1888, 1551, 1551, + /* 2520 */ 1551, 1924, 1551, 1551, 1551, 299, 1889, 1891, 604, 1893, + /* 2530 */ 1894, 599, 1551, 594, 1908, 1551, 1551, 1551, 1551, 1551, + /* 2540 */ 1551, 1551, 601, 1551, 1551, 1551, 1551, 1858, 1890, 600, + /* 2550 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2560 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1890, 1551, + /* 2570 */ 1888, 1551, 1551, 1551, 1924, 1551, 1551, 1908, 291, 1889, + /* 2580 */ 1891, 604, 1893, 1894, 599, 601, 594, 1551, 1551, 1551, + /* 2590 */ 1858, 1551, 600, 1551, 1551, 1551, 1551, 1908, 1551, 1551, + /* 2600 */ 1551, 1551, 1551, 1551, 1551, 601, 1551, 1551, 1551, 1551, + /* 2610 */ 1858, 1551, 600, 1888, 1551, 1551, 1551, 1924, 1551, 1551, + /* 2620 */ 1551, 304, 1889, 1891, 604, 1893, 1894, 599, 1551, 594, + /* 2630 */ 1551, 1890, 1551, 1888, 1551, 1551, 1551, 1924, 1551, 1551, + /* 2640 */ 1551, 305, 1889, 1891, 604, 1893, 1894, 599, 1551, 594, + /* 2650 */ 1890, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2660 */ 1908, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 601, 1551, + /* 2670 */ 1551, 1551, 1551, 1858, 1551, 600, 1551, 1551, 1551, 1908, + /* 2680 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 601, 1551, 1551, + /* 2690 */ 1551, 1551, 1858, 1890, 600, 1551, 1888, 1551, 1551, 1551, + /* 2700 */ 1924, 1551, 1551, 1551, 1902, 1889, 1891, 604, 1893, 1894, + /* 2710 */ 599, 1551, 594, 1551, 1551, 1888, 1551, 1551, 1551, 1924, + /* 2720 */ 1551, 1551, 1908, 1901, 1889, 1891, 604, 1893, 1894, 599, + /* 2730 */ 601, 594, 1551, 1551, 1551, 1858, 1551, 600, 1551, 1551, + /* 2740 */ 1551, 1551, 1551, 1551, 1890, 1551, 1551, 1551, 1551, 1551, + /* 2750 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1888, 1551, + /* 2760 */ 1551, 1551, 1924, 1551, 1890, 1551, 1900, 1889, 1891, 604, + /* 2770 */ 1893, 1894, 599, 1908, 594, 1551, 1551, 1551, 1551, 1551, + /* 2780 */ 1551, 601, 1551, 1551, 1551, 1551, 1858, 1551, 600, 1551, + /* 2790 */ 1551, 1551, 1551, 1908, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2800 */ 1551, 601, 1551, 1551, 1551, 1551, 1858, 1551, 600, 1888, + /* 2810 */ 1551, 1551, 1551, 1924, 1551, 1890, 1551, 316, 1889, 1891, + /* 2820 */ 604, 1893, 1894, 599, 1551, 594, 1551, 1551, 1551, 1888, + /* 2830 */ 1551, 1551, 1551, 1924, 1551, 1551, 1551, 317, 1889, 1891, + /* 2840 */ 604, 1893, 1894, 599, 1908, 594, 1551, 1551, 1551, 1551, + /* 2850 */ 1551, 1551, 601, 1551, 1551, 1551, 1551, 1858, 1551, 600, + /* 2860 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1890, 1551, + /* 2870 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2880 */ 1888, 1551, 1551, 1551, 1924, 1551, 1551, 1551, 313, 1889, + /* 2890 */ 1891, 604, 1893, 1894, 599, 1551, 594, 1908, 1551, 1551, + /* 2900 */ 1551, 1551, 1551, 1551, 1551, 601, 1551, 1551, 1551, 1551, + /* 2910 */ 1858, 1890, 600, 1551, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2920 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2930 */ 1551, 1551, 1551, 1888, 1551, 1551, 1551, 1924, 1551, 1551, + /* 2940 */ 1908, 318, 1889, 1891, 604, 1893, 1894, 599, 601, 594, + /* 2950 */ 1551, 1551, 1551, 1858, 1551, 600, 1551, 1551, 1551, 1551, + /* 2960 */ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, + /* 2970 */ 1551, 1551, 1551, 1551, 1551, 1551, 1888, 1551, 1551, 1551, + /* 2980 */ 1924, 1551, 1551, 1551, 293, 1889, 1891, 604, 1893, 1894, + /* 2990 */ 599, 1551, 594, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 351, 0, 324, 351, 326, 327, 324, 320, 326, 327, - /* 10 */ 351, 362, 12, 13, 362, 360, 328, 328, 363, 364, - /* 20 */ 20, 362, 22, 12, 13, 14, 15, 16, 340, 3, - /* 30 */ 409, 410, 20, 33, 20, 35, 349, 388, 389, 390, - /* 40 */ 388, 389, 390, 20, 357, 357, 20, 388, 389, 362, - /* 50 */ 401, 364, 2, 401, 0, 366, 56, 4, 8, 9, + /* 0 */ 351, 409, 410, 351, 0, 4, 324, 320, 326, 327, + /* 10 */ 351, 362, 12, 13, 362, 324, 328, 326, 327, 350, + /* 20 */ 20, 362, 22, 12, 13, 14, 15, 16, 20, 14, + /* 30 */ 15, 16, 319, 33, 321, 35, 349, 388, 389, 390, + /* 40 */ 388, 389, 390, 20, 357, 44, 45, 388, 389, 362, + /* 50 */ 401, 364, 2, 401, 366, 320, 56, 20, 8, 9, /* 60 */ 401, 61, 12, 13, 14, 15, 16, 320, 68, 12, - /* 70 */ 13, 14, 385, 14, 15, 16, 389, 20, 394, 22, - /* 80 */ 393, 394, 395, 396, 397, 398, 399, 20, 401, 22, - /* 90 */ 33, 4, 35, 406, 94, 408, 349, 44, 45, 412, - /* 100 */ 413, 332, 35, 60, 357, 328, 94, 423, 94, 362, - /* 110 */ 20, 364, 425, 56, 60, 346, 116, 50, 61, 364, - /* 120 */ 433, 95, 438, 439, 355, 68, 371, 443, 444, 374, - /* 130 */ 130, 131, 385, 20, 357, 56, 389, 0, 349, 56, - /* 140 */ 393, 394, 395, 396, 397, 398, 399, 358, 401, 349, - /* 150 */ 20, 94, 22, 130, 131, 408, 94, 357, 21, 412, + /* 70 */ 13, 14, 385, 20, 60, 22, 389, 20, 394, 22, + /* 80 */ 393, 394, 395, 396, 397, 398, 399, 320, 401, 3, + /* 90 */ 33, 60, 35, 406, 94, 408, 349, 362, 20, 412, + /* 100 */ 413, 20, 341, 50, 357, 328, 20, 423, 349, 362, + /* 110 */ 349, 364, 425, 56, 320, 356, 116, 94, 61, 358, + /* 120 */ 433, 328, 438, 439, 365, 68, 0, 443, 444, 362, + /* 130 */ 130, 131, 385, 340, 357, 0, 389, 0, 130, 131, + /* 140 */ 393, 394, 395, 396, 397, 398, 399, 364, 401, 360, + /* 150 */ 357, 94, 363, 364, 371, 408, 362, 374, 21, 412, /* 160 */ 413, 24, 25, 26, 27, 28, 29, 30, 31, 32, - /* 170 */ 423, 394, 93, 116, 94, 96, 176, 94, 178, 96, - /* 180 */ 50, 94, 0, 320, 94, 438, 439, 130, 131, 163, - /* 190 */ 443, 444, 415, 416, 417, 418, 396, 420, 363, 364, - /* 200 */ 200, 201, 60, 203, 204, 205, 206, 207, 208, 209, + /* 170 */ 423, 394, 333, 116, 14, 94, 176, 338, 178, 94, + /* 180 */ 20, 95, 47, 21, 320, 438, 439, 130, 131, 56, + /* 190 */ 443, 444, 415, 416, 417, 418, 34, 420, 36, 20, + /* 200 */ 200, 201, 391, 203, 204, 205, 206, 207, 208, 209, /* 210 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - /* 220 */ 220, 221, 222, 223, 33, 362, 125, 126, 20, 106, - /* 230 */ 328, 333, 37, 176, 14, 178, 338, 175, 47, 177, - /* 240 */ 20, 241, 60, 52, 53, 54, 55, 56, 125, 126, - /* 250 */ 127, 128, 129, 241, 319, 241, 321, 200, 201, 357, + /* 220 */ 220, 221, 222, 223, 33, 325, 362, 94, 328, 96, + /* 230 */ 419, 325, 106, 176, 328, 178, 0, 342, 47, 0, + /* 240 */ 345, 241, 200, 52, 53, 54, 55, 56, 351, 163, + /* 250 */ 94, 125, 126, 127, 128, 129, 105, 200, 201, 362, /* 260 */ 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, /* 270 */ 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - /* 280 */ 223, 12, 13, 126, 93, 184, 348, 96, 187, 20, - /* 290 */ 341, 22, 97, 320, 99, 100, 394, 102, 349, 361, - /* 300 */ 328, 106, 33, 241, 35, 320, 21, 358, 20, 24, - /* 310 */ 25, 26, 27, 28, 29, 30, 31, 32, 416, 417, - /* 320 */ 418, 241, 420, 128, 241, 56, 20, 349, 241, 357, - /* 330 */ 61, 351, 161, 320, 356, 362, 125, 68, 12, 13, - /* 340 */ 183, 184, 362, 365, 187, 357, 20, 362, 22, 328, - /* 350 */ 159, 160, 94, 162, 14, 328, 368, 166, 330, 33, - /* 360 */ 20, 35, 349, 94, 328, 14, 394, 340, 388, 389, - /* 370 */ 357, 20, 344, 182, 347, 362, 340, 364, 357, 349, - /* 380 */ 352, 401, 56, 347, 357, 116, 356, 61, 416, 417, - /* 390 */ 418, 22, 420, 357, 68, 365, 185, 186, 385, 130, - /* 400 */ 131, 200, 389, 0, 35, 341, 393, 394, 395, 396, - /* 410 */ 397, 398, 399, 349, 401, 394, 35, 246, 247, 406, - /* 420 */ 94, 408, 358, 158, 204, 412, 413, 24, 25, 26, - /* 430 */ 27, 28, 29, 30, 31, 32, 3, 416, 417, 418, - /* 440 */ 78, 420, 116, 332, 423, 176, 433, 178, 21, 68, - /* 450 */ 341, 250, 251, 252, 253, 254, 130, 131, 349, 438, - /* 460 */ 439, 34, 20, 36, 443, 444, 355, 358, 20, 200, - /* 470 */ 201, 0, 203, 204, 205, 206, 207, 208, 209, 210, + /* 280 */ 223, 12, 13, 225, 93, 388, 389, 96, 225, 20, + /* 290 */ 227, 22, 250, 251, 252, 253, 254, 126, 401, 63, + /* 300 */ 64, 65, 33, 328, 35, 94, 21, 71, 72, 24, + /* 310 */ 25, 26, 27, 28, 29, 30, 31, 32, 82, 83, + /* 320 */ 20, 106, 241, 328, 88, 56, 241, 4, 363, 364, + /* 330 */ 61, 394, 357, 320, 348, 340, 0, 68, 12, 13, + /* 340 */ 125, 126, 127, 128, 129, 106, 20, 361, 22, 328, + /* 350 */ 159, 160, 357, 162, 183, 184, 349, 166, 187, 33, + /* 360 */ 423, 35, 349, 94, 125, 126, 127, 128, 129, 394, + /* 370 */ 357, 349, 365, 182, 241, 362, 439, 364, 357, 357, + /* 380 */ 443, 444, 56, 35, 20, 116, 175, 61, 177, 125, + /* 390 */ 126, 416, 417, 418, 68, 420, 60, 241, 385, 130, + /* 400 */ 131, 330, 389, 0, 20, 341, 393, 394, 395, 396, + /* 410 */ 397, 398, 399, 349, 401, 394, 68, 94, 396, 406, + /* 420 */ 94, 408, 358, 352, 328, 412, 413, 24, 25, 26, + /* 430 */ 27, 28, 29, 30, 31, 32, 340, 416, 417, 418, + /* 440 */ 332, 420, 116, 347, 423, 176, 433, 178, 184, 335, + /* 450 */ 336, 187, 241, 357, 346, 349, 130, 131, 94, 438, + /* 460 */ 439, 320, 356, 355, 443, 444, 405, 350, 407, 200, + /* 470 */ 201, 365, 203, 204, 205, 206, 207, 208, 209, 210, /* 480 */ 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - /* 490 */ 221, 222, 223, 228, 225, 325, 134, 135, 328, 241, - /* 500 */ 335, 336, 176, 238, 178, 68, 107, 108, 109, 110, + /* 490 */ 221, 222, 223, 161, 225, 405, 373, 407, 375, 78, + /* 500 */ 335, 336, 176, 362, 178, 332, 107, 108, 109, 110, /* 510 */ 111, 112, 113, 114, 115, 116, 117, 320, 119, 120, - /* 520 */ 121, 122, 123, 124, 391, 394, 200, 201, 95, 203, + /* 520 */ 121, 122, 123, 124, 320, 394, 200, 201, 355, 203, /* 530 */ 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, /* 540 */ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - /* 550 */ 12, 13, 419, 328, 423, 204, 335, 336, 20, 362, - /* 560 */ 22, 225, 35, 227, 328, 340, 328, 105, 320, 325, - /* 570 */ 439, 33, 328, 35, 443, 444, 340, 106, 340, 320, + /* 550 */ 12, 13, 364, 328, 423, 134, 135, 320, 20, 362, + /* 560 */ 22, 20, 374, 22, 241, 340, 362, 391, 44, 45, + /* 570 */ 439, 33, 347, 35, 443, 444, 35, 171, 246, 247, /* 580 */ 8, 9, 357, 320, 12, 13, 14, 15, 16, 328, - /* 590 */ 1, 2, 20, 357, 56, 357, 125, 126, 127, 128, - /* 600 */ 129, 340, 320, 0, 328, 163, 68, 12, 13, 14, - /* 610 */ 362, 328, 349, 320, 328, 20, 340, 22, 357, 391, - /* 620 */ 357, 362, 349, 340, 320, 362, 340, 364, 33, 349, - /* 630 */ 35, 349, 94, 357, 225, 405, 356, 407, 365, 357, - /* 640 */ 357, 328, 56, 357, 362, 365, 364, 419, 385, 320, - /* 650 */ 330, 56, 389, 340, 116, 362, 393, 394, 395, 396, - /* 660 */ 397, 398, 399, 68, 401, 68, 362, 385, 130, 131, - /* 670 */ 357, 389, 352, 320, 394, 393, 394, 395, 396, 397, - /* 680 */ 398, 399, 96, 401, 95, 373, 423, 375, 406, 94, - /* 690 */ 408, 362, 8, 9, 412, 413, 12, 13, 14, 15, - /* 700 */ 16, 438, 439, 423, 422, 178, 443, 444, 328, 106, - /* 710 */ 405, 116, 407, 171, 176, 362, 178, 317, 438, 439, - /* 720 */ 340, 44, 45, 443, 444, 130, 131, 43, 125, 126, - /* 730 */ 127, 128, 129, 191, 192, 163, 320, 357, 200, 201, - /* 740 */ 350, 203, 204, 205, 206, 207, 208, 209, 210, 211, + /* 590 */ 14, 50, 20, 391, 56, 419, 20, 191, 192, 362, + /* 600 */ 404, 340, 320, 407, 328, 241, 68, 12, 13, 14, + /* 610 */ 56, 328, 349, 320, 328, 20, 340, 22, 357, 381, + /* 620 */ 357, 419, 37, 340, 3, 362, 340, 364, 33, 349, + /* 630 */ 35, 349, 94, 357, 68, 158, 356, 328, 20, 357, + /* 640 */ 357, 328, 68, 357, 362, 365, 364, 93, 385, 340, + /* 650 */ 96, 56, 389, 340, 116, 362, 393, 394, 395, 396, + /* 660 */ 397, 398, 399, 68, 401, 4, 357, 385, 130, 131, + /* 670 */ 357, 389, 125, 3, 394, 393, 394, 395, 396, 397, + /* 680 */ 398, 399, 97, 401, 99, 100, 423, 102, 406, 94, + /* 690 */ 408, 106, 8, 9, 412, 413, 12, 13, 14, 15, + /* 700 */ 16, 438, 439, 423, 422, 228, 443, 444, 328, 22, + /* 710 */ 357, 116, 0, 128, 176, 238, 178, 317, 438, 439, + /* 720 */ 340, 368, 35, 443, 444, 130, 131, 43, 14, 357, + /* 730 */ 1, 2, 185, 186, 20, 163, 320, 357, 200, 201, + /* 740 */ 368, 203, 204, 205, 206, 207, 208, 209, 210, 211, /* 750 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - /* 760 */ 222, 223, 8, 9, 328, 350, 12, 13, 14, 15, - /* 770 */ 16, 176, 342, 178, 357, 345, 340, 377, 362, 241, - /* 780 */ 3, 20, 8, 9, 320, 368, 12, 13, 14, 15, - /* 790 */ 16, 0, 320, 357, 394, 200, 201, 39, 203, 204, + /* 760 */ 222, 223, 8, 9, 328, 95, 12, 13, 14, 15, + /* 770 */ 16, 176, 60, 178, 357, 106, 340, 377, 362, 241, + /* 780 */ 204, 163, 8, 9, 320, 368, 12, 13, 14, 15, + /* 790 */ 16, 20, 320, 357, 394, 200, 201, 128, 203, 204, /* 800 */ 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, /* 810 */ 215, 216, 217, 218, 219, 220, 221, 222, 223, 12, - /* 820 */ 13, 328, 22, 423, 320, 320, 362, 20, 43, 22, - /* 830 */ 320, 364, 350, 340, 362, 35, 328, 35, 438, 439, - /* 840 */ 33, 374, 35, 443, 444, 350, 320, 2, 340, 95, - /* 850 */ 357, 4, 320, 8, 9, 64, 65, 12, 13, 14, - /* 860 */ 15, 16, 71, 56, 320, 357, 362, 362, 68, 394, - /* 870 */ 68, 320, 362, 82, 83, 68, 12, 13, 328, 88, - /* 880 */ 328, 349, 391, 328, 20, 373, 22, 375, 362, 357, - /* 890 */ 340, 357, 340, 328, 362, 340, 364, 33, 423, 35, - /* 900 */ 349, 94, 368, 239, 240, 340, 362, 357, 357, 357, - /* 910 */ 419, 20, 357, 362, 439, 364, 116, 385, 443, 444, - /* 920 */ 56, 389, 357, 116, 163, 393, 394, 395, 396, 397, - /* 930 */ 398, 399, 68, 401, 106, 350, 385, 130, 131, 320, + /* 820 */ 13, 328, 22, 423, 95, 20, 362, 20, 373, 22, + /* 830 */ 375, 239, 240, 340, 362, 35, 320, 330, 438, 439, + /* 840 */ 33, 328, 35, 443, 444, 328, 320, 63, 64, 65, + /* 850 */ 357, 344, 320, 340, 350, 71, 72, 340, 337, 352, + /* 860 */ 339, 328, 320, 56, 320, 320, 82, 83, 68, 320, + /* 870 */ 357, 320, 88, 340, 357, 68, 12, 13, 362, 258, + /* 880 */ 328, 349, 320, 328, 20, 43, 22, 43, 362, 357, + /* 890 */ 357, 39, 340, 328, 362, 340, 364, 33, 350, 35, + /* 900 */ 349, 94, 341, 242, 362, 340, 362, 362, 357, 357, + /* 910 */ 349, 362, 357, 362, 56, 364, 116, 385, 204, 358, + /* 920 */ 56, 389, 357, 116, 362, 393, 394, 395, 396, 397, + /* 930 */ 398, 399, 68, 401, 163, 105, 385, 130, 131, 95, /* 940 */ 389, 328, 168, 328, 393, 394, 395, 396, 397, 398, - /* 950 */ 399, 404, 401, 340, 407, 340, 128, 406, 94, 408, - /* 960 */ 337, 350, 339, 412, 413, 359, 434, 435, 362, 381, - /* 970 */ 357, 359, 357, 422, 362, 0, 176, 350, 178, 342, - /* 980 */ 116, 362, 345, 176, 43, 178, 42, 43, 98, 105, - /* 990 */ 98, 101, 43, 101, 130, 131, 98, 22, 240, 101, - /* 1000 */ 200, 201, 0, 98, 163, 164, 101, 200, 201, 0, + /* 950 */ 399, 349, 401, 340, 96, 340, 350, 406, 94, 408, + /* 960 */ 358, 350, 359, 412, 413, 362, 434, 435, 359, 61, + /* 970 */ 357, 362, 357, 422, 342, 0, 176, 345, 178, 43, + /* 980 */ 116, 42, 43, 176, 154, 178, 98, 98, 98, 101, + /* 990 */ 101, 101, 43, 98, 130, 131, 101, 22, 163, 164, + /* 1000 */ 200, 201, 130, 131, 1, 2, 43, 200, 201, 204, /* 1010 */ 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, /* 1020 */ 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - /* 1030 */ 223, 22, 130, 131, 43, 258, 95, 263, 154, 35, - /* 1040 */ 176, 43, 178, 321, 95, 260, 8, 9, 61, 47, - /* 1050 */ 12, 13, 14, 15, 16, 8, 9, 43, 392, 12, - /* 1060 */ 13, 14, 15, 16, 200, 201, 0, 203, 204, 205, + /* 1030 */ 223, 95, 350, 338, 321, 43, 35, 263, 0, 0, + /* 1040 */ 176, 43, 178, 2, 95, 392, 46, 43, 447, 8, + /* 1050 */ 9, 43, 43, 12, 13, 14, 15, 16, 95, 35, + /* 1060 */ 22, 22, 35, 43, 200, 201, 0, 203, 204, 205, /* 1070 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - /* 1080 */ 216, 217, 218, 219, 220, 221, 222, 223, 18, 242, - /* 1090 */ 20, 1, 2, 95, 94, 204, 0, 27, 447, 436, - /* 1100 */ 30, 13, 13, 338, 104, 329, 8, 9, 43, 95, - /* 1110 */ 12, 13, 14, 15, 16, 43, 43, 47, 22, 49, - /* 1120 */ 43, 51, 43, 35, 35, 0, 430, 43, 349, 63, + /* 1080 */ 216, 217, 218, 219, 220, 221, 222, 223, 18, 329, + /* 1090 */ 20, 94, 240, 95, 94, 68, 13, 27, 13, 95, + /* 1100 */ 30, 104, 260, 95, 95, 430, 8, 9, 200, 436, + /* 1110 */ 12, 13, 14, 15, 16, 95, 43, 47, 35, 49, + /* 1120 */ 35, 51, 349, 329, 327, 361, 392, 421, 440, 63, /* 1130 */ 64, 65, 66, 67, 43, 69, 70, 71, 72, 73, /* 1140 */ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - /* 1150 */ 84, 85, 86, 87, 88, 89, 90, 18, 329, 327, - /* 1160 */ 95, 392, 23, 93, 361, 421, 440, 95, 95, 414, - /* 1170 */ 424, 243, 95, 48, 95, 105, 37, 38, 377, 95, - /* 1180 */ 41, 387, 178, 46, 43, 43, 95, 200, 379, 43, - /* 1190 */ 47, 43, 386, 95, 43, 394, 57, 58, 59, 174, - /* 1200 */ 42, 163, 369, 133, 369, 320, 136, 137, 138, 139, + /* 1150 */ 84, 85, 86, 87, 88, 89, 90, 18, 414, 424, + /* 1160 */ 243, 47, 23, 93, 387, 386, 8, 9, 95, 174, + /* 1170 */ 12, 13, 14, 15, 16, 105, 37, 38, 377, 178, + /* 1180 */ 41, 0, 379, 43, 8, 9, 95, 42, 12, 13, + /* 1190 */ 14, 15, 16, 95, 43, 394, 57, 58, 59, 20, + /* 1200 */ 369, 369, 178, 133, 328, 320, 136, 137, 138, 139, /* 1210 */ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - /* 1220 */ 150, 151, 152, 153, 423, 155, 156, 157, 20, 328, - /* 1230 */ 369, 94, 328, 94, 349, 367, 95, 95, 158, 438, - /* 1240 */ 439, 95, 357, 95, 443, 444, 95, 362, 367, 364, - /* 1250 */ 334, 8, 9, 262, 92, 12, 13, 14, 15, 16, - /* 1260 */ 328, 20, 328, 328, 322, 322, 20, 364, 332, 383, - /* 1270 */ 385, 132, 332, 20, 389, 376, 20, 332, 393, 394, - /* 1280 */ 395, 396, 397, 398, 399, 378, 401, 64, 65, 404, - /* 1290 */ 376, 406, 407, 408, 71, 332, 332, 412, 413, 332, - /* 1300 */ 328, 377, 332, 377, 61, 82, 83, 168, 169, 170, - /* 1310 */ 377, 88, 173, 328, 322, 349, 320, 349, 394, 322, - /* 1320 */ 394, 362, 349, 349, 189, 349, 349, 394, 349, 190, - /* 1330 */ 349, 349, 193, 383, 195, 196, 197, 198, 199, 349, - /* 1340 */ 384, 330, 349, 382, 181, 349, 103, 423, 330, 423, - /* 1350 */ 364, 328, 328, 357, 376, 248, 423, 330, 362, 160, - /* 1360 */ 364, 377, 438, 439, 438, 439, 372, 443, 444, 443, - /* 1370 */ 444, 438, 439, 372, 362, 362, 443, 444, 394, 362, - /* 1380 */ 241, 385, 362, 362, 330, 389, 370, 345, 330, 393, - /* 1390 */ 394, 395, 396, 397, 398, 399, 357, 401, 20, 392, - /* 1400 */ 392, 158, 406, 362, 408, 249, 372, 423, 412, 413, - /* 1410 */ 19, 362, 429, 362, 362, 372, 255, 429, 422, 362, - /* 1420 */ 431, 320, 438, 439, 33, 167, 257, 443, 444, 256, - /* 1430 */ 244, 432, 429, 428, 264, 387, 261, 427, 47, 259, - /* 1440 */ 240, 426, 357, 52, 53, 54, 55, 56, 20, 94, - /* 1450 */ 349, 391, 94, 353, 448, 411, 362, 339, 357, 328, - /* 1460 */ 330, 442, 36, 362, 320, 364, 380, 441, 323, 322, - /* 1470 */ 375, 228, 229, 230, 231, 232, 233, 234, 235, 236, - /* 1480 */ 237, 238, 318, 343, 93, 331, 385, 96, 0, 0, - /* 1490 */ 389, 183, 343, 349, 393, 394, 395, 396, 397, 398, - /* 1500 */ 399, 357, 401, 343, 0, 0, 362, 406, 364, 408, - /* 1510 */ 42, 12, 13, 412, 413, 0, 35, 320, 194, 35, - /* 1520 */ 129, 22, 35, 194, 0, 35, 35, 35, 194, 385, + /* 1220 */ 150, 151, 152, 153, 423, 155, 156, 157, 328, 48, + /* 1230 */ 369, 334, 158, 94, 349, 95, 43, 367, 43, 438, + /* 1240 */ 439, 367, 357, 328, 443, 444, 95, 362, 92, 364, + /* 1250 */ 43, 8, 9, 95, 262, 12, 13, 14, 15, 16, + /* 1260 */ 328, 20, 328, 322, 322, 20, 383, 332, 364, 332, + /* 1270 */ 385, 132, 20, 20, 389, 376, 378, 332, 393, 394, + /* 1280 */ 395, 396, 397, 398, 399, 376, 401, 332, 95, 404, + /* 1290 */ 95, 406, 407, 408, 332, 328, 332, 412, 413, 322, + /* 1300 */ 332, 377, 95, 377, 61, 349, 349, 168, 169, 170, + /* 1310 */ 377, 328, 173, 322, 349, 349, 320, 189, 394, 349, + /* 1320 */ 394, 349, 349, 349, 384, 349, 383, 394, 349, 190, + /* 1330 */ 349, 362, 193, 181, 195, 196, 197, 198, 199, 163, + /* 1340 */ 330, 382, 364, 330, 328, 349, 103, 423, 330, 423, + /* 1350 */ 328, 248, 372, 357, 372, 362, 423, 370, 362, 160, + /* 1360 */ 364, 377, 438, 439, 438, 439, 376, 443, 444, 443, + /* 1370 */ 444, 438, 439, 362, 362, 330, 443, 444, 394, 362, + /* 1380 */ 241, 385, 345, 362, 330, 389, 357, 20, 362, 393, + /* 1390 */ 394, 395, 396, 397, 398, 399, 249, 401, 392, 392, + /* 1400 */ 429, 158, 406, 372, 408, 362, 362, 423, 412, 413, + /* 1410 */ 19, 362, 372, 362, 429, 255, 167, 431, 422, 257, + /* 1420 */ 432, 320, 438, 439, 33, 256, 427, 443, 444, 244, + /* 1430 */ 264, 429, 261, 428, 387, 357, 442, 448, 47, 259, + /* 1440 */ 426, 240, 20, 52, 53, 54, 55, 56, 391, 94, + /* 1450 */ 349, 94, 353, 411, 362, 339, 441, 328, 357, 328, + /* 1460 */ 330, 36, 380, 362, 320, 364, 323, 343, 322, 375, + /* 1470 */ 343, 228, 229, 230, 231, 232, 233, 234, 235, 236, + /* 1480 */ 237, 238, 318, 0, 93, 343, 385, 96, 357, 0, + /* 1490 */ 389, 183, 331, 349, 393, 394, 395, 396, 397, 398, + /* 1500 */ 399, 357, 401, 0, 0, 42, 362, 406, 364, 408, + /* 1510 */ 0, 12, 13, 412, 413, 35, 194, 320, 194, 35, + /* 1520 */ 129, 22, 35, 35, 0, 394, 35, 35, 194, 385, /* 1530 */ 0, 194, 33, 389, 35, 0, 35, 393, 394, 395, - /* 1540 */ 396, 397, 398, 399, 35, 401, 349, 0, 22, 0, - /* 1550 */ 406, 178, 408, 162, 357, 56, 412, 413, 176, 362, - /* 1560 */ 0, 364, 0, 0, 172, 171, 0, 68, 0, 46, - /* 1570 */ 320, 180, 0, 182, 0, 42, 0, 0, 0, 42, - /* 1580 */ 0, 0, 385, 0, 0, 0, 389, 0, 149, 35, + /* 1540 */ 396, 397, 398, 399, 35, 401, 349, 416, 417, 418, + /* 1550 */ 406, 420, 408, 162, 357, 56, 412, 413, 0, 362, + /* 1560 */ 22, 364, 0, 178, 176, 0, 0, 68, 172, 171, + /* 1570 */ 320, 180, 0, 182, 0, 46, 0, 0, 0, 42, + /* 1580 */ 0, 0, 385, 0, 42, 0, 389, 0, 0, 0, /* 1590 */ 393, 394, 395, 396, 397, 398, 399, 0, 401, 349, - /* 1600 */ 149, 0, 0, 406, 22, 408, 0, 357, 0, 412, + /* 1600 */ 0, 149, 35, 406, 149, 408, 0, 357, 0, 412, /* 1610 */ 413, 0, 362, 320, 364, 116, 0, 0, 0, 0, /* 1620 */ 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, - /* 1630 */ 0, 0, 0, 0, 0, 385, 0, 0, 35, 389, + /* 1630 */ 0, 0, 0, 0, 0, 385, 22, 0, 0, 389, /* 1640 */ 0, 0, 349, 393, 394, 395, 396, 397, 398, 399, - /* 1650 */ 357, 401, 56, 0, 56, 362, 42, 364, 408, 14, - /* 1660 */ 14, 46, 412, 413, 167, 0, 320, 39, 0, 0, - /* 1670 */ 0, 0, 0, 0, 39, 176, 0, 178, 385, 0, - /* 1680 */ 0, 43, 389, 40, 35, 46, 393, 394, 395, 396, - /* 1690 */ 397, 398, 399, 39, 401, 349, 39, 47, 35, 200, - /* 1700 */ 201, 408, 47, 357, 62, 412, 413, 0, 362, 35, - /* 1710 */ 364, 0, 0, 214, 215, 216, 217, 218, 219, 220, - /* 1720 */ 39, 39, 320, 35, 47, 47, 39, 0, 0, 0, - /* 1730 */ 35, 385, 22, 0, 35, 389, 35, 43, 35, 393, + /* 1650 */ 357, 401, 0, 0, 56, 362, 0, 364, 408, 56, + /* 1660 */ 0, 46, 412, 413, 14, 14, 320, 39, 0, 0, + /* 1670 */ 35, 0, 0, 167, 0, 176, 0, 178, 385, 43, + /* 1680 */ 0, 42, 389, 40, 39, 39, 393, 394, 395, 396, + /* 1690 */ 397, 398, 399, 0, 401, 349, 0, 35, 39, 200, + /* 1700 */ 201, 408, 47, 357, 46, 412, 413, 0, 362, 39, + /* 1710 */ 364, 62, 35, 214, 215, 216, 217, 218, 219, 220, + /* 1720 */ 47, 0, 320, 35, 39, 47, 0, 35, 47, 39, + /* 1730 */ 0, 385, 0, 0, 0, 389, 35, 22, 0, 393, /* 1740 */ 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - /* 1750 */ 35, 349, 43, 101, 103, 0, 22, 22, 0, 357, - /* 1760 */ 22, 0, 49, 22, 362, 35, 364, 0, 0, 0, - /* 1770 */ 22, 20, 35, 0, 35, 163, 0, 35, 95, 94, - /* 1780 */ 0, 22, 0, 0, 320, 94, 179, 385, 0, 4, - /* 1790 */ 3, 389, 0, 95, 0, 393, 394, 395, 396, 397, - /* 1800 */ 398, 399, 94, 401, 19, 35, 0, 163, 160, 104, - /* 1810 */ 94, 39, 46, 349, 94, 224, 226, 43, 33, 163, - /* 1820 */ 161, 357, 43, 165, 224, 159, 362, 95, 364, 43, - /* 1830 */ 46, 3, 47, 245, 94, 46, 51, 94, 43, 95, - /* 1840 */ 95, 56, 320, 94, 43, 95, 94, 445, 446, 385, - /* 1850 */ 188, 94, 43, 389, 94, 245, 94, 393, 394, 395, - /* 1860 */ 396, 397, 398, 399, 320, 401, 95, 35, 35, 35, - /* 1870 */ 95, 349, 408, 95, 35, 35, 354, 413, 93, 357, - /* 1880 */ 35, 96, 46, 46, 362, 95, 364, 43, 95, 46, - /* 1890 */ 2, 22, 200, 349, 94, 46, 46, 95, 94, 94, - /* 1900 */ 239, 357, 95, 95, 94, 245, 362, 385, 364, 94, - /* 1910 */ 94, 389, 95, 22, 95, 393, 394, 395, 396, 397, - /* 1920 */ 398, 399, 35, 401, 320, 202, 105, 35, 35, 385, - /* 1930 */ 95, 35, 94, 389, 35, 94, 94, 393, 394, 395, - /* 1940 */ 396, 397, 398, 399, 35, 401, 95, 403, 95, 94, - /* 1950 */ 22, 95, 94, 349, 106, 94, 94, 35, 94, 43, - /* 1960 */ 22, 357, 62, 61, 118, 118, 362, 320, 364, 35, - /* 1970 */ 118, 35, 118, 68, 35, 35, 35, 35, 35, 35, - /* 1980 */ 35, 35, 22, 22, 320, 91, 35, 35, 35, 385, - /* 1990 */ 43, 35, 35, 389, 35, 68, 349, 393, 394, 395, - /* 2000 */ 396, 397, 398, 399, 357, 401, 35, 35, 35, 362, - /* 2010 */ 35, 364, 35, 349, 22, 35, 0, 35, 39, 0, - /* 2020 */ 35, 357, 39, 47, 0, 47, 362, 39, 364, 35, - /* 2030 */ 0, 47, 385, 35, 47, 39, 389, 0, 320, 435, - /* 2040 */ 393, 394, 395, 396, 397, 398, 399, 35, 401, 385, - /* 2050 */ 35, 0, 21, 389, 22, 22, 320, 393, 394, 395, - /* 2060 */ 396, 397, 398, 399, 22, 401, 21, 349, 20, 449, - /* 2070 */ 449, 449, 354, 449, 449, 357, 449, 449, 449, 449, + /* 1750 */ 22, 349, 35, 43, 35, 35, 43, 103, 101, 357, + /* 1760 */ 35, 0, 35, 22, 362, 0, 364, 22, 0, 22, + /* 1770 */ 35, 49, 35, 0, 35, 0, 0, 35, 22, 20, + /* 1780 */ 0, 95, 0, 94, 320, 35, 179, 385, 22, 4, + /* 1790 */ 0, 389, 0, 0, 3, 393, 394, 395, 396, 397, + /* 1800 */ 398, 399, 0, 401, 19, 163, 0, 163, 160, 95, + /* 1810 */ 94, 0, 35, 349, 0, 104, 46, 94, 33, 224, + /* 1820 */ 39, 357, 43, 94, 163, 94, 362, 161, 364, 43, + /* 1830 */ 165, 226, 47, 224, 159, 245, 51, 94, 43, 95, + /* 1840 */ 94, 56, 320, 95, 95, 94, 94, 445, 446, 385, + /* 1850 */ 95, 188, 94, 389, 94, 43, 46, 393, 394, 395, + /* 1860 */ 396, 397, 398, 399, 320, 401, 95, 46, 94, 43, + /* 1870 */ 3, 349, 408, 95, 43, 35, 354, 413, 93, 357, + /* 1880 */ 35, 96, 95, 35, 362, 35, 364, 35, 35, 95, + /* 1890 */ 46, 95, 43, 349, 2, 22, 95, 46, 200, 94, + /* 1900 */ 46, 357, 94, 46, 95, 46, 362, 385, 364, 94, + /* 1910 */ 94, 389, 245, 95, 94, 393, 394, 395, 396, 397, + /* 1920 */ 398, 399, 239, 401, 320, 95, 22, 245, 94, 385, + /* 1930 */ 105, 95, 35, 389, 35, 94, 35, 393, 394, 395, + /* 1940 */ 396, 397, 398, 399, 35, 401, 35, 403, 35, 22, + /* 1950 */ 95, 95, 94, 349, 94, 202, 95, 94, 35, 95, + /* 1960 */ 94, 357, 43, 22, 118, 118, 362, 320, 364, 94, + /* 1970 */ 94, 94, 62, 61, 35, 106, 68, 35, 35, 35, + /* 1980 */ 118, 35, 35, 43, 320, 35, 118, 35, 35, 385, + /* 1990 */ 35, 91, 35, 389, 35, 22, 349, 393, 394, 395, + /* 2000 */ 396, 397, 398, 399, 357, 401, 35, 22, 22, 362, + /* 2010 */ 35, 364, 35, 349, 35, 35, 35, 68, 35, 35, + /* 2020 */ 0, 357, 35, 35, 35, 47, 362, 0, 364, 39, + /* 2030 */ 35, 39, 385, 0, 35, 39, 389, 0, 320, 435, + /* 2040 */ 393, 394, 395, 396, 397, 398, 399, 47, 401, 385, + /* 2050 */ 47, 35, 47, 389, 39, 0, 320, 393, 394, 395, + /* 2060 */ 396, 397, 398, 399, 35, 401, 35, 349, 0, 22, + /* 2070 */ 21, 21, 354, 22, 22, 357, 20, 449, 449, 449, /* 2080 */ 362, 449, 364, 449, 437, 349, 449, 449, 449, 449, /* 2090 */ 354, 449, 449, 357, 449, 449, 449, 449, 362, 449, /* 2100 */ 364, 449, 449, 385, 449, 449, 449, 389, 449, 449, @@ -821,83 +821,83 @@ static const YYCODETYPE yy_lookahead[] = { /* 2980 */ 389, 449, 449, 449, 393, 394, 395, 396, 397, 398, /* 2990 */ 399, 449, 401, }; -#define YY_SHIFT_COUNT (692) +#define YY_SHIFT_COUNT (694) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2051) +#define YY_SHIFT_MAX (2068) static const unsigned short int yy_shift_ofst[] = { /* 0 */ 1139, 0, 57, 269, 57, 326, 326, 326, 538, 326, /* 10 */ 326, 326, 326, 326, 595, 807, 807, 864, 807, 807, /* 20 */ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, /* 30 */ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, - /* 40 */ 807, 807, 807, 807, 807, 807, 12, 14, 90, 62, - /* 50 */ 83, 80, 258, 80, 90, 90, 1499, 1499, 80, 1499, - /* 60 */ 1499, 87, 80, 113, 113, 53, 53, 23, 113, 113, - /* 70 */ 113, 113, 113, 113, 113, 113, 113, 113, 43, 113, - /* 80 */ 113, 113, 208, 113, 113, 288, 113, 113, 288, 306, - /* 90 */ 113, 288, 288, 288, 113, 142, 1070, 1243, 1243, 285, - /* 100 */ 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - /* 110 */ 800, 800, 800, 800, 800, 800, 800, 800, 800, 195, - /* 120 */ 1223, 26, 23, 340, 340, 54, 381, 182, 336, 336, - /* 130 */ 442, 442, 442, 381, 448, 448, 448, 462, 208, 1, - /* 140 */ 1, 409, 288, 288, 437, 437, 462, 597, 399, 399, - /* 150 */ 399, 399, 399, 399, 399, 1391, 137, 572, 774, 791, - /* 160 */ 201, 67, 171, 220, 351, 130, 677, 828, 761, 664, - /* 170 */ 758, 777, 664, 944, 847, 891, 928, 1143, 1025, 1158, - /* 180 */ 1158, 1208, 1208, 1158, 1080, 1080, 1162, 1208, 1208, 1208, - /* 190 */ 1241, 1241, 1246, 43, 208, 43, 1253, 1256, 43, 1253, - /* 200 */ 43, 43, 43, 1208, 43, 1241, 288, 288, 288, 288, - /* 210 */ 288, 288, 288, 288, 288, 288, 288, 1208, 1241, 437, - /* 220 */ 1135, 1246, 142, 1163, 208, 142, 1208, 1208, 1253, 142, - /* 230 */ 1107, 437, 437, 437, 437, 1107, 437, 1199, 142, 462, - /* 240 */ 142, 448, 1378, 1378, 437, 1156, 1107, 437, 437, 1156, - /* 250 */ 1107, 437, 437, 288, 1161, 1258, 1156, 1169, 1173, 1186, - /* 260 */ 928, 1170, 1175, 1180, 1200, 448, 1428, 1355, 1358, 437, - /* 270 */ 597, 1208, 142, 1426, 1241, 2993, 2993, 2993, 2993, 2993, - /* 280 */ 2993, 2993, 1066, 191, 403, 1785, 754, 684, 1098, 50, - /* 290 */ 845, 1038, 471, 1047, 1047, 1047, 1047, 1047, 1047, 1047, - /* 300 */ 1047, 1047, 603, 123, 11, 11, 157, 101, 542, 79, - /* 310 */ 362, 427, 211, 59, 589, 265, 59, 59, 59, 941, - /* 320 */ 1002, 369, 884, 890, 892, 898, 905, 975, 1009, 1096, - /* 330 */ 586, 841, 949, 998, 1014, 1065, 1072, 1073, 1077, 902, - /* 340 */ 785, 991, 1090, 1079, 527, 1004, 987, 1084, 433, 1137, - /* 350 */ 1091, 1141, 1142, 1146, 1148, 1151, 1000, 1088, 1089, 802, - /* 360 */ 1125, 1488, 1489, 1308, 1504, 1505, 1468, 1515, 1481, 1324, - /* 370 */ 1484, 1487, 1490, 1329, 1524, 1491, 1492, 1334, 1530, 1337, - /* 380 */ 1535, 1501, 1547, 1526, 1549, 1509, 1373, 1382, 1560, 1562, - /* 390 */ 1392, 1394, 1563, 1566, 1523, 1568, 1572, 1574, 1533, 1576, - /* 400 */ 1577, 1578, 1537, 1580, 1581, 1583, 1584, 1585, 1587, 1439, - /* 410 */ 1554, 1597, 1451, 1601, 1602, 1606, 1608, 1611, 1616, 1617, - /* 420 */ 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1586, 1625, 1626, - /* 430 */ 1627, 1629, 1630, 1631, 1582, 1632, 1633, 1634, 1636, 1603, - /* 440 */ 1637, 1596, 1640, 1598, 1641, 1653, 1614, 1628, 1638, 1645, - /* 450 */ 1615, 1646, 1639, 1668, 1643, 1635, 1669, 1670, 1671, 1654, - /* 460 */ 1497, 1665, 1672, 1673, 1642, 1676, 1679, 1649, 1650, 1657, - /* 470 */ 1680, 1663, 1655, 1681, 1707, 1674, 1677, 1682, 1711, 1688, - /* 480 */ 1678, 1687, 1712, 1727, 1728, 1729, 1651, 1652, 1695, 1710, - /* 490 */ 1733, 1699, 1701, 1694, 1709, 1703, 1715, 1734, 1755, 1735, - /* 500 */ 1758, 1738, 1713, 1761, 1741, 1730, 1767, 1737, 1768, 1739, - /* 510 */ 1769, 1748, 1751, 1683, 1685, 1773, 1612, 1742, 1776, 1607, - /* 520 */ 1759, 1644, 1648, 1780, 1782, 1656, 1658, 1787, 1783, 1788, - /* 530 */ 1792, 1691, 1698, 1770, 1662, 1794, 1708, 1659, 1716, 1806, - /* 540 */ 1772, 1666, 1720, 1705, 1766, 1774, 1591, 1590, 1600, 1779, - /* 550 */ 1588, 1740, 1732, 1743, 1744, 1745, 1749, 1786, 1750, 1752, - /* 560 */ 1757, 1760, 1771, 1795, 1784, 1789, 1762, 1801, 1610, 1775, - /* 570 */ 1778, 1828, 1809, 1660, 1832, 1833, 1834, 1839, 1840, 1845, - /* 580 */ 1790, 1793, 1836, 1661, 1844, 1837, 1843, 1888, 1869, 1692, - /* 590 */ 1800, 1802, 1804, 1807, 1805, 1808, 1849, 1810, 1815, 1850, - /* 600 */ 1817, 1891, 1723, 1816, 1821, 1819, 1887, 1892, 1838, 1835, - /* 610 */ 1893, 1841, 1851, 1896, 1842, 1853, 1899, 1855, 1856, 1909, - /* 620 */ 1858, 1846, 1847, 1852, 1854, 1928, 1848, 1861, 1862, 1922, - /* 630 */ 1864, 1916, 1916, 1938, 1900, 1902, 1934, 1936, 1939, 1940, - /* 640 */ 1941, 1942, 1943, 1944, 1945, 1946, 1905, 1894, 1947, 1951, - /* 650 */ 1952, 1960, 1953, 1961, 1956, 1957, 1959, 1927, 1694, 1971, - /* 660 */ 1709, 1972, 1973, 1975, 1977, 1992, 1980, 2016, 1982, 1976, - /* 670 */ 1979, 2019, 1985, 1978, 1983, 2024, 1994, 1984, 1988, 2030, - /* 680 */ 1998, 1987, 1996, 2037, 2012, 2015, 2051, 2032, 2031, 2033, - /* 690 */ 2042, 2045, 2048, + /* 40 */ 807, 807, 807, 807, 807, 807, 81, 364, 23, 211, + /* 50 */ 133, 85, 156, 85, 23, 23, 1499, 1499, 85, 1499, + /* 60 */ 1499, 323, 85, 37, 37, 1, 1, 8, 37, 37, + /* 70 */ 37, 37, 37, 37, 37, 37, 37, 37, 14, 37, + /* 80 */ 37, 37, 78, 37, 37, 179, 37, 37, 179, 300, + /* 90 */ 37, 179, 179, 179, 37, 31, 1070, 1243, 1243, 285, + /* 100 */ 784, 800, 800, 800, 800, 800, 800, 800, 800, 800, + /* 110 */ 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + /* 120 */ 585, 86, 8, 160, 160, 336, 348, 712, 63, 63, + /* 130 */ 618, 618, 618, 348, 384, 384, 384, 151, 78, 4, + /* 140 */ 4, 58, 179, 179, 566, 566, 151, 574, 399, 399, + /* 150 */ 399, 399, 399, 399, 399, 1391, 137, 236, 572, 774, + /* 160 */ 42, 541, 332, 576, 714, 53, 524, 669, 771, 592, + /* 170 */ 852, 621, 592, 939, 661, 805, 917, 1114, 995, 1145, + /* 180 */ 1145, 1179, 1179, 1145, 1074, 1074, 1156, 1179, 1179, 1179, + /* 190 */ 1241, 1241, 1245, 14, 78, 14, 1252, 1253, 14, 1252, + /* 200 */ 14, 14, 14, 1179, 14, 1241, 179, 179, 179, 179, + /* 210 */ 179, 179, 179, 179, 179, 179, 179, 1179, 1241, 566, + /* 220 */ 1128, 1245, 31, 1152, 78, 31, 1179, 1179, 1252, 31, + /* 230 */ 1103, 566, 566, 566, 566, 1103, 566, 1199, 31, 151, + /* 240 */ 31, 384, 1367, 1367, 566, 1147, 1103, 566, 566, 1147, + /* 250 */ 1103, 566, 566, 179, 1160, 1249, 1147, 1162, 1169, 1185, + /* 260 */ 917, 1166, 1171, 1180, 1201, 384, 1422, 1355, 1357, 566, + /* 270 */ 574, 1179, 31, 1425, 1241, 2993, 2993, 2993, 2993, 2993, + /* 280 */ 2993, 2993, 1066, 191, 403, 1785, 1098, 684, 1158, 50, + /* 290 */ 1041, 1176, 126, 754, 754, 754, 754, 754, 754, 754, + /* 300 */ 754, 754, 239, 215, 11, 11, 171, 264, 406, 554, + /* 310 */ 421, 162, 547, 15, 729, 477, 15, 15, 15, 844, + /* 320 */ 135, 687, 830, 888, 889, 890, 895, 975, 1038, 1039, + /* 330 */ 858, 835, 936, 949, 963, 998, 1008, 1009, 1020, 872, + /* 340 */ 842, 992, 1003, 1004, 1001, 1024, 908, 1073, 670, 1000, + /* 350 */ 1091, 1140, 1151, 1193, 1195, 1207, 997, 1083, 1085, 1027, + /* 360 */ 1181, 1483, 1489, 1308, 1503, 1504, 1463, 1510, 1480, 1322, + /* 370 */ 1484, 1487, 1488, 1324, 1524, 1491, 1492, 1334, 1530, 1337, + /* 380 */ 1535, 1501, 1558, 1538, 1562, 1509, 1385, 1388, 1565, 1566, + /* 390 */ 1396, 1398, 1572, 1574, 1529, 1576, 1577, 1578, 1537, 1580, + /* 400 */ 1581, 1583, 1542, 1585, 1587, 1588, 1589, 1597, 1600, 1452, + /* 410 */ 1567, 1606, 1455, 1608, 1611, 1616, 1617, 1618, 1619, 1620, + /* 420 */ 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1586, 1629, 1630, + /* 430 */ 1631, 1632, 1633, 1634, 1614, 1637, 1638, 1640, 1641, 1635, + /* 440 */ 1652, 1598, 1653, 1603, 1656, 1660, 1639, 1628, 1636, 1650, + /* 450 */ 1615, 1651, 1658, 1668, 1643, 1645, 1669, 1671, 1672, 1646, + /* 460 */ 1506, 1674, 1676, 1680, 1649, 1693, 1696, 1662, 1655, 1659, + /* 470 */ 1707, 1677, 1673, 1670, 1721, 1688, 1678, 1685, 1726, 1692, + /* 480 */ 1681, 1690, 1730, 1732, 1733, 1734, 1654, 1657, 1701, 1715, + /* 490 */ 1738, 1717, 1719, 1720, 1710, 1713, 1725, 1727, 1728, 1735, + /* 500 */ 1761, 1741, 1765, 1745, 1722, 1768, 1747, 1737, 1773, 1739, + /* 510 */ 1775, 1742, 1776, 1756, 1759, 1686, 1689, 1780, 1642, 1750, + /* 520 */ 1782, 1607, 1766, 1644, 1648, 1790, 1792, 1661, 1665, 1791, + /* 530 */ 1793, 1802, 1806, 1716, 1714, 1777, 1663, 1811, 1723, 1666, + /* 540 */ 1729, 1814, 1781, 1675, 1731, 1711, 1770, 1779, 1595, 1605, + /* 550 */ 1609, 1786, 1590, 1743, 1744, 1746, 1748, 1749, 1751, 1795, + /* 560 */ 1755, 1752, 1758, 1760, 1771, 1812, 1810, 1821, 1774, 1826, + /* 570 */ 1667, 1778, 1787, 1867, 1831, 1682, 1840, 1845, 1848, 1850, + /* 580 */ 1852, 1853, 1794, 1796, 1844, 1683, 1849, 1851, 1854, 1892, + /* 590 */ 1873, 1698, 1805, 1801, 1808, 1809, 1815, 1818, 1857, 1816, + /* 600 */ 1820, 1859, 1830, 1904, 1753, 1834, 1825, 1836, 1897, 1899, + /* 610 */ 1841, 1855, 1901, 1858, 1856, 1909, 1860, 1861, 1911, 1863, + /* 620 */ 1864, 1913, 1866, 1846, 1847, 1862, 1868, 1927, 1869, 1875, + /* 630 */ 1876, 1923, 1877, 1919, 1919, 1941, 1910, 1912, 1939, 1942, + /* 640 */ 1943, 1944, 1946, 1947, 1950, 1952, 1953, 1955, 1908, 1900, + /* 650 */ 1940, 1957, 1959, 1973, 1971, 1985, 1975, 1977, 1979, 1949, + /* 660 */ 1710, 1980, 1713, 1981, 1983, 1984, 1987, 1986, 1988, 2020, + /* 670 */ 1989, 1978, 1990, 2027, 1995, 2000, 1992, 2033, 1999, 2003, + /* 680 */ 1996, 2037, 2016, 2005, 2015, 2055, 2029, 2031, 2068, 2047, + /* 690 */ 2049, 2051, 2052, 2050, 2056, }; #define YY_REDUCE_COUNT (281) -#define YY_REDUCE_MIN (-379) +#define YY_REDUCE_MIN (-408) #define YY_REDUCE_MAX (2591) static const short yy_reduce_ofst[] = { /* 0 */ 400, -253, -313, 885, 13, 282, 551, 996, 263, 1101, @@ -905,102 +905,102 @@ static const short yy_reduce_ofst[] = { /* 20 */ 1604, 1647, 1664, 1718, 1736, 1798, 1822, 1865, 1885, 1948, /* 30 */ 1967, 2010, 2061, 2081, 2132, 2185, 2228, 2248, 2311, 2330, /* 40 */ 2373, 2424, 2444, 2495, 2548, 2591, 21, 280, -223, 801, - /* 50 */ 924, 926, 933, 984, -98, -28, -351, -348, -316, -341, - /* 60 */ -20, 131, 475, 27, 36, -322, -318, -345, -312, 225, - /* 70 */ 236, 238, 261, 276, 283, 286, 313, 436, -231, 493, - /* 80 */ 508, 550, -245, 552, 555, -51, 565, 613, -22, -200, - /* 90 */ 615, 64, 30, 109, 380, 28, -311, -379, -379, -65, - /* 100 */ -137, -27, -15, 197, 248, 259, 293, 304, 329, 353, - /* 110 */ 416, 464, 472, 504, 505, 510, 526, 544, 619, -62, - /* 120 */ -102, 133, -165, 170, 244, 111, 165, 320, 230, 305, - /* 130 */ 133, 228, 491, 221, -12, 417, 534, 430, 467, 312, - /* 140 */ 512, 547, -211, 273, 606, 612, 637, 623, 390, 415, - /* 150 */ 482, 495, 585, 611, 627, 588, 722, 666, 651, 765, - /* 160 */ 663, 776, 696, 779, 779, 829, 832, 803, 769, 744, - /* 170 */ 744, 726, 744, 755, 746, 779, 794, 806, 809, 833, - /* 180 */ 835, 901, 904, 861, 868, 881, 916, 932, 934, 935, - /* 190 */ 942, 943, 886, 936, 903, 940, 899, 907, 945, 914, - /* 200 */ 963, 964, 967, 972, 970, 992, 966, 968, 973, 974, - /* 210 */ 976, 977, 979, 981, 982, 990, 993, 985, 997, 959, - /* 220 */ 956, 950, 1011, 961, 986, 1018, 1023, 1024, 978, 1027, - /* 230 */ 994, 1012, 1013, 1017, 1020, 1001, 1021, 1016, 1054, 1042, - /* 240 */ 1058, 1039, 1007, 1008, 1041, 983, 1034, 1049, 1051, 988, - /* 250 */ 1043, 1052, 1057, 779, 999, 989, 1003, 1005, 1010, 1015, - /* 260 */ 1048, 1006, 1019, 1026, 744, 1085, 1060, 1044, 1100, 1094, - /* 270 */ 1118, 1131, 1130, 1145, 1147, 1086, 1095, 1140, 1149, 1160, - /* 280 */ 1154, 1164, + /* 50 */ 924, 926, 933, 984, -25, 1131, -351, -348, -316, -341, + /* 60 */ -103, -63, 131, 96, 225, -318, -309, -211, -207, -5, + /* 70 */ 261, 276, 283, 286, 309, 313, 436, 493, 108, 513, + /* 80 */ 517, 533, -217, 552, 555, -239, 565, 613, -241, 22, + /* 90 */ 380, 64, 106, 561, 615, 507, -312, -408, -408, -287, + /* 100 */ -161, -265, -233, -206, -136, 141, 197, 204, 237, 293, + /* 110 */ 416, 464, 472, 516, 526, 542, 544, 545, 549, 562, + /* 120 */ -14, -189, -35, -100, -94, 173, 114, 71, 61, 90, + /* 130 */ -189, 176, 202, 165, 353, 372, 417, -105, 188, 123, + /* 140 */ 455, 196, 602, 7, 603, 609, 632, 521, -331, 117, + /* 150 */ 504, 548, 606, 611, 682, 238, 713, 695, 653, 601, + /* 160 */ 673, 760, 675, 773, 773, 794, 797, 764, 734, 706, + /* 170 */ 706, 688, 706, 744, 735, 773, 777, 779, 803, 831, + /* 180 */ 832, 876, 900, 861, 870, 874, 897, 915, 932, 934, + /* 190 */ 941, 942, 883, 935, 904, 937, 899, 898, 945, 909, + /* 200 */ 955, 962, 964, 967, 968, 977, 956, 957, 965, 966, + /* 210 */ 970, 972, 973, 974, 976, 979, 981, 983, 991, 969, + /* 220 */ 940, 943, 1010, 959, 978, 1013, 1016, 1022, 990, 1018, + /* 230 */ 980, 993, 1011, 1012, 1017, 982, 1021, 987, 1045, 1037, + /* 240 */ 1054, 1029, 1006, 1007, 1026, 971, 1031, 1043, 1044, 985, + /* 250 */ 1040, 1049, 1051, 773, 988, 986, 1002, 1005, 999, 1014, + /* 260 */ 1047, 989, 994, 1015, 706, 1078, 1057, 1042, 1099, 1092, + /* 270 */ 1116, 1129, 1130, 1143, 1146, 1082, 1094, 1124, 1127, 1142, + /* 280 */ 1161, 1164, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 10 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 20 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 30 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 40 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 50 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 60 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 70 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1617, 1543, - /* 80 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 90 */ 1543, 1543, 1543, 1543, 1543, 1615, 1783, 1971, 1543, 1543, - /* 100 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 110 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 120 */ 1543, 1983, 1543, 1543, 1543, 1617, 1543, 1615, 1943, 1943, - /* 130 */ 1983, 1983, 1983, 1543, 1543, 1543, 1543, 1722, 1543, 1824, - /* 140 */ 1824, 1543, 1543, 1543, 1543, 1543, 1722, 1543, 1543, 1543, - /* 150 */ 1543, 1543, 1543, 1543, 1543, 1818, 1543, 2008, 2061, 1543, - /* 160 */ 1543, 1543, 2011, 1543, 1543, 1543, 1543, 1675, 1998, 1975, - /* 170 */ 1989, 2045, 1976, 1973, 1992, 1543, 2002, 1543, 1811, 1788, - /* 180 */ 1788, 1543, 1543, 1788, 1785, 1785, 1666, 1543, 1543, 1543, - /* 190 */ 1543, 1543, 1543, 1617, 1543, 1617, 1543, 1543, 1617, 1543, - /* 200 */ 1617, 1617, 1617, 1543, 1617, 1543, 1543, 1543, 1543, 1543, - /* 210 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 220 */ 1830, 1543, 1615, 1820, 1543, 1615, 1543, 1543, 1543, 1615, - /* 230 */ 2016, 1543, 1543, 1543, 1543, 2016, 1543, 1543, 1615, 1543, - /* 240 */ 1615, 1543, 1543, 1543, 1543, 2018, 2016, 1543, 1543, 2018, - /* 250 */ 2016, 1543, 1543, 1543, 2030, 2026, 2018, 2034, 2032, 2004, - /* 260 */ 2002, 2064, 2051, 2047, 1989, 1543, 1543, 1543, 1691, 1543, - /* 270 */ 1543, 1543, 1615, 1575, 1543, 1813, 1824, 1725, 1725, 1725, - /* 280 */ 1618, 1548, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 290 */ 1543, 1543, 1543, 1899, 1543, 2029, 2028, 1947, 1946, 1945, - /* 300 */ 1936, 1898, 1543, 1687, 1897, 1896, 1543, 1543, 1543, 1543, - /* 310 */ 1543, 1543, 1543, 1890, 1543, 1543, 1891, 1889, 1888, 1543, - /* 320 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 330 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 340 */ 2048, 2052, 1972, 1543, 1543, 1543, 1543, 1543, 1881, 1872, - /* 350 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 360 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 370 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 380 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 390 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 400 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 410 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 420 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 430 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 440 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1580, 1543, - /* 450 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 460 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 470 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 480 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 490 */ 1543, 1543, 1543, 1656, 1655, 1543, 1543, 1543, 1543, 1543, - /* 500 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 510 */ 1543, 1543, 1543, 1880, 1543, 1543, 1543, 1543, 1543, 1543, - /* 520 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 2044, 1543, 1543, - /* 530 */ 1543, 1543, 1543, 1543, 1543, 1828, 1543, 1543, 1543, 1543, - /* 540 */ 1543, 1543, 1543, 1543, 1543, 1933, 1543, 1543, 1543, 2005, - /* 550 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 560 */ 1543, 1543, 1543, 1543, 1543, 1872, 1543, 2027, 1543, 1543, - /* 570 */ 2042, 1543, 2046, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 580 */ 1982, 1978, 1543, 1543, 1974, 1871, 1543, 1967, 1543, 1543, - /* 590 */ 1918, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 600 */ 1880, 1543, 1884, 1543, 1543, 1543, 1543, 1543, 1719, 1543, - /* 610 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 620 */ 1543, 1704, 1702, 1701, 1700, 1543, 1697, 1543, 1543, 1543, - /* 630 */ 1543, 1728, 1727, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 640 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1637, 1543, - /* 650 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1628, 1543, - /* 660 */ 1627, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 670 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 680 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - /* 690 */ 1543, 1543, 1543, + /* 0 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 10 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 20 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 30 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 40 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 50 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 60 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 70 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1623, 1549, + /* 80 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 90 */ 1549, 1549, 1549, 1549, 1549, 1621, 1791, 1979, 1549, 1549, + /* 100 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 110 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 120 */ 1549, 1991, 1549, 1549, 1549, 1623, 1549, 1621, 1951, 1951, + /* 130 */ 1991, 1991, 1991, 1549, 1549, 1549, 1549, 1730, 1549, 1832, + /* 140 */ 1832, 1549, 1549, 1549, 1549, 1549, 1730, 1549, 1549, 1549, + /* 150 */ 1549, 1549, 1549, 1549, 1549, 1826, 1549, 1549, 2016, 2069, + /* 160 */ 1549, 1549, 2019, 1549, 1549, 1549, 1549, 1683, 2006, 1983, + /* 170 */ 1997, 2053, 1984, 1981, 2000, 1549, 2010, 1549, 1819, 1796, + /* 180 */ 1796, 1549, 1549, 1796, 1793, 1793, 1674, 1549, 1549, 1549, + /* 190 */ 1549, 1549, 1549, 1623, 1549, 1623, 1549, 1549, 1623, 1549, + /* 200 */ 1623, 1623, 1623, 1549, 1623, 1549, 1549, 1549, 1549, 1549, + /* 210 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 220 */ 1838, 1549, 1621, 1828, 1549, 1621, 1549, 1549, 1549, 1621, + /* 230 */ 2024, 1549, 1549, 1549, 1549, 2024, 1549, 1549, 1621, 1549, + /* 240 */ 1621, 1549, 1549, 1549, 1549, 2026, 2024, 1549, 1549, 2026, + /* 250 */ 2024, 1549, 1549, 1549, 2038, 2034, 2026, 2042, 2040, 2012, + /* 260 */ 2010, 2072, 2059, 2055, 1997, 1549, 1549, 1549, 1699, 1549, + /* 270 */ 1549, 1549, 1621, 1581, 1549, 1821, 1832, 1733, 1733, 1733, + /* 280 */ 1624, 1554, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 290 */ 1549, 1549, 1549, 1907, 1549, 2037, 2036, 1955, 1954, 1953, + /* 300 */ 1944, 1906, 1549, 1695, 1905, 1904, 1549, 1549, 1549, 1549, + /* 310 */ 1549, 1549, 1549, 1898, 1549, 1549, 1899, 1897, 1896, 1549, + /* 320 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 330 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 340 */ 2056, 2060, 1980, 1549, 1549, 1549, 1549, 1549, 1889, 1880, + /* 350 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 360 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 370 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 380 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 390 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 400 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 410 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 420 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 430 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 440 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1586, 1549, + /* 450 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 460 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 470 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 480 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 490 */ 1549, 1549, 1549, 1549, 1663, 1662, 1549, 1549, 1549, 1549, + /* 500 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 510 */ 1549, 1549, 1549, 1549, 1549, 1888, 1549, 1549, 1549, 1549, + /* 520 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 2052, + /* 530 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1836, 1549, 1549, + /* 540 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1941, 1549, 1549, + /* 550 */ 1549, 2013, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 560 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1880, 1549, 2035, + /* 570 */ 1549, 1549, 2050, 1549, 2054, 1549, 1549, 1549, 1549, 1549, + /* 580 */ 1549, 1549, 1990, 1986, 1549, 1549, 1982, 1879, 1549, 1975, + /* 590 */ 1549, 1549, 1926, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 600 */ 1549, 1549, 1888, 1549, 1892, 1549, 1549, 1549, 1549, 1549, + /* 610 */ 1727, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 620 */ 1549, 1549, 1549, 1712, 1710, 1709, 1708, 1549, 1705, 1549, + /* 630 */ 1549, 1549, 1549, 1736, 1735, 1549, 1549, 1549, 1549, 1549, + /* 640 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 650 */ 1643, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 660 */ 1634, 1549, 1633, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 670 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 680 */ 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + /* 690 */ 1549, 1549, 1549, 1549, 1549, }; /********** End of lemon-generated parsing tables *****************************/ @@ -1986,421 +1986,423 @@ static const char *const yyRuleName[] = { /* 103 */ "db_options ::= db_options TABLE_SUFFIX NK_INTEGER", /* 104 */ "alter_db_options ::= alter_db_option", /* 105 */ "alter_db_options ::= alter_db_options alter_db_option", - /* 106 */ "alter_db_option ::= CACHEMODEL NK_STRING", - /* 107 */ "alter_db_option ::= CACHESIZE NK_INTEGER", - /* 108 */ "alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER", - /* 109 */ "alter_db_option ::= KEEP integer_list", - /* 110 */ "alter_db_option ::= KEEP variable_list", - /* 111 */ "alter_db_option ::= WAL_LEVEL NK_INTEGER", - /* 112 */ "alter_db_option ::= STT_TRIGGER NK_INTEGER", - /* 113 */ "integer_list ::= NK_INTEGER", - /* 114 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", - /* 115 */ "variable_list ::= NK_VARIABLE", - /* 116 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", - /* 117 */ "retention_list ::= retention", - /* 118 */ "retention_list ::= retention_list NK_COMMA retention", - /* 119 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", - /* 120 */ "speed_opt ::=", - /* 121 */ "speed_opt ::= MAX_SPEED NK_INTEGER", - /* 122 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", - /* 123 */ "cmd ::= CREATE TABLE multi_create_clause", - /* 124 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", - /* 125 */ "cmd ::= DROP TABLE multi_drop_clause", - /* 126 */ "cmd ::= DROP STABLE exists_opt full_table_name", - /* 127 */ "cmd ::= ALTER TABLE alter_table_clause", - /* 128 */ "cmd ::= ALTER STABLE alter_table_clause", - /* 129 */ "alter_table_clause ::= full_table_name alter_table_options", - /* 130 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", - /* 131 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", - /* 132 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", - /* 133 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", - /* 134 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", - /* 135 */ "alter_table_clause ::= full_table_name DROP TAG column_name", - /* 136 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", - /* 137 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", - /* 138 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", - /* 139 */ "multi_create_clause ::= create_subtable_clause", - /* 140 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", - /* 141 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options", - /* 142 */ "multi_drop_clause ::= drop_table_clause", - /* 143 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", - /* 144 */ "drop_table_clause ::= exists_opt full_table_name", - /* 145 */ "specific_cols_opt ::=", - /* 146 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", - /* 147 */ "full_table_name ::= table_name", - /* 148 */ "full_table_name ::= db_name NK_DOT table_name", - /* 149 */ "column_def_list ::= column_def", - /* 150 */ "column_def_list ::= column_def_list NK_COMMA column_def", - /* 151 */ "column_def ::= column_name type_name", - /* 152 */ "column_def ::= column_name type_name COMMENT NK_STRING", - /* 153 */ "type_name ::= BOOL", - /* 154 */ "type_name ::= TINYINT", - /* 155 */ "type_name ::= SMALLINT", - /* 156 */ "type_name ::= INT", - /* 157 */ "type_name ::= INTEGER", - /* 158 */ "type_name ::= BIGINT", - /* 159 */ "type_name ::= FLOAT", - /* 160 */ "type_name ::= DOUBLE", - /* 161 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", - /* 162 */ "type_name ::= TIMESTAMP", - /* 163 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", - /* 164 */ "type_name ::= TINYINT UNSIGNED", - /* 165 */ "type_name ::= SMALLINT UNSIGNED", - /* 166 */ "type_name ::= INT UNSIGNED", - /* 167 */ "type_name ::= BIGINT UNSIGNED", - /* 168 */ "type_name ::= JSON", - /* 169 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", - /* 170 */ "type_name ::= MEDIUMBLOB", - /* 171 */ "type_name ::= BLOB", - /* 172 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", - /* 173 */ "type_name ::= DECIMAL", - /* 174 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", - /* 175 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", - /* 176 */ "tags_def_opt ::=", - /* 177 */ "tags_def_opt ::= tags_def", - /* 178 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", - /* 179 */ "table_options ::=", - /* 180 */ "table_options ::= table_options COMMENT NK_STRING", - /* 181 */ "table_options ::= table_options MAX_DELAY duration_list", - /* 182 */ "table_options ::= table_options WATERMARK duration_list", - /* 183 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", - /* 184 */ "table_options ::= table_options TTL NK_INTEGER", - /* 185 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", - /* 186 */ "alter_table_options ::= alter_table_option", - /* 187 */ "alter_table_options ::= alter_table_options alter_table_option", - /* 188 */ "alter_table_option ::= COMMENT NK_STRING", - /* 189 */ "alter_table_option ::= TTL NK_INTEGER", - /* 190 */ "duration_list ::= duration_literal", - /* 191 */ "duration_list ::= duration_list NK_COMMA duration_literal", - /* 192 */ "rollup_func_list ::= rollup_func_name", - /* 193 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", - /* 194 */ "rollup_func_name ::= function_name", - /* 195 */ "rollup_func_name ::= FIRST", - /* 196 */ "rollup_func_name ::= LAST", - /* 197 */ "col_name_list ::= col_name", - /* 198 */ "col_name_list ::= col_name_list NK_COMMA col_name", - /* 199 */ "col_name ::= column_name", - /* 200 */ "cmd ::= SHOW DNODES", - /* 201 */ "cmd ::= SHOW USERS", - /* 202 */ "cmd ::= SHOW DATABASES", - /* 203 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", - /* 204 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", - /* 205 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", - /* 206 */ "cmd ::= SHOW MNODES", - /* 207 */ "cmd ::= SHOW MODULES", - /* 208 */ "cmd ::= SHOW QNODES", - /* 209 */ "cmd ::= SHOW FUNCTIONS", - /* 210 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", - /* 211 */ "cmd ::= SHOW STREAMS", - /* 212 */ "cmd ::= SHOW ACCOUNTS", - /* 213 */ "cmd ::= SHOW APPS", - /* 214 */ "cmd ::= SHOW CONNECTIONS", - /* 215 */ "cmd ::= SHOW LICENCES", - /* 216 */ "cmd ::= SHOW GRANTS", - /* 217 */ "cmd ::= SHOW CREATE DATABASE db_name", - /* 218 */ "cmd ::= SHOW CREATE TABLE full_table_name", - /* 219 */ "cmd ::= SHOW CREATE STABLE full_table_name", - /* 220 */ "cmd ::= SHOW QUERIES", - /* 221 */ "cmd ::= SHOW SCORES", - /* 222 */ "cmd ::= SHOW TOPICS", - /* 223 */ "cmd ::= SHOW VARIABLES", - /* 224 */ "cmd ::= SHOW LOCAL VARIABLES", - /* 225 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES", - /* 226 */ "cmd ::= SHOW BNODES", - /* 227 */ "cmd ::= SHOW SNODES", - /* 228 */ "cmd ::= SHOW CLUSTER", - /* 229 */ "cmd ::= SHOW TRANSACTIONS", - /* 230 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", - /* 231 */ "cmd ::= SHOW CONSUMERS", - /* 232 */ "cmd ::= SHOW SUBSCRIPTIONS", - /* 233 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", - /* 234 */ "cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt", - /* 235 */ "cmd ::= SHOW VNODES NK_INTEGER", - /* 236 */ "cmd ::= SHOW VNODES NK_STRING", - /* 237 */ "db_name_cond_opt ::=", - /* 238 */ "db_name_cond_opt ::= db_name NK_DOT", - /* 239 */ "like_pattern_opt ::=", - /* 240 */ "like_pattern_opt ::= LIKE NK_STRING", - /* 241 */ "table_name_cond ::= table_name", - /* 242 */ "from_db_opt ::=", - /* 243 */ "from_db_opt ::= FROM db_name", - /* 244 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options", - /* 245 */ "cmd ::= DROP INDEX exists_opt full_table_name", - /* 246 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", - /* 247 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", - /* 248 */ "func_list ::= func", - /* 249 */ "func_list ::= func_list NK_COMMA func", - /* 250 */ "func ::= function_name NK_LP expression_list NK_RP", - /* 251 */ "sma_stream_opt ::=", - /* 252 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", - /* 253 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", - /* 254 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", - /* 255 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", - /* 256 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", - /* 257 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", - /* 258 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", - /* 259 */ "cmd ::= DROP TOPIC exists_opt topic_name", - /* 260 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", - /* 261 */ "cmd ::= DESC full_table_name", - /* 262 */ "cmd ::= DESCRIBE full_table_name", - /* 263 */ "cmd ::= RESET QUERY CACHE", - /* 264 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery", - /* 265 */ "analyze_opt ::=", - /* 266 */ "analyze_opt ::= ANALYZE", - /* 267 */ "explain_options ::=", - /* 268 */ "explain_options ::= explain_options VERBOSE NK_BOOL", - /* 269 */ "explain_options ::= explain_options RATIO NK_FLOAT", - /* 270 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", - /* 271 */ "cmd ::= DROP FUNCTION exists_opt function_name", - /* 272 */ "agg_func_opt ::=", - /* 273 */ "agg_func_opt ::= AGGREGATE", - /* 274 */ "bufsize_opt ::=", - /* 275 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", - /* 276 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery", - /* 277 */ "cmd ::= DROP STREAM exists_opt stream_name", - /* 278 */ "stream_options ::=", - /* 279 */ "stream_options ::= stream_options TRIGGER AT_ONCE", - /* 280 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", - /* 281 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", - /* 282 */ "stream_options ::= stream_options WATERMARK duration_literal", - /* 283 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", - /* 284 */ "subtable_opt ::=", - /* 285 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP", - /* 286 */ "cmd ::= KILL CONNECTION NK_INTEGER", - /* 287 */ "cmd ::= KILL QUERY NK_STRING", - /* 288 */ "cmd ::= KILL TRANSACTION NK_INTEGER", - /* 289 */ "cmd ::= BALANCE VGROUP", - /* 290 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", - /* 291 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", - /* 292 */ "cmd ::= SPLIT VGROUP NK_INTEGER", - /* 293 */ "dnode_list ::= DNODE NK_INTEGER", - /* 294 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", - /* 295 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", - /* 296 */ "cmd ::= query_or_subquery", - /* 297 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery", - /* 298 */ "cmd ::= INSERT INTO full_table_name query_or_subquery", - /* 299 */ "literal ::= NK_INTEGER", - /* 300 */ "literal ::= NK_FLOAT", - /* 301 */ "literal ::= NK_STRING", - /* 302 */ "literal ::= NK_BOOL", - /* 303 */ "literal ::= TIMESTAMP NK_STRING", - /* 304 */ "literal ::= duration_literal", - /* 305 */ "literal ::= NULL", - /* 306 */ "literal ::= NK_QUESTION", - /* 307 */ "duration_literal ::= NK_VARIABLE", - /* 308 */ "signed ::= NK_INTEGER", - /* 309 */ "signed ::= NK_PLUS NK_INTEGER", - /* 310 */ "signed ::= NK_MINUS NK_INTEGER", - /* 311 */ "signed ::= NK_FLOAT", - /* 312 */ "signed ::= NK_PLUS NK_FLOAT", - /* 313 */ "signed ::= NK_MINUS NK_FLOAT", - /* 314 */ "signed_literal ::= signed", - /* 315 */ "signed_literal ::= NK_STRING", - /* 316 */ "signed_literal ::= NK_BOOL", - /* 317 */ "signed_literal ::= TIMESTAMP NK_STRING", - /* 318 */ "signed_literal ::= duration_literal", - /* 319 */ "signed_literal ::= NULL", - /* 320 */ "signed_literal ::= literal_func", - /* 321 */ "signed_literal ::= NK_QUESTION", - /* 322 */ "literal_list ::= signed_literal", - /* 323 */ "literal_list ::= literal_list NK_COMMA signed_literal", - /* 324 */ "db_name ::= NK_ID", - /* 325 */ "table_name ::= NK_ID", - /* 326 */ "column_name ::= NK_ID", - /* 327 */ "function_name ::= NK_ID", - /* 328 */ "table_alias ::= NK_ID", - /* 329 */ "column_alias ::= NK_ID", - /* 330 */ "user_name ::= NK_ID", - /* 331 */ "topic_name ::= NK_ID", - /* 332 */ "stream_name ::= NK_ID", - /* 333 */ "cgroup_name ::= NK_ID", - /* 334 */ "expr_or_subquery ::= expression", - /* 335 */ "expr_or_subquery ::= subquery", - /* 336 */ "expression ::= literal", - /* 337 */ "expression ::= pseudo_column", - /* 338 */ "expression ::= column_reference", - /* 339 */ "expression ::= function_expression", - /* 340 */ "expression ::= case_when_expression", - /* 341 */ "expression ::= NK_LP expression NK_RP", - /* 342 */ "expression ::= NK_PLUS expr_or_subquery", - /* 343 */ "expression ::= NK_MINUS expr_or_subquery", - /* 344 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery", - /* 345 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery", - /* 346 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery", - /* 347 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery", - /* 348 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery", - /* 349 */ "expression ::= column_reference NK_ARROW NK_STRING", - /* 350 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery", - /* 351 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery", - /* 352 */ "expression_list ::= expr_or_subquery", - /* 353 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery", - /* 354 */ "column_reference ::= column_name", - /* 355 */ "column_reference ::= table_name NK_DOT column_name", - /* 356 */ "pseudo_column ::= ROWTS", - /* 357 */ "pseudo_column ::= TBNAME", - /* 358 */ "pseudo_column ::= table_name NK_DOT TBNAME", - /* 359 */ "pseudo_column ::= QSTART", - /* 360 */ "pseudo_column ::= QEND", - /* 361 */ "pseudo_column ::= QDURATION", - /* 362 */ "pseudo_column ::= WSTART", - /* 363 */ "pseudo_column ::= WEND", - /* 364 */ "pseudo_column ::= WDURATION", - /* 365 */ "pseudo_column ::= IROWTS", - /* 366 */ "pseudo_column ::= QTAGS", - /* 367 */ "function_expression ::= function_name NK_LP expression_list NK_RP", - /* 368 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", - /* 369 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP", - /* 370 */ "function_expression ::= literal_func", - /* 371 */ "literal_func ::= noarg_func NK_LP NK_RP", - /* 372 */ "literal_func ::= NOW", - /* 373 */ "noarg_func ::= NOW", - /* 374 */ "noarg_func ::= TODAY", - /* 375 */ "noarg_func ::= TIMEZONE", - /* 376 */ "noarg_func ::= DATABASE", - /* 377 */ "noarg_func ::= CLIENT_VERSION", - /* 378 */ "noarg_func ::= SERVER_VERSION", - /* 379 */ "noarg_func ::= SERVER_STATUS", - /* 380 */ "noarg_func ::= CURRENT_USER", - /* 381 */ "noarg_func ::= USER", - /* 382 */ "star_func ::= COUNT", - /* 383 */ "star_func ::= FIRST", - /* 384 */ "star_func ::= LAST", - /* 385 */ "star_func ::= LAST_ROW", - /* 386 */ "star_func_para_list ::= NK_STAR", - /* 387 */ "star_func_para_list ::= other_para_list", - /* 388 */ "other_para_list ::= star_func_para", - /* 389 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", - /* 390 */ "star_func_para ::= expr_or_subquery", - /* 391 */ "star_func_para ::= table_name NK_DOT NK_STAR", - /* 392 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END", - /* 393 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END", - /* 394 */ "when_then_list ::= when_then_expr", - /* 395 */ "when_then_list ::= when_then_list when_then_expr", - /* 396 */ "when_then_expr ::= WHEN common_expression THEN common_expression", - /* 397 */ "case_when_else_opt ::=", - /* 398 */ "case_when_else_opt ::= ELSE common_expression", - /* 399 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery", - /* 400 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery", - /* 401 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery", - /* 402 */ "predicate ::= expr_or_subquery IS NULL", - /* 403 */ "predicate ::= expr_or_subquery IS NOT NULL", - /* 404 */ "predicate ::= expr_or_subquery in_op in_predicate_value", - /* 405 */ "compare_op ::= NK_LT", - /* 406 */ "compare_op ::= NK_GT", - /* 407 */ "compare_op ::= NK_LE", - /* 408 */ "compare_op ::= NK_GE", - /* 409 */ "compare_op ::= NK_NE", - /* 410 */ "compare_op ::= NK_EQ", - /* 411 */ "compare_op ::= LIKE", - /* 412 */ "compare_op ::= NOT LIKE", - /* 413 */ "compare_op ::= MATCH", - /* 414 */ "compare_op ::= NMATCH", - /* 415 */ "compare_op ::= CONTAINS", - /* 416 */ "in_op ::= IN", - /* 417 */ "in_op ::= NOT IN", - /* 418 */ "in_predicate_value ::= NK_LP literal_list NK_RP", - /* 419 */ "boolean_value_expression ::= boolean_primary", - /* 420 */ "boolean_value_expression ::= NOT boolean_primary", - /* 421 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 422 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 423 */ "boolean_primary ::= predicate", - /* 424 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 425 */ "common_expression ::= expr_or_subquery", - /* 426 */ "common_expression ::= boolean_value_expression", - /* 427 */ "from_clause_opt ::=", - /* 428 */ "from_clause_opt ::= FROM table_reference_list", - /* 429 */ "table_reference_list ::= table_reference", - /* 430 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 431 */ "table_reference ::= table_primary", - /* 432 */ "table_reference ::= joined_table", - /* 433 */ "table_primary ::= table_name alias_opt", - /* 434 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 435 */ "table_primary ::= subquery alias_opt", - /* 436 */ "table_primary ::= parenthesized_joined_table", - /* 437 */ "alias_opt ::=", - /* 438 */ "alias_opt ::= table_alias", - /* 439 */ "alias_opt ::= AS table_alias", - /* 440 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 441 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 442 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 443 */ "join_type ::=", - /* 444 */ "join_type ::= INNER", - /* 445 */ "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", - /* 446 */ "set_quantifier_opt ::=", - /* 447 */ "set_quantifier_opt ::= DISTINCT", - /* 448 */ "set_quantifier_opt ::= ALL", - /* 449 */ "select_list ::= select_item", - /* 450 */ "select_list ::= select_list NK_COMMA select_item", - /* 451 */ "select_item ::= NK_STAR", - /* 452 */ "select_item ::= common_expression", - /* 453 */ "select_item ::= common_expression column_alias", - /* 454 */ "select_item ::= common_expression AS column_alias", - /* 455 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 456 */ "where_clause_opt ::=", - /* 457 */ "where_clause_opt ::= WHERE search_condition", - /* 458 */ "partition_by_clause_opt ::=", - /* 459 */ "partition_by_clause_opt ::= PARTITION BY partition_list", - /* 460 */ "partition_list ::= partition_item", - /* 461 */ "partition_list ::= partition_list NK_COMMA partition_item", - /* 462 */ "partition_item ::= expr_or_subquery", - /* 463 */ "partition_item ::= expr_or_subquery column_alias", - /* 464 */ "partition_item ::= expr_or_subquery AS column_alias", - /* 465 */ "twindow_clause_opt ::=", - /* 466 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", - /* 467 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP", - /* 468 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 469 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 470 */ "sliding_opt ::=", - /* 471 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 472 */ "fill_opt ::=", - /* 473 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 474 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 475 */ "fill_mode ::= NONE", - /* 476 */ "fill_mode ::= PREV", - /* 477 */ "fill_mode ::= NULL", - /* 478 */ "fill_mode ::= LINEAR", - /* 479 */ "fill_mode ::= NEXT", - /* 480 */ "group_by_clause_opt ::=", - /* 481 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 482 */ "group_by_list ::= expr_or_subquery", - /* 483 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery", - /* 484 */ "having_clause_opt ::=", - /* 485 */ "having_clause_opt ::= HAVING search_condition", - /* 486 */ "range_opt ::=", - /* 487 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP", - /* 488 */ "every_opt ::=", - /* 489 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", - /* 490 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 491 */ "query_simple ::= query_specification", - /* 492 */ "query_simple ::= union_query_expression", - /* 493 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery", - /* 494 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery", - /* 495 */ "query_simple_or_subquery ::= query_simple", - /* 496 */ "query_simple_or_subquery ::= subquery", - /* 497 */ "query_or_subquery ::= query_expression", - /* 498 */ "query_or_subquery ::= subquery", - /* 499 */ "order_by_clause_opt ::=", - /* 500 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 501 */ "slimit_clause_opt ::=", - /* 502 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 503 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 504 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 505 */ "limit_clause_opt ::=", - /* 506 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 507 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 508 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 509 */ "subquery ::= NK_LP query_expression NK_RP", - /* 510 */ "subquery ::= NK_LP subquery NK_RP", - /* 511 */ "search_condition ::= common_expression", - /* 512 */ "sort_specification_list ::= sort_specification", - /* 513 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 514 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt", - /* 515 */ "ordering_specification_opt ::=", - /* 516 */ "ordering_specification_opt ::= ASC", - /* 517 */ "ordering_specification_opt ::= DESC", - /* 518 */ "null_ordering_opt ::=", - /* 519 */ "null_ordering_opt ::= NULLS FIRST", - /* 520 */ "null_ordering_opt ::= NULLS LAST", + /* 106 */ "alter_db_option ::= BUFFER NK_INTEGER", + /* 107 */ "alter_db_option ::= CACHEMODEL NK_STRING", + /* 108 */ "alter_db_option ::= CACHESIZE NK_INTEGER", + /* 109 */ "alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER", + /* 110 */ "alter_db_option ::= KEEP integer_list", + /* 111 */ "alter_db_option ::= KEEP variable_list", + /* 112 */ "alter_db_option ::= PAGES NK_INTEGER", + /* 113 */ "alter_db_option ::= WAL_LEVEL NK_INTEGER", + /* 114 */ "alter_db_option ::= STT_TRIGGER NK_INTEGER", + /* 115 */ "integer_list ::= NK_INTEGER", + /* 116 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER", + /* 117 */ "variable_list ::= NK_VARIABLE", + /* 118 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE", + /* 119 */ "retention_list ::= retention", + /* 120 */ "retention_list ::= retention_list NK_COMMA retention", + /* 121 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE", + /* 122 */ "speed_opt ::=", + /* 123 */ "speed_opt ::= MAX_SPEED NK_INTEGER", + /* 124 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options", + /* 125 */ "cmd ::= CREATE TABLE multi_create_clause", + /* 126 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options", + /* 127 */ "cmd ::= DROP TABLE multi_drop_clause", + /* 128 */ "cmd ::= DROP STABLE exists_opt full_table_name", + /* 129 */ "cmd ::= ALTER TABLE alter_table_clause", + /* 130 */ "cmd ::= ALTER STABLE alter_table_clause", + /* 131 */ "alter_table_clause ::= full_table_name alter_table_options", + /* 132 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name", + /* 133 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name", + /* 134 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name", + /* 135 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name", + /* 136 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name", + /* 137 */ "alter_table_clause ::= full_table_name DROP TAG column_name", + /* 138 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name", + /* 139 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name", + /* 140 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal", + /* 141 */ "multi_create_clause ::= create_subtable_clause", + /* 142 */ "multi_create_clause ::= multi_create_clause create_subtable_clause", + /* 143 */ "create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options", + /* 144 */ "multi_drop_clause ::= drop_table_clause", + /* 145 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause", + /* 146 */ "drop_table_clause ::= exists_opt full_table_name", + /* 147 */ "specific_cols_opt ::=", + /* 148 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP", + /* 149 */ "full_table_name ::= table_name", + /* 150 */ "full_table_name ::= db_name NK_DOT table_name", + /* 151 */ "column_def_list ::= column_def", + /* 152 */ "column_def_list ::= column_def_list NK_COMMA column_def", + /* 153 */ "column_def ::= column_name type_name", + /* 154 */ "column_def ::= column_name type_name COMMENT NK_STRING", + /* 155 */ "type_name ::= BOOL", + /* 156 */ "type_name ::= TINYINT", + /* 157 */ "type_name ::= SMALLINT", + /* 158 */ "type_name ::= INT", + /* 159 */ "type_name ::= INTEGER", + /* 160 */ "type_name ::= BIGINT", + /* 161 */ "type_name ::= FLOAT", + /* 162 */ "type_name ::= DOUBLE", + /* 163 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP", + /* 164 */ "type_name ::= TIMESTAMP", + /* 165 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP", + /* 166 */ "type_name ::= TINYINT UNSIGNED", + /* 167 */ "type_name ::= SMALLINT UNSIGNED", + /* 168 */ "type_name ::= INT UNSIGNED", + /* 169 */ "type_name ::= BIGINT UNSIGNED", + /* 170 */ "type_name ::= JSON", + /* 171 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP", + /* 172 */ "type_name ::= MEDIUMBLOB", + /* 173 */ "type_name ::= BLOB", + /* 174 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP", + /* 175 */ "type_name ::= DECIMAL", + /* 176 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP", + /* 177 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP", + /* 178 */ "tags_def_opt ::=", + /* 179 */ "tags_def_opt ::= tags_def", + /* 180 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP", + /* 181 */ "table_options ::=", + /* 182 */ "table_options ::= table_options COMMENT NK_STRING", + /* 183 */ "table_options ::= table_options MAX_DELAY duration_list", + /* 184 */ "table_options ::= table_options WATERMARK duration_list", + /* 185 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP", + /* 186 */ "table_options ::= table_options TTL NK_INTEGER", + /* 187 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP", + /* 188 */ "alter_table_options ::= alter_table_option", + /* 189 */ "alter_table_options ::= alter_table_options alter_table_option", + /* 190 */ "alter_table_option ::= COMMENT NK_STRING", + /* 191 */ "alter_table_option ::= TTL NK_INTEGER", + /* 192 */ "duration_list ::= duration_literal", + /* 193 */ "duration_list ::= duration_list NK_COMMA duration_literal", + /* 194 */ "rollup_func_list ::= rollup_func_name", + /* 195 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name", + /* 196 */ "rollup_func_name ::= function_name", + /* 197 */ "rollup_func_name ::= FIRST", + /* 198 */ "rollup_func_name ::= LAST", + /* 199 */ "col_name_list ::= col_name", + /* 200 */ "col_name_list ::= col_name_list NK_COMMA col_name", + /* 201 */ "col_name ::= column_name", + /* 202 */ "cmd ::= SHOW DNODES", + /* 203 */ "cmd ::= SHOW USERS", + /* 204 */ "cmd ::= SHOW DATABASES", + /* 205 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt", + /* 206 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt", + /* 207 */ "cmd ::= SHOW db_name_cond_opt VGROUPS", + /* 208 */ "cmd ::= SHOW MNODES", + /* 209 */ "cmd ::= SHOW MODULES", + /* 210 */ "cmd ::= SHOW QNODES", + /* 211 */ "cmd ::= SHOW FUNCTIONS", + /* 212 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt", + /* 213 */ "cmd ::= SHOW STREAMS", + /* 214 */ "cmd ::= SHOW ACCOUNTS", + /* 215 */ "cmd ::= SHOW APPS", + /* 216 */ "cmd ::= SHOW CONNECTIONS", + /* 217 */ "cmd ::= SHOW LICENCES", + /* 218 */ "cmd ::= SHOW GRANTS", + /* 219 */ "cmd ::= SHOW CREATE DATABASE db_name", + /* 220 */ "cmd ::= SHOW CREATE TABLE full_table_name", + /* 221 */ "cmd ::= SHOW CREATE STABLE full_table_name", + /* 222 */ "cmd ::= SHOW QUERIES", + /* 223 */ "cmd ::= SHOW SCORES", + /* 224 */ "cmd ::= SHOW TOPICS", + /* 225 */ "cmd ::= SHOW VARIABLES", + /* 226 */ "cmd ::= SHOW LOCAL VARIABLES", + /* 227 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES", + /* 228 */ "cmd ::= SHOW BNODES", + /* 229 */ "cmd ::= SHOW SNODES", + /* 230 */ "cmd ::= SHOW CLUSTER", + /* 231 */ "cmd ::= SHOW TRANSACTIONS", + /* 232 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name", + /* 233 */ "cmd ::= SHOW CONSUMERS", + /* 234 */ "cmd ::= SHOW SUBSCRIPTIONS", + /* 235 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", + /* 236 */ "cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt", + /* 237 */ "cmd ::= SHOW VNODES NK_INTEGER", + /* 238 */ "cmd ::= SHOW VNODES NK_STRING", + /* 239 */ "db_name_cond_opt ::=", + /* 240 */ "db_name_cond_opt ::= db_name NK_DOT", + /* 241 */ "like_pattern_opt ::=", + /* 242 */ "like_pattern_opt ::= LIKE NK_STRING", + /* 243 */ "table_name_cond ::= table_name", + /* 244 */ "from_db_opt ::=", + /* 245 */ "from_db_opt ::= FROM db_name", + /* 246 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options", + /* 247 */ "cmd ::= DROP INDEX exists_opt full_table_name", + /* 248 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", + /* 249 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", + /* 250 */ "func_list ::= func", + /* 251 */ "func_list ::= func_list NK_COMMA func", + /* 252 */ "func ::= function_name NK_LP expression_list NK_RP", + /* 253 */ "sma_stream_opt ::=", + /* 254 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", + /* 255 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", + /* 256 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", + /* 257 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", + /* 258 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", + /* 259 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", + /* 260 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", + /* 261 */ "cmd ::= DROP TOPIC exists_opt topic_name", + /* 262 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", + /* 263 */ "cmd ::= DESC full_table_name", + /* 264 */ "cmd ::= DESCRIBE full_table_name", + /* 265 */ "cmd ::= RESET QUERY CACHE", + /* 266 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery", + /* 267 */ "analyze_opt ::=", + /* 268 */ "analyze_opt ::= ANALYZE", + /* 269 */ "explain_options ::=", + /* 270 */ "explain_options ::= explain_options VERBOSE NK_BOOL", + /* 271 */ "explain_options ::= explain_options RATIO NK_FLOAT", + /* 272 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", + /* 273 */ "cmd ::= DROP FUNCTION exists_opt function_name", + /* 274 */ "agg_func_opt ::=", + /* 275 */ "agg_func_opt ::= AGGREGATE", + /* 276 */ "bufsize_opt ::=", + /* 277 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", + /* 278 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery", + /* 279 */ "cmd ::= DROP STREAM exists_opt stream_name", + /* 280 */ "stream_options ::=", + /* 281 */ "stream_options ::= stream_options TRIGGER AT_ONCE", + /* 282 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", + /* 283 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", + /* 284 */ "stream_options ::= stream_options WATERMARK duration_literal", + /* 285 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", + /* 286 */ "subtable_opt ::=", + /* 287 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP", + /* 288 */ "cmd ::= KILL CONNECTION NK_INTEGER", + /* 289 */ "cmd ::= KILL QUERY NK_STRING", + /* 290 */ "cmd ::= KILL TRANSACTION NK_INTEGER", + /* 291 */ "cmd ::= BALANCE VGROUP", + /* 292 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", + /* 293 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", + /* 294 */ "cmd ::= SPLIT VGROUP NK_INTEGER", + /* 295 */ "dnode_list ::= DNODE NK_INTEGER", + /* 296 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", + /* 297 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", + /* 298 */ "cmd ::= query_or_subquery", + /* 299 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery", + /* 300 */ "cmd ::= INSERT INTO full_table_name query_or_subquery", + /* 301 */ "literal ::= NK_INTEGER", + /* 302 */ "literal ::= NK_FLOAT", + /* 303 */ "literal ::= NK_STRING", + /* 304 */ "literal ::= NK_BOOL", + /* 305 */ "literal ::= TIMESTAMP NK_STRING", + /* 306 */ "literal ::= duration_literal", + /* 307 */ "literal ::= NULL", + /* 308 */ "literal ::= NK_QUESTION", + /* 309 */ "duration_literal ::= NK_VARIABLE", + /* 310 */ "signed ::= NK_INTEGER", + /* 311 */ "signed ::= NK_PLUS NK_INTEGER", + /* 312 */ "signed ::= NK_MINUS NK_INTEGER", + /* 313 */ "signed ::= NK_FLOAT", + /* 314 */ "signed ::= NK_PLUS NK_FLOAT", + /* 315 */ "signed ::= NK_MINUS NK_FLOAT", + /* 316 */ "signed_literal ::= signed", + /* 317 */ "signed_literal ::= NK_STRING", + /* 318 */ "signed_literal ::= NK_BOOL", + /* 319 */ "signed_literal ::= TIMESTAMP NK_STRING", + /* 320 */ "signed_literal ::= duration_literal", + /* 321 */ "signed_literal ::= NULL", + /* 322 */ "signed_literal ::= literal_func", + /* 323 */ "signed_literal ::= NK_QUESTION", + /* 324 */ "literal_list ::= signed_literal", + /* 325 */ "literal_list ::= literal_list NK_COMMA signed_literal", + /* 326 */ "db_name ::= NK_ID", + /* 327 */ "table_name ::= NK_ID", + /* 328 */ "column_name ::= NK_ID", + /* 329 */ "function_name ::= NK_ID", + /* 330 */ "table_alias ::= NK_ID", + /* 331 */ "column_alias ::= NK_ID", + /* 332 */ "user_name ::= NK_ID", + /* 333 */ "topic_name ::= NK_ID", + /* 334 */ "stream_name ::= NK_ID", + /* 335 */ "cgroup_name ::= NK_ID", + /* 336 */ "expr_or_subquery ::= expression", + /* 337 */ "expr_or_subquery ::= subquery", + /* 338 */ "expression ::= literal", + /* 339 */ "expression ::= pseudo_column", + /* 340 */ "expression ::= column_reference", + /* 341 */ "expression ::= function_expression", + /* 342 */ "expression ::= case_when_expression", + /* 343 */ "expression ::= NK_LP expression NK_RP", + /* 344 */ "expression ::= NK_PLUS expr_or_subquery", + /* 345 */ "expression ::= NK_MINUS expr_or_subquery", + /* 346 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery", + /* 347 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery", + /* 348 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery", + /* 349 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery", + /* 350 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery", + /* 351 */ "expression ::= column_reference NK_ARROW NK_STRING", + /* 352 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery", + /* 353 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery", + /* 354 */ "expression_list ::= expr_or_subquery", + /* 355 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery", + /* 356 */ "column_reference ::= column_name", + /* 357 */ "column_reference ::= table_name NK_DOT column_name", + /* 358 */ "pseudo_column ::= ROWTS", + /* 359 */ "pseudo_column ::= TBNAME", + /* 360 */ "pseudo_column ::= table_name NK_DOT TBNAME", + /* 361 */ "pseudo_column ::= QSTART", + /* 362 */ "pseudo_column ::= QEND", + /* 363 */ "pseudo_column ::= QDURATION", + /* 364 */ "pseudo_column ::= WSTART", + /* 365 */ "pseudo_column ::= WEND", + /* 366 */ "pseudo_column ::= WDURATION", + /* 367 */ "pseudo_column ::= IROWTS", + /* 368 */ "pseudo_column ::= QTAGS", + /* 369 */ "function_expression ::= function_name NK_LP expression_list NK_RP", + /* 370 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", + /* 371 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP", + /* 372 */ "function_expression ::= literal_func", + /* 373 */ "literal_func ::= noarg_func NK_LP NK_RP", + /* 374 */ "literal_func ::= NOW", + /* 375 */ "noarg_func ::= NOW", + /* 376 */ "noarg_func ::= TODAY", + /* 377 */ "noarg_func ::= TIMEZONE", + /* 378 */ "noarg_func ::= DATABASE", + /* 379 */ "noarg_func ::= CLIENT_VERSION", + /* 380 */ "noarg_func ::= SERVER_VERSION", + /* 381 */ "noarg_func ::= SERVER_STATUS", + /* 382 */ "noarg_func ::= CURRENT_USER", + /* 383 */ "noarg_func ::= USER", + /* 384 */ "star_func ::= COUNT", + /* 385 */ "star_func ::= FIRST", + /* 386 */ "star_func ::= LAST", + /* 387 */ "star_func ::= LAST_ROW", + /* 388 */ "star_func_para_list ::= NK_STAR", + /* 389 */ "star_func_para_list ::= other_para_list", + /* 390 */ "other_para_list ::= star_func_para", + /* 391 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", + /* 392 */ "star_func_para ::= expr_or_subquery", + /* 393 */ "star_func_para ::= table_name NK_DOT NK_STAR", + /* 394 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END", + /* 395 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END", + /* 396 */ "when_then_list ::= when_then_expr", + /* 397 */ "when_then_list ::= when_then_list when_then_expr", + /* 398 */ "when_then_expr ::= WHEN common_expression THEN common_expression", + /* 399 */ "case_when_else_opt ::=", + /* 400 */ "case_when_else_opt ::= ELSE common_expression", + /* 401 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery", + /* 402 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery", + /* 403 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery", + /* 404 */ "predicate ::= expr_or_subquery IS NULL", + /* 405 */ "predicate ::= expr_or_subquery IS NOT NULL", + /* 406 */ "predicate ::= expr_or_subquery in_op in_predicate_value", + /* 407 */ "compare_op ::= NK_LT", + /* 408 */ "compare_op ::= NK_GT", + /* 409 */ "compare_op ::= NK_LE", + /* 410 */ "compare_op ::= NK_GE", + /* 411 */ "compare_op ::= NK_NE", + /* 412 */ "compare_op ::= NK_EQ", + /* 413 */ "compare_op ::= LIKE", + /* 414 */ "compare_op ::= NOT LIKE", + /* 415 */ "compare_op ::= MATCH", + /* 416 */ "compare_op ::= NMATCH", + /* 417 */ "compare_op ::= CONTAINS", + /* 418 */ "in_op ::= IN", + /* 419 */ "in_op ::= NOT IN", + /* 420 */ "in_predicate_value ::= NK_LP literal_list NK_RP", + /* 421 */ "boolean_value_expression ::= boolean_primary", + /* 422 */ "boolean_value_expression ::= NOT boolean_primary", + /* 423 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 424 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 425 */ "boolean_primary ::= predicate", + /* 426 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 427 */ "common_expression ::= expr_or_subquery", + /* 428 */ "common_expression ::= boolean_value_expression", + /* 429 */ "from_clause_opt ::=", + /* 430 */ "from_clause_opt ::= FROM table_reference_list", + /* 431 */ "table_reference_list ::= table_reference", + /* 432 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 433 */ "table_reference ::= table_primary", + /* 434 */ "table_reference ::= joined_table", + /* 435 */ "table_primary ::= table_name alias_opt", + /* 436 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 437 */ "table_primary ::= subquery alias_opt", + /* 438 */ "table_primary ::= parenthesized_joined_table", + /* 439 */ "alias_opt ::=", + /* 440 */ "alias_opt ::= table_alias", + /* 441 */ "alias_opt ::= AS table_alias", + /* 442 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 443 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 444 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 445 */ "join_type ::=", + /* 446 */ "join_type ::= INNER", + /* 447 */ "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", + /* 448 */ "set_quantifier_opt ::=", + /* 449 */ "set_quantifier_opt ::= DISTINCT", + /* 450 */ "set_quantifier_opt ::= ALL", + /* 451 */ "select_list ::= select_item", + /* 452 */ "select_list ::= select_list NK_COMMA select_item", + /* 453 */ "select_item ::= NK_STAR", + /* 454 */ "select_item ::= common_expression", + /* 455 */ "select_item ::= common_expression column_alias", + /* 456 */ "select_item ::= common_expression AS column_alias", + /* 457 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 458 */ "where_clause_opt ::=", + /* 459 */ "where_clause_opt ::= WHERE search_condition", + /* 460 */ "partition_by_clause_opt ::=", + /* 461 */ "partition_by_clause_opt ::= PARTITION BY partition_list", + /* 462 */ "partition_list ::= partition_item", + /* 463 */ "partition_list ::= partition_list NK_COMMA partition_item", + /* 464 */ "partition_item ::= expr_or_subquery", + /* 465 */ "partition_item ::= expr_or_subquery column_alias", + /* 466 */ "partition_item ::= expr_or_subquery AS column_alias", + /* 467 */ "twindow_clause_opt ::=", + /* 468 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", + /* 469 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP", + /* 470 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 471 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 472 */ "sliding_opt ::=", + /* 473 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 474 */ "fill_opt ::=", + /* 475 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 476 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 477 */ "fill_mode ::= NONE", + /* 478 */ "fill_mode ::= PREV", + /* 479 */ "fill_mode ::= NULL", + /* 480 */ "fill_mode ::= LINEAR", + /* 481 */ "fill_mode ::= NEXT", + /* 482 */ "group_by_clause_opt ::=", + /* 483 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 484 */ "group_by_list ::= expr_or_subquery", + /* 485 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery", + /* 486 */ "having_clause_opt ::=", + /* 487 */ "having_clause_opt ::= HAVING search_condition", + /* 488 */ "range_opt ::=", + /* 489 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP", + /* 490 */ "every_opt ::=", + /* 491 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", + /* 492 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 493 */ "query_simple ::= query_specification", + /* 494 */ "query_simple ::= union_query_expression", + /* 495 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery", + /* 496 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery", + /* 497 */ "query_simple_or_subquery ::= query_simple", + /* 498 */ "query_simple_or_subquery ::= subquery", + /* 499 */ "query_or_subquery ::= query_expression", + /* 500 */ "query_or_subquery ::= subquery", + /* 501 */ "order_by_clause_opt ::=", + /* 502 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 503 */ "slimit_clause_opt ::=", + /* 504 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 505 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 506 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 507 */ "limit_clause_opt ::=", + /* 508 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 509 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 510 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 511 */ "subquery ::= NK_LP query_expression NK_RP", + /* 512 */ "subquery ::= NK_LP subquery NK_RP", + /* 513 */ "search_condition ::= common_expression", + /* 514 */ "sort_specification_list ::= sort_specification", + /* 515 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 516 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt", + /* 517 */ "ordering_specification_opt ::=", + /* 518 */ "ordering_specification_opt ::= ASC", + /* 519 */ "ordering_specification_opt ::= DESC", + /* 520 */ "null_ordering_opt ::=", + /* 521 */ "null_ordering_opt ::= NULLS FIRST", + /* 522 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -3115,421 +3117,423 @@ static const struct { { 331, -3 }, /* (103) db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ { 333, -1 }, /* (104) alter_db_options ::= alter_db_option */ { 333, -2 }, /* (105) alter_db_options ::= alter_db_options alter_db_option */ - { 338, -2 }, /* (106) alter_db_option ::= CACHEMODEL NK_STRING */ - { 338, -2 }, /* (107) alter_db_option ::= CACHESIZE NK_INTEGER */ - { 338, -2 }, /* (108) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ - { 338, -2 }, /* (109) alter_db_option ::= KEEP integer_list */ - { 338, -2 }, /* (110) alter_db_option ::= KEEP variable_list */ - { 338, -2 }, /* (111) alter_db_option ::= WAL_LEVEL NK_INTEGER */ - { 338, -2 }, /* (112) alter_db_option ::= STT_TRIGGER NK_INTEGER */ - { 335, -1 }, /* (113) integer_list ::= NK_INTEGER */ - { 335, -3 }, /* (114) integer_list ::= integer_list NK_COMMA NK_INTEGER */ - { 336, -1 }, /* (115) variable_list ::= NK_VARIABLE */ - { 336, -3 }, /* (116) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ - { 337, -1 }, /* (117) retention_list ::= retention */ - { 337, -3 }, /* (118) retention_list ::= retention_list NK_COMMA retention */ - { 339, -3 }, /* (119) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ - { 334, 0 }, /* (120) speed_opt ::= */ - { 334, -2 }, /* (121) speed_opt ::= MAX_SPEED NK_INTEGER */ - { 317, -9 }, /* (122) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - { 317, -3 }, /* (123) cmd ::= CREATE TABLE multi_create_clause */ - { 317, -9 }, /* (124) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ - { 317, -3 }, /* (125) cmd ::= DROP TABLE multi_drop_clause */ - { 317, -4 }, /* (126) cmd ::= DROP STABLE exists_opt full_table_name */ - { 317, -3 }, /* (127) cmd ::= ALTER TABLE alter_table_clause */ - { 317, -3 }, /* (128) cmd ::= ALTER STABLE alter_table_clause */ - { 347, -2 }, /* (129) alter_table_clause ::= full_table_name alter_table_options */ - { 347, -5 }, /* (130) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ - { 347, -4 }, /* (131) alter_table_clause ::= full_table_name DROP COLUMN column_name */ - { 347, -5 }, /* (132) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ - { 347, -5 }, /* (133) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ - { 347, -5 }, /* (134) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ - { 347, -4 }, /* (135) alter_table_clause ::= full_table_name DROP TAG column_name */ - { 347, -5 }, /* (136) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ - { 347, -5 }, /* (137) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ - { 347, -6 }, /* (138) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ - { 344, -1 }, /* (139) multi_create_clause ::= create_subtable_clause */ - { 344, -2 }, /* (140) multi_create_clause ::= multi_create_clause create_subtable_clause */ - { 352, -10 }, /* (141) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ - { 346, -1 }, /* (142) multi_drop_clause ::= drop_table_clause */ - { 346, -2 }, /* (143) multi_drop_clause ::= multi_drop_clause drop_table_clause */ - { 355, -2 }, /* (144) drop_table_clause ::= exists_opt full_table_name */ - { 353, 0 }, /* (145) specific_cols_opt ::= */ - { 353, -3 }, /* (146) specific_cols_opt ::= NK_LP col_name_list NK_RP */ - { 340, -1 }, /* (147) full_table_name ::= table_name */ - { 340, -3 }, /* (148) full_table_name ::= db_name NK_DOT table_name */ - { 341, -1 }, /* (149) column_def_list ::= column_def */ - { 341, -3 }, /* (150) column_def_list ::= column_def_list NK_COMMA column_def */ - { 358, -2 }, /* (151) column_def ::= column_name type_name */ - { 358, -4 }, /* (152) column_def ::= column_name type_name COMMENT NK_STRING */ - { 350, -1 }, /* (153) type_name ::= BOOL */ - { 350, -1 }, /* (154) type_name ::= TINYINT */ - { 350, -1 }, /* (155) type_name ::= SMALLINT */ - { 350, -1 }, /* (156) type_name ::= INT */ - { 350, -1 }, /* (157) type_name ::= INTEGER */ - { 350, -1 }, /* (158) type_name ::= BIGINT */ - { 350, -1 }, /* (159) type_name ::= FLOAT */ - { 350, -1 }, /* (160) type_name ::= DOUBLE */ - { 350, -4 }, /* (161) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ - { 350, -1 }, /* (162) type_name ::= TIMESTAMP */ - { 350, -4 }, /* (163) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ - { 350, -2 }, /* (164) type_name ::= TINYINT UNSIGNED */ - { 350, -2 }, /* (165) type_name ::= SMALLINT UNSIGNED */ - { 350, -2 }, /* (166) type_name ::= INT UNSIGNED */ - { 350, -2 }, /* (167) type_name ::= BIGINT UNSIGNED */ - { 350, -1 }, /* (168) type_name ::= JSON */ - { 350, -4 }, /* (169) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ - { 350, -1 }, /* (170) type_name ::= MEDIUMBLOB */ - { 350, -1 }, /* (171) type_name ::= BLOB */ - { 350, -4 }, /* (172) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ - { 350, -1 }, /* (173) type_name ::= DECIMAL */ - { 350, -4 }, /* (174) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ - { 350, -6 }, /* (175) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ - { 342, 0 }, /* (176) tags_def_opt ::= */ - { 342, -1 }, /* (177) tags_def_opt ::= tags_def */ - { 345, -4 }, /* (178) tags_def ::= TAGS NK_LP column_def_list NK_RP */ - { 343, 0 }, /* (179) table_options ::= */ - { 343, -3 }, /* (180) table_options ::= table_options COMMENT NK_STRING */ - { 343, -3 }, /* (181) table_options ::= table_options MAX_DELAY duration_list */ - { 343, -3 }, /* (182) table_options ::= table_options WATERMARK duration_list */ - { 343, -5 }, /* (183) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ - { 343, -3 }, /* (184) table_options ::= table_options TTL NK_INTEGER */ - { 343, -5 }, /* (185) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ - { 348, -1 }, /* (186) alter_table_options ::= alter_table_option */ - { 348, -2 }, /* (187) alter_table_options ::= alter_table_options alter_table_option */ - { 361, -2 }, /* (188) alter_table_option ::= COMMENT NK_STRING */ - { 361, -2 }, /* (189) alter_table_option ::= TTL NK_INTEGER */ - { 359, -1 }, /* (190) duration_list ::= duration_literal */ - { 359, -3 }, /* (191) duration_list ::= duration_list NK_COMMA duration_literal */ - { 360, -1 }, /* (192) rollup_func_list ::= rollup_func_name */ - { 360, -3 }, /* (193) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ - { 363, -1 }, /* (194) rollup_func_name ::= function_name */ - { 363, -1 }, /* (195) rollup_func_name ::= FIRST */ - { 363, -1 }, /* (196) rollup_func_name ::= LAST */ - { 356, -1 }, /* (197) col_name_list ::= col_name */ - { 356, -3 }, /* (198) col_name_list ::= col_name_list NK_COMMA col_name */ - { 365, -1 }, /* (199) col_name ::= column_name */ - { 317, -2 }, /* (200) cmd ::= SHOW DNODES */ - { 317, -2 }, /* (201) cmd ::= SHOW USERS */ - { 317, -2 }, /* (202) cmd ::= SHOW DATABASES */ - { 317, -4 }, /* (203) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ - { 317, -4 }, /* (204) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ - { 317, -3 }, /* (205) cmd ::= SHOW db_name_cond_opt VGROUPS */ - { 317, -2 }, /* (206) cmd ::= SHOW MNODES */ - { 317, -2 }, /* (207) cmd ::= SHOW MODULES */ - { 317, -2 }, /* (208) cmd ::= SHOW QNODES */ - { 317, -2 }, /* (209) cmd ::= SHOW FUNCTIONS */ - { 317, -5 }, /* (210) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ - { 317, -2 }, /* (211) cmd ::= SHOW STREAMS */ - { 317, -2 }, /* (212) cmd ::= SHOW ACCOUNTS */ - { 317, -2 }, /* (213) cmd ::= SHOW APPS */ - { 317, -2 }, /* (214) cmd ::= SHOW CONNECTIONS */ - { 317, -2 }, /* (215) cmd ::= SHOW LICENCES */ - { 317, -2 }, /* (216) cmd ::= SHOW GRANTS */ - { 317, -4 }, /* (217) cmd ::= SHOW CREATE DATABASE db_name */ - { 317, -4 }, /* (218) cmd ::= SHOW CREATE TABLE full_table_name */ - { 317, -4 }, /* (219) cmd ::= SHOW CREATE STABLE full_table_name */ - { 317, -2 }, /* (220) cmd ::= SHOW QUERIES */ - { 317, -2 }, /* (221) cmd ::= SHOW SCORES */ - { 317, -2 }, /* (222) cmd ::= SHOW TOPICS */ - { 317, -2 }, /* (223) cmd ::= SHOW VARIABLES */ - { 317, -3 }, /* (224) cmd ::= SHOW LOCAL VARIABLES */ - { 317, -4 }, /* (225) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ - { 317, -2 }, /* (226) cmd ::= SHOW BNODES */ - { 317, -2 }, /* (227) cmd ::= SHOW SNODES */ - { 317, -2 }, /* (228) cmd ::= SHOW CLUSTER */ - { 317, -2 }, /* (229) cmd ::= SHOW TRANSACTIONS */ - { 317, -4 }, /* (230) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ - { 317, -2 }, /* (231) cmd ::= SHOW CONSUMERS */ - { 317, -2 }, /* (232) cmd ::= SHOW SUBSCRIPTIONS */ - { 317, -5 }, /* (233) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ - { 317, -6 }, /* (234) cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt */ - { 317, -3 }, /* (235) cmd ::= SHOW VNODES NK_INTEGER */ - { 317, -3 }, /* (236) cmd ::= SHOW VNODES NK_STRING */ - { 366, 0 }, /* (237) db_name_cond_opt ::= */ - { 366, -2 }, /* (238) db_name_cond_opt ::= db_name NK_DOT */ - { 367, 0 }, /* (239) like_pattern_opt ::= */ - { 367, -2 }, /* (240) like_pattern_opt ::= LIKE NK_STRING */ - { 368, -1 }, /* (241) table_name_cond ::= table_name */ - { 369, 0 }, /* (242) from_db_opt ::= */ - { 369, -2 }, /* (243) from_db_opt ::= FROM db_name */ - { 317, -8 }, /* (244) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ - { 317, -4 }, /* (245) cmd ::= DROP INDEX exists_opt full_table_name */ - { 370, -10 }, /* (246) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ - { 370, -12 }, /* (247) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ - { 371, -1 }, /* (248) func_list ::= func */ - { 371, -3 }, /* (249) func_list ::= func_list NK_COMMA func */ - { 374, -4 }, /* (250) func ::= function_name NK_LP expression_list NK_RP */ - { 373, 0 }, /* (251) sma_stream_opt ::= */ - { 373, -3 }, /* (252) sma_stream_opt ::= stream_options WATERMARK duration_literal */ - { 373, -3 }, /* (253) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ - { 317, -6 }, /* (254) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ - { 317, -7 }, /* (255) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ - { 317, -9 }, /* (256) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ - { 317, -7 }, /* (257) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ - { 317, -9 }, /* (258) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ - { 317, -4 }, /* (259) cmd ::= DROP TOPIC exists_opt topic_name */ - { 317, -7 }, /* (260) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ - { 317, -2 }, /* (261) cmd ::= DESC full_table_name */ - { 317, -2 }, /* (262) cmd ::= DESCRIBE full_table_name */ - { 317, -3 }, /* (263) cmd ::= RESET QUERY CACHE */ - { 317, -4 }, /* (264) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ - { 379, 0 }, /* (265) analyze_opt ::= */ - { 379, -1 }, /* (266) analyze_opt ::= ANALYZE */ - { 380, 0 }, /* (267) explain_options ::= */ - { 380, -3 }, /* (268) explain_options ::= explain_options VERBOSE NK_BOOL */ - { 380, -3 }, /* (269) explain_options ::= explain_options RATIO NK_FLOAT */ - { 317, -10 }, /* (270) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ - { 317, -4 }, /* (271) cmd ::= DROP FUNCTION exists_opt function_name */ - { 381, 0 }, /* (272) agg_func_opt ::= */ - { 381, -1 }, /* (273) agg_func_opt ::= AGGREGATE */ - { 382, 0 }, /* (274) bufsize_opt ::= */ - { 382, -2 }, /* (275) bufsize_opt ::= BUFSIZE NK_INTEGER */ - { 317, -11 }, /* (276) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ - { 317, -4 }, /* (277) cmd ::= DROP STREAM exists_opt stream_name */ - { 375, 0 }, /* (278) stream_options ::= */ - { 375, -3 }, /* (279) stream_options ::= stream_options TRIGGER AT_ONCE */ - { 375, -3 }, /* (280) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ - { 375, -4 }, /* (281) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ - { 375, -3 }, /* (282) stream_options ::= stream_options WATERMARK duration_literal */ - { 375, -4 }, /* (283) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ - { 384, 0 }, /* (284) subtable_opt ::= */ - { 384, -4 }, /* (285) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ - { 317, -3 }, /* (286) cmd ::= KILL CONNECTION NK_INTEGER */ - { 317, -3 }, /* (287) cmd ::= KILL QUERY NK_STRING */ - { 317, -3 }, /* (288) cmd ::= KILL TRANSACTION NK_INTEGER */ - { 317, -2 }, /* (289) cmd ::= BALANCE VGROUP */ - { 317, -4 }, /* (290) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ - { 317, -4 }, /* (291) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ - { 317, -3 }, /* (292) cmd ::= SPLIT VGROUP NK_INTEGER */ - { 386, -2 }, /* (293) dnode_list ::= DNODE NK_INTEGER */ - { 386, -3 }, /* (294) dnode_list ::= dnode_list DNODE NK_INTEGER */ - { 317, -4 }, /* (295) cmd ::= DELETE FROM full_table_name where_clause_opt */ - { 317, -1 }, /* (296) cmd ::= query_or_subquery */ - { 317, -7 }, /* (297) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ - { 317, -4 }, /* (298) cmd ::= INSERT INTO full_table_name query_or_subquery */ - { 320, -1 }, /* (299) literal ::= NK_INTEGER */ - { 320, -1 }, /* (300) literal ::= NK_FLOAT */ - { 320, -1 }, /* (301) literal ::= NK_STRING */ - { 320, -1 }, /* (302) literal ::= NK_BOOL */ - { 320, -2 }, /* (303) literal ::= TIMESTAMP NK_STRING */ - { 320, -1 }, /* (304) literal ::= duration_literal */ - { 320, -1 }, /* (305) literal ::= NULL */ - { 320, -1 }, /* (306) literal ::= NK_QUESTION */ - { 362, -1 }, /* (307) duration_literal ::= NK_VARIABLE */ - { 388, -1 }, /* (308) signed ::= NK_INTEGER */ - { 388, -2 }, /* (309) signed ::= NK_PLUS NK_INTEGER */ - { 388, -2 }, /* (310) signed ::= NK_MINUS NK_INTEGER */ - { 388, -1 }, /* (311) signed ::= NK_FLOAT */ - { 388, -2 }, /* (312) signed ::= NK_PLUS NK_FLOAT */ - { 388, -2 }, /* (313) signed ::= NK_MINUS NK_FLOAT */ - { 351, -1 }, /* (314) signed_literal ::= signed */ - { 351, -1 }, /* (315) signed_literal ::= NK_STRING */ - { 351, -1 }, /* (316) signed_literal ::= NK_BOOL */ - { 351, -2 }, /* (317) signed_literal ::= TIMESTAMP NK_STRING */ - { 351, -1 }, /* (318) signed_literal ::= duration_literal */ - { 351, -1 }, /* (319) signed_literal ::= NULL */ - { 351, -1 }, /* (320) signed_literal ::= literal_func */ - { 351, -1 }, /* (321) signed_literal ::= NK_QUESTION */ - { 390, -1 }, /* (322) literal_list ::= signed_literal */ - { 390, -3 }, /* (323) literal_list ::= literal_list NK_COMMA signed_literal */ - { 328, -1 }, /* (324) db_name ::= NK_ID */ - { 357, -1 }, /* (325) table_name ::= NK_ID */ - { 349, -1 }, /* (326) column_name ::= NK_ID */ - { 364, -1 }, /* (327) function_name ::= NK_ID */ - { 391, -1 }, /* (328) table_alias ::= NK_ID */ - { 392, -1 }, /* (329) column_alias ::= NK_ID */ - { 322, -1 }, /* (330) user_name ::= NK_ID */ - { 376, -1 }, /* (331) topic_name ::= NK_ID */ - { 383, -1 }, /* (332) stream_name ::= NK_ID */ - { 378, -1 }, /* (333) cgroup_name ::= NK_ID */ - { 393, -1 }, /* (334) expr_or_subquery ::= expression */ - { 393, -1 }, /* (335) expr_or_subquery ::= subquery */ - { 385, -1 }, /* (336) expression ::= literal */ - { 385, -1 }, /* (337) expression ::= pseudo_column */ - { 385, -1 }, /* (338) expression ::= column_reference */ - { 385, -1 }, /* (339) expression ::= function_expression */ - { 385, -1 }, /* (340) expression ::= case_when_expression */ - { 385, -3 }, /* (341) expression ::= NK_LP expression NK_RP */ - { 385, -2 }, /* (342) expression ::= NK_PLUS expr_or_subquery */ - { 385, -2 }, /* (343) expression ::= NK_MINUS expr_or_subquery */ - { 385, -3 }, /* (344) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ - { 385, -3 }, /* (345) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ - { 385, -3 }, /* (346) expression ::= expr_or_subquery NK_STAR expr_or_subquery */ - { 385, -3 }, /* (347) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ - { 385, -3 }, /* (348) expression ::= expr_or_subquery NK_REM expr_or_subquery */ - { 385, -3 }, /* (349) expression ::= column_reference NK_ARROW NK_STRING */ - { 385, -3 }, /* (350) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ - { 385, -3 }, /* (351) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ - { 354, -1 }, /* (352) expression_list ::= expr_or_subquery */ - { 354, -3 }, /* (353) expression_list ::= expression_list NK_COMMA expr_or_subquery */ - { 396, -1 }, /* (354) column_reference ::= column_name */ - { 396, -3 }, /* (355) column_reference ::= table_name NK_DOT column_name */ - { 395, -1 }, /* (356) pseudo_column ::= ROWTS */ - { 395, -1 }, /* (357) pseudo_column ::= TBNAME */ - { 395, -3 }, /* (358) pseudo_column ::= table_name NK_DOT TBNAME */ - { 395, -1 }, /* (359) pseudo_column ::= QSTART */ - { 395, -1 }, /* (360) pseudo_column ::= QEND */ - { 395, -1 }, /* (361) pseudo_column ::= QDURATION */ - { 395, -1 }, /* (362) pseudo_column ::= WSTART */ - { 395, -1 }, /* (363) pseudo_column ::= WEND */ - { 395, -1 }, /* (364) pseudo_column ::= WDURATION */ - { 395, -1 }, /* (365) pseudo_column ::= IROWTS */ - { 395, -1 }, /* (366) pseudo_column ::= QTAGS */ - { 397, -4 }, /* (367) function_expression ::= function_name NK_LP expression_list NK_RP */ - { 397, -4 }, /* (368) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ - { 397, -6 }, /* (369) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ - { 397, -1 }, /* (370) function_expression ::= literal_func */ - { 389, -3 }, /* (371) literal_func ::= noarg_func NK_LP NK_RP */ - { 389, -1 }, /* (372) literal_func ::= NOW */ - { 401, -1 }, /* (373) noarg_func ::= NOW */ - { 401, -1 }, /* (374) noarg_func ::= TODAY */ - { 401, -1 }, /* (375) noarg_func ::= TIMEZONE */ - { 401, -1 }, /* (376) noarg_func ::= DATABASE */ - { 401, -1 }, /* (377) noarg_func ::= CLIENT_VERSION */ - { 401, -1 }, /* (378) noarg_func ::= SERVER_VERSION */ - { 401, -1 }, /* (379) noarg_func ::= SERVER_STATUS */ - { 401, -1 }, /* (380) noarg_func ::= CURRENT_USER */ - { 401, -1 }, /* (381) noarg_func ::= USER */ - { 399, -1 }, /* (382) star_func ::= COUNT */ - { 399, -1 }, /* (383) star_func ::= FIRST */ - { 399, -1 }, /* (384) star_func ::= LAST */ - { 399, -1 }, /* (385) star_func ::= LAST_ROW */ - { 400, -1 }, /* (386) star_func_para_list ::= NK_STAR */ - { 400, -1 }, /* (387) star_func_para_list ::= other_para_list */ - { 402, -1 }, /* (388) other_para_list ::= star_func_para */ - { 402, -3 }, /* (389) other_para_list ::= other_para_list NK_COMMA star_func_para */ - { 403, -1 }, /* (390) star_func_para ::= expr_or_subquery */ - { 403, -3 }, /* (391) star_func_para ::= table_name NK_DOT NK_STAR */ - { 398, -4 }, /* (392) case_when_expression ::= CASE when_then_list case_when_else_opt END */ - { 398, -5 }, /* (393) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ - { 404, -1 }, /* (394) when_then_list ::= when_then_expr */ - { 404, -2 }, /* (395) when_then_list ::= when_then_list when_then_expr */ - { 407, -4 }, /* (396) when_then_expr ::= WHEN common_expression THEN common_expression */ - { 405, 0 }, /* (397) case_when_else_opt ::= */ - { 405, -2 }, /* (398) case_when_else_opt ::= ELSE common_expression */ - { 408, -3 }, /* (399) predicate ::= expr_or_subquery compare_op expr_or_subquery */ - { 408, -5 }, /* (400) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ - { 408, -6 }, /* (401) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ - { 408, -3 }, /* (402) predicate ::= expr_or_subquery IS NULL */ - { 408, -4 }, /* (403) predicate ::= expr_or_subquery IS NOT NULL */ - { 408, -3 }, /* (404) predicate ::= expr_or_subquery in_op in_predicate_value */ - { 409, -1 }, /* (405) compare_op ::= NK_LT */ - { 409, -1 }, /* (406) compare_op ::= NK_GT */ - { 409, -1 }, /* (407) compare_op ::= NK_LE */ - { 409, -1 }, /* (408) compare_op ::= NK_GE */ - { 409, -1 }, /* (409) compare_op ::= NK_NE */ - { 409, -1 }, /* (410) compare_op ::= NK_EQ */ - { 409, -1 }, /* (411) compare_op ::= LIKE */ - { 409, -2 }, /* (412) compare_op ::= NOT LIKE */ - { 409, -1 }, /* (413) compare_op ::= MATCH */ - { 409, -1 }, /* (414) compare_op ::= NMATCH */ - { 409, -1 }, /* (415) compare_op ::= CONTAINS */ - { 410, -1 }, /* (416) in_op ::= IN */ - { 410, -2 }, /* (417) in_op ::= NOT IN */ - { 411, -3 }, /* (418) in_predicate_value ::= NK_LP literal_list NK_RP */ - { 412, -1 }, /* (419) boolean_value_expression ::= boolean_primary */ - { 412, -2 }, /* (420) boolean_value_expression ::= NOT boolean_primary */ - { 412, -3 }, /* (421) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 412, -3 }, /* (422) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 413, -1 }, /* (423) boolean_primary ::= predicate */ - { 413, -3 }, /* (424) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 406, -1 }, /* (425) common_expression ::= expr_or_subquery */ - { 406, -1 }, /* (426) common_expression ::= boolean_value_expression */ - { 414, 0 }, /* (427) from_clause_opt ::= */ - { 414, -2 }, /* (428) from_clause_opt ::= FROM table_reference_list */ - { 415, -1 }, /* (429) table_reference_list ::= table_reference */ - { 415, -3 }, /* (430) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 416, -1 }, /* (431) table_reference ::= table_primary */ - { 416, -1 }, /* (432) table_reference ::= joined_table */ - { 417, -2 }, /* (433) table_primary ::= table_name alias_opt */ - { 417, -4 }, /* (434) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 417, -2 }, /* (435) table_primary ::= subquery alias_opt */ - { 417, -1 }, /* (436) table_primary ::= parenthesized_joined_table */ - { 419, 0 }, /* (437) alias_opt ::= */ - { 419, -1 }, /* (438) alias_opt ::= table_alias */ - { 419, -2 }, /* (439) alias_opt ::= AS table_alias */ - { 420, -3 }, /* (440) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 420, -3 }, /* (441) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 418, -6 }, /* (442) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 421, 0 }, /* (443) join_type ::= */ - { 421, -1 }, /* (444) join_type ::= INNER */ - { 423, -12 }, /* (445) 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 */ - { 424, 0 }, /* (446) set_quantifier_opt ::= */ - { 424, -1 }, /* (447) set_quantifier_opt ::= DISTINCT */ - { 424, -1 }, /* (448) set_quantifier_opt ::= ALL */ - { 425, -1 }, /* (449) select_list ::= select_item */ - { 425, -3 }, /* (450) select_list ::= select_list NK_COMMA select_item */ - { 433, -1 }, /* (451) select_item ::= NK_STAR */ - { 433, -1 }, /* (452) select_item ::= common_expression */ - { 433, -2 }, /* (453) select_item ::= common_expression column_alias */ - { 433, -3 }, /* (454) select_item ::= common_expression AS column_alias */ - { 433, -3 }, /* (455) select_item ::= table_name NK_DOT NK_STAR */ - { 387, 0 }, /* (456) where_clause_opt ::= */ - { 387, -2 }, /* (457) where_clause_opt ::= WHERE search_condition */ - { 426, 0 }, /* (458) partition_by_clause_opt ::= */ - { 426, -3 }, /* (459) partition_by_clause_opt ::= PARTITION BY partition_list */ - { 434, -1 }, /* (460) partition_list ::= partition_item */ - { 434, -3 }, /* (461) partition_list ::= partition_list NK_COMMA partition_item */ - { 435, -1 }, /* (462) partition_item ::= expr_or_subquery */ - { 435, -2 }, /* (463) partition_item ::= expr_or_subquery column_alias */ - { 435, -3 }, /* (464) partition_item ::= expr_or_subquery AS column_alias */ - { 430, 0 }, /* (465) twindow_clause_opt ::= */ - { 430, -6 }, /* (466) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ - { 430, -4 }, /* (467) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ - { 430, -6 }, /* (468) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 430, -8 }, /* (469) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 372, 0 }, /* (470) sliding_opt ::= */ - { 372, -4 }, /* (471) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 429, 0 }, /* (472) fill_opt ::= */ - { 429, -4 }, /* (473) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 429, -6 }, /* (474) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 436, -1 }, /* (475) fill_mode ::= NONE */ - { 436, -1 }, /* (476) fill_mode ::= PREV */ - { 436, -1 }, /* (477) fill_mode ::= NULL */ - { 436, -1 }, /* (478) fill_mode ::= LINEAR */ - { 436, -1 }, /* (479) fill_mode ::= NEXT */ - { 431, 0 }, /* (480) group_by_clause_opt ::= */ - { 431, -3 }, /* (481) group_by_clause_opt ::= GROUP BY group_by_list */ - { 437, -1 }, /* (482) group_by_list ::= expr_or_subquery */ - { 437, -3 }, /* (483) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ - { 432, 0 }, /* (484) having_clause_opt ::= */ - { 432, -2 }, /* (485) having_clause_opt ::= HAVING search_condition */ - { 427, 0 }, /* (486) range_opt ::= */ - { 427, -6 }, /* (487) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ - { 428, 0 }, /* (488) every_opt ::= */ - { 428, -4 }, /* (489) every_opt ::= EVERY NK_LP duration_literal NK_RP */ - { 438, -4 }, /* (490) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 439, -1 }, /* (491) query_simple ::= query_specification */ - { 439, -1 }, /* (492) query_simple ::= union_query_expression */ - { 443, -4 }, /* (493) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ - { 443, -3 }, /* (494) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ - { 444, -1 }, /* (495) query_simple_or_subquery ::= query_simple */ - { 444, -1 }, /* (496) query_simple_or_subquery ::= subquery */ - { 377, -1 }, /* (497) query_or_subquery ::= query_expression */ - { 377, -1 }, /* (498) query_or_subquery ::= subquery */ - { 440, 0 }, /* (499) order_by_clause_opt ::= */ - { 440, -3 }, /* (500) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 441, 0 }, /* (501) slimit_clause_opt ::= */ - { 441, -2 }, /* (502) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 441, -4 }, /* (503) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 441, -4 }, /* (504) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 442, 0 }, /* (505) limit_clause_opt ::= */ - { 442, -2 }, /* (506) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 442, -4 }, /* (507) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 442, -4 }, /* (508) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 394, -3 }, /* (509) subquery ::= NK_LP query_expression NK_RP */ - { 394, -3 }, /* (510) subquery ::= NK_LP subquery NK_RP */ - { 422, -1 }, /* (511) search_condition ::= common_expression */ - { 445, -1 }, /* (512) sort_specification_list ::= sort_specification */ - { 445, -3 }, /* (513) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 446, -3 }, /* (514) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ - { 447, 0 }, /* (515) ordering_specification_opt ::= */ - { 447, -1 }, /* (516) ordering_specification_opt ::= ASC */ - { 447, -1 }, /* (517) ordering_specification_opt ::= DESC */ - { 448, 0 }, /* (518) null_ordering_opt ::= */ - { 448, -2 }, /* (519) null_ordering_opt ::= NULLS FIRST */ - { 448, -2 }, /* (520) null_ordering_opt ::= NULLS LAST */ + { 338, -2 }, /* (106) alter_db_option ::= BUFFER NK_INTEGER */ + { 338, -2 }, /* (107) alter_db_option ::= CACHEMODEL NK_STRING */ + { 338, -2 }, /* (108) alter_db_option ::= CACHESIZE NK_INTEGER */ + { 338, -2 }, /* (109) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ + { 338, -2 }, /* (110) alter_db_option ::= KEEP integer_list */ + { 338, -2 }, /* (111) alter_db_option ::= KEEP variable_list */ + { 338, -2 }, /* (112) alter_db_option ::= PAGES NK_INTEGER */ + { 338, -2 }, /* (113) alter_db_option ::= WAL_LEVEL NK_INTEGER */ + { 338, -2 }, /* (114) alter_db_option ::= STT_TRIGGER NK_INTEGER */ + { 335, -1 }, /* (115) integer_list ::= NK_INTEGER */ + { 335, -3 }, /* (116) integer_list ::= integer_list NK_COMMA NK_INTEGER */ + { 336, -1 }, /* (117) variable_list ::= NK_VARIABLE */ + { 336, -3 }, /* (118) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ + { 337, -1 }, /* (119) retention_list ::= retention */ + { 337, -3 }, /* (120) retention_list ::= retention_list NK_COMMA retention */ + { 339, -3 }, /* (121) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ + { 334, 0 }, /* (122) speed_opt ::= */ + { 334, -2 }, /* (123) speed_opt ::= MAX_SPEED NK_INTEGER */ + { 317, -9 }, /* (124) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + { 317, -3 }, /* (125) cmd ::= CREATE TABLE multi_create_clause */ + { 317, -9 }, /* (126) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ + { 317, -3 }, /* (127) cmd ::= DROP TABLE multi_drop_clause */ + { 317, -4 }, /* (128) cmd ::= DROP STABLE exists_opt full_table_name */ + { 317, -3 }, /* (129) cmd ::= ALTER TABLE alter_table_clause */ + { 317, -3 }, /* (130) cmd ::= ALTER STABLE alter_table_clause */ + { 347, -2 }, /* (131) alter_table_clause ::= full_table_name alter_table_options */ + { 347, -5 }, /* (132) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ + { 347, -4 }, /* (133) alter_table_clause ::= full_table_name DROP COLUMN column_name */ + { 347, -5 }, /* (134) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ + { 347, -5 }, /* (135) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ + { 347, -5 }, /* (136) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ + { 347, -4 }, /* (137) alter_table_clause ::= full_table_name DROP TAG column_name */ + { 347, -5 }, /* (138) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ + { 347, -5 }, /* (139) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ + { 347, -6 }, /* (140) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ + { 344, -1 }, /* (141) multi_create_clause ::= create_subtable_clause */ + { 344, -2 }, /* (142) multi_create_clause ::= multi_create_clause create_subtable_clause */ + { 352, -10 }, /* (143) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ + { 346, -1 }, /* (144) multi_drop_clause ::= drop_table_clause */ + { 346, -2 }, /* (145) multi_drop_clause ::= multi_drop_clause drop_table_clause */ + { 355, -2 }, /* (146) drop_table_clause ::= exists_opt full_table_name */ + { 353, 0 }, /* (147) specific_cols_opt ::= */ + { 353, -3 }, /* (148) specific_cols_opt ::= NK_LP col_name_list NK_RP */ + { 340, -1 }, /* (149) full_table_name ::= table_name */ + { 340, -3 }, /* (150) full_table_name ::= db_name NK_DOT table_name */ + { 341, -1 }, /* (151) column_def_list ::= column_def */ + { 341, -3 }, /* (152) column_def_list ::= column_def_list NK_COMMA column_def */ + { 358, -2 }, /* (153) column_def ::= column_name type_name */ + { 358, -4 }, /* (154) column_def ::= column_name type_name COMMENT NK_STRING */ + { 350, -1 }, /* (155) type_name ::= BOOL */ + { 350, -1 }, /* (156) type_name ::= TINYINT */ + { 350, -1 }, /* (157) type_name ::= SMALLINT */ + { 350, -1 }, /* (158) type_name ::= INT */ + { 350, -1 }, /* (159) type_name ::= INTEGER */ + { 350, -1 }, /* (160) type_name ::= BIGINT */ + { 350, -1 }, /* (161) type_name ::= FLOAT */ + { 350, -1 }, /* (162) type_name ::= DOUBLE */ + { 350, -4 }, /* (163) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 350, -1 }, /* (164) type_name ::= TIMESTAMP */ + { 350, -4 }, /* (165) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 350, -2 }, /* (166) type_name ::= TINYINT UNSIGNED */ + { 350, -2 }, /* (167) type_name ::= SMALLINT UNSIGNED */ + { 350, -2 }, /* (168) type_name ::= INT UNSIGNED */ + { 350, -2 }, /* (169) type_name ::= BIGINT UNSIGNED */ + { 350, -1 }, /* (170) type_name ::= JSON */ + { 350, -4 }, /* (171) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 350, -1 }, /* (172) type_name ::= MEDIUMBLOB */ + { 350, -1 }, /* (173) type_name ::= BLOB */ + { 350, -4 }, /* (174) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 350, -1 }, /* (175) type_name ::= DECIMAL */ + { 350, -4 }, /* (176) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 350, -6 }, /* (177) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 342, 0 }, /* (178) tags_def_opt ::= */ + { 342, -1 }, /* (179) tags_def_opt ::= tags_def */ + { 345, -4 }, /* (180) tags_def ::= TAGS NK_LP column_def_list NK_RP */ + { 343, 0 }, /* (181) table_options ::= */ + { 343, -3 }, /* (182) table_options ::= table_options COMMENT NK_STRING */ + { 343, -3 }, /* (183) table_options ::= table_options MAX_DELAY duration_list */ + { 343, -3 }, /* (184) table_options ::= table_options WATERMARK duration_list */ + { 343, -5 }, /* (185) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ + { 343, -3 }, /* (186) table_options ::= table_options TTL NK_INTEGER */ + { 343, -5 }, /* (187) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ + { 348, -1 }, /* (188) alter_table_options ::= alter_table_option */ + { 348, -2 }, /* (189) alter_table_options ::= alter_table_options alter_table_option */ + { 361, -2 }, /* (190) alter_table_option ::= COMMENT NK_STRING */ + { 361, -2 }, /* (191) alter_table_option ::= TTL NK_INTEGER */ + { 359, -1 }, /* (192) duration_list ::= duration_literal */ + { 359, -3 }, /* (193) duration_list ::= duration_list NK_COMMA duration_literal */ + { 360, -1 }, /* (194) rollup_func_list ::= rollup_func_name */ + { 360, -3 }, /* (195) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ + { 363, -1 }, /* (196) rollup_func_name ::= function_name */ + { 363, -1 }, /* (197) rollup_func_name ::= FIRST */ + { 363, -1 }, /* (198) rollup_func_name ::= LAST */ + { 356, -1 }, /* (199) col_name_list ::= col_name */ + { 356, -3 }, /* (200) col_name_list ::= col_name_list NK_COMMA col_name */ + { 365, -1 }, /* (201) col_name ::= column_name */ + { 317, -2 }, /* (202) cmd ::= SHOW DNODES */ + { 317, -2 }, /* (203) cmd ::= SHOW USERS */ + { 317, -2 }, /* (204) cmd ::= SHOW DATABASES */ + { 317, -4 }, /* (205) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ + { 317, -4 }, /* (206) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ + { 317, -3 }, /* (207) cmd ::= SHOW db_name_cond_opt VGROUPS */ + { 317, -2 }, /* (208) cmd ::= SHOW MNODES */ + { 317, -2 }, /* (209) cmd ::= SHOW MODULES */ + { 317, -2 }, /* (210) cmd ::= SHOW QNODES */ + { 317, -2 }, /* (211) cmd ::= SHOW FUNCTIONS */ + { 317, -5 }, /* (212) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ + { 317, -2 }, /* (213) cmd ::= SHOW STREAMS */ + { 317, -2 }, /* (214) cmd ::= SHOW ACCOUNTS */ + { 317, -2 }, /* (215) cmd ::= SHOW APPS */ + { 317, -2 }, /* (216) cmd ::= SHOW CONNECTIONS */ + { 317, -2 }, /* (217) cmd ::= SHOW LICENCES */ + { 317, -2 }, /* (218) cmd ::= SHOW GRANTS */ + { 317, -4 }, /* (219) cmd ::= SHOW CREATE DATABASE db_name */ + { 317, -4 }, /* (220) cmd ::= SHOW CREATE TABLE full_table_name */ + { 317, -4 }, /* (221) cmd ::= SHOW CREATE STABLE full_table_name */ + { 317, -2 }, /* (222) cmd ::= SHOW QUERIES */ + { 317, -2 }, /* (223) cmd ::= SHOW SCORES */ + { 317, -2 }, /* (224) cmd ::= SHOW TOPICS */ + { 317, -2 }, /* (225) cmd ::= SHOW VARIABLES */ + { 317, -3 }, /* (226) cmd ::= SHOW LOCAL VARIABLES */ + { 317, -4 }, /* (227) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + { 317, -2 }, /* (228) cmd ::= SHOW BNODES */ + { 317, -2 }, /* (229) cmd ::= SHOW SNODES */ + { 317, -2 }, /* (230) cmd ::= SHOW CLUSTER */ + { 317, -2 }, /* (231) cmd ::= SHOW TRANSACTIONS */ + { 317, -4 }, /* (232) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ + { 317, -2 }, /* (233) cmd ::= SHOW CONSUMERS */ + { 317, -2 }, /* (234) cmd ::= SHOW SUBSCRIPTIONS */ + { 317, -5 }, /* (235) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ + { 317, -6 }, /* (236) cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt */ + { 317, -3 }, /* (237) cmd ::= SHOW VNODES NK_INTEGER */ + { 317, -3 }, /* (238) cmd ::= SHOW VNODES NK_STRING */ + { 366, 0 }, /* (239) db_name_cond_opt ::= */ + { 366, -2 }, /* (240) db_name_cond_opt ::= db_name NK_DOT */ + { 367, 0 }, /* (241) like_pattern_opt ::= */ + { 367, -2 }, /* (242) like_pattern_opt ::= LIKE NK_STRING */ + { 368, -1 }, /* (243) table_name_cond ::= table_name */ + { 369, 0 }, /* (244) from_db_opt ::= */ + { 369, -2 }, /* (245) from_db_opt ::= FROM db_name */ + { 317, -8 }, /* (246) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ + { 317, -4 }, /* (247) cmd ::= DROP INDEX exists_opt full_table_name */ + { 370, -10 }, /* (248) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ + { 370, -12 }, /* (249) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ + { 371, -1 }, /* (250) func_list ::= func */ + { 371, -3 }, /* (251) func_list ::= func_list NK_COMMA func */ + { 374, -4 }, /* (252) func ::= function_name NK_LP expression_list NK_RP */ + { 373, 0 }, /* (253) sma_stream_opt ::= */ + { 373, -3 }, /* (254) sma_stream_opt ::= stream_options WATERMARK duration_literal */ + { 373, -3 }, /* (255) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ + { 317, -6 }, /* (256) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ + { 317, -7 }, /* (257) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ + { 317, -9 }, /* (258) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ + { 317, -7 }, /* (259) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ + { 317, -9 }, /* (260) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + { 317, -4 }, /* (261) cmd ::= DROP TOPIC exists_opt topic_name */ + { 317, -7 }, /* (262) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ + { 317, -2 }, /* (263) cmd ::= DESC full_table_name */ + { 317, -2 }, /* (264) cmd ::= DESCRIBE full_table_name */ + { 317, -3 }, /* (265) cmd ::= RESET QUERY CACHE */ + { 317, -4 }, /* (266) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ + { 379, 0 }, /* (267) analyze_opt ::= */ + { 379, -1 }, /* (268) analyze_opt ::= ANALYZE */ + { 380, 0 }, /* (269) explain_options ::= */ + { 380, -3 }, /* (270) explain_options ::= explain_options VERBOSE NK_BOOL */ + { 380, -3 }, /* (271) explain_options ::= explain_options RATIO NK_FLOAT */ + { 317, -10 }, /* (272) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ + { 317, -4 }, /* (273) cmd ::= DROP FUNCTION exists_opt function_name */ + { 381, 0 }, /* (274) agg_func_opt ::= */ + { 381, -1 }, /* (275) agg_func_opt ::= AGGREGATE */ + { 382, 0 }, /* (276) bufsize_opt ::= */ + { 382, -2 }, /* (277) bufsize_opt ::= BUFSIZE NK_INTEGER */ + { 317, -11 }, /* (278) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ + { 317, -4 }, /* (279) cmd ::= DROP STREAM exists_opt stream_name */ + { 375, 0 }, /* (280) stream_options ::= */ + { 375, -3 }, /* (281) stream_options ::= stream_options TRIGGER AT_ONCE */ + { 375, -3 }, /* (282) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + { 375, -4 }, /* (283) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + { 375, -3 }, /* (284) stream_options ::= stream_options WATERMARK duration_literal */ + { 375, -4 }, /* (285) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ + { 384, 0 }, /* (286) subtable_opt ::= */ + { 384, -4 }, /* (287) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ + { 317, -3 }, /* (288) cmd ::= KILL CONNECTION NK_INTEGER */ + { 317, -3 }, /* (289) cmd ::= KILL QUERY NK_STRING */ + { 317, -3 }, /* (290) cmd ::= KILL TRANSACTION NK_INTEGER */ + { 317, -2 }, /* (291) cmd ::= BALANCE VGROUP */ + { 317, -4 }, /* (292) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + { 317, -4 }, /* (293) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ + { 317, -3 }, /* (294) cmd ::= SPLIT VGROUP NK_INTEGER */ + { 386, -2 }, /* (295) dnode_list ::= DNODE NK_INTEGER */ + { 386, -3 }, /* (296) dnode_list ::= dnode_list DNODE NK_INTEGER */ + { 317, -4 }, /* (297) cmd ::= DELETE FROM full_table_name where_clause_opt */ + { 317, -1 }, /* (298) cmd ::= query_or_subquery */ + { 317, -7 }, /* (299) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ + { 317, -4 }, /* (300) cmd ::= INSERT INTO full_table_name query_or_subquery */ + { 320, -1 }, /* (301) literal ::= NK_INTEGER */ + { 320, -1 }, /* (302) literal ::= NK_FLOAT */ + { 320, -1 }, /* (303) literal ::= NK_STRING */ + { 320, -1 }, /* (304) literal ::= NK_BOOL */ + { 320, -2 }, /* (305) literal ::= TIMESTAMP NK_STRING */ + { 320, -1 }, /* (306) literal ::= duration_literal */ + { 320, -1 }, /* (307) literal ::= NULL */ + { 320, -1 }, /* (308) literal ::= NK_QUESTION */ + { 362, -1 }, /* (309) duration_literal ::= NK_VARIABLE */ + { 388, -1 }, /* (310) signed ::= NK_INTEGER */ + { 388, -2 }, /* (311) signed ::= NK_PLUS NK_INTEGER */ + { 388, -2 }, /* (312) signed ::= NK_MINUS NK_INTEGER */ + { 388, -1 }, /* (313) signed ::= NK_FLOAT */ + { 388, -2 }, /* (314) signed ::= NK_PLUS NK_FLOAT */ + { 388, -2 }, /* (315) signed ::= NK_MINUS NK_FLOAT */ + { 351, -1 }, /* (316) signed_literal ::= signed */ + { 351, -1 }, /* (317) signed_literal ::= NK_STRING */ + { 351, -1 }, /* (318) signed_literal ::= NK_BOOL */ + { 351, -2 }, /* (319) signed_literal ::= TIMESTAMP NK_STRING */ + { 351, -1 }, /* (320) signed_literal ::= duration_literal */ + { 351, -1 }, /* (321) signed_literal ::= NULL */ + { 351, -1 }, /* (322) signed_literal ::= literal_func */ + { 351, -1 }, /* (323) signed_literal ::= NK_QUESTION */ + { 390, -1 }, /* (324) literal_list ::= signed_literal */ + { 390, -3 }, /* (325) literal_list ::= literal_list NK_COMMA signed_literal */ + { 328, -1 }, /* (326) db_name ::= NK_ID */ + { 357, -1 }, /* (327) table_name ::= NK_ID */ + { 349, -1 }, /* (328) column_name ::= NK_ID */ + { 364, -1 }, /* (329) function_name ::= NK_ID */ + { 391, -1 }, /* (330) table_alias ::= NK_ID */ + { 392, -1 }, /* (331) column_alias ::= NK_ID */ + { 322, -1 }, /* (332) user_name ::= NK_ID */ + { 376, -1 }, /* (333) topic_name ::= NK_ID */ + { 383, -1 }, /* (334) stream_name ::= NK_ID */ + { 378, -1 }, /* (335) cgroup_name ::= NK_ID */ + { 393, -1 }, /* (336) expr_or_subquery ::= expression */ + { 393, -1 }, /* (337) expr_or_subquery ::= subquery */ + { 385, -1 }, /* (338) expression ::= literal */ + { 385, -1 }, /* (339) expression ::= pseudo_column */ + { 385, -1 }, /* (340) expression ::= column_reference */ + { 385, -1 }, /* (341) expression ::= function_expression */ + { 385, -1 }, /* (342) expression ::= case_when_expression */ + { 385, -3 }, /* (343) expression ::= NK_LP expression NK_RP */ + { 385, -2 }, /* (344) expression ::= NK_PLUS expr_or_subquery */ + { 385, -2 }, /* (345) expression ::= NK_MINUS expr_or_subquery */ + { 385, -3 }, /* (346) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ + { 385, -3 }, /* (347) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ + { 385, -3 }, /* (348) expression ::= expr_or_subquery NK_STAR expr_or_subquery */ + { 385, -3 }, /* (349) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ + { 385, -3 }, /* (350) expression ::= expr_or_subquery NK_REM expr_or_subquery */ + { 385, -3 }, /* (351) expression ::= column_reference NK_ARROW NK_STRING */ + { 385, -3 }, /* (352) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ + { 385, -3 }, /* (353) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ + { 354, -1 }, /* (354) expression_list ::= expr_or_subquery */ + { 354, -3 }, /* (355) expression_list ::= expression_list NK_COMMA expr_or_subquery */ + { 396, -1 }, /* (356) column_reference ::= column_name */ + { 396, -3 }, /* (357) column_reference ::= table_name NK_DOT column_name */ + { 395, -1 }, /* (358) pseudo_column ::= ROWTS */ + { 395, -1 }, /* (359) pseudo_column ::= TBNAME */ + { 395, -3 }, /* (360) pseudo_column ::= table_name NK_DOT TBNAME */ + { 395, -1 }, /* (361) pseudo_column ::= QSTART */ + { 395, -1 }, /* (362) pseudo_column ::= QEND */ + { 395, -1 }, /* (363) pseudo_column ::= QDURATION */ + { 395, -1 }, /* (364) pseudo_column ::= WSTART */ + { 395, -1 }, /* (365) pseudo_column ::= WEND */ + { 395, -1 }, /* (366) pseudo_column ::= WDURATION */ + { 395, -1 }, /* (367) pseudo_column ::= IROWTS */ + { 395, -1 }, /* (368) pseudo_column ::= QTAGS */ + { 397, -4 }, /* (369) function_expression ::= function_name NK_LP expression_list NK_RP */ + { 397, -4 }, /* (370) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ + { 397, -6 }, /* (371) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ + { 397, -1 }, /* (372) function_expression ::= literal_func */ + { 389, -3 }, /* (373) literal_func ::= noarg_func NK_LP NK_RP */ + { 389, -1 }, /* (374) literal_func ::= NOW */ + { 401, -1 }, /* (375) noarg_func ::= NOW */ + { 401, -1 }, /* (376) noarg_func ::= TODAY */ + { 401, -1 }, /* (377) noarg_func ::= TIMEZONE */ + { 401, -1 }, /* (378) noarg_func ::= DATABASE */ + { 401, -1 }, /* (379) noarg_func ::= CLIENT_VERSION */ + { 401, -1 }, /* (380) noarg_func ::= SERVER_VERSION */ + { 401, -1 }, /* (381) noarg_func ::= SERVER_STATUS */ + { 401, -1 }, /* (382) noarg_func ::= CURRENT_USER */ + { 401, -1 }, /* (383) noarg_func ::= USER */ + { 399, -1 }, /* (384) star_func ::= COUNT */ + { 399, -1 }, /* (385) star_func ::= FIRST */ + { 399, -1 }, /* (386) star_func ::= LAST */ + { 399, -1 }, /* (387) star_func ::= LAST_ROW */ + { 400, -1 }, /* (388) star_func_para_list ::= NK_STAR */ + { 400, -1 }, /* (389) star_func_para_list ::= other_para_list */ + { 402, -1 }, /* (390) other_para_list ::= star_func_para */ + { 402, -3 }, /* (391) other_para_list ::= other_para_list NK_COMMA star_func_para */ + { 403, -1 }, /* (392) star_func_para ::= expr_or_subquery */ + { 403, -3 }, /* (393) star_func_para ::= table_name NK_DOT NK_STAR */ + { 398, -4 }, /* (394) case_when_expression ::= CASE when_then_list case_when_else_opt END */ + { 398, -5 }, /* (395) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ + { 404, -1 }, /* (396) when_then_list ::= when_then_expr */ + { 404, -2 }, /* (397) when_then_list ::= when_then_list when_then_expr */ + { 407, -4 }, /* (398) when_then_expr ::= WHEN common_expression THEN common_expression */ + { 405, 0 }, /* (399) case_when_else_opt ::= */ + { 405, -2 }, /* (400) case_when_else_opt ::= ELSE common_expression */ + { 408, -3 }, /* (401) predicate ::= expr_or_subquery compare_op expr_or_subquery */ + { 408, -5 }, /* (402) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ + { 408, -6 }, /* (403) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ + { 408, -3 }, /* (404) predicate ::= expr_or_subquery IS NULL */ + { 408, -4 }, /* (405) predicate ::= expr_or_subquery IS NOT NULL */ + { 408, -3 }, /* (406) predicate ::= expr_or_subquery in_op in_predicate_value */ + { 409, -1 }, /* (407) compare_op ::= NK_LT */ + { 409, -1 }, /* (408) compare_op ::= NK_GT */ + { 409, -1 }, /* (409) compare_op ::= NK_LE */ + { 409, -1 }, /* (410) compare_op ::= NK_GE */ + { 409, -1 }, /* (411) compare_op ::= NK_NE */ + { 409, -1 }, /* (412) compare_op ::= NK_EQ */ + { 409, -1 }, /* (413) compare_op ::= LIKE */ + { 409, -2 }, /* (414) compare_op ::= NOT LIKE */ + { 409, -1 }, /* (415) compare_op ::= MATCH */ + { 409, -1 }, /* (416) compare_op ::= NMATCH */ + { 409, -1 }, /* (417) compare_op ::= CONTAINS */ + { 410, -1 }, /* (418) in_op ::= IN */ + { 410, -2 }, /* (419) in_op ::= NOT IN */ + { 411, -3 }, /* (420) in_predicate_value ::= NK_LP literal_list NK_RP */ + { 412, -1 }, /* (421) boolean_value_expression ::= boolean_primary */ + { 412, -2 }, /* (422) boolean_value_expression ::= NOT boolean_primary */ + { 412, -3 }, /* (423) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 412, -3 }, /* (424) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 413, -1 }, /* (425) boolean_primary ::= predicate */ + { 413, -3 }, /* (426) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 406, -1 }, /* (427) common_expression ::= expr_or_subquery */ + { 406, -1 }, /* (428) common_expression ::= boolean_value_expression */ + { 414, 0 }, /* (429) from_clause_opt ::= */ + { 414, -2 }, /* (430) from_clause_opt ::= FROM table_reference_list */ + { 415, -1 }, /* (431) table_reference_list ::= table_reference */ + { 415, -3 }, /* (432) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 416, -1 }, /* (433) table_reference ::= table_primary */ + { 416, -1 }, /* (434) table_reference ::= joined_table */ + { 417, -2 }, /* (435) table_primary ::= table_name alias_opt */ + { 417, -4 }, /* (436) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 417, -2 }, /* (437) table_primary ::= subquery alias_opt */ + { 417, -1 }, /* (438) table_primary ::= parenthesized_joined_table */ + { 419, 0 }, /* (439) alias_opt ::= */ + { 419, -1 }, /* (440) alias_opt ::= table_alias */ + { 419, -2 }, /* (441) alias_opt ::= AS table_alias */ + { 420, -3 }, /* (442) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 420, -3 }, /* (443) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 418, -6 }, /* (444) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 421, 0 }, /* (445) join_type ::= */ + { 421, -1 }, /* (446) join_type ::= INNER */ + { 423, -12 }, /* (447) 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 */ + { 424, 0 }, /* (448) set_quantifier_opt ::= */ + { 424, -1 }, /* (449) set_quantifier_opt ::= DISTINCT */ + { 424, -1 }, /* (450) set_quantifier_opt ::= ALL */ + { 425, -1 }, /* (451) select_list ::= select_item */ + { 425, -3 }, /* (452) select_list ::= select_list NK_COMMA select_item */ + { 433, -1 }, /* (453) select_item ::= NK_STAR */ + { 433, -1 }, /* (454) select_item ::= common_expression */ + { 433, -2 }, /* (455) select_item ::= common_expression column_alias */ + { 433, -3 }, /* (456) select_item ::= common_expression AS column_alias */ + { 433, -3 }, /* (457) select_item ::= table_name NK_DOT NK_STAR */ + { 387, 0 }, /* (458) where_clause_opt ::= */ + { 387, -2 }, /* (459) where_clause_opt ::= WHERE search_condition */ + { 426, 0 }, /* (460) partition_by_clause_opt ::= */ + { 426, -3 }, /* (461) partition_by_clause_opt ::= PARTITION BY partition_list */ + { 434, -1 }, /* (462) partition_list ::= partition_item */ + { 434, -3 }, /* (463) partition_list ::= partition_list NK_COMMA partition_item */ + { 435, -1 }, /* (464) partition_item ::= expr_or_subquery */ + { 435, -2 }, /* (465) partition_item ::= expr_or_subquery column_alias */ + { 435, -3 }, /* (466) partition_item ::= expr_or_subquery AS column_alias */ + { 430, 0 }, /* (467) twindow_clause_opt ::= */ + { 430, -6 }, /* (468) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ + { 430, -4 }, /* (469) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ + { 430, -6 }, /* (470) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 430, -8 }, /* (471) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 372, 0 }, /* (472) sliding_opt ::= */ + { 372, -4 }, /* (473) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 429, 0 }, /* (474) fill_opt ::= */ + { 429, -4 }, /* (475) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 429, -6 }, /* (476) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 436, -1 }, /* (477) fill_mode ::= NONE */ + { 436, -1 }, /* (478) fill_mode ::= PREV */ + { 436, -1 }, /* (479) fill_mode ::= NULL */ + { 436, -1 }, /* (480) fill_mode ::= LINEAR */ + { 436, -1 }, /* (481) fill_mode ::= NEXT */ + { 431, 0 }, /* (482) group_by_clause_opt ::= */ + { 431, -3 }, /* (483) group_by_clause_opt ::= GROUP BY group_by_list */ + { 437, -1 }, /* (484) group_by_list ::= expr_or_subquery */ + { 437, -3 }, /* (485) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ + { 432, 0 }, /* (486) having_clause_opt ::= */ + { 432, -2 }, /* (487) having_clause_opt ::= HAVING search_condition */ + { 427, 0 }, /* (488) range_opt ::= */ + { 427, -6 }, /* (489) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ + { 428, 0 }, /* (490) every_opt ::= */ + { 428, -4 }, /* (491) every_opt ::= EVERY NK_LP duration_literal NK_RP */ + { 438, -4 }, /* (492) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 439, -1 }, /* (493) query_simple ::= query_specification */ + { 439, -1 }, /* (494) query_simple ::= union_query_expression */ + { 443, -4 }, /* (495) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ + { 443, -3 }, /* (496) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ + { 444, -1 }, /* (497) query_simple_or_subquery ::= query_simple */ + { 444, -1 }, /* (498) query_simple_or_subquery ::= subquery */ + { 377, -1 }, /* (499) query_or_subquery ::= query_expression */ + { 377, -1 }, /* (500) query_or_subquery ::= subquery */ + { 440, 0 }, /* (501) order_by_clause_opt ::= */ + { 440, -3 }, /* (502) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 441, 0 }, /* (503) slimit_clause_opt ::= */ + { 441, -2 }, /* (504) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 441, -4 }, /* (505) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 441, -4 }, /* (506) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 442, 0 }, /* (507) limit_clause_opt ::= */ + { 442, -2 }, /* (508) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 442, -4 }, /* (509) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 442, -4 }, /* (510) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 394, -3 }, /* (511) subquery ::= NK_LP query_expression NK_RP */ + { 394, -3 }, /* (512) subquery ::= NK_LP subquery NK_RP */ + { 422, -1 }, /* (513) search_condition ::= common_expression */ + { 445, -1 }, /* (514) sort_specification_list ::= sort_specification */ + { 445, -3 }, /* (515) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 446, -3 }, /* (516) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ + { 447, 0 }, /* (517) ordering_specification_opt ::= */ + { 447, -1 }, /* (518) ordering_specification_opt ::= ASC */ + { 447, -1 }, /* (519) ordering_specification_opt ::= DESC */ + { 448, 0 }, /* (520) null_ordering_opt ::= */ + { 448, -2 }, /* (521) null_ordering_opt ::= NULLS FIRST */ + { 448, -2 }, /* (522) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -3745,29 +3749,29 @@ static YYACTIONTYPE yy_reduce( case 49: /* dnode_endpoint ::= NK_STRING */ case 50: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==50); case 51: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==51); - case 324: /* db_name ::= NK_ID */ yytestcase(yyruleno==324); - case 325: /* table_name ::= NK_ID */ yytestcase(yyruleno==325); - case 326: /* column_name ::= NK_ID */ yytestcase(yyruleno==326); - case 327: /* function_name ::= NK_ID */ yytestcase(yyruleno==327); - case 328: /* table_alias ::= NK_ID */ yytestcase(yyruleno==328); - case 329: /* column_alias ::= NK_ID */ yytestcase(yyruleno==329); - case 330: /* user_name ::= NK_ID */ yytestcase(yyruleno==330); - case 331: /* topic_name ::= NK_ID */ yytestcase(yyruleno==331); - case 332: /* stream_name ::= NK_ID */ yytestcase(yyruleno==332); - case 333: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==333); - case 373: /* noarg_func ::= NOW */ yytestcase(yyruleno==373); - case 374: /* noarg_func ::= TODAY */ yytestcase(yyruleno==374); - case 375: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==375); - case 376: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==376); - case 377: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==377); - case 378: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==378); - case 379: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==379); - case 380: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==380); - case 381: /* noarg_func ::= USER */ yytestcase(yyruleno==381); - case 382: /* star_func ::= COUNT */ yytestcase(yyruleno==382); - case 383: /* star_func ::= FIRST */ yytestcase(yyruleno==383); - case 384: /* star_func ::= LAST */ yytestcase(yyruleno==384); - case 385: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==385); + case 326: /* db_name ::= NK_ID */ yytestcase(yyruleno==326); + case 327: /* table_name ::= NK_ID */ yytestcase(yyruleno==327); + case 328: /* column_name ::= NK_ID */ yytestcase(yyruleno==328); + case 329: /* function_name ::= NK_ID */ yytestcase(yyruleno==329); + case 330: /* table_alias ::= NK_ID */ yytestcase(yyruleno==330); + case 331: /* column_alias ::= NK_ID */ yytestcase(yyruleno==331); + case 332: /* user_name ::= NK_ID */ yytestcase(yyruleno==332); + case 333: /* topic_name ::= NK_ID */ yytestcase(yyruleno==333); + case 334: /* stream_name ::= NK_ID */ yytestcase(yyruleno==334); + case 335: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==335); + case 375: /* noarg_func ::= NOW */ yytestcase(yyruleno==375); + case 376: /* noarg_func ::= TODAY */ yytestcase(yyruleno==376); + case 377: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==377); + case 378: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==378); + case 379: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==379); + case 380: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==380); + case 381: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==381); + case 382: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==382); + case 383: /* noarg_func ::= USER */ yytestcase(yyruleno==383); + case 384: /* star_func ::= COUNT */ yytestcase(yyruleno==384); + case 385: /* star_func ::= FIRST */ yytestcase(yyruleno==385); + case 386: /* star_func ::= LAST */ yytestcase(yyruleno==386); + case 387: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==387); { yylhsminor.yy181 = yymsp[0].minor.yy0; } yymsp[0].minor.yy181 = yylhsminor.yy181; break; @@ -3824,9 +3828,9 @@ static YYACTIONTYPE yy_reduce( break; case 69: /* not_exists_opt ::= */ case 71: /* exists_opt ::= */ yytestcase(yyruleno==71); - case 265: /* analyze_opt ::= */ yytestcase(yyruleno==265); - case 272: /* agg_func_opt ::= */ yytestcase(yyruleno==272); - case 446: /* set_quantifier_opt ::= */ yytestcase(yyruleno==446); + case 267: /* analyze_opt ::= */ yytestcase(yyruleno==267); + case 274: /* agg_func_opt ::= */ yytestcase(yyruleno==274); + case 448: /* set_quantifier_opt ::= */ yytestcase(yyruleno==448); { yymsp[1].minor.yy39 = false; } break; case 70: /* exists_opt ::= IF EXISTS */ @@ -3969,671 +3973,677 @@ static YYACTIONTYPE yy_reduce( { yylhsminor.yy778 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy778, &yymsp[0].minor.yy645); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 106: /* alter_db_option ::= CACHEMODEL NK_STRING */ + case 106: /* alter_db_option ::= BUFFER NK_INTEGER */ +{ yymsp[-1].minor.yy645.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } + break; + case 107: /* alter_db_option ::= CACHEMODEL NK_STRING */ { yymsp[-1].minor.yy645.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; - case 107: /* alter_db_option ::= CACHESIZE NK_INTEGER */ + case 108: /* alter_db_option ::= CACHESIZE NK_INTEGER */ { yymsp[-1].minor.yy645.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; - case 108: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ + case 109: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ { yymsp[-1].minor.yy645.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; - case 109: /* alter_db_option ::= KEEP integer_list */ - case 110: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==110); + case 110: /* alter_db_option ::= KEEP integer_list */ + case 111: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==111); { yymsp[-1].minor.yy645.type = DB_OPTION_KEEP; yymsp[-1].minor.yy645.pList = yymsp[0].minor.yy282; } break; - case 111: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ + case 112: /* alter_db_option ::= PAGES NK_INTEGER */ +{ yymsp[-1].minor.yy645.type = DB_OPTION_PAGES; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } + break; + case 113: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ { yymsp[-1].minor.yy645.type = DB_OPTION_WAL; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; - case 112: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */ + case 114: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */ { yymsp[-1].minor.yy645.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; - case 113: /* integer_list ::= NK_INTEGER */ + case 115: /* integer_list ::= NK_INTEGER */ { yylhsminor.yy282 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 114: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ - case 294: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==294); + case 116: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ + case 296: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==296); { yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } yymsp[-2].minor.yy282 = yylhsminor.yy282; break; - case 115: /* variable_list ::= NK_VARIABLE */ + case 117: /* variable_list ::= NK_VARIABLE */ { yylhsminor.yy282 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 116: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ + case 118: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ { yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } yymsp[-2].minor.yy282 = yylhsminor.yy282; break; - case 117: /* retention_list ::= retention */ - case 139: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==139); - case 142: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==142); - case 149: /* column_def_list ::= column_def */ yytestcase(yyruleno==149); - case 192: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==192); - case 197: /* col_name_list ::= col_name */ yytestcase(yyruleno==197); - case 248: /* func_list ::= func */ yytestcase(yyruleno==248); - case 322: /* literal_list ::= signed_literal */ yytestcase(yyruleno==322); - case 388: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==388); - case 394: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==394); - case 449: /* select_list ::= select_item */ yytestcase(yyruleno==449); - case 460: /* partition_list ::= partition_item */ yytestcase(yyruleno==460); - case 512: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==512); + case 119: /* retention_list ::= retention */ + case 141: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==141); + case 144: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==144); + case 151: /* column_def_list ::= column_def */ yytestcase(yyruleno==151); + case 194: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==194); + case 199: /* col_name_list ::= col_name */ yytestcase(yyruleno==199); + case 250: /* func_list ::= func */ yytestcase(yyruleno==250); + case 324: /* literal_list ::= signed_literal */ yytestcase(yyruleno==324); + case 390: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==390); + case 396: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==396); + case 451: /* select_list ::= select_item */ yytestcase(yyruleno==451); + case 462: /* partition_list ::= partition_item */ yytestcase(yyruleno==462); + case 514: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==514); { yylhsminor.yy282 = createNodeList(pCxt, yymsp[0].minor.yy778); } yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 118: /* retention_list ::= retention_list NK_COMMA retention */ - case 150: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==150); - case 193: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==193); - case 198: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==198); - case 249: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==249); - case 323: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==323); - case 389: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==389); - case 450: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==450); - case 461: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==461); - case 513: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==513); + case 120: /* retention_list ::= retention_list NK_COMMA retention */ + case 152: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==152); + case 195: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==195); + case 200: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==200); + case 251: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==251); + case 325: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==325); + case 391: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==391); + case 452: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==452); + case 463: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==463); + case 515: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==515); { yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, yymsp[0].minor.yy778); } yymsp[-2].minor.yy282 = yylhsminor.yy282; break; - case 119: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ + case 121: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ { yylhsminor.yy778 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 120: /* speed_opt ::= */ - case 274: /* bufsize_opt ::= */ yytestcase(yyruleno==274); + case 122: /* speed_opt ::= */ + case 276: /* bufsize_opt ::= */ yytestcase(yyruleno==276); { yymsp[1].minor.yy276 = 0; } break; - case 121: /* speed_opt ::= MAX_SPEED NK_INTEGER */ - case 275: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==275); + case 123: /* speed_opt ::= MAX_SPEED NK_INTEGER */ + case 277: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==277); { yymsp[-1].minor.yy276 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } break; - case 122: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - case 124: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==124); + case 124: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + case 126: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==126); { pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy39, yymsp[-5].minor.yy778, yymsp[-3].minor.yy282, yymsp[-1].minor.yy282, yymsp[0].minor.yy778); } break; - case 123: /* cmd ::= CREATE TABLE multi_create_clause */ + case 125: /* cmd ::= CREATE TABLE multi_create_clause */ { pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy282); } break; - case 125: /* cmd ::= DROP TABLE multi_drop_clause */ + case 127: /* cmd ::= DROP TABLE multi_drop_clause */ { pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy282); } break; - case 126: /* cmd ::= DROP STABLE exists_opt full_table_name */ + case 128: /* cmd ::= DROP STABLE exists_opt full_table_name */ { pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy39, yymsp[0].minor.yy778); } break; - case 127: /* cmd ::= ALTER TABLE alter_table_clause */ - case 296: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==296); + case 129: /* cmd ::= ALTER TABLE alter_table_clause */ + case 298: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==298); { pCxt->pRootNode = yymsp[0].minor.yy778; } break; - case 128: /* cmd ::= ALTER STABLE alter_table_clause */ + case 130: /* cmd ::= ALTER STABLE alter_table_clause */ { pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy778); } break; - case 129: /* alter_table_clause ::= full_table_name alter_table_options */ + case 131: /* alter_table_clause ::= full_table_name alter_table_options */ { yylhsminor.yy778 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 130: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ + case 132: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ { yylhsminor.yy778 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 131: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ + case 133: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ { yylhsminor.yy778 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy778, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy181); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 132: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ + case 134: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ { yylhsminor.yy778 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 133: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ + case 135: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ { yylhsminor.yy778 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy181, &yymsp[0].minor.yy181); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 134: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ + case 136: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ { yylhsminor.yy778 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 135: /* alter_table_clause ::= full_table_name DROP TAG column_name */ + case 137: /* alter_table_clause ::= full_table_name DROP TAG column_name */ { yylhsminor.yy778 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy778, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy181); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 136: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ + case 138: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ { yylhsminor.yy778 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 137: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ + case 139: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ { yylhsminor.yy778 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy181, &yymsp[0].minor.yy181); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 138: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ + case 140: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ { yylhsminor.yy778 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy778, &yymsp[-2].minor.yy181, yymsp[0].minor.yy778); } yymsp[-5].minor.yy778 = yylhsminor.yy778; break; - case 140: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ - case 143: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==143); - case 395: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==395); + case 142: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ + case 145: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==145); + case 397: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==397); { yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-1].minor.yy282, yymsp[0].minor.yy778); } yymsp[-1].minor.yy282 = yylhsminor.yy282; break; - case 141: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ + case 143: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ { yylhsminor.yy778 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy39, yymsp[-8].minor.yy778, yymsp[-6].minor.yy778, yymsp[-5].minor.yy282, yymsp[-2].minor.yy282, yymsp[0].minor.yy778); } yymsp[-9].minor.yy778 = yylhsminor.yy778; break; - case 144: /* drop_table_clause ::= exists_opt full_table_name */ + case 146: /* drop_table_clause ::= exists_opt full_table_name */ { yylhsminor.yy778 = createDropTableClause(pCxt, yymsp[-1].minor.yy39, yymsp[0].minor.yy778); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 145: /* specific_cols_opt ::= */ - case 176: /* tags_def_opt ::= */ yytestcase(yyruleno==176); - case 458: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==458); - case 480: /* group_by_clause_opt ::= */ yytestcase(yyruleno==480); - case 499: /* order_by_clause_opt ::= */ yytestcase(yyruleno==499); + case 147: /* specific_cols_opt ::= */ + case 178: /* tags_def_opt ::= */ yytestcase(yyruleno==178); + case 460: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==460); + case 482: /* group_by_clause_opt ::= */ yytestcase(yyruleno==482); + case 501: /* order_by_clause_opt ::= */ yytestcase(yyruleno==501); { yymsp[1].minor.yy282 = NULL; } break; - case 146: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ + case 148: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ { yymsp[-2].minor.yy282 = yymsp[-1].minor.yy282; } break; - case 147: /* full_table_name ::= table_name */ + case 149: /* full_table_name ::= table_name */ { yylhsminor.yy778 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy181, NULL); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 148: /* full_table_name ::= db_name NK_DOT table_name */ + case 150: /* full_table_name ::= db_name NK_DOT table_name */ { yylhsminor.yy778 = createRealTableNode(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181, NULL); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 151: /* column_def ::= column_name type_name */ + case 153: /* column_def ::= column_name type_name */ { yylhsminor.yy778 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380, NULL); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 152: /* column_def ::= column_name type_name COMMENT NK_STRING */ + case 154: /* column_def ::= column_name type_name COMMENT NK_STRING */ { yylhsminor.yy778 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy181, yymsp[-2].minor.yy380, &yymsp[0].minor.yy0); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 153: /* type_name ::= BOOL */ + case 155: /* type_name ::= BOOL */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_BOOL); } break; - case 154: /* type_name ::= TINYINT */ + case 156: /* type_name ::= TINYINT */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; - case 155: /* type_name ::= SMALLINT */ + case 157: /* type_name ::= SMALLINT */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; - case 156: /* type_name ::= INT */ - case 157: /* type_name ::= INTEGER */ yytestcase(yyruleno==157); + case 158: /* type_name ::= INT */ + case 159: /* type_name ::= INTEGER */ yytestcase(yyruleno==159); { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_INT); } break; - case 158: /* type_name ::= BIGINT */ + case 160: /* type_name ::= BIGINT */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; - case 159: /* type_name ::= FLOAT */ + case 161: /* type_name ::= FLOAT */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; - case 160: /* type_name ::= DOUBLE */ + case 162: /* type_name ::= DOUBLE */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; - case 161: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + case 163: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ { yymsp[-3].minor.yy380 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; - case 162: /* type_name ::= TIMESTAMP */ + case 164: /* type_name ::= TIMESTAMP */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; - case 163: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + case 165: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ { yymsp[-3].minor.yy380 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; - case 164: /* type_name ::= TINYINT UNSIGNED */ + case 166: /* type_name ::= TINYINT UNSIGNED */ { yymsp[-1].minor.yy380 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; - case 165: /* type_name ::= SMALLINT UNSIGNED */ + case 167: /* type_name ::= SMALLINT UNSIGNED */ { yymsp[-1].minor.yy380 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; - case 166: /* type_name ::= INT UNSIGNED */ + case 168: /* type_name ::= INT UNSIGNED */ { yymsp[-1].minor.yy380 = createDataType(TSDB_DATA_TYPE_UINT); } break; - case 167: /* type_name ::= BIGINT UNSIGNED */ + case 169: /* type_name ::= BIGINT UNSIGNED */ { yymsp[-1].minor.yy380 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; - case 168: /* type_name ::= JSON */ + case 170: /* type_name ::= JSON */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_JSON); } break; - case 169: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + case 171: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ { yymsp[-3].minor.yy380 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; - case 170: /* type_name ::= MEDIUMBLOB */ + case 172: /* type_name ::= MEDIUMBLOB */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; - case 171: /* type_name ::= BLOB */ + case 173: /* type_name ::= BLOB */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_BLOB); } break; - case 172: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + case 174: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ { yymsp[-3].minor.yy380 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; - case 173: /* type_name ::= DECIMAL */ + case 175: /* type_name ::= DECIMAL */ { yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 174: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + case 176: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ { yymsp[-3].minor.yy380 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 175: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + case 177: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ { yymsp[-5].minor.yy380 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; - case 177: /* tags_def_opt ::= tags_def */ - case 387: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==387); + case 179: /* tags_def_opt ::= tags_def */ + case 389: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==389); { yylhsminor.yy282 = yymsp[0].minor.yy282; } yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 178: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ + case 180: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ { yymsp[-3].minor.yy282 = yymsp[-1].minor.yy282; } break; - case 179: /* table_options ::= */ + case 181: /* table_options ::= */ { yymsp[1].minor.yy778 = createDefaultTableOptions(pCxt); } break; - case 180: /* table_options ::= table_options COMMENT NK_STRING */ + case 182: /* table_options ::= table_options COMMENT NK_STRING */ { yylhsminor.yy778 = setTableOption(pCxt, yymsp[-2].minor.yy778, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 181: /* table_options ::= table_options MAX_DELAY duration_list */ + case 183: /* table_options ::= table_options MAX_DELAY duration_list */ { yylhsminor.yy778 = setTableOption(pCxt, yymsp[-2].minor.yy778, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy282); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 182: /* table_options ::= table_options WATERMARK duration_list */ + case 184: /* table_options ::= table_options WATERMARK duration_list */ { yylhsminor.yy778 = setTableOption(pCxt, yymsp[-2].minor.yy778, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy282); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 183: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ + case 185: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ { yylhsminor.yy778 = setTableOption(pCxt, yymsp[-4].minor.yy778, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy282); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 184: /* table_options ::= table_options TTL NK_INTEGER */ + case 186: /* table_options ::= table_options TTL NK_INTEGER */ { yylhsminor.yy778 = setTableOption(pCxt, yymsp[-2].minor.yy778, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 185: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ + case 187: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ { yylhsminor.yy778 = setTableOption(pCxt, yymsp[-4].minor.yy778, TABLE_OPTION_SMA, yymsp[-1].minor.yy282); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 186: /* alter_table_options ::= alter_table_option */ + case 188: /* alter_table_options ::= alter_table_option */ { yylhsminor.yy778 = createAlterTableOptions(pCxt); yylhsminor.yy778 = setTableOption(pCxt, yylhsminor.yy778, yymsp[0].minor.yy645.type, &yymsp[0].minor.yy645.val); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 187: /* alter_table_options ::= alter_table_options alter_table_option */ + case 189: /* alter_table_options ::= alter_table_options alter_table_option */ { yylhsminor.yy778 = setTableOption(pCxt, yymsp[-1].minor.yy778, yymsp[0].minor.yy645.type, &yymsp[0].minor.yy645.val); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 188: /* alter_table_option ::= COMMENT NK_STRING */ + case 190: /* alter_table_option ::= COMMENT NK_STRING */ { yymsp[-1].minor.yy645.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; - case 189: /* alter_table_option ::= TTL NK_INTEGER */ + case 191: /* alter_table_option ::= TTL NK_INTEGER */ { yymsp[-1].minor.yy645.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; - case 190: /* duration_list ::= duration_literal */ - case 352: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==352); + case 192: /* duration_list ::= duration_literal */ + case 354: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==354); { yylhsminor.yy282 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy778)); } yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 191: /* duration_list ::= duration_list NK_COMMA duration_literal */ - case 353: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==353); + case 193: /* duration_list ::= duration_list NK_COMMA duration_literal */ + case 355: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==355); { yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, releaseRawExprNode(pCxt, yymsp[0].minor.yy778)); } yymsp[-2].minor.yy282 = yylhsminor.yy282; break; - case 194: /* rollup_func_name ::= function_name */ + case 196: /* rollup_func_name ::= function_name */ { yylhsminor.yy778 = createFunctionNode(pCxt, &yymsp[0].minor.yy181, NULL); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 195: /* rollup_func_name ::= FIRST */ - case 196: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==196); + case 197: /* rollup_func_name ::= FIRST */ + case 198: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==198); { yylhsminor.yy778 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 199: /* col_name ::= column_name */ + case 201: /* col_name ::= column_name */ { yylhsminor.yy778 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy181); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 200: /* cmd ::= SHOW DNODES */ + case 202: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } break; - case 201: /* cmd ::= SHOW USERS */ + case 203: /* cmd ::= SHOW USERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); } break; - case 202: /* cmd ::= SHOW DATABASES */ + case 204: /* cmd ::= SHOW DATABASES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } break; - case 203: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ + case 205: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy778, yymsp[0].minor.yy778, OP_TYPE_LIKE); } break; - case 204: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ + case 206: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy778, yymsp[0].minor.yy778, OP_TYPE_LIKE); } break; - case 205: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ + case 207: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy778, NULL, OP_TYPE_LIKE); } break; - case 206: /* cmd ::= SHOW MNODES */ + case 208: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); } break; - case 207: /* cmd ::= SHOW MODULES */ + case 209: /* cmd ::= SHOW MODULES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MODULES_STMT); } break; - case 208: /* cmd ::= SHOW QNODES */ + case 210: /* cmd ::= SHOW QNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); } break; - case 209: /* cmd ::= SHOW FUNCTIONS */ + case 211: /* cmd ::= SHOW FUNCTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); } break; - case 210: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ + case 212: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy778, yymsp[-1].minor.yy778, OP_TYPE_EQUAL); } break; - case 211: /* cmd ::= SHOW STREAMS */ + case 213: /* cmd ::= SHOW STREAMS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); } break; - case 212: /* cmd ::= SHOW ACCOUNTS */ + case 214: /* cmd ::= SHOW ACCOUNTS */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } break; - case 213: /* cmd ::= SHOW APPS */ + case 215: /* cmd ::= SHOW APPS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_APPS_STMT); } break; - case 214: /* cmd ::= SHOW CONNECTIONS */ + case 216: /* cmd ::= SHOW CONNECTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONNECTIONS_STMT); } break; - case 215: /* cmd ::= SHOW LICENCES */ - case 216: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==216); + case 217: /* cmd ::= SHOW LICENCES */ + case 218: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==218); { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCES_STMT); } break; - case 217: /* cmd ::= SHOW CREATE DATABASE db_name */ + case 219: /* cmd ::= SHOW CREATE DATABASE db_name */ { pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy181); } break; - case 218: /* cmd ::= SHOW CREATE TABLE full_table_name */ + case 220: /* cmd ::= SHOW CREATE TABLE full_table_name */ { pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy778); } break; - case 219: /* cmd ::= SHOW CREATE STABLE full_table_name */ + case 221: /* cmd ::= SHOW CREATE STABLE full_table_name */ { pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy778); } break; - case 220: /* cmd ::= SHOW QUERIES */ + case 222: /* cmd ::= SHOW QUERIES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } break; - case 221: /* cmd ::= SHOW SCORES */ + case 223: /* cmd ::= SHOW SCORES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SCORES_STMT); } break; - case 222: /* cmd ::= SHOW TOPICS */ + case 224: /* cmd ::= SHOW TOPICS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TOPICS_STMT); } break; - case 223: /* cmd ::= SHOW VARIABLES */ + case 225: /* cmd ::= SHOW VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); } break; - case 224: /* cmd ::= SHOW LOCAL VARIABLES */ + case 226: /* cmd ::= SHOW LOCAL VARIABLES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); } break; - case 225: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + case 227: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ { pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-1].minor.yy0)); } break; - case 226: /* cmd ::= SHOW BNODES */ + case 228: /* cmd ::= SHOW BNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); } break; - case 227: /* cmd ::= SHOW SNODES */ + case 229: /* cmd ::= SHOW SNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } break; - case 228: /* cmd ::= SHOW CLUSTER */ + case 230: /* cmd ::= SHOW CLUSTER */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); } break; - case 229: /* cmd ::= SHOW TRANSACTIONS */ + case 231: /* cmd ::= SHOW TRANSACTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } break; - case 230: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ + case 232: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ { pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy778); } break; - case 231: /* cmd ::= SHOW CONSUMERS */ + case 233: /* cmd ::= SHOW CONSUMERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } break; - case 232: /* cmd ::= SHOW SUBSCRIPTIONS */ + case 234: /* cmd ::= SHOW SUBSCRIPTIONS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } break; - case 233: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ + case 235: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy778, yymsp[-1].minor.yy778, OP_TYPE_EQUAL); } break; - case 234: /* cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt */ + case 236: /* cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt */ { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLE_TAGS_STMT, yymsp[0].minor.yy778, yymsp[-1].minor.yy778, OP_TYPE_EQUAL); } break; - case 235: /* cmd ::= SHOW VNODES NK_INTEGER */ + case 237: /* cmd ::= SHOW VNODES NK_INTEGER */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0), NULL); } break; - case 236: /* cmd ::= SHOW VNODES NK_STRING */ + case 238: /* cmd ::= SHOW VNODES NK_STRING */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &yymsp[0].minor.yy0)); } break; - case 237: /* db_name_cond_opt ::= */ - case 242: /* from_db_opt ::= */ yytestcase(yyruleno==242); + case 239: /* db_name_cond_opt ::= */ + case 244: /* from_db_opt ::= */ yytestcase(yyruleno==244); { yymsp[1].minor.yy778 = createDefaultDatabaseCondValue(pCxt); } break; - case 238: /* db_name_cond_opt ::= db_name NK_DOT */ + case 240: /* db_name_cond_opt ::= db_name NK_DOT */ { yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy181); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 239: /* like_pattern_opt ::= */ - case 284: /* subtable_opt ::= */ yytestcase(yyruleno==284); - case 397: /* case_when_else_opt ::= */ yytestcase(yyruleno==397); - case 427: /* from_clause_opt ::= */ yytestcase(yyruleno==427); - case 456: /* where_clause_opt ::= */ yytestcase(yyruleno==456); - case 465: /* twindow_clause_opt ::= */ yytestcase(yyruleno==465); - case 470: /* sliding_opt ::= */ yytestcase(yyruleno==470); - case 472: /* fill_opt ::= */ yytestcase(yyruleno==472); - case 484: /* having_clause_opt ::= */ yytestcase(yyruleno==484); - case 486: /* range_opt ::= */ yytestcase(yyruleno==486); - case 488: /* every_opt ::= */ yytestcase(yyruleno==488); - case 501: /* slimit_clause_opt ::= */ yytestcase(yyruleno==501); - case 505: /* limit_clause_opt ::= */ yytestcase(yyruleno==505); + case 241: /* like_pattern_opt ::= */ + case 286: /* subtable_opt ::= */ yytestcase(yyruleno==286); + case 399: /* case_when_else_opt ::= */ yytestcase(yyruleno==399); + case 429: /* from_clause_opt ::= */ yytestcase(yyruleno==429); + case 458: /* where_clause_opt ::= */ yytestcase(yyruleno==458); + case 467: /* twindow_clause_opt ::= */ yytestcase(yyruleno==467); + case 472: /* sliding_opt ::= */ yytestcase(yyruleno==472); + case 474: /* fill_opt ::= */ yytestcase(yyruleno==474); + case 486: /* having_clause_opt ::= */ yytestcase(yyruleno==486); + case 488: /* range_opt ::= */ yytestcase(yyruleno==488); + case 490: /* every_opt ::= */ yytestcase(yyruleno==490); + case 503: /* slimit_clause_opt ::= */ yytestcase(yyruleno==503); + case 507: /* limit_clause_opt ::= */ yytestcase(yyruleno==507); { yymsp[1].minor.yy778 = NULL; } break; - case 240: /* like_pattern_opt ::= LIKE NK_STRING */ + case 242: /* like_pattern_opt ::= LIKE NK_STRING */ { yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; - case 241: /* table_name_cond ::= table_name */ + case 243: /* table_name_cond ::= table_name */ { yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy181); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 243: /* from_db_opt ::= FROM db_name */ + case 245: /* from_db_opt ::= FROM db_name */ { yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy181); } break; - case 244: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ + case 246: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ { pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy39, yymsp[-3].minor.yy778, yymsp[-1].minor.yy778, NULL, yymsp[0].minor.yy778); } break; - case 245: /* cmd ::= DROP INDEX exists_opt full_table_name */ + case 247: /* cmd ::= DROP INDEX exists_opt full_table_name */ { pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy39, yymsp[0].minor.yy778); } break; - case 246: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ + case 248: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ { yymsp[-9].minor.yy778 = createIndexOption(pCxt, yymsp[-7].minor.yy282, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), NULL, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 247: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ + case 249: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ { yymsp[-11].minor.yy778 = createIndexOption(pCxt, yymsp[-9].minor.yy282, releaseRawExprNode(pCxt, yymsp[-5].minor.yy778), releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 250: /* func ::= function_name NK_LP expression_list NK_RP */ + case 252: /* func ::= function_name NK_LP expression_list NK_RP */ { yylhsminor.yy778 = createFunctionNode(pCxt, &yymsp[-3].minor.yy181, yymsp[-1].minor.yy282); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 251: /* sma_stream_opt ::= */ - case 278: /* stream_options ::= */ yytestcase(yyruleno==278); + case 253: /* sma_stream_opt ::= */ + case 280: /* stream_options ::= */ yytestcase(yyruleno==280); { yymsp[1].minor.yy778 = createStreamOptions(pCxt); } break; - case 252: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ - case 282: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==282); + case 254: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ + case 284: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==284); { ((SStreamOptions*)yymsp[-2].minor.yy778)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = yymsp[-2].minor.yy778; } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 253: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ + case 255: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ { ((SStreamOptions*)yymsp[-2].minor.yy778)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = yymsp[-2].minor.yy778; } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 254: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ + case 256: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ { pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy39, &yymsp[-2].minor.yy181, yymsp[0].minor.yy778); } break; - case 255: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ + case 257: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ { pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy39, &yymsp[-3].minor.yy181, &yymsp[0].minor.yy181, false); } break; - case 256: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ + case 258: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ { pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy39, &yymsp[-5].minor.yy181, &yymsp[0].minor.yy181, true); } break; - case 257: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ + case 259: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ { pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy39, &yymsp[-3].minor.yy181, yymsp[0].minor.yy778, false); } break; - case 258: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + case 260: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ { pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy39, &yymsp[-5].minor.yy181, yymsp[0].minor.yy778, true); } break; - case 259: /* cmd ::= DROP TOPIC exists_opt topic_name */ + case 261: /* cmd ::= DROP TOPIC exists_opt topic_name */ { pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy39, &yymsp[0].minor.yy181); } break; - case 260: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ + case 262: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ { pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy39, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181); } break; - case 261: /* cmd ::= DESC full_table_name */ - case 262: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==262); + case 263: /* cmd ::= DESC full_table_name */ + case 264: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==264); { pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy778); } break; - case 263: /* cmd ::= RESET QUERY CACHE */ + case 265: /* cmd ::= RESET QUERY CACHE */ { pCxt->pRootNode = createResetQueryCacheStmt(pCxt); } break; - case 264: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ + case 266: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ { pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy39, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 266: /* analyze_opt ::= ANALYZE */ - case 273: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==273); - case 447: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==447); + case 268: /* analyze_opt ::= ANALYZE */ + case 275: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==275); + case 449: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==449); { yymsp[0].minor.yy39 = true; } break; - case 267: /* explain_options ::= */ + case 269: /* explain_options ::= */ { yymsp[1].minor.yy778 = createDefaultExplainOptions(pCxt); } break; - case 268: /* explain_options ::= explain_options VERBOSE NK_BOOL */ + case 270: /* explain_options ::= explain_options VERBOSE NK_BOOL */ { yylhsminor.yy778 = setExplainVerbose(pCxt, yymsp[-2].minor.yy778, &yymsp[0].minor.yy0); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 269: /* explain_options ::= explain_options RATIO NK_FLOAT */ + case 271: /* explain_options ::= explain_options RATIO NK_FLOAT */ { yylhsminor.yy778 = setExplainRatio(pCxt, yymsp[-2].minor.yy778, &yymsp[0].minor.yy0); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 270: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ + case 272: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ { pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy39, yymsp[-8].minor.yy39, &yymsp[-5].minor.yy181, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy380, yymsp[0].minor.yy276); } break; - case 271: /* cmd ::= DROP FUNCTION exists_opt function_name */ + case 273: /* cmd ::= DROP FUNCTION exists_opt function_name */ { pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy39, &yymsp[0].minor.yy181); } break; - case 276: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ + case 278: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ { pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-8].minor.yy39, &yymsp[-7].minor.yy181, yymsp[-4].minor.yy778, yymsp[-6].minor.yy778, yymsp[-3].minor.yy282, yymsp[-2].minor.yy778, yymsp[0].minor.yy778); } break; - case 277: /* cmd ::= DROP STREAM exists_opt stream_name */ + case 279: /* cmd ::= DROP STREAM exists_opt stream_name */ { pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy39, &yymsp[0].minor.yy181); } break; - case 279: /* stream_options ::= stream_options TRIGGER AT_ONCE */ + case 281: /* stream_options ::= stream_options TRIGGER AT_ONCE */ { ((SStreamOptions*)yymsp[-2].minor.yy778)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy778 = yymsp[-2].minor.yy778; } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 280: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + case 282: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ { ((SStreamOptions*)yymsp[-2].minor.yy778)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy778 = yymsp[-2].minor.yy778; } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 281: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + case 283: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ { ((SStreamOptions*)yymsp[-3].minor.yy778)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy778)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = yymsp[-3].minor.yy778; } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 283: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ + case 285: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ { ((SStreamOptions*)yymsp[-3].minor.yy778)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy778 = yymsp[-3].minor.yy778; } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 285: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ - case 471: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==471); - case 489: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==489); + case 287: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ + case 473: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==473); + case 491: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==491); { yymsp[-3].minor.yy778 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy778); } break; - case 286: /* cmd ::= KILL CONNECTION NK_INTEGER */ + case 288: /* cmd ::= KILL CONNECTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); } break; - case 287: /* cmd ::= KILL QUERY NK_STRING */ + case 289: /* cmd ::= KILL QUERY NK_STRING */ { pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 288: /* cmd ::= KILL TRANSACTION NK_INTEGER */ + case 290: /* cmd ::= KILL TRANSACTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); } break; - case 289: /* cmd ::= BALANCE VGROUP */ + case 291: /* cmd ::= BALANCE VGROUP */ { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); } break; - case 290: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + case 292: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 291: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ + case 293: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ { pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy282); } break; - case 292: /* cmd ::= SPLIT VGROUP NK_INTEGER */ + case 294: /* cmd ::= SPLIT VGROUP NK_INTEGER */ { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 293: /* dnode_list ::= DNODE NK_INTEGER */ + case 295: /* dnode_list ::= DNODE NK_INTEGER */ { yymsp[-1].minor.yy282 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } break; - case 295: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ + case 297: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ { pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 297: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ + case 299: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ { pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy778, yymsp[-2].minor.yy282, yymsp[0].minor.yy778); } break; - case 298: /* cmd ::= INSERT INTO full_table_name query_or_subquery */ + case 300: /* cmd ::= INSERT INTO full_table_name query_or_subquery */ { pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy778, NULL, yymsp[0].minor.yy778); } break; - case 299: /* literal ::= NK_INTEGER */ + case 301: /* literal ::= NK_INTEGER */ { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 300: /* literal ::= NK_FLOAT */ + case 302: /* literal ::= NK_FLOAT */ { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 301: /* literal ::= NK_STRING */ + case 303: /* literal ::= NK_STRING */ { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 302: /* literal ::= NK_BOOL */ + case 304: /* literal ::= NK_BOOL */ { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 303: /* literal ::= TIMESTAMP NK_STRING */ + case 305: /* literal ::= TIMESTAMP NK_STRING */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 304: /* literal ::= duration_literal */ - case 314: /* signed_literal ::= signed */ yytestcase(yyruleno==314); - case 334: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==334); - case 335: /* expr_or_subquery ::= subquery */ yytestcase(yyruleno==335); - case 336: /* expression ::= literal */ yytestcase(yyruleno==336); - case 337: /* expression ::= pseudo_column */ yytestcase(yyruleno==337); - case 338: /* expression ::= column_reference */ yytestcase(yyruleno==338); - case 339: /* expression ::= function_expression */ yytestcase(yyruleno==339); - case 340: /* expression ::= case_when_expression */ yytestcase(yyruleno==340); - case 370: /* function_expression ::= literal_func */ yytestcase(yyruleno==370); - case 419: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==419); - case 423: /* boolean_primary ::= predicate */ yytestcase(yyruleno==423); - case 425: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==425); - case 426: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==426); - case 429: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==429); - case 431: /* table_reference ::= table_primary */ yytestcase(yyruleno==431); - case 432: /* table_reference ::= joined_table */ yytestcase(yyruleno==432); - case 436: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==436); - case 491: /* query_simple ::= query_specification */ yytestcase(yyruleno==491); - case 492: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==492); - case 495: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==495); - case 497: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==497); + case 306: /* literal ::= duration_literal */ + case 316: /* signed_literal ::= signed */ yytestcase(yyruleno==316); + case 336: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==336); + case 337: /* expr_or_subquery ::= subquery */ yytestcase(yyruleno==337); + case 338: /* expression ::= literal */ yytestcase(yyruleno==338); + case 339: /* expression ::= pseudo_column */ yytestcase(yyruleno==339); + case 340: /* expression ::= column_reference */ yytestcase(yyruleno==340); + case 341: /* expression ::= function_expression */ yytestcase(yyruleno==341); + case 342: /* expression ::= case_when_expression */ yytestcase(yyruleno==342); + case 372: /* function_expression ::= literal_func */ yytestcase(yyruleno==372); + case 421: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==421); + case 425: /* boolean_primary ::= predicate */ yytestcase(yyruleno==425); + case 427: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==427); + case 428: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==428); + case 431: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==431); + case 433: /* table_reference ::= table_primary */ yytestcase(yyruleno==433); + case 434: /* table_reference ::= joined_table */ yytestcase(yyruleno==434); + case 438: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==438); + case 493: /* query_simple ::= query_specification */ yytestcase(yyruleno==493); + case 494: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==494); + case 497: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==497); + case 499: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==499); { yylhsminor.yy778 = yymsp[0].minor.yy778; } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 305: /* literal ::= NULL */ + case 307: /* literal ::= NULL */ { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 306: /* literal ::= NK_QUESTION */ + case 308: /* literal ::= NK_QUESTION */ { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 307: /* duration_literal ::= NK_VARIABLE */ + case 309: /* duration_literal ::= NK_VARIABLE */ { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 308: /* signed ::= NK_INTEGER */ + case 310: /* signed ::= NK_INTEGER */ { yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 309: /* signed ::= NK_PLUS NK_INTEGER */ + case 311: /* signed ::= NK_PLUS NK_INTEGER */ { yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } break; - case 310: /* signed ::= NK_MINUS NK_INTEGER */ + case 312: /* signed ::= NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; @@ -4641,14 +4651,14 @@ static YYACTIONTYPE yy_reduce( } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 311: /* signed ::= NK_FLOAT */ + case 313: /* signed ::= NK_FLOAT */ { yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 312: /* signed ::= NK_PLUS NK_FLOAT */ + case 314: /* signed ::= NK_PLUS NK_FLOAT */ { yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } break; - case 313: /* signed ::= NK_MINUS NK_FLOAT */ + case 315: /* signed ::= NK_MINUS NK_FLOAT */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; @@ -4656,57 +4666,57 @@ static YYACTIONTYPE yy_reduce( } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 315: /* signed_literal ::= NK_STRING */ + case 317: /* signed_literal ::= NK_STRING */ { yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 316: /* signed_literal ::= NK_BOOL */ + case 318: /* signed_literal ::= NK_BOOL */ { yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 317: /* signed_literal ::= TIMESTAMP NK_STRING */ + case 319: /* signed_literal ::= TIMESTAMP NK_STRING */ { yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } break; - case 318: /* signed_literal ::= duration_literal */ - case 320: /* signed_literal ::= literal_func */ yytestcase(yyruleno==320); - case 390: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==390); - case 452: /* select_item ::= common_expression */ yytestcase(yyruleno==452); - case 462: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==462); - case 496: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==496); - case 498: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==498); - case 511: /* search_condition ::= common_expression */ yytestcase(yyruleno==511); + case 320: /* signed_literal ::= duration_literal */ + case 322: /* signed_literal ::= literal_func */ yytestcase(yyruleno==322); + case 392: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==392); + case 454: /* select_item ::= common_expression */ yytestcase(yyruleno==454); + case 464: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==464); + case 498: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==498); + case 500: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==500); + case 513: /* search_condition ::= common_expression */ yytestcase(yyruleno==513); { yylhsminor.yy778 = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 319: /* signed_literal ::= NULL */ + case 321: /* signed_literal ::= NULL */ { yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 321: /* signed_literal ::= NK_QUESTION */ + case 323: /* signed_literal ::= NK_QUESTION */ { yylhsminor.yy778 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 341: /* expression ::= NK_LP expression NK_RP */ - case 424: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==424); - case 510: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==510); + case 343: /* expression ::= NK_LP expression NK_RP */ + case 426: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==426); + case 512: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==512); { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy778)); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 342: /* expression ::= NK_PLUS expr_or_subquery */ + case 344: /* expression ::= NK_PLUS expr_or_subquery */ { SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy778)); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 343: /* expression ::= NK_MINUS expr_or_subquery */ + case 345: /* expression ::= NK_MINUS expr_or_subquery */ { SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy778), NULL)); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 344: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ + case 346: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4714,7 +4724,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 345: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ + case 347: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4722,7 +4732,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 346: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */ + case 348: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4730,7 +4740,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 347: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ + case 349: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4738,7 +4748,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 348: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */ + case 350: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4746,14 +4756,14 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 349: /* expression ::= column_reference NK_ARROW NK_STRING */ + case 351: /* expression ::= column_reference NK_ARROW NK_STRING */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 350: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ + case 352: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4761,7 +4771,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 351: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ + case 353: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4769,70 +4779,70 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 354: /* column_reference ::= column_name */ + case 356: /* column_reference ::= column_name */ { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy181, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy181)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 355: /* column_reference ::= table_name NK_DOT column_name */ + case 357: /* column_reference ::= table_name NK_DOT column_name */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181, createColumnNode(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181)); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 356: /* pseudo_column ::= ROWTS */ - case 357: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==357); - case 359: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==359); - case 360: /* pseudo_column ::= QEND */ yytestcase(yyruleno==360); - case 361: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==361); - case 362: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==362); - case 363: /* pseudo_column ::= WEND */ yytestcase(yyruleno==363); - case 364: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==364); - case 365: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==365); - case 366: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==366); - case 372: /* literal_func ::= NOW */ yytestcase(yyruleno==372); + case 358: /* pseudo_column ::= ROWTS */ + case 359: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==359); + case 361: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==361); + case 362: /* pseudo_column ::= QEND */ yytestcase(yyruleno==362); + case 363: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==363); + case 364: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==364); + case 365: /* pseudo_column ::= WEND */ yytestcase(yyruleno==365); + case 366: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==366); + case 367: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==367); + case 368: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==368); + case 374: /* literal_func ::= NOW */ yytestcase(yyruleno==374); { yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 358: /* pseudo_column ::= table_name NK_DOT TBNAME */ + case 360: /* pseudo_column ::= table_name NK_DOT TBNAME */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy181)))); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 367: /* function_expression ::= function_name NK_LP expression_list NK_RP */ - case 368: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==368); + case 369: /* function_expression ::= function_name NK_LP expression_list NK_RP */ + case 370: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==370); { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy181, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy181, yymsp[-1].minor.yy282)); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 369: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ + case 371: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), yymsp[-1].minor.yy380)); } yymsp[-5].minor.yy778 = yylhsminor.yy778; break; - case 371: /* literal_func ::= noarg_func NK_LP NK_RP */ + case 373: /* literal_func ::= noarg_func NK_LP NK_RP */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy181, NULL)); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 386: /* star_func_para_list ::= NK_STAR */ + case 388: /* star_func_para_list ::= NK_STAR */ { yylhsminor.yy282 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 391: /* star_func_para ::= table_name NK_DOT NK_STAR */ - case 455: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==455); + case 393: /* star_func_para ::= table_name NK_DOT NK_STAR */ + case 457: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==457); { yylhsminor.yy778 = createColumnNode(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy0); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 392: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */ + case 394: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy282, yymsp[-1].minor.yy778)); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 393: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ + case 395: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), yymsp[-2].minor.yy282, yymsp[-1].minor.yy778)); } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 396: /* when_then_expr ::= WHEN common_expression THEN common_expression */ + case 398: /* when_then_expr ::= WHEN common_expression THEN common_expression */ { yymsp[-3].minor.yy778 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778)); } break; - case 398: /* case_when_else_opt ::= ELSE common_expression */ + case 400: /* case_when_else_opt ::= ELSE common_expression */ { yymsp[-1].minor.yy778 = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); } break; - case 399: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */ - case 404: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==404); + case 401: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */ + case 406: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==406); { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4840,7 +4850,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 400: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ + case 402: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4848,7 +4858,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 401: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ + case 403: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4856,71 +4866,71 @@ static YYACTIONTYPE yy_reduce( } yymsp[-5].minor.yy778 = yylhsminor.yy778; break; - case 402: /* predicate ::= expr_or_subquery IS NULL */ + case 404: /* predicate ::= expr_or_subquery IS NULL */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), NULL)); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 403: /* predicate ::= expr_or_subquery IS NOT NULL */ + case 405: /* predicate ::= expr_or_subquery IS NOT NULL */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy778); yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), NULL)); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 405: /* compare_op ::= NK_LT */ + case 407: /* compare_op ::= NK_LT */ { yymsp[0].minor.yy682 = OP_TYPE_LOWER_THAN; } break; - case 406: /* compare_op ::= NK_GT */ + case 408: /* compare_op ::= NK_GT */ { yymsp[0].minor.yy682 = OP_TYPE_GREATER_THAN; } break; - case 407: /* compare_op ::= NK_LE */ + case 409: /* compare_op ::= NK_LE */ { yymsp[0].minor.yy682 = OP_TYPE_LOWER_EQUAL; } break; - case 408: /* compare_op ::= NK_GE */ + case 410: /* compare_op ::= NK_GE */ { yymsp[0].minor.yy682 = OP_TYPE_GREATER_EQUAL; } break; - case 409: /* compare_op ::= NK_NE */ + case 411: /* compare_op ::= NK_NE */ { yymsp[0].minor.yy682 = OP_TYPE_NOT_EQUAL; } break; - case 410: /* compare_op ::= NK_EQ */ + case 412: /* compare_op ::= NK_EQ */ { yymsp[0].minor.yy682 = OP_TYPE_EQUAL; } break; - case 411: /* compare_op ::= LIKE */ + case 413: /* compare_op ::= LIKE */ { yymsp[0].minor.yy682 = OP_TYPE_LIKE; } break; - case 412: /* compare_op ::= NOT LIKE */ + case 414: /* compare_op ::= NOT LIKE */ { yymsp[-1].minor.yy682 = OP_TYPE_NOT_LIKE; } break; - case 413: /* compare_op ::= MATCH */ + case 415: /* compare_op ::= MATCH */ { yymsp[0].minor.yy682 = OP_TYPE_MATCH; } break; - case 414: /* compare_op ::= NMATCH */ + case 416: /* compare_op ::= NMATCH */ { yymsp[0].minor.yy682 = OP_TYPE_NMATCH; } break; - case 415: /* compare_op ::= CONTAINS */ + case 417: /* compare_op ::= CONTAINS */ { yymsp[0].minor.yy682 = OP_TYPE_JSON_CONTAINS; } break; - case 416: /* in_op ::= IN */ + case 418: /* in_op ::= IN */ { yymsp[0].minor.yy682 = OP_TYPE_IN; } break; - case 417: /* in_op ::= NOT IN */ + case 419: /* in_op ::= NOT IN */ { yymsp[-1].minor.yy682 = OP_TYPE_NOT_IN; } break; - case 418: /* in_predicate_value ::= NK_LP literal_list NK_RP */ + case 420: /* in_predicate_value ::= NK_LP literal_list NK_RP */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy282)); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 420: /* boolean_value_expression ::= NOT boolean_primary */ + case 422: /* boolean_value_expression ::= NOT boolean_primary */ { SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy778), NULL)); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 421: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 423: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4928,7 +4938,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 422: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 424: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); @@ -4936,52 +4946,52 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 428: /* from_clause_opt ::= FROM table_reference_list */ - case 457: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==457); - case 485: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==485); + case 430: /* from_clause_opt ::= FROM table_reference_list */ + case 459: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==459); + case 487: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==487); { yymsp[-1].minor.yy778 = yymsp[0].minor.yy778; } break; - case 430: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ + case 432: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ { yylhsminor.yy778 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy778, yymsp[0].minor.yy778, NULL); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 433: /* table_primary ::= table_name alias_opt */ + case 435: /* table_primary ::= table_name alias_opt */ { yylhsminor.yy778 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy181, &yymsp[0].minor.yy181); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 434: /* table_primary ::= db_name NK_DOT table_name alias_opt */ + case 436: /* table_primary ::= db_name NK_DOT table_name alias_opt */ { yylhsminor.yy778 = createRealTableNode(pCxt, &yymsp[-3].minor.yy181, &yymsp[-1].minor.yy181, &yymsp[0].minor.yy181); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 435: /* table_primary ::= subquery alias_opt */ + case 437: /* table_primary ::= subquery alias_opt */ { yylhsminor.yy778 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy778), &yymsp[0].minor.yy181); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 437: /* alias_opt ::= */ + case 439: /* alias_opt ::= */ { yymsp[1].minor.yy181 = nil_token; } break; - case 438: /* alias_opt ::= table_alias */ + case 440: /* alias_opt ::= table_alias */ { yylhsminor.yy181 = yymsp[0].minor.yy181; } yymsp[0].minor.yy181 = yylhsminor.yy181; break; - case 439: /* alias_opt ::= AS table_alias */ + case 441: /* alias_opt ::= AS table_alias */ { yymsp[-1].minor.yy181 = yymsp[0].minor.yy181; } break; - case 440: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 441: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==441); + case 442: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 443: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==443); { yymsp[-2].minor.yy778 = yymsp[-1].minor.yy778; } break; - case 442: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + case 444: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ { yylhsminor.yy778 = createJoinTableNode(pCxt, yymsp[-4].minor.yy202, yymsp[-5].minor.yy778, yymsp[-2].minor.yy778, yymsp[0].minor.yy778); } yymsp[-5].minor.yy778 = yylhsminor.yy778; break; - case 443: /* join_type ::= */ + case 445: /* join_type ::= */ { yymsp[1].minor.yy202 = JOIN_TYPE_INNER; } break; - case 444: /* join_type ::= INNER */ + case 446: /* join_type ::= INNER */ { yymsp[0].minor.yy202 = JOIN_TYPE_INNER; } break; - case 445: /* 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 */ + case 447: /* 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.yy778 = createSelectStmt(pCxt, yymsp[-10].minor.yy39, yymsp[-9].minor.yy282, yymsp[-8].minor.yy778); yymsp[-11].minor.yy778 = addWhereClause(pCxt, yymsp[-11].minor.yy778, yymsp[-7].minor.yy778); @@ -4994,73 +5004,73 @@ static YYACTIONTYPE yy_reduce( yymsp[-11].minor.yy778 = addFillClause(pCxt, yymsp[-11].minor.yy778, yymsp[-3].minor.yy778); } break; - case 448: /* set_quantifier_opt ::= ALL */ + case 450: /* set_quantifier_opt ::= ALL */ { yymsp[0].minor.yy39 = false; } break; - case 451: /* select_item ::= NK_STAR */ + case 453: /* select_item ::= NK_STAR */ { yylhsminor.yy778 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 453: /* select_item ::= common_expression column_alias */ - case 463: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==463); + case 455: /* select_item ::= common_expression column_alias */ + case 465: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==465); { yylhsminor.yy778 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy778), &yymsp[0].minor.yy181); } yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 454: /* select_item ::= common_expression AS column_alias */ - case 464: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==464); + case 456: /* select_item ::= common_expression AS column_alias */ + case 466: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==466); { yylhsminor.yy778 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), &yymsp[0].minor.yy181); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 459: /* partition_by_clause_opt ::= PARTITION BY partition_list */ - case 481: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==481); - case 500: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==500); + case 461: /* partition_by_clause_opt ::= PARTITION BY partition_list */ + case 483: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==483); + case 502: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==502); { yymsp[-2].minor.yy282 = yymsp[0].minor.yy282; } break; - case 466: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ + case 468: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ { yymsp[-5].minor.yy778 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), releaseRawExprNode(pCxt, yymsp[-1].minor.yy778)); } break; - case 467: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ + case 469: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ { yymsp[-3].minor.yy778 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy778)); } break; - case 468: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + case 470: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ { yymsp[-5].minor.yy778 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), NULL, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 469: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + case 471: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ { yymsp[-7].minor.yy778 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy778), releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 473: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ + case 475: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ { yymsp[-3].minor.yy778 = createFillNode(pCxt, yymsp[-1].minor.yy381, NULL); } break; - case 474: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + case 476: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ { yymsp[-5].minor.yy778 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy282)); } break; - case 475: /* fill_mode ::= NONE */ + case 477: /* fill_mode ::= NONE */ { yymsp[0].minor.yy381 = FILL_MODE_NONE; } break; - case 476: /* fill_mode ::= PREV */ + case 478: /* fill_mode ::= PREV */ { yymsp[0].minor.yy381 = FILL_MODE_PREV; } break; - case 477: /* fill_mode ::= NULL */ + case 479: /* fill_mode ::= NULL */ { yymsp[0].minor.yy381 = FILL_MODE_NULL; } break; - case 478: /* fill_mode ::= LINEAR */ + case 480: /* fill_mode ::= LINEAR */ { yymsp[0].minor.yy381 = FILL_MODE_LINEAR; } break; - case 479: /* fill_mode ::= NEXT */ + case 481: /* fill_mode ::= NEXT */ { yymsp[0].minor.yy381 = FILL_MODE_NEXT; } break; - case 482: /* group_by_list ::= expr_or_subquery */ + case 484: /* group_by_list ::= expr_or_subquery */ { yylhsminor.yy282 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 483: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ + case 485: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ { yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } yymsp[-2].minor.yy282 = yylhsminor.yy282; break; - case 487: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ + case 489: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ { yymsp[-5].minor.yy778 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), releaseRawExprNode(pCxt, yymsp[-1].minor.yy778)); } break; - case 490: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 492: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ { yylhsminor.yy778 = addOrderByClause(pCxt, yymsp[-3].minor.yy778, yymsp[-2].minor.yy282); yylhsminor.yy778 = addSlimitClause(pCxt, yylhsminor.yy778, yymsp[-1].minor.yy778); @@ -5068,50 +5078,50 @@ static YYACTIONTYPE yy_reduce( } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 493: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ + case 495: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ { yylhsminor.yy778 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy778, yymsp[0].minor.yy778); } yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 494: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ + case 496: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ { yylhsminor.yy778 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy778, yymsp[0].minor.yy778); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 502: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 506: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==506); + case 504: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 508: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==508); { yymsp[-1].minor.yy778 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 503: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 507: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==507); + case 505: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 509: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==509); { yymsp[-3].minor.yy778 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 504: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 508: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==508); + case 506: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 510: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==510); { yymsp[-3].minor.yy778 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 509: /* subquery ::= NK_LP query_expression NK_RP */ + case 511: /* subquery ::= NK_LP query_expression NK_RP */ { yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy778); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 514: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ + case 516: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ { yylhsminor.yy778 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), yymsp[-1].minor.yy14, yymsp[0].minor.yy305); } yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 515: /* ordering_specification_opt ::= */ + case 517: /* ordering_specification_opt ::= */ { yymsp[1].minor.yy14 = ORDER_ASC; } break; - case 516: /* ordering_specification_opt ::= ASC */ + case 518: /* ordering_specification_opt ::= ASC */ { yymsp[0].minor.yy14 = ORDER_ASC; } break; - case 517: /* ordering_specification_opt ::= DESC */ + case 519: /* ordering_specification_opt ::= DESC */ { yymsp[0].minor.yy14 = ORDER_DESC; } break; - case 518: /* null_ordering_opt ::= */ + case 520: /* null_ordering_opt ::= */ { yymsp[1].minor.yy305 = NULL_ORDER_DEFAULT; } break; - case 519: /* null_ordering_opt ::= NULLS FIRST */ + case 521: /* null_ordering_opt ::= NULLS FIRST */ { yymsp[-1].minor.yy305 = NULL_ORDER_FIRST; } break; - case 520: /* null_ordering_opt ::= NULLS LAST */ + case 522: /* null_ordering_opt ::= NULLS LAST */ { yymsp[-1].minor.yy305 = NULL_ORDER_LAST; } break; default: diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp index fcaa5af05c..a9360f796c 100644 --- a/source/libs/parser/test/mockCatalog.cpp +++ b/source/libs/parser/test/mockCatalog.cpp @@ -130,16 +130,16 @@ void generatePerformanceSchema(MockCatalogService* mcs) { * c5 | column | DOUBLE | 8 | */ void generateTestTables(MockCatalogService* mcs, const std::string& db) { - ITableBuilder& builder = mcs->createTableBuilder(db, "t1", TSDB_NORMAL_TABLE, 6) - .setPrecision(TSDB_TIME_PRECISION_MILLI) - .setVgid(1) - .addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP) - .addColumn("c1", TSDB_DATA_TYPE_INT) - .addColumn("c2", TSDB_DATA_TYPE_BINARY, 20) - .addColumn("c3", TSDB_DATA_TYPE_BIGINT) - .addColumn("c4", TSDB_DATA_TYPE_DOUBLE) - .addColumn("c5", TSDB_DATA_TYPE_DOUBLE); - builder.done(); + mcs->createTableBuilder(db, "t1", TSDB_NORMAL_TABLE, 6) + .setPrecision(TSDB_TIME_PRECISION_MILLI) + .setVgid(1) + .addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP) + .addColumn("c1", TSDB_DATA_TYPE_INT) + .addColumn("c2", TSDB_DATA_TYPE_BINARY, 20) + .addColumn("c3", TSDB_DATA_TYPE_BIGINT) + .addColumn("c4", TSDB_DATA_TYPE_DOUBLE) + .addColumn("c5", TSDB_DATA_TYPE_DOUBLE) + .done(); } /* diff --git a/source/libs/parser/test/parAlterToBalanceTest.cpp b/source/libs/parser/test/parAlterToBalanceTest.cpp index 3a08ef9756..0c8b82ddd4 100644 --- a/source/libs/parser/test/parAlterToBalanceTest.cpp +++ b/source/libs/parser/test/parAlterToBalanceTest.cpp @@ -79,12 +79,12 @@ TEST_F(ParserInitialATest, alterDnode) { * alter_database_option ... * * alter_database_option: { - * BUFFER int_value -- todo: range [3, 16384], default 96, unit MB + * BUFFER int_value -- range [3, 16384], default 96, unit MB * | CACHEMODEL {'none' | 'last_row' | 'last_value' | 'both'} -- default 'none' * | CACHESIZE int_value -- range [1, 65536], default 1, unit MB * | WAL_FSYNC_PERIOD int_value -- rang [0, 180000], default 3000, unit ms * | KEEP {int_value | duration_value} -- rang [1, 365000], default 3650, unit day - * | PAGES int_value -- todo: rang [64, +oo), default 256, unit page + * | PAGES int_value -- rang [64, INT32_MAX], default 256, unit page * | REPLICA int_value -- todo: enum 1, 3, default 1, unit replica * | STRICT {'off' | 'on'} -- todo: default 'off' * | WAL_LEVEL int_value -- enum 1, 2, default 1 @@ -162,7 +162,19 @@ TEST_F(ParserInitialATest, alterDatabase) { setAlterDbWal(1); setAlterDbCacheModel(TSDB_CACHE_MODEL_LAST_ROW); setAlterDbSstTrigger(16); - run("ALTER DATABASE test CACHEMODEL 'last_row' CACHESIZE 32 WAL_FSYNC_PERIOD 200 KEEP 10 WAL_LEVEL 1 STT_TRIGGER 16"); + setAlterDbBuffer(16); + setAlterDbPages(128); + run("ALTER DATABASE test BUFFER 16 CACHEMODEL 'last_row' CACHESIZE 32 WAL_FSYNC_PERIOD 200 KEEP 10 PAGES 128 " + "WAL_LEVEL 1 STT_TRIGGER 16"); + clearAlterDbReq(); + + initAlterDb("test"); + setAlterDbBuffer(3); + run("ALTER DATABASE test BUFFER 3"); + setAlterDbBuffer(64); + run("ALTER DATABASE test BUFFER 64"); + setAlterDbBuffer(16384); + run("ALTER DATABASE test BUFFER 16384"); clearAlterDbReq(); initAlterDb("test"); @@ -213,6 +225,15 @@ TEST_F(ParserInitialATest, alterDatabase) { run("ALTER DATABASE test KEEP 14400m,2400h,1500d"); clearAlterDbReq(); + initAlterDb("test"); + setAlterDbPages(64); + run("ALTER DATABASE test PAGES 64"); + setAlterDbPages(1024); + run("ALTER DATABASE test PAGES 1024"); + setAlterDbPages(16384); + run("ALTER DATABASE test PAGES 16384"); + clearAlterDbReq(); + initAlterDb("test"); setAlterDbWal(1); run("ALTER DATABASE test WAL_LEVEL 1"); @@ -224,6 +245,8 @@ TEST_F(ParserInitialATest, alterDatabase) { TEST_F(ParserInitialATest, alterDatabaseSemanticCheck) { useDb("root", "test"); + run("ALTER DATABASE test BUFFER 2", TSDB_CODE_PAR_INVALID_DB_OPTION); + run("ALTER DATABASE test BUFFER 16385", TSDB_CODE_PAR_INVALID_DB_OPTION); run("ALTER DATABASE test CACHEMODEL 'other'", TSDB_CODE_PAR_INVALID_DB_OPTION); run("ALTER DATABASE test CACHESIZE 0", TSDB_CODE_PAR_INVALID_DB_OPTION); run("ALTER DATABASE test CACHESIZE 65537", TSDB_CODE_PAR_INVALID_DB_OPTION); @@ -234,6 +257,7 @@ TEST_F(ParserInitialATest, alterDatabaseSemanticCheck) { run("ALTER DATABASE test KEEP 365001", TSDB_CODE_PAR_INVALID_DB_OPTION); run("ALTER DATABASE test KEEP 1000000000s", TSDB_CODE_PAR_INVALID_DB_OPTION); run("ALTER DATABASE test KEEP 1w", TSDB_CODE_PAR_INVALID_DB_OPTION); + run("ALTER DATABASE test PAGES 63", TSDB_CODE_PAR_INVALID_DB_OPTION); run("ALTER DATABASE test WAL_LEVEL 0", TSDB_CODE_PAR_INVALID_DB_OPTION); run("ALTER DATABASE test WAL_LEVEL 3", TSDB_CODE_PAR_INVALID_DB_OPTION); run("ALTER DATABASE test STT_TRIGGER 0", TSDB_CODE_PAR_INVALID_DB_OPTION); diff --git a/source/libs/parser/test/parTestUtil.cpp b/source/libs/parser/test/parTestUtil.cpp index 14c991917b..bf27fd2e13 100644 --- a/source/libs/parser/test/parTestUtil.cpp +++ b/source/libs/parser/test/parTestUtil.cpp @@ -343,7 +343,6 @@ class ParserTestBaseImpl { unique_ptr query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery); doParseSql(&cxt, query.get()); - SQuery* pQuery = *(query.get()); if (g_dump) { dump(); diff --git a/source/libs/qcom/CMakeLists.txt b/source/libs/qcom/CMakeLists.txt index 6e7b5cb610..715c3b8ef2 100644 --- a/source/libs/qcom/CMakeLists.txt +++ b/source/libs/qcom/CMakeLists.txt @@ -8,7 +8,7 @@ target_include_directories( target_link_libraries( qcom - PRIVATE os util transport nodes + PRIVATE os util transport ) if(${BUILD_TEST}) diff --git a/source/libs/scalar/CMakeLists.txt b/source/libs/scalar/CMakeLists.txt index 776abd93e8..c34c5e2877 100644 --- a/source/libs/scalar/CMakeLists.txt +++ b/source/libs/scalar/CMakeLists.txt @@ -8,8 +8,14 @@ target_include_directories( ) target_link_libraries(scalar - PRIVATE os util common nodes function qcom vnode - ) + PRIVATE os + PRIVATE util + PRIVATE common + PRIVATE nodes + PRIVATE function + PRIVATE qcom + PRIVATE vnode +) if(${BUILD_TEST}) ADD_SUBDIRECTORY(test) diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index ac063cb50d..dbb5214415 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -1939,7 +1939,7 @@ int32_t fltInitValFieldData(SFilterInfo *info) { bytes = (len + 1) * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE; fi->data = taosMemoryCalloc(1, bytes); - } else{ + } else { if (dType->type == TSDB_DATA_TYPE_VALUE_ARRAY) { //TIME RANGE /* fi->data = taosMemoryCalloc(dType->bytes, tDataTypes[type].bytes); diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index 9cba94d85a..b4b99be636 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -363,7 +363,11 @@ int32_t sclInitParam(SNode* node, SScalarParam *param, SScalarCtx *ctx, int32_t } SSDataBlock *block = *(SSDataBlock **)taosArrayGet(ctx->pBlockList, index); - if (NULL == block || ref->slotId >= taosArrayGetSize(block->pDataBlock)) { + if (NULL == block) { + SCL_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); + } + + if (ref->slotId >= taosArrayGetSize(block->pDataBlock)) { sclError("column slotId is too big, slodId:%d, dataBlockSize:%d", ref->slotId, (int32_t)taosArrayGetSize(block->pDataBlock)); SCL_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); } diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c index 6060f8cd92..91044a96b5 100644 --- a/source/libs/scalar/src/sclfunc.c +++ b/source/libs/scalar/src/sclfunc.c @@ -2002,7 +2002,7 @@ int32_t avgScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam * } } - if (hasNull) { + if (hasNull || (count == 0)) { colDataAppendNULL(pOutputData, 0); } else { if (IS_SIGNED_NUMERIC_TYPE(type)) { diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c index fe2a970aaa..339b18bc06 100644 --- a/source/libs/scalar/src/sclvector.c +++ b/source/libs/scalar/src/sclvector.c @@ -281,7 +281,7 @@ static FORCE_INLINE void varToTimestamp(char *buf, SScalarParam* pOut, int32_t r if (taosParseTime(buf, &value, strlen(buf), pOut->columnData->info.precision, tsDaylight) != TSDB_CODE_SUCCESS) { value = 0; } - + colDataAppendInt64(pOut->columnData, rowIndex, &value); } @@ -300,29 +300,29 @@ static FORCE_INLINE void varToSigned(char *buf, SScalarParam* pOut, int32_t rowI *overflow = 0; } } - + switch (pOut->columnData->info.type) { case TSDB_DATA_TYPE_TINYINT: { int8_t value = (int8_t)taosStr2Int8(buf, NULL, 10); - + colDataAppendInt8(pOut->columnData, rowIndex, (int8_t*)&value); break; - } + } case TSDB_DATA_TYPE_SMALLINT: { int16_t value = (int16_t)taosStr2Int16(buf, NULL, 10); colDataAppendInt16(pOut->columnData, rowIndex, (int16_t*)&value); break; - } + } case TSDB_DATA_TYPE_INT: { int32_t value = (int32_t)taosStr2Int32(buf, NULL, 10); colDataAppendInt32(pOut->columnData, rowIndex, (int32_t*)&value); break; - } + } case TSDB_DATA_TYPE_BIGINT: { int64_t value = (int64_t)taosStr2Int64(buf, NULL, 10); colDataAppendInt64(pOut->columnData, rowIndex, (int64_t*)&value); break; - } + } } } @@ -347,22 +347,22 @@ static FORCE_INLINE void varToUnsigned(char *buf, SScalarParam* pOut, int32_t ro uint8_t value = (uint8_t)taosStr2UInt8(buf, NULL, 10); colDataAppendInt8(pOut->columnData, rowIndex, (int8_t*)&value); break; - } + } case TSDB_DATA_TYPE_USMALLINT: { uint16_t value = (uint16_t)taosStr2UInt16(buf, NULL, 10); colDataAppendInt16(pOut->columnData, rowIndex, (int16_t*)&value); break; - } + } case TSDB_DATA_TYPE_UINT: { uint32_t value = (uint32_t)taosStr2UInt32(buf, NULL, 10); colDataAppendInt32(pOut->columnData, rowIndex, (int32_t*)&value); break; - } + } case TSDB_DATA_TYPE_UBIGINT: { uint64_t value = (uint64_t)taosStr2UInt64(buf, NULL, 10); colDataAppendInt64(pOut->columnData, rowIndex, (int64_t*)&value); break; - } + } } } @@ -372,7 +372,7 @@ static FORCE_INLINE void varToFloat(char *buf, SScalarParam* pOut, int32_t rowIn colDataAppendFloat(pOut->columnData, rowIndex, &value); return; } - + double value = taosStr2Double(buf, NULL); colDataAppendDouble(pOut->columnData, rowIndex, &value); } @@ -488,11 +488,11 @@ int32_t vectorConvertFromVarData(const SScalarParam* pIn, SScalarParam* pOut, in tmp[len] = 0; } } - + (*func)(tmp, pOut, i, overflow); taosMemoryFreeClear(tmp); } - + return TSDB_CODE_SUCCESS; } @@ -529,24 +529,24 @@ void* ncharTobinary(void *buf){ // todo need to remove , if tobinary bool convertJsonValue(__compar_fn_t *fp, int32_t optr, int8_t typeLeft, int8_t typeRight, char **pLeftData, char **pRightData, void *pLeftOut, void *pRightOut, bool *isNull, bool *freeLeft, bool *freeRight){ - if(optr == OP_TYPE_JSON_CONTAINS) { + if (optr == OP_TYPE_JSON_CONTAINS) { return true; } - if(typeLeft != TSDB_DATA_TYPE_JSON && typeRight != TSDB_DATA_TYPE_JSON){ + if (typeLeft != TSDB_DATA_TYPE_JSON && typeRight != TSDB_DATA_TYPE_JSON) { return true; } - if(typeLeft == TSDB_DATA_TYPE_JSON){ - if(tTagIsJson(*pLeftData)){ + if (typeLeft == TSDB_DATA_TYPE_JSON) { + if (tTagIsJson(*pLeftData)) { terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR; return false; } typeLeft = **pLeftData; (*pLeftData) ++; } - if(typeRight == TSDB_DATA_TYPE_JSON){ - if(tTagIsJson(*pLeftData)){ + if (typeRight == TSDB_DATA_TYPE_JSON) { + if (tTagIsJson(*pLeftData)) { terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR; return false; } @@ -554,71 +554,71 @@ bool convertJsonValue(__compar_fn_t *fp, int32_t optr, int8_t typeLeft, int8_t t (*pRightData) ++; } - if(optr == OP_TYPE_LIKE || optr == OP_TYPE_NOT_LIKE || optr == OP_TYPE_MATCH || optr == OP_TYPE_NMATCH){ - if(typeLeft != TSDB_DATA_TYPE_NCHAR && typeLeft != TSDB_DATA_TYPE_BINARY){ + if (optr == OP_TYPE_LIKE || optr == OP_TYPE_NOT_LIKE || optr == OP_TYPE_MATCH || optr == OP_TYPE_NMATCH) { + if (typeLeft != TSDB_DATA_TYPE_NCHAR && typeLeft != TSDB_DATA_TYPE_BINARY) { return false; } } // if types can not comparable - if((IS_NUMERIC_TYPE(typeLeft) && !IS_NUMERIC_TYPE(typeRight)) || - (IS_NUMERIC_TYPE(typeRight) && !IS_NUMERIC_TYPE(typeLeft)) || - (IS_VAR_DATA_TYPE(typeLeft) && !IS_VAR_DATA_TYPE(typeRight)) || - (IS_VAR_DATA_TYPE(typeRight) && !IS_VAR_DATA_TYPE(typeLeft)) || - ((typeLeft == TSDB_DATA_TYPE_BOOL) && (typeRight != TSDB_DATA_TYPE_BOOL)) || - ((typeRight == TSDB_DATA_TYPE_BOOL) && (typeLeft != TSDB_DATA_TYPE_BOOL))) + if ((IS_NUMERIC_TYPE(typeLeft) && !IS_NUMERIC_TYPE(typeRight)) || + (IS_NUMERIC_TYPE(typeRight) && !IS_NUMERIC_TYPE(typeLeft)) || + (IS_VAR_DATA_TYPE(typeLeft) && !IS_VAR_DATA_TYPE(typeRight)) || + (IS_VAR_DATA_TYPE(typeRight) && !IS_VAR_DATA_TYPE(typeLeft)) || + ((typeLeft == TSDB_DATA_TYPE_BOOL) && (typeRight != TSDB_DATA_TYPE_BOOL)) || + ((typeRight == TSDB_DATA_TYPE_BOOL) && (typeLeft != TSDB_DATA_TYPE_BOOL))) return false; - if(typeLeft == TSDB_DATA_TYPE_NULL || typeRight == TSDB_DATA_TYPE_NULL){ + if (typeLeft == TSDB_DATA_TYPE_NULL || typeRight == TSDB_DATA_TYPE_NULL) { *isNull = true; return true; } int8_t type = vectorGetConvertType(typeLeft, typeRight); - if(type == 0) { + if (type == 0) { *fp = filterGetCompFunc(typeLeft, optr); return true; } *fp = filterGetCompFunc(type, optr); - if(IS_NUMERIC_TYPE(type)){ - if(typeLeft == TSDB_DATA_TYPE_NCHAR) { + if (IS_NUMERIC_TYPE(type)) { + if (typeLeft == TSDB_DATA_TYPE_NCHAR) { ASSERT(0); // convertNcharToDouble(*pLeftData, pLeftOut); // *pLeftData = pLeftOut; - } else if(typeLeft == TSDB_DATA_TYPE_BINARY) { + } else if (typeLeft == TSDB_DATA_TYPE_BINARY) { ASSERT(0); // convertBinaryToDouble(*pLeftData, pLeftOut); // *pLeftData = pLeftOut; - } else if(typeLeft != type) { + } else if (typeLeft != type) { convertNumberToNumber(*pLeftData, pLeftOut, typeLeft, type); *pLeftData = pLeftOut; } - if(typeRight == TSDB_DATA_TYPE_NCHAR) { + if (typeRight == TSDB_DATA_TYPE_NCHAR) { ASSERT(0); // convertNcharToDouble(*pRightData, pRightOut); // *pRightData = pRightOut; - } else if(typeRight == TSDB_DATA_TYPE_BINARY) { + } else if (typeRight == TSDB_DATA_TYPE_BINARY) { ASSERT(0); // convertBinaryToDouble(*pRightData, pRightOut); // *pRightData = pRightOut; - } else if(typeRight != type) { + } else if (typeRight != type) { convertNumberToNumber(*pRightData, pRightOut, typeRight, type); *pRightData = pRightOut; } - }else if(type == TSDB_DATA_TYPE_BINARY){ - if(typeLeft == TSDB_DATA_TYPE_NCHAR){ + } else if (type == TSDB_DATA_TYPE_BINARY) { + if (typeLeft == TSDB_DATA_TYPE_NCHAR) { *pLeftData = ncharTobinary(*pLeftData); *freeLeft = true; } - if(typeRight == TSDB_DATA_TYPE_NCHAR){ + if (typeRight == TSDB_DATA_TYPE_NCHAR) { *pRightData = ncharTobinary(*pRightData); *freeRight = true; } - }else{ + } else { ASSERT(0); } @@ -636,7 +636,7 @@ int32_t vectorConvertToVarData(const SScalarParam* pIn, SScalarParam* pOut, int1 colDataAppendNULL(pOutputCol, i); continue; } - + int64_t value = 0; GET_TYPED_DATA(value, int64_t, inType, colDataGetData(pInputCol, i)); int32_t len = sprintf(varDataVal(tmp), "%" PRId64, value); @@ -653,7 +653,7 @@ int32_t vectorConvertToVarData(const SScalarParam* pIn, SScalarParam* pOut, int1 colDataAppendNULL(pOutputCol, i); continue; } - + uint64_t value = 0; GET_TYPED_DATA(value, uint64_t, inType, colDataGetData(pInputCol, i)); int32_t len = sprintf(varDataVal(tmp), "%" PRIu64, value); @@ -670,7 +670,7 @@ int32_t vectorConvertToVarData(const SScalarParam* pIn, SScalarParam* pOut, int1 colDataAppendNULL(pOutputCol, i); continue; } - + double value = 0; GET_TYPED_DATA(value, double, inType, colDataGetData(pInputCol, i)); int32_t len = sprintf(varDataVal(tmp), "%lf", value); @@ -698,7 +698,7 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* sclError("input column is NULL, hashFilter %p", pIn->pHashFilter); return TSDB_CODE_APP_ERROR; } - + int16_t inType = pInputCol->info.type; int16_t outType = pOutputCol->info.type; @@ -710,14 +710,14 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* ASSERT(1 == pIn->numOfRows); pOut->numOfRows = 0; - + if (IS_SIGNED_NUMERIC_TYPE(outType)) { int64_t minValue = tDataTypes[outType].minValue; int64_t maxValue = tDataTypes[outType].maxValue; - + double value = 0; GET_TYPED_DATA(value, double, inType, colDataGetData(pInputCol, 0)); - + if (value > maxValue) { *overflow = 1; return TSDB_CODE_SUCCESS; @@ -730,10 +730,10 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* } else if (IS_UNSIGNED_NUMERIC_TYPE(outType)) { uint64_t minValue = (uint64_t)tDataTypes[outType].minValue; uint64_t maxValue = (uint64_t)tDataTypes[outType].maxValue; - + double value = 0; GET_TYPED_DATA(value, double, inType, colDataGetData(pInputCol, 0)); - + if (value > maxValue) { *overflow = 1; return TSDB_CODE_SUCCESS; @@ -820,7 +820,7 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* colDataAppendNULL(pOutputCol, i); continue; } - + uint8_t value = 0; GET_TYPED_DATA(value, uint8_t, inType, colDataGetData(pInputCol, i)); colDataAppendInt8(pOutputCol, i, (int8_t *)&value); @@ -833,7 +833,7 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* colDataAppendNULL(pOutputCol, i); continue; } - + uint16_t value = 0; GET_TYPED_DATA(value, uint16_t, inType, colDataGetData(pInputCol, i)); colDataAppendInt16(pOutputCol, i, (int16_t *)&value); @@ -846,7 +846,7 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* colDataAppendNULL(pOutputCol, i); continue; } - + uint32_t value = 0; GET_TYPED_DATA(value, uint32_t, inType, colDataGetData(pInputCol, i)); colDataAppendInt32(pOutputCol, i, (int32_t *)&value); @@ -859,7 +859,7 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* colDataAppendNULL(pOutputCol, i); continue; } - + uint64_t value = 0; GET_TYPED_DATA(value, uint64_t, inType, colDataGetData(pInputCol, i)); colDataAppendInt64(pOutputCol, i, (int64_t*)&value); @@ -872,12 +872,12 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* colDataAppendNULL(pOutputCol, i); continue; } - + float value = 0; GET_TYPED_DATA(value, float, inType, colDataGetData(pInputCol, i)); colDataAppendFloat(pOutputCol, i, (float*)&value); } - break; + break; } case TSDB_DATA_TYPE_DOUBLE: { for (int32_t i = 0; i < pIn->numOfRows; ++i) { @@ -885,14 +885,14 @@ int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut, int32_t* colDataAppendNULL(pOutputCol, i); continue; } - + double value = 0; GET_TYPED_DATA(value, double, inType, colDataGetData(pInputCol, i)); colDataAppendDouble(pOutputCol, i, (double*)&value); } - break; + break; } - case TSDB_DATA_TYPE_BINARY: + case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_NCHAR: { return vectorConvertToVarData(pIn, pOut, inType, outType); } @@ -966,10 +966,10 @@ int32_t vectorConvert(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam* p return TSDB_CODE_SUCCESS; } - SScalarParam *param1 = NULL, *paramOut1 = NULL; + SScalarParam *param1 = NULL, *paramOut1 = NULL; SScalarParam *param2 = NULL, *paramOut2 = NULL; int32_t code = 0; - + if (leftType < rightType) { param1 = pLeft; param2 = pRight; @@ -993,7 +993,7 @@ int32_t vectorConvert(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam* p return code; } } - + if (type != GET_PARAM_TYPE(param2)) { code = vectorConvertScalarParam(param2, paramOut2, type); if (code) { @@ -1136,7 +1136,7 @@ void vectorMathAdd(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut } *output = getVectorBigintValueFnLeft(pLeftCol->pData, i) + getVectorBigintValueFnRight(pRightCol->pData, i); } - } + } } else { double *output = (double *)pOutputCol->pData; _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type); @@ -1198,7 +1198,7 @@ static void vectorMathTsSubHelper(SColumnInfoData* pLeftCol, SColumnInfoData* pR } *output = taosTimeAdd(getVectorBigintValueFnLeft(pLeftCol->pData, i), -getVectorBigintValueFnRight(pRightCol->pData, 0), pRightCol->info.scale, pRightCol->info.precision); - + } } } @@ -1706,7 +1706,7 @@ void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam * int32_t lType = GET_PARAM_TYPE(pLeft); int32_t rType = GET_PARAM_TYPE(pRight); __compar_fn_t fp = NULL; - + if (lType == rType) { fp = filterGetCompFunc(lType, optr); } else { @@ -1736,9 +1736,9 @@ void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam * } void vectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord, int32_t optr) { - SScalarParam pLeftOut = {0}; + SScalarParam pLeftOut = {0}; SScalarParam pRightOut = {0}; - SScalarParam *param1 = NULL; + SScalarParam *param1 = NULL; SScalarParam *param2 = NULL; if (SCL_NO_NEED_CONVERT_COMPARISION(GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight), optr)) { @@ -1762,7 +1762,7 @@ void vectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut vectorCompareImpl(param1, param2, pOut, _ord, optr); sclFreeParam(&pLeftOut); - sclFreeParam(&pRightOut); + sclFreeParam(&pRightOut); } void vectorGreater(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord) { diff --git a/source/libs/stream/src/streamData.c b/source/libs/stream/src/streamData.c index e6705a77b2..2fea5b9eca 100644 --- a/source/libs/stream/src/streamData.c +++ b/source/libs/stream/src/streamData.c @@ -35,6 +35,7 @@ int32_t streamDispatchReqToData(const SStreamDispatchReq* pReq, SStreamDataBlock pDataBlock->info.window.ekey = be64toh(pRetrieve->ekey); pDataBlock->info.version = be64toh(pRetrieve->version); pDataBlock->info.watermark = be64toh(pRetrieve->watermark); + memcpy(pDataBlock->info.parTbName, pRetrieve->parTbName, TSDB_TABLE_NAME_LEN); pDataBlock->info.type = pRetrieve->streamBlockType; pDataBlock->info.childId = pReq->upstreamChildId; diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c index e6960ae350..9d8a44c1ef 100644 --- a/source/libs/stream/src/streamDispatch.c +++ b/source/libs/stream/src/streamDispatch.c @@ -195,6 +195,7 @@ static int32_t streamAddBlockToDispatchMsg(const SSDataBlock* pBlock, SStreamDis pRetrieve->ekey = htobe64(pBlock->info.window.ekey); pRetrieve->version = htobe64(pBlock->info.version); pRetrieve->watermark = htobe64(pBlock->info.watermark); + memcpy(pRetrieve->parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN); int32_t numOfCols = (int32_t)taosArrayGetSize(pBlock->pDataBlock); pRetrieve->numOfCols = htonl(numOfCols); @@ -250,7 +251,13 @@ FAIL: int32_t streamSearchAndAddBlock(SStreamTask* pTask, SStreamDispatchReq* pReqs, SSDataBlock* pDataBlock, int32_t vgSz, int64_t groupId) { - char* ctbName = buildCtbNameByGroupId(pTask->shuffleDispatcher.stbFullName, groupId); + char* ctbName; + if (pDataBlock->info.parTbName[0]) { + ctbName = taosMemoryCalloc(1, TSDB_TABLE_NAME_LEN); + snprintf(ctbName, TSDB_TABLE_NAME_LEN, "%s.%s", pTask->shuffleDispatcher.dbInfo.db, pDataBlock->info.parTbName); + } else { + ctbName = buildCtbNameByGroupId(pTask->shuffleDispatcher.stbFullName, groupId); + } SArray* vgInfo = pTask->shuffleDispatcher.dbInfo.pVgroupInfos; /*uint32_t hashValue = MurmurHash3_32(ctbName, strlen(ctbName));*/ diff --git a/source/libs/stream/src/streamState.c b/source/libs/stream/src/streamState.c index 596c16747b..85592881cd 100644 --- a/source/libs/stream/src/streamState.c +++ b/source/libs/stream/src/streamState.c @@ -24,7 +24,7 @@ typedef struct SStateKey { int64_t opNum; } SStateKey; -static inline int SStateKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) { +static inline int stateKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) { SStateKey* pWin1 = (SStateKey*)pKey1; SStateKey* pWin2 = (SStateKey*)pKey2; @@ -60,6 +60,7 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath) { if (!specPath) { sprintf(statePath, "%s/%d", path, pTask->taskId); } else { + memset(statePath, 0, 300); strncpy(statePath, path, 300); } if (tdbOpen(statePath, 4096, 256, &pState->db) < 0) { @@ -67,12 +68,12 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath) { } // open state storage backend - if (tdbTbOpen("state.db", sizeof(SStateKey), -1, SStateKeyCmpr, pState->db, &pState->pStateDb) < 0) { + if (tdbTbOpen("state.db", sizeof(SStateKey), -1, stateKeyCmpr, pState->db, &pState->pStateDb) < 0) { goto _err; } // todo refactor - if (tdbTbOpen("func.state.db", sizeof(SWinKey), -1, SWinKeyCmpr, pState->db, &pState->pFillStateDb) < 0) { + if (tdbTbOpen("fill.state.db", sizeof(SWinKey), -1, winKeyCmpr, pState->db, &pState->pFillStateDb) < 0) { goto _err; } diff --git a/source/libs/tdb/inc/tdb.h b/source/libs/tdb/inc/tdb.h index ee023087df..c90d4e3c03 100644 --- a/source/libs/tdb/inc/tdb.h +++ b/source/libs/tdb/inc/tdb.h @@ -36,6 +36,7 @@ int32_t tdbClose(TDB *pDb); int32_t tdbBegin(TDB *pDb, TXN *pTxn); int32_t tdbCommit(TDB *pDb, TXN *pTxn); int32_t tdbAbort(TDB *pDb, TXN *pTxn); +int32_t tdbAlter(TDB *pDb, int pages); // TTB int32_t tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprFn, TDB *pEnv, TTB **ppTb); diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index c5204ef59e..a148c1e36b 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -1003,14 +1003,14 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const int nLeft = nPayload; int bytes; int lastPage = 0; - if (nLocal >= kLen + 4) { + if (nLocal >= nHeader + kLen + sizeof(SPgno)) { // pack key to local memcpy(pCell + nHeader, pKey, kLen); nLeft -= kLen; // pack partial val to local if any space left - if (nLocal > kLen + 4) { - memcpy(pCell + nHeader + kLen, pVal, nLocal - kLen - sizeof(SPgno)); - nLeft -= nLocal - kLen - sizeof(SPgno); + if (nLocal > nHeader + kLen + sizeof(SPgno)) { + memcpy(pCell + nHeader + kLen, pVal, nLocal - nHeader - kLen - sizeof(SPgno)); + nLeft -= nLocal - nHeader - kLen - sizeof(SPgno); } // pack nextPgno @@ -1150,9 +1150,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const // free local buffer tdbFree(pBuf); - *szPayload = nLocal; - - // ASSERT(0); + *szPayload = nLocal - nHeader; } return 0; @@ -1246,10 +1244,10 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, int bytes; int lastPage = 0; - if (nLocal >= pDecoder->kLen + 4) { + if (nLocal >= pDecoder->kLen + nHeader + sizeof(SPgno)) { pDecoder->pKey = (SCell *)pCell + nHeader; nLeft -= kLen; - if (nLocal > kLen + 4) { + if (nLocal > kLen + nHeader + sizeof(SPgno)) { // read partial val to local pDecoder->pVal = tdbRealloc(pDecoder->pVal, vLen); if (pDecoder->pVal == NULL) { @@ -1259,9 +1257,9 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, tdbDebug("tdb btc decoder: %p/0x%x pVal: %p ", pDecoder, pDecoder->freeKV, pDecoder->pVal); - memcpy(pDecoder->pVal, pCell + nHeader + kLen, nLocal - kLen - sizeof(SPgno)); + memcpy(pDecoder->pVal, pCell + nHeader + kLen, nLocal - nHeader - kLen - sizeof(SPgno)); - nLeft -= nLocal - kLen - sizeof(SPgno); + nLeft -= nLocal - nHeader - kLen - sizeof(SPgno); } memcpy(&pgno, pCell + nHeader + nPayload - nLeft, sizeof(pgno)); @@ -1474,7 +1472,7 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell, int dropOfp, TXN * int nPayload = kLen + vLen; if (nHeader + nPayload <= pPage->maxLocal) { - return nHeader + kLen + vLen; + return nHeader + nPayload; } else { int maxLocal = pPage->maxLocal; @@ -1486,8 +1484,8 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell, int dropOfp, TXN * // free ofp pages' cells if (dropOfp) { int ret = 0; - SPgno pgno = *(SPgno *)(pCell + nHeader + nLocal - sizeof(SPgno)); - int nLeft = nPayload - nLocal + sizeof(SPgno); + SPgno pgno = *(SPgno *)(pCell + nLocal - sizeof(SPgno)); + int nLeft = nPayload - nLocal + sizeof(SPgno) + nHeader; SPage *ofp; int bytes; @@ -1513,7 +1511,7 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell, int dropOfp, TXN * } } - return nHeader + nLocal; + return nLocal; } } // TDB_BTREE_CELL diff --git a/source/libs/tdb/src/db/tdbDb.c b/source/libs/tdb/src/db/tdbDb.c index 42aeeae19a..ea16e80562 100644 --- a/source/libs/tdb/src/db/tdbDb.c +++ b/source/libs/tdb/src/db/tdbDb.c @@ -97,6 +97,8 @@ int tdbClose(TDB *pDb) { return 0; } +int32_t tdbAlter(TDB *pDb, int pages) { return tdbPCacheAlter(pDb->pCache, pages); } + int32_t tdbBegin(TDB *pDb, TXN *pTxn) { SPager *pPager; int ret; diff --git a/source/libs/tdb/src/db/tdbPCache.c b/source/libs/tdb/src/db/tdbPCache.c index 6254158591..b6d1f95c0e 100644 --- a/source/libs/tdb/src/db/tdbPCache.c +++ b/source/libs/tdb/src/db/tdbPCache.c @@ -61,7 +61,11 @@ int tdbPCacheOpen(int pageSize, int cacheSize, SPCache **ppCache) { pCache->szPage = pageSize; pCache->nPages = cacheSize; - pCache->aPage = (SPage **)&pCache[1]; + pCache->aPage = (SPage **)tdbOsCalloc(cacheSize, sizeof(SPage *)); + if (pCache->aPage == NULL) { + tdbOsFree(pCache); + return -1; + } if (tdbPCacheOpenImpl(pCache) < 0) { tdbOsFree(pCache); @@ -75,11 +79,93 @@ int tdbPCacheOpen(int pageSize, int cacheSize, SPCache **ppCache) { int tdbPCacheClose(SPCache *pCache) { if (pCache) { tdbPCacheCloseImpl(pCache); + tdbOsFree(pCache->aPage); tdbOsFree(pCache); } return 0; } +// TODO: +// if (pPage->id >= pCache->nPages) { +// free(pPage); +// pCache->aPage[pPage->id] = NULL; +// } else { +// add to free list +// } + +static int tdbPCacheAlterImpl(SPCache *pCache, int32_t nPage) { + if (pCache->nPages == nPage) { + return 0; + } else if (pCache->nPages < nPage) { + SPage **aPage = tdbOsCalloc(nPage, sizeof(SPage *)); + if (aPage == NULL) { + return -1; + } + + for (int32_t iPage = pCache->nPages; iPage < nPage; iPage++) { + if (tdbPageCreate(pCache->szPage, &aPage[iPage], tdbDefaultMalloc, NULL) < 0) { + // TODO: handle error + return -1; + } + + // pPage->pgid = 0; + aPage[iPage]->isAnchor = 0; + aPage[iPage]->isLocal = 1; + aPage[iPage]->nRef = 0; + aPage[iPage]->pHashNext = NULL; + aPage[iPage]->pLruNext = NULL; + aPage[iPage]->pLruPrev = NULL; + aPage[iPage]->pDirtyNext = NULL; + + // add to local list + aPage[iPage]->id = iPage; + } + + // add page to free list + for (int32_t iPage = pCache->nPages; iPage < nPage; iPage++) { + aPage[iPage]->pFreeNext = pCache->pFree; + pCache->pFree = aPage[iPage]; + pCache->nFree++; + } + + for (int32_t iPage = 0; iPage < pCache->nPage; iPage++) { + aPage[iPage] = pCache->aPage[iPage]; + } + + tdbOsFree(pCache->aPage); + pCache->aPage = aPage; + } else { + for (SPage **ppPage = &pCache->pFree; *ppPage;) { + int32_t iPage = (*ppPage)->id; + + if (iPage >= nPage) { + SPage *pPage = *ppPage; + *ppPage = pPage->pFreeNext; + pCache->aPage[pPage->id] = NULL; + tdbPageDestroy(pPage, tdbDefaultFree, NULL); + pCache->nFree--; + } else { + ppPage = &(*ppPage)->pFreeNext; + } + } + } + + pCache->nPages = nPage; + return 0; +} + +int tdbPCacheAlter(SPCache *pCache, int32_t nPage) { + int ret = 0; + + tdbPCacheLock(pCache); + + ret = tdbPCacheAlterImpl(pCache, nPage); + + tdbPCacheUnlock(pCache); + + return ret; +} + SPage *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid, TXN *pTxn) { SPage *pPage; i32 nRef; @@ -310,8 +396,7 @@ static int tdbPCacheOpenImpl(SPCache *pCache) { pCache->nFree = 0; pCache->pFree = NULL; for (int i = 0; i < pCache->nPages; i++) { - ret = tdbPageCreate(pCache->szPage, &pPage, tdbDefaultMalloc, NULL); - if (ret < 0) { + if (tdbPageCreate(pCache->szPage, &pPage, tdbDefaultMalloc, NULL) < 0) { // TODO: handle error return -1; } diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h index 29a9665c15..68434a4319 100644 --- a/source/libs/tdb/src/inc/tdbInt.h +++ b/source/libs/tdb/src/inc/tdbInt.h @@ -216,6 +216,7 @@ int tdbPagerRestore(SPager *pPager, SBTree *pBt); int tdbPCacheOpen(int pageSize, int cacheSize, SPCache **ppCache); int tdbPCacheClose(SPCache *pCache); +int tdbPCacheAlter(SPCache *pCache, int32_t nPage); SPage *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid, TXN *pTxn); void tdbPCacheRelease(SPCache *pCache, SPage *pPage, TXN *pTxn); int tdbPCacheGetPageSize(SPCache *pCache); diff --git a/source/libs/tdb/test/tdbExOVFLTest.cpp b/source/libs/tdb/test/tdbExOVFLTest.cpp index 2d8d012a6a..d98c271edb 100644 --- a/source/libs/tdb/test/tdbExOVFLTest.cpp +++ b/source/libs/tdb/test/tdbExOVFLTest.cpp @@ -119,12 +119,12 @@ static int tDefaultKeyCmpr(const void *pKey1, int keyLen1, const void *pKey2, in return cret; } -TEST(TdbOVFLPagesTest, TbUpsertTest) { - +TEST(TdbOVFLPagesTest, DISABLED_TbUpsertTest) { + // TEST(TdbOVFLPagesTest, TbUpsertTest) { } -TEST(TdbOVFLPagesTest, TbPGetTest) { - +TEST(TdbOVFLPagesTest, DISABLED_TbPGetTest) { + // TEST(TdbOVFLPagesTest, TbPGetTest) { } static void generateBigVal(char *val, int valLen) { @@ -156,32 +156,36 @@ static void insertOfp(void) { // open Env int const pageSize = 4096; int const pageNum = 64; - TDB *pEnv = openEnv("tdb", pageSize, pageNum); + TDB *pEnv = openEnv("tdb", pageSize, pageNum); GTEST_ASSERT_NE(pEnv, nullptr); // open db - TTB *pDb = NULL; + TTB *pDb = NULL; tdb_cmpr_fn_t compFunc = tKeyCmpr; - ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb); + // ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb); + ret = tdbTbOpen("ofp_insert.db", 12, -1, compFunc, pEnv, &pDb); GTEST_ASSERT_EQ(ret, 0); // open the pool SPoolMem *pPool = openPool(); // start a transaction - TXN txn; + TXN txn; int64_t txnid = 0; ++txnid; tdbTxnOpen(&txn, txnid, poolMalloc, poolFree, pPool, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED); tdbBegin(pEnv, &txn); // generate value payload - char val[((4083 - 4 - 3 - 2)+1)*100]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) - int valLen = sizeof(val) / sizeof(val[0]); + // char val[((4083 - 4 - 3 - 2) + 1) * 100]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) + char val[32605]; + int valLen = sizeof(val) / sizeof(val[0]); generateBigVal(val, valLen); // insert the generated big data - ret = tdbTbInsert(pDb, "key1", strlen("key1"), val, valLen, &txn); + // char const *key = "key1"; + char const *key = "key123456789"; + ret = tdbTbInsert(pDb, key, strlen(key), val, valLen, &txn); GTEST_ASSERT_EQ(ret, 0); // commit current transaction @@ -189,37 +193,41 @@ static void insertOfp(void) { tdbTxnClose(&txn); } -//TEST(TdbOVFLPagesTest, DISABLED_TbInsertTest) { -TEST(TdbOVFLPagesTest, TbInsertTest) { +TEST(TdbOVFLPagesTest, DISABLED_TbInsertTest) { + // TEST(TdbOVFLPagesTest, TbInsertTest) { insertOfp(); } -//TEST(TdbOVFLPagesTest, DISABLED_TbGetTest) { +// TEST(TdbOVFLPagesTest, DISABLED_TbGetTest) { TEST(TdbOVFLPagesTest, TbGetTest) { insertOfp(); // open Env int const pageSize = 4096; int const pageNum = 64; - TDB *pEnv = openEnv("tdb", pageSize, pageNum); + TDB *pEnv = openEnv("tdb", pageSize, pageNum); GTEST_ASSERT_NE(pEnv, nullptr); // open db - TTB *pDb = NULL; + TTB *pDb = NULL; tdb_cmpr_fn_t compFunc = tKeyCmpr; - int ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb); + // int ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb); + int ret = tdbTbOpen("ofp_insert.db", 12, -1, compFunc, pEnv, &pDb); GTEST_ASSERT_EQ(ret, 0); // generate value payload - char val[((4083 - 4 - 3 - 2)+1)*100]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) - int valLen = sizeof(val) / sizeof(val[0]); + // char val[((4083 - 4 - 3 - 2) + 1) * 100]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) + char val[32605]; + int valLen = sizeof(val) / sizeof(val[0]); generateBigVal(val, valLen); { // Query the data void *pVal = NULL; int vLen; - ret = tdbTbGet(pDb, "key1", strlen("key1"), &pVal, &vLen); + // char const *key = "key1"; + char const *key = "key123456789"; + ret = tdbTbGet(pDb, key, strlen(key), &pVal, &vLen); ASSERT(ret == 0); GTEST_ASSERT_EQ(ret, 0); @@ -230,6 +238,7 @@ TEST(TdbOVFLPagesTest, TbGetTest) { } } +// TEST(TdbOVFLPagesTest, DISABLED_TbDeleteTest) { TEST(TdbOVFLPagesTest, TbDeleteTest) { int ret = 0; @@ -238,11 +247,11 @@ TEST(TdbOVFLPagesTest, TbDeleteTest) { // open Env int const pageSize = 4096; int const pageNum = 64; - TDB *pEnv = openEnv("tdb", pageSize, pageNum); + TDB *pEnv = openEnv("tdb", pageSize, pageNum); GTEST_ASSERT_NE(pEnv, nullptr); // open db - TTB *pDb = NULL; + TTB *pDb = NULL; tdb_cmpr_fn_t compFunc = tKeyCmpr; ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb); GTEST_ASSERT_EQ(ret, 0); @@ -251,18 +260,19 @@ TEST(TdbOVFLPagesTest, TbDeleteTest) { SPoolMem *pPool = openPool(); // start a transaction - TXN txn; + TXN txn; int64_t txnid = 0; ++txnid; tdbTxnOpen(&txn, txnid, poolMalloc, poolFree, pPool, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED); tdbBegin(pEnv, &txn); // generate value payload - char val[((4083 - 4 - 3 - 2)+1)*100]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) - int valLen = sizeof(val) / sizeof(val[0]); + // char val[((4083 - 4 - 3 - 2) + 1) * 100]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) + char val[((4083 - 4 - 3 - 2) + 1) * 2]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) + int valLen = sizeof(val) / sizeof(val[0]); generateBigVal(val, valLen); - { // insert the generated big data + { // insert the generated big data ret = tdbTbInsert(pDb, "key1", strlen("key1"), val, valLen, &txn); GTEST_ASSERT_EQ(ret, 0); } @@ -280,15 +290,15 @@ TEST(TdbOVFLPagesTest, TbDeleteTest) { tdbFree(pVal); } - /* open to debug committed file - tdbCommit(pEnv, &txn); - tdbTxnClose(&txn); + /* open to debug committed file +tdbCommit(pEnv, &txn); +tdbTxnClose(&txn); - ++txnid; - tdbTxnOpen(&txn, txnid, poolMalloc, poolFree, pPool, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED); - tdbBegin(pEnv, &txn); - */ - { // upsert the data +++txnid; +tdbTxnOpen(&txn, txnid, poolMalloc, poolFree, pPool, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED); +tdbBegin(pEnv, &txn); + */ + { // upsert the data ret = tdbTbUpsert(pDb, "key1", strlen("key1"), "value1", strlen("value1"), &txn); GTEST_ASSERT_EQ(ret, 0); } @@ -307,7 +317,7 @@ TEST(TdbOVFLPagesTest, TbDeleteTest) { tdbFree(pVal); } - { // delete the data + { // delete the data ret = tdbTbDelete(pDb, "key1", strlen("key1"), &txn); GTEST_ASSERT_EQ(ret, 0); } @@ -331,8 +341,8 @@ TEST(TdbOVFLPagesTest, TbDeleteTest) { tdbTxnClose(&txn); } -TEST(tdb_test, DISABLED_simple_insert1) { -//TEST(tdb_test, simple_insert1) { +// TEST(tdb_test, DISABLED_simple_insert1) { +TEST(tdb_test, simple_insert1) { int ret; TDB *pEnv; TTB *pDb; @@ -353,10 +363,10 @@ TEST(tdb_test, DISABLED_simple_insert1) { GTEST_ASSERT_EQ(ret, 0); { - char key[64]; - //char val[(4083 - 4 - 3 - 2)]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) - char val[(4083 - 4 - 3 - 2)+1]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) - int64_t poolLimit = 4096; // 1M pool limit + char key[64]; + // char val[(4083 - 4 - 3 - 2)]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) + char val[(4083 - 4 - 3 - 2) + 1]; // pSize(4096) - amSize(1) - pageHdr(8) - footerSize(4) + int64_t poolLimit = 4096; // 1M pool limit int64_t txnid = 0; SPoolMem *pPool; @@ -372,17 +382,17 @@ TEST(tdb_test, DISABLED_simple_insert1) { sprintf(key, "key0"); sprintf(val, "value%d", iData); - //ret = tdbTbInsert(pDb, key, strlen(key), val, strlen(val), &txn); - //GTEST_ASSERT_EQ(ret, 0); + // ret = tdbTbInsert(pDb, key, strlen(key), val, strlen(val), &txn); + // GTEST_ASSERT_EQ(ret, 0); // generate value payload int valLen = sizeof(val) / sizeof(val[0]); for (int i = 6; i < valLen; ++i) { - char c = char(i & 0xff); - if (c == 0) { - c = 1; - } - val[i] = c; + char c = char(i & 0xff); + if (c == 0) { + c = 1; + } + val[i] = c; } ret = tdbTbInsert(pDb, "key1", strlen("key1"), val, valLen, &txn); diff --git a/source/libs/tfs/inc/tfsInt.h b/source/libs/tfs/inc/tfsInt.h index 2a508cf676..8e77dc8c0c 100644 --- a/source/libs/tfs/inc/tfsInt.h +++ b/source/libs/tfs/inc/tfsInt.h @@ -57,7 +57,7 @@ typedef struct { typedef struct STfsDir { SDiskIter iter; SDiskID did; - char dirname[TSDB_FILENAME_LEN]; + char dirName[TSDB_FILENAME_LEN]; STfsFile tfile; TdDirPtr pDir; STfs *pTfs; diff --git a/source/libs/tfs/src/tfs.c b/source/libs/tfs/src/tfs.c index 4600e5e568..b8786a85a9 100644 --- a/source/libs/tfs/src/tfs.c +++ b/source/libs/tfs/src/tfs.c @@ -332,7 +332,7 @@ STfsDir *tfsOpendir(STfs *pTfs, const char *rname) { SDiskID diskId = {.id = 0, .level = 0}; pDir->iter.pDisk = TFS_DISK_AT(pTfs, diskId); pDir->pTfs = pTfs; - tstrncpy(pDir->dirname, rname, TSDB_FILENAME_LEN); + tstrncpy(pDir->dirName, rname, TSDB_FILENAME_LEN); if (tfsOpendirImpl(pTfs, pDir) < 0) { taosMemoryFree(pDir); @@ -354,10 +354,10 @@ const STfsFile *tfsReaddir(STfsDir *pTfsDir) { char *name = taosGetDirEntryName(pDirEntry); if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue; - if (pTfsDir->dirname == NULL || pTfsDir->dirname[0] == 0) { + if (pTfsDir->dirName[0] == 0) { snprintf(bname, TMPNAME_LEN * 2, "%s", name); } else { - snprintf(bname, TMPNAME_LEN * 2, "%s%s%s", pTfsDir->dirname, TD_DIRSEP, name); + snprintf(bname, TMPNAME_LEN * 2, "%s%s%s", pTfsDir->dirName, TD_DIRSEP, name); } tfsInitFile(pTfsDir->pTfs, &pTfsDir->tfile, pTfsDir->did, bname); @@ -523,9 +523,9 @@ static int32_t tfsOpendirImpl(STfs *pTfs, STfsDir *pTfsDir) { pTfsDir->did.id = pDisk->id; if (pDisk->path == NULL || pDisk->path[0] == 0) { - snprintf(adir, TMPNAME_LEN * 2, "%s", pTfsDir->dirname); + snprintf(adir, TMPNAME_LEN * 2, "%s", pTfsDir->dirName); } else { - snprintf(adir, TMPNAME_LEN * 2, "%s%s%s", pDisk->path, TD_DIRSEP, pTfsDir->dirname); + snprintf(adir, TMPNAME_LEN * 2, "%s%s%s", pDisk->path, TD_DIRSEP, pTfsDir->dirName); } pTfsDir->pDir = taosOpenDir(adir); if (pTfsDir->pDir != NULL) break; diff --git a/source/libs/transport/CMakeLists.txt b/source/libs/transport/CMakeLists.txt index 62eb1a985b..a48926d2d4 100644 --- a/source/libs/transport/CMakeLists.txt +++ b/source/libs/transport/CMakeLists.txt @@ -16,11 +16,6 @@ target_link_libraries( ) if (${BUILD_WITH_UV_TRANS}) if (${BUILD_WITH_UV}) - target_include_directories( - transport - PUBLIC "${TD_SOURCE_DIR}/contrib/libuv/include" - ) - target_link_libraries( transport PUBLIC uv_a diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index ff4fae3de8..bd99a23267 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -79,7 +79,8 @@ typedef struct SCliThrd { uint64_t nextTimeout; // next timeout void* pTransInst; // - SCvtAddr cvtAddr; + SHashObj* fqdn2ipCache; + SCvtAddr cvtAddr; SCliMsg* stopMsg; @@ -135,6 +136,9 @@ static FORCE_INLINE void cliMayCvtFqdnToIp(SEpSet* pEpSet, SCvtAddr* pCvtAddr); static FORCE_INLINE int32_t cliBuildExceptResp(SCliMsg* pMsg, STransMsg* resp); +static FORCE_INLINE uint32_t cliGetIpFromFqdnCache(SHashObj* cache, char* fqdn); +static FORCE_INLINE void cliUpdateFqdnCache(SHashObj* cache, char* fqdn); + // process data read from server, add decompress etc later static void cliHandleResp(SCliConn* conn); // handle except about conn @@ -154,7 +158,7 @@ static FORCE_INLINE int cliRBChoseIdx(STrans* pTransInst); static FORCE_INLINE void transDestroyConnCtx(STransConnCtx* ctx); // thread obj -static SCliThrd* createThrdObj(); +static SCliThrd* createThrdObj(void* trans); static void destroyThrdObj(SCliThrd* pThrd); static void cliWalkCb(uv_handle_t* handle, void* arg); @@ -930,6 +934,21 @@ FORCE_INLINE int32_t cliBuildExceptResp(SCliMsg* pMsg, STransMsg* pResp) { return 0; } +static FORCE_INLINE uint32_t cliGetIpFromFqdnCache(SHashObj* cache, char* fqdn) { + uint32_t addr = 0; + uint32_t* v = taosHashGet(cache, fqdn, strlen(fqdn)); + if (v == NULL) { + addr = taosGetIpv4FromFqdn(fqdn); + taosHashPut(cache, fqdn, strlen(fqdn), &addr, sizeof(addr)); + } else { + addr = *v; + } + return addr; +} +static FORCE_INLINE void cliUpdateFqdnCache(SHashObj* cache, char* fqdn) { + // impl later + return; +} void cliHandleReq(SCliMsg* pMsg, SCliThrd* pThrd) { STrans* pTransInst = pThrd->pTransInst; @@ -985,7 +1004,8 @@ void cliHandleReq(SCliMsg* pMsg, SCliThrd* pThrd) { struct sockaddr_in addr; addr.sin_family = AF_INET; - addr.sin_addr.s_addr = taosGetIpv4FromFqdn(conn->ip); + + addr.sin_addr.s_addr = cliGetIpFromFqdnCache(pThrd->fqdn2ipCache, conn->ip); addr.sin_port = (uint16_t)htons((uint16_t)conn->port); tTrace("%s conn %p try to connect to %s:%d", pTransInst->label, conn, conn->ip, conn->port); ret = uv_tcp_connect(&conn->connReq, (uv_tcp_t*)(conn->stream), (const struct sockaddr*)&addr, cliConnCb); @@ -1132,11 +1152,8 @@ void* transInitClient(uint32_t ip, uint32_t port, char* label, int numOfThreads, cli->pThreadObj = (SCliThrd**)taosMemoryCalloc(cli->numOfThreads, sizeof(SCliThrd*)); for (int i = 0; i < cli->numOfThreads; i++) { - SCliThrd* pThrd = createThrdObj(); - pThrd->nextTimeout = taosGetTimestampMs() + CONN_PERSIST_TIME(pTransInst->idleTime); - pThrd->pTransInst = shandle; - - int err = taosThreadCreate(&pThrd->thread, NULL, cliWorkThread, (void*)(pThrd)); + SCliThrd* pThrd = createThrdObj(shandle); + int err = taosThreadCreate(&pThrd->thread, NULL, cliWorkThread, (void*)(pThrd)); if (err == 0) { tDebug("success to create tranport-cli thread:%d", i); } @@ -1164,7 +1181,9 @@ static FORCE_INLINE void destroyCmsg(void* arg) { taosMemoryFree(pMsg); } -static SCliThrd* createThrdObj() { +static SCliThrd* createThrdObj(void* trans) { + STrans* pTransInst = trans; + SCliThrd* pThrd = (SCliThrd*)taosMemoryCalloc(1, sizeof(SCliThrd)); QUEUE_INIT(&pThrd->msg); @@ -1193,6 +1212,10 @@ static SCliThrd* createThrdObj() { transDQCreate(pThrd->loop, &pThrd->timeoutQueue); + pThrd->nextTimeout = taosGetTimestampMs() + CONN_PERSIST_TIME(pTransInst->idleTime); + pThrd->pTransInst = trans; + + pThrd->fqdn2ipCache = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); pThrd->quit = false; return pThrd; } @@ -1217,6 +1240,7 @@ static void destroyThrdObj(SCliThrd* pThrd) { taosArrayDestroy(pThrd->timerList); taosMemoryFree(pThrd->prepare); taosMemoryFree(pThrd->loop); + taosHashCleanup(pThrd->fqdn2ipCache); taosMemoryFree(pThrd); } diff --git a/source/libs/wal/inc/walInt.h b/source/libs/wal/inc/walInt.h index e4b27292bb..1aea0e8148 100644 --- a/source/libs/wal/inc/walInt.h +++ b/source/libs/wal/inc/walInt.h @@ -97,12 +97,12 @@ static inline SWalFileInfo* walGetCurFileInfo(SWal* pWal) { return (SWalFileInfo*)taosArrayGet(pWal->fileInfoSet, pWal->writeCur); } -static inline int walBuildLogName(SWal* pWal, int64_t fileFirstVer, char* buf) { - return sprintf(buf, "%s/%020" PRId64 "." WAL_LOG_SUFFIX, pWal->path, fileFirstVer); +static inline void walBuildLogName(SWal* pWal, int64_t fileFirstVer, char* buf) { + sprintf(buf, "%s/%020" PRId64 "." WAL_LOG_SUFFIX, pWal->path, fileFirstVer); } -static inline int walBuildIdxName(SWal* pWal, int64_t fileFirstVer, char* buf) { - return sprintf(buf, "%s/%020" PRId64 "." WAL_INDEX_SUFFIX, pWal->path, fileFirstVer); +static inline void walBuildIdxName(SWal* pWal, int64_t fileFirstVer, char* buf) { + sprintf(buf, "%s/%020" PRId64 "." WAL_INDEX_SUFFIX, pWal->path, fileFirstVer); } static inline int walValidHeadCksum(SWalCkHead* pHead) { diff --git a/source/libs/wal/src/walMeta.c b/source/libs/wal/src/walMeta.c index c69046f707..e49a963191 100644 --- a/source/libs/wal/src/walMeta.c +++ b/source/libs/wal/src/walMeta.c @@ -35,8 +35,8 @@ int64_t FORCE_INLINE walGetCommittedVer(SWal* pWal) { return pWal->vers.commitVe int64_t FORCE_INLINE walGetAppliedVer(SWal* pWal) { return pWal->vers.appliedVer; } -static FORCE_INLINE int walBuildMetaName(SWal* pWal, int metaVer, char* buf) { - return sprintf(buf, "%s/meta-ver%d", pWal->path, metaVer); +static FORCE_INLINE void walBuildMetaName(SWal* pWal, int metaVer, char* buf) { + sprintf(buf, "%s/meta-ver%d", pWal->path, metaVer); } static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal) { @@ -150,17 +150,21 @@ int walCheckAndRepairMeta(SWal* pWal) { const char* idxPattern = "^[0-9]+.idx$"; regex_t logRegPattern; regex_t idxRegPattern; - SArray* actualLog = taosArrayInit(8, sizeof(SWalFileInfo)); + bool fixed = false; regcomp(&logRegPattern, logPattern, REG_EXTENDED); regcomp(&idxRegPattern, idxPattern, REG_EXTENDED); TdDirPtr pDir = taosOpenDir(pWal->path); if (pDir == NULL) { + regfree(&logRegPattern); + regfree(&idxRegPattern); wError("vgId:%d, path:%s, failed to open since %s", pWal->cfg.vgId, pWal->path, strerror(errno)); return -1; } + SArray* actualLog = taosArrayInit(8, sizeof(SWalFileInfo)); + // scan log files and build new meta TdDirEntryPtr pDirEntry; while ((pDirEntry = taosReadDir(pDir)) != NULL) { @@ -203,6 +207,77 @@ int walCheckAndRepairMeta(SWal* pWal) { actualFileNum = taosArrayGetSize(pLogInfoArray); #endif + { + int32_t i = 0, j = 0; + while (i < actualFileNum && j < metaFileNum) { + SWalFileInfo* pActualFile = taosArrayGet(actualLog, i); + SWalFileInfo* pMetaFile = taosArrayGet(pWal->fileInfoSet, j); + if (pActualFile->firstVer < pMetaFile->firstVer) { + char fNameStr[WAL_FILE_LEN]; + walBuildLogName(pWal, pActualFile->firstVer, fNameStr); + taosRemoveFile(fNameStr); + walBuildIdxName(pWal, pActualFile->firstVer, fNameStr); + taosRemoveFile(fNameStr); + i++; + } else if (pActualFile->firstVer > pMetaFile->firstVer) { + taosArrayRemove(pWal->fileInfoSet, j); + metaFileNum--; + } else { + i++; + j++; + } + } + if (i == actualFileNum && j == metaFileNum) { + if (j > 0) { + SWalFileInfo* pLastInfo = taosArrayGet(pWal->fileInfoSet, j - 1); + int64_t fsize = 0; + char fNameStr[WAL_FILE_LEN]; + walBuildLogName(pWal, pLastInfo->firstVer, fNameStr); + taosStatFile(fNameStr, &fsize, NULL); + if (pLastInfo->fileSize != fsize) { + fixed = true; + pLastInfo->fileSize = fsize; + pLastInfo->lastVer = walScanLogGetLastVer(pWal); + } + } + } else { + fixed = true; + while (i < actualFileNum) { + SWalFileInfo* pActualFile = taosArrayGet(actualLog, i); + char fNameStr[WAL_FILE_LEN]; + walBuildLogName(pWal, pActualFile->firstVer, fNameStr); + taosStatFile(fNameStr, &pActualFile->fileSize, NULL); + + if (pActualFile->fileSize == 0) { + ASSERT(i == actualFileNum - 1); + taosRemoveFile(fNameStr); + + walBuildIdxName(pWal, pActualFile->firstVer, fNameStr); + taosRemoveFile(fNameStr); + break; + } + + if (i < actualFileNum - 1) { + pActualFile->lastVer = ((SWalFileInfo*)taosArrayGet(actualLog, i + 1))->firstVer - 1; + taosArrayPush(pWal->fileInfoSet, pActualFile); + i++; + } else { + pActualFile = taosArrayPush(pWal->fileInfoSet, pActualFile); + pActualFile->lastVer = walScanLogGetLastVer(pWal); + if (pActualFile->lastVer == -1) { + taosRemoveFile(fNameStr); + + walBuildIdxName(pWal, pActualFile->firstVer, fNameStr); + taosRemoveFile(fNameStr); + taosArrayPop(pWal->fileInfoSet); + } + break; + } + } + } + } + +#if 0 if (metaFileNum > actualFileNum) { taosArrayPopFrontBatch(pWal->fileInfoSet, metaFileNum - actualFileNum); } else if (metaFileNum < actualFileNum) { @@ -211,30 +286,28 @@ int walCheckAndRepairMeta(SWal* pWal) { taosArrayPush(pWal->fileInfoSet, pFileInfo); } } +#endif + taosArrayDestroy(actualLog); + actualFileNum = taosArrayGetSize(pWal->fileInfoSet); pWal->writeCur = actualFileNum - 1; + if (actualFileNum > 0) { - pWal->vers.firstVer = ((SWalFileInfo*)taosArrayGet(pWal->fileInfoSet, 0))->firstVer; - - SWalFileInfo* pLastFileInfo = taosArrayGet(pWal->fileInfoSet, actualFileNum - 1); - char fnameStr[WAL_FILE_LEN]; - walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr); - int64_t fileSize = 0; - taosStatFile(fnameStr, &fileSize, NULL); - /*ASSERT(fileSize != 0);*/ - - if (metaFileNum != actualFileNum || pLastFileInfo->fileSize != fileSize) { - pLastFileInfo->fileSize = fileSize; - pWal->vers.lastVer = walScanLogGetLastVer(pWal); - ((SWalFileInfo*)taosArrayGetLast(pWal->fileInfoSet))->lastVer = pWal->vers.lastVer; - ASSERT(pWal->vers.lastVer != -1); - - int code = walSaveMeta(pWal); - if (code < 0) { - return -1; - } + int64_t fLastVer = ((SWalFileInfo*)taosArrayGet(pWal->fileInfoSet, pWal->writeCur))->lastVer; + if (fLastVer != -1 && pWal->vers.lastVer != fLastVer) { + fixed = true; + pWal->vers.lastVer = fLastVer; } + int64_t fFirstVer = ((SWalFileInfo*)taosArrayGet(pWal->fileInfoSet, 0))->firstVer; + if (fFirstVer != pWal->vers.firstVer) { + fixed = true; + pWal->vers.firstVer = fFirstVer; + } + } + + if (fixed) { + walSaveMeta(pWal); } return 0; @@ -304,7 +377,12 @@ int walCheckAndRepairIdx(SWal* pWal) { return -1; } while (idxEntry.ver < pFileInfo->lastVer) { - taosLSeekFile(pLogFile, idxEntry.offset, SEEK_SET); + if (taosLSeekFile(pLogFile, idxEntry.offset, SEEK_SET) == -1) { + terrno = TAOS_SYSTEM_ERROR(errno); + wError("vgId:%d, cannot seek file %s at %ld, since %s", pWal->cfg.vgId, fLogNameStr, idxEntry.offset, + terrstr()); + return -1; + } SWalCkHead ckHead; taosReadFile(pLogFile, &ckHead, sizeof(SWalCkHead)); if (idxEntry.ver != ckHead.head.version) { @@ -485,18 +563,21 @@ int walSaveMeta(SWal* pWal) { int metaVer = walFindCurMetaVer(pWal); char fnameStr[WAL_FILE_LEN]; walBuildMetaName(pWal, metaVer + 1, fnameStr); - TdFilePtr pMataFile = taosOpenFile(fnameStr, TD_FILE_CREATE | TD_FILE_WRITE); - if (pMataFile == NULL) { + TdFilePtr pMetaFile = taosOpenFile(fnameStr, TD_FILE_CREATE | TD_FILE_WRITE); + if (pMetaFile == NULL) { return -1; } char* serialized = walMetaSerialize(pWal); int len = strlen(serialized); - if (len != taosWriteFile(pMataFile, serialized, len)) { + if (len != taosWriteFile(pMetaFile, serialized, len)) { // TODO:clean file + + taosCloseFile(&pMetaFile); + taosRemoveFile(fnameStr); return -1; } - taosCloseFile(&pMataFile); + taosCloseFile(&pMetaFile); // delete old file if (metaVer > -1) { walBuildMetaName(pWal, metaVer, fnameStr); @@ -519,6 +600,11 @@ int walLoadMeta(SWal* pWal) { // read metafile int64_t fileSize = 0; taosStatFile(fnameStr, &fileSize, NULL); + if (fileSize == 0) { + taosRemoveFile(fnameStr); + wDebug("vgId:%d wal find empty meta ver %d", pWal->cfg.vgId, metaVer); + return -1; + } int size = (int)fileSize; char* buf = taosMemoryMalloc(size + 5); if (buf == NULL) { @@ -529,6 +615,7 @@ int walLoadMeta(SWal* pWal) { TdFilePtr pFile = taosOpenFile(fnameStr, TD_FILE_READ); if (pFile == NULL) { terrno = TSDB_CODE_WAL_FILE_CORRUPTED; + taosMemoryFree(buf); return -1; } if (taosReadFile(pFile, buf, size) != size) { diff --git a/source/libs/wal/src/walMgmt.c b/source/libs/wal/src/walMgmt.c index a55f00d277..7974f3e32e 100644 --- a/source/libs/wal/src/walMgmt.c +++ b/source/libs/wal/src/walMgmt.c @@ -98,6 +98,7 @@ SWal *walOpen(const char *path, SWalCfg *pCfg) { tstrncpy(pWal->path, path, sizeof(pWal->path)); if (taosMkDir(pWal->path) != 0) { wError("vgId:%d, path:%s, failed to create directory since %s", pWal->cfg.vgId, pWal->path, strerror(errno)); + taosMemoryFree(pWal); return NULL; } diff --git a/source/libs/wal/src/walRead.c b/source/libs/wal/src/walRead.c index 5c437e6f7a..c4f1a81eeb 100644 --- a/source/libs/wal/src/walRead.c +++ b/source/libs/wal/src/walRead.c @@ -279,7 +279,7 @@ static int32_t walFetchBodyNew(SWalReader *pRead) { terrno = TSDB_CODE_WAL_OUT_OF_MEMORY; return -1; } - pRead->pHead = ptr; + pRead->pHead = (SWalCkHead *)ptr; pReadHead = &pRead->pHead->head; pRead->capacity = pReadHead->bodyLen; } @@ -399,7 +399,7 @@ int32_t walFetchBody(SWalReader *pRead, SWalCkHead **ppHead) { terrno = TSDB_CODE_WAL_OUT_OF_MEMORY; return -1; } - *ppHead = ptr; + *ppHead = (SWalCkHead *)ptr; pReadHead = &((*ppHead)->head); pRead->capacity = pReadHead->bodyLen; } @@ -494,7 +494,7 @@ int32_t walReadVer(SWalReader *pReader, int64_t ver) { taosThreadMutexUnlock(&pReader->mutex); return -1; } - pReader->pHead = ptr; + pReader->pHead = (SWalCkHead *)ptr; pReader->capacity = pReader->pHead->head.bodyLen; } @@ -504,7 +504,6 @@ int32_t walReadVer(SWalReader *pReader, int64_t ver) { terrno = TAOS_SYSTEM_ERROR(errno); else { terrno = TSDB_CODE_WAL_FILE_CORRUPTED; - ASSERT(0); } taosThreadMutexUnlock(&pReader->mutex); return -1; diff --git a/source/libs/wal/src/walRef.c b/source/libs/wal/src/walRef.c index 2b29012040..2c45fbbdaf 100644 --- a/source/libs/wal/src/walRef.c +++ b/source/libs/wal/src/walRef.c @@ -33,7 +33,9 @@ SWalRef *walOpenRef(SWal *pWal) { } void walCloseRef(SWal *pWal, int64_t refId) { - SWalRef *pRef = *(SWalRef **)taosHashGet(pWal->pRefHash, &refId, sizeof(int64_t)); + SWalRef **ppRef = taosHashGet(pWal->pRefHash, &refId, sizeof(int64_t)); + if (ppRef == NULL) return; + SWalRef *pRef = *ppRef; taosHashRemove(pWal->pRefHash, &refId, sizeof(int64_t)); taosMemoryFree(pRef); } diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c index fad3977a21..628b432446 100644 --- a/source/libs/wal/src/walWrite.c +++ b/source/libs/wal/src/walWrite.c @@ -28,6 +28,7 @@ int32_t walRestoreFromSnapshot(SWal *pWal, int64_t ver) { SWalRef *pRef = (SWalRef *)pIter; if (pRef->refVer != -1 && pRef->refVer <= ver) { taosHashCancelIterate(pWal->pRefHash, pIter); + taosThreadMutexUnlock(&pWal->mutex); return -1; } } diff --git a/source/os/CMakeLists.txt b/source/os/CMakeLists.txt index 2a9d0c8535..b7cb20896b 100644 --- a/source/os/CMakeLists.txt +++ b/source/os/CMakeLists.txt @@ -52,3 +52,7 @@ else() os PUBLIC dl m rt ) endif() + +IF (JEMALLOC_ENABLED) + target_link_libraries(os PUBLIC -ljemalloc) +ENDIF () \ No newline at end of file diff --git a/source/os/src/osSocket.c b/source/os/src/osSocket.c index c1e02b48aa..bfeef248cd 100644 --- a/source/os/src/osSocket.c +++ b/source/os/src/osSocket.c @@ -267,21 +267,29 @@ int32_t taosSetSockOpt(TdSocketPtr pSocket, int32_t level, int32_t optname, void return -1; } #ifdef WINDOWS +#ifdef TCP_KEEPCNT if (level == SOL_SOCKET && optname == TCP_KEEPCNT) { return 0; } +#endif +#ifdef TCP_KEEPIDLE if (level == SOL_TCP && optname == TCP_KEEPIDLE) { return 0; } +#endif +#ifdef TCP_KEEPINTVL if (level == SOL_TCP && optname == TCP_KEEPINTVL) { return 0; } +#endif +#ifdef TCP_KEEPCNT if (level == SOL_TCP && optname == TCP_KEEPCNT) { return 0; } +#endif return setsockopt(pSocket->fd, level, optname, optval, optlen); #else @@ -601,26 +609,32 @@ int32_t taosKeepTcpAlive(TdSocketPtr pSocket) { #ifndef __APPLE__ // all fails on macosx +#ifdef TCP_KEEPCNT int32_t probes = 3; if (taosSetSockOpt(pSocket, SOL_TCP, TCP_KEEPCNT, (void *)&probes, sizeof(probes)) < 0) { // printf("fd:%d setsockopt SO_KEEPCNT failed: %d (%s)", sockFd, errno, strerror(errno)); taosCloseSocket(&pSocket); return -1; } +#endif +#ifdef TCP_KEEPIDLE int32_t alivetime = 10; if (taosSetSockOpt(pSocket, SOL_TCP, TCP_KEEPIDLE, (void *)&alivetime, sizeof(alivetime)) < 0) { // printf("fd:%d setsockopt SO_KEEPIDLE failed: %d (%s)", sockFd, errno, strerror(errno)); taosCloseSocket(&pSocket); return -1; } +#endif +#ifdef TCP_KEEPINTVL int32_t interval = 3; if (taosSetSockOpt(pSocket, SOL_TCP, TCP_KEEPINTVL, (void *)&interval, sizeof(interval)) < 0) { // printf("fd:%d setsockopt SO_KEEPINTVL failed: %d (%s)", sockFd, errno, strerror(errno)); taosCloseSocket(&pSocket); return -1; } +#endif #endif // __APPLE__ int32_t nodelay = 1; diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index a57bd4ee63..f5f02676af 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -154,8 +154,8 @@ static int32_t taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { return -1; } - char *line = NULL; - ssize_t _bytes = taosGetLineFile(pFile, &line); + char line[1024]; + ssize_t _bytes = taosGetsFile(pFile, sizeof(line), line); if ((_bytes < 0) || (line == NULL)) { taosCloseFile(&pFile); return -1; @@ -165,7 +165,6 @@ static int32_t taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { sscanf(line, "%s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, cpu, &cpuInfo->user, &cpuInfo->nice, &cpuInfo->system, &cpuInfo->idle); - if (line != NULL) taosMemoryFreeClear(line); taosCloseFile(&pFile); #endif return 0; @@ -194,8 +193,8 @@ static int32_t taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { return -1; } - char *line = NULL; - ssize_t _bytes = taosGetLineFile(pFile, &line); + char line[1024]; + ssize_t _bytes = taosGetsFile(pFile, sizeof(line), line); if ((_bytes < 0) || (line == NULL)) { taosCloseFile(&pFile); return -1; @@ -210,7 +209,6 @@ static int32_t taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { } } - if (line != NULL) taosMemoryFreeClear(line); taosCloseFile(&pFile); #endif return 0; @@ -286,14 +284,14 @@ int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen) { snprintf(releaseName, maxLen, "Windows"); return 0; #elif defined(_TD_DARWIN_64) - char *line = NULL; + char line[1024]; size_t size = 0; int32_t code = -1; TdFilePtr pFile = taosOpenFile("/etc/os-release", TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) return false; - while ((size = taosGetLineFile(pFile, &line)) != -1) { + while ((size = taosGetsFile(pFile, sizeof(line), line)) != -1) { line[size - 1] = '\0'; if (strncmp(line, "PRETTY_NAME", 11) == 0) { const char *p = strchr(line, '=') + 1; @@ -307,18 +305,17 @@ int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen) { } } - if (line != NULL) taosMemoryFree(line); taosCloseFile(&pFile); return code; #else - char *line = NULL; + char line[1024]; size_t size = 0; int32_t code = -1; TdFilePtr pFile = taosOpenFile("/etc/os-release", TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) return false; - while ((size = taosGetLineFile(pFile, &line)) != -1) { + while ((size = taosGetsFile(pFile, sizeof(line), line)) != -1) { line[size - 1] = '\0'; if (strncmp(line, "PRETTY_NAME", 11) == 0) { const char *p = strchr(line, '=') + 1; @@ -332,7 +329,6 @@ int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen) { } } - if (line != NULL) taosMemoryFree(line); taosCloseFile(&pFile); return code; #endif @@ -374,7 +370,7 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) { return code; #else - char *line = NULL; + char line[1024]; size_t size = 0; int32_t done = 0; int32_t code = -1; @@ -383,7 +379,7 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) { TdFilePtr pFile = taosOpenFile("/proc/cpuinfo", TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) return code; - while (done != 3 && (size = taosGetLineFile(pFile, &line)) != -1) { + while (done != 3 && (size = taosGetsFile(pFile, sizeof(line), line)) != -1) { line[size - 1] = '\0'; if (((done & 1) == 0) && strncmp(line, "model name", 10) == 0) { const char *v = strchr(line, ':') + 2; @@ -398,7 +394,6 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) { if (strncmp(line, "processor", 9) == 0) coreCount += 1; } - if (line != NULL) taosMemoryFree(line); taosCloseFile(&pFile); if (code != 0 && (done & 1) == 0) { @@ -517,9 +512,9 @@ int32_t taosGetProcMemory(int64_t *usedKB) { } ssize_t _bytes = 0; - char *line = NULL; + char line[1024]; while (!taosEOFFile(pFile)) { - _bytes = taosGetLineFile(pFile, &line); + _bytes = taosGetsFile(pFile, sizeof(line), line); if ((_bytes < 0) || (line == NULL)) { break; } @@ -537,7 +532,6 @@ int32_t taosGetProcMemory(int64_t *usedKB) { char tmp[10]; sscanf(line, "%s %" PRId64, tmp, usedKB); - if (line != NULL) taosMemoryFreeClear(line); taosCloseFile(&pFile); return 0; #endif @@ -631,12 +625,12 @@ int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int if (pFile == NULL) return -1; ssize_t _bytes = 0; - char *line = NULL; + char line[1024]; char tmp[24]; int readIndex = 0; while (!taosEOFFile(pFile)) { - _bytes = taosGetLineFile(pFile, &line); + _bytes = taosGetsFile(pFile, sizeof(line), line); if (_bytes < 10 || line == NULL) { break; } @@ -658,7 +652,6 @@ int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int if (readIndex >= 4) break; } - if (line != NULL) taosMemoryFreeClear(line); taosCloseFile(&pFile); if (readIndex < 4) { @@ -709,7 +702,7 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) { if (pFile == NULL) return -1; ssize_t _bytes = 0; - char *line = NULL; + char line[1024]; while (!taosEOFFile(pFile)) { int64_t o_rbytes = 0; @@ -724,7 +717,7 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) { int64_t nouse6 = 0; char nouse0[200] = {0}; - _bytes = taosGetLineFile(pFile, &line); + _bytes = taosGetsFile(pFile, sizeof(line), line); if (_bytes < 0) { break; } @@ -743,7 +736,6 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) { *transmit_bytes = o_tbytes; } - if (line != NULL) taosMemoryFreeClear(line); taosCloseFile(&pFile); return 0; diff --git a/source/os/src/osTime.c b/source/os/src/osTime.c index 3c81ba3d9f..58a09565f9 100644 --- a/source/os/src/osTime.c +++ b/source/os/src/osTime.c @@ -359,15 +359,15 @@ time_t taosTime(time_t *t) { return time(t); } time_t taosMktime(struct tm *timep) { #ifdef WINDOWS - struct tm tm1 = {0}; - LARGE_INTEGER t; - FILETIME f; - SYSTEMTIME s; - FILETIME ff; - SYSTEMTIME ss; - LARGE_INTEGER offset; + struct tm tm1 = {0}; + LARGE_INTEGER t; + FILETIME f; + SYSTEMTIME s; + FILETIME ff; + SYSTEMTIME ss; + LARGE_INTEGER offset; - time_t tt = 0; + time_t tt = 0; localtime_s(&tm1, &tt); ss.wYear = tm1.tm_year + 1900; ss.wMonth = tm1.tm_mon + 1; @@ -394,11 +394,11 @@ time_t taosMktime(struct tm *timep) { t.QuadPart |= f.dwLowDateTime; t.QuadPart -= offset.QuadPart; - return (time_t)(t.QuadPart / 10000000); + return (time_t)(t.QuadPart / 10000000); #else return mktime(timep); #endif - } +} struct tm *taosLocalTime(const time_t *timep, struct tm *result) { if (result == NULL) { @@ -406,8 +406,8 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result) { } #ifdef WINDOWS if (*timep < 0) { - SYSTEMTIME ss,s; - FILETIME ff,f; + SYSTEMTIME ss, s; + FILETIME ff, f; LARGE_INTEGER offset; struct tm tm1; time_t tt = 0; @@ -431,8 +431,8 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result) { result->tm_min = s.wMinute; result->tm_hour = s.wHour; result->tm_mday = s.wDay; - result->tm_mon = s.wMonth-1; - result->tm_year = s.wYear-1900; + result->tm_mon = s.wMonth - 1; + result->tm_year = s.wYear - 1900; result->tm_wday = s.wDayOfWeek; result->tm_yday = 0; result->tm_isdst = 0; @@ -445,6 +445,103 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result) { return result; } +static int isLeapYear(time_t year) { + if (year % 4) + return 0; + else if (year % 100) + return 1; + else if (year % 400) + return 0; + else + return 1; +} +struct tm *taosLocalTimeNolock(struct tm *result, const time_t *timep, int dst) { + if (result == NULL) { + return localtime(timep); + } +#ifdef WINDOWS + if (*timep < 0) { + SYSTEMTIME ss, s; + FILETIME ff, f; + LARGE_INTEGER offset; + struct tm tm1; + time_t tt = 0; + localtime_s(&tm1, &tt); + ss.wYear = tm1.tm_year + 1900; + ss.wMonth = tm1.tm_mon + 1; + ss.wDay = tm1.tm_mday; + ss.wHour = tm1.tm_hour; + ss.wMinute = tm1.tm_min; + ss.wSecond = tm1.tm_sec; + ss.wMilliseconds = 0; + SystemTimeToFileTime(&ss, &ff); + offset.QuadPart = ff.dwHighDateTime; + offset.QuadPart <<= 32; + offset.QuadPart |= ff.dwLowDateTime; + offset.QuadPart += *timep * 10000000; + f.dwLowDateTime = offset.QuadPart & 0xffffffff; + f.dwHighDateTime = (offset.QuadPart >> 32) & 0xffffffff; + FileTimeToSystemTime(&f, &s); + result->tm_sec = s.wSecond; + result->tm_min = s.wMinute; + result->tm_hour = s.wHour; + result->tm_mday = s.wDay; + result->tm_mon = s.wMonth - 1; + result->tm_year = s.wYear - 1900; + result->tm_wday = s.wDayOfWeek; + result->tm_yday = 0; + result->tm_isdst = 0; + } else { + localtime_s(result, timep); + } +#elif defined(LINUX) + time_t secsMin = 60, secsHour = 3600, secsDay = 3600 * 24; + long tz = timezone; + + time_t t = *timep; + t -= tz; /* Adjust for timezone. */ + t += 3600 * dst; /* Adjust for daylight time. */ + time_t days = t / secsDay; /* Days passed since epoch. */ + time_t seconds = t % secsDay; /* Remaining seconds. */ + + result->tm_isdst = dst; + result->tm_hour = seconds / secsHour; + result->tm_min = (seconds % secsHour) / secsMin; + result->tm_sec = (seconds % secsHour) % secsMin; + + /* 1/1/1970 was a Thursday, that is, day 4 from the POV of the tm structure + * where sunday = 0, so to calculate the day of the week we have to add 4 + * and take the modulo by 7. */ + result->tm_wday = (days + 4) % 7; + + /* Calculate the current year. */ + result->tm_year = 1970; + while (1) { + /* Leap years have one day more. */ + time_t daysOfYear = 365 + isLeapYear(result->tm_year); + if (daysOfYear > days) break; + days -= daysOfYear; + result->tm_year++; + } + result->tm_yday = days; /* Number of day of the current year. */ + /* We need to calculate in which month and day of the month we are. To do + * so we need to skip days according to how many days there are in each + * month, and adjust for the leap year that has one more day in February. */ + int mdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + mdays[1] += isLeapYear(result->tm_year); + result->tm_mon = 0; + while (days >= mdays[result->tm_mon]) { + days -= mdays[result->tm_mon]; + result->tm_mon++; + } + + result->tm_mday = days + 1; /* Add 1 since our 'days' is zero-based. */ + result->tm_year -= 1900; /* Surprisingly tm_year is year-1900. */ +#else + localtime_r(timep, result); +#endif + return result; +} int32_t taosGetTimestampSec() { return (int32_t)time(NULL); } int32_t taosClockGetTime(int clock_id, struct timespec *pTS) { #ifdef WINDOWS @@ -473,9 +570,9 @@ int32_t taosClockGetTime(int clock_id, struct timespec *pTS) { t.QuadPart -= offset.QuadPart; pTS->tv_sec = t.QuadPart / 10000000; - pTS->tv_nsec = (t.QuadPart % 10000000)*100; + pTS->tv_nsec = (t.QuadPart % 10000000) * 100; return (0); #else return clock_gettime(clock_id, pTS); #endif -} \ No newline at end of file +} diff --git a/source/util/src/tconfig.c b/source/util/src/tconfig.c index 2a28ec66d2..58f90b68c9 100644 --- a/source/util/src/tconfig.c +++ b/source/util/src/tconfig.c @@ -714,7 +714,7 @@ int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd) { } int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) { - char *line = NULL, *name, *value, *value2, *value3; + char line[1024], *name, *value, *value2, *value3; int32_t olen, vlen, vlen2, vlen3; int32_t code = 0; ssize_t _bytes = 0; @@ -743,7 +743,7 @@ int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) { name = value = value2 = value3 = NULL; olen = vlen = vlen2 = vlen3 = 0; - _bytes = taosGetLineFile(pFile, &line); + _bytes = taosGetsFile(pFile, sizeof(line), line); if (_bytes <= 0) { break; } @@ -775,14 +775,13 @@ int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) { } taosCloseFile(&pFile); - if (line != NULL) taosMemoryFreeClear(line); uInfo("load from env cfg file %s success", filepath); return 0; } int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) { - char *line = NULL, *name, *value, *value2, *value3; + char line[1024], *name, *value, *value2, *value3; int32_t olen, vlen, vlen2, vlen3; ssize_t _bytes = 0; int32_t code = 0; @@ -804,7 +803,7 @@ int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) { name = value = value2 = value3 = NULL; olen = vlen = vlen2 = vlen3 = 0; - _bytes = taosGetLineFile(pFile, &line); + _bytes = taosGetsFile(pFile, sizeof(line), line); if (_bytes <= 0) { break; } @@ -836,7 +835,6 @@ int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) { } taosCloseFile(&pFile); - if (line != NULL) taosMemoryFreeClear(line); if (code == 0 || (code != 0 && terrno == TSDB_CODE_CFG_NOT_FOUND)) { uInfo("load from cfg file %s success", filepath); diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 1906a77127..eb13a08be4 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -633,6 +633,10 @@ TAOS_DEFINE_ERROR(TSDB_CODE_TMQ_INVALID_MSG, "Invalid message") TAOS_DEFINE_ERROR(TSDB_CODE_TMQ_CONSUMER_MISMATCH, "Consumer mismatch") TAOS_DEFINE_ERROR(TSDB_CODE_TMQ_CONSUMER_CLOSED, "Consumer closed") +// TDLite +TAOS_DEFINE_ERROR(TSDB_CODE_TDLITE_IVLD_OPEN_FLAGS, "Invalid TDLite open flags") +TAOS_DEFINE_ERROR(TSDB_CODE_TDLITE_IVLD_OPEN_DIR, "Invalid TDLite open directory") + #ifdef TAOS_ERROR_C }; #endif diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 46203658f1..2e2300ba14 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -68,6 +68,7 @@ static int8_t tsLogInited = 0; static SLogObj tsLogObj = {.fileNum = 1}; static int64_t tsAsyncLogLostLines = 0; static int32_t tsWriteInterval = LOG_DEFAULT_INTERVAL; +static int32_t tsDaylightActive; /* Currently in daylight saving time. */ bool tsLogEmbedded = 0; bool tsAsyncLog = true; @@ -113,6 +114,16 @@ static void taosCloseLogByFd(TdFilePtr pFile); static int32_t taosOpenLogFile(char *fn, int32_t maxLines, int32_t maxFileNum); static int32_t taosCompressFile(char *srcFileName, char *destFileName); +static FORCE_INLINE void taosUpdateDaylight() { + struct tm Tm, *ptm; + struct timeval timeSecs; + taosGetTimeOfDay(&timeSecs); + time_t curTime = timeSecs.tv_sec; + ptm = taosLocalTime(&curTime, &Tm); + tsDaylightActive = ptm->tm_isdst; +} +static FORCE_INLINE int32_t taosGetDaylight() { return tsDaylightActive; } + static int32_t taosStartLog() { TdThreadAttr threadAttr; taosThreadAttrInit(&threadAttr); @@ -133,6 +144,7 @@ int32_t taosInitLog(const char *logName, int32_t maxFiles) { } else { snprintf(fullName, PATH_MAX, "%s", logName); } + taosUpdateDaylight(); tsLogObj.logHandle = taosLogBuffNew(LOG_DEFAULT_BUF_SIZE); if (tsLogObj.logHandle == NULL) return -1; @@ -422,7 +434,7 @@ static inline int32_t taosBuildLogHead(char *buffer, const char *flags) { taosGetTimeOfDay(&timeSecs); time_t curTime = timeSecs.tv_sec; - ptm = taosLocalTime(&curTime, &Tm); + ptm = taosLocalTimeNolock(&Tm, &curTime, taosGetDaylight()); return sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d %08" PRId64 " %s", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId(), flags); @@ -694,8 +706,10 @@ static void *taosAsyncOutputLog(void *param) { SLogBuff *pLogBuf = (SLogBuff *)param; setThreadName("log"); int32_t count = 0; + int32_t updateCron = 0; while (1) { count += tsWriteInterval; + updateCron++; taosMsleep(tsWriteInterval); if (count > 1000) { osUpdate(); @@ -705,6 +719,11 @@ static void *taosAsyncOutputLog(void *param) { // Polling the buffer taosWriteLog(pLogBuf); + if (updateCron >= 3600 * 24 * 40 / 2) { + taosUpdateDaylight(); + updateCron = 0; + } + if (pLogBuf->stop) break; } diff --git a/source/util/src/tuuid.c b/source/util/src/tuuid.c index 8652652024..9d749cc002 100644 --- a/source/util/src/tuuid.c +++ b/source/util/src/tuuid.c @@ -22,6 +22,8 @@ int32_t tGenIdPI32(void) { if (tUUIDHashId == 0) { char uid[65] = {0}; int32_t code = taosGetSystemUUID(uid, sizeof(uid)); + uid[64] = 0; + if (code != TSDB_CODE_SUCCESS) { terrno = TAOS_SYSTEM_ERROR(errno); } else { diff --git a/tests/script/tsim/stream/basic1.sim b/tests/script/tsim/stream/basic1.sim index 8942f7f702..b20e2e3592 100644 --- a/tests/script/tsim/stream/basic1.sim +++ b/tests/script/tsim/stream/basic1.sim @@ -622,4 +622,56 @@ if $data12 != 2 then goto loop3 endi + +sql create database test4 vgroups 1; +sql use test4; +sql create table t1(ts timestamp, a int, b int , c int, d double); +sql create stream streams4 trigger at_once into streamt4 as select _wstart, count(*) c1 from t1 where a > 5 interval(10s); +sql insert into t1 values(1648791213000,1,2,3,1.0); + +sleep 200 +sql select * from streamt4; + +# row 0 +if $rows != 0 then + print =====rows=$rows + return -1 +endi + +sql insert into t1 values(1648791213000,6,2,3,1.0); + +$loop_count = 0 +loop4: +sleep 200 +sql select * from streamt4; + +$loop_count = $loop_count + 1 +if $loop_count == 10 then + return -1 +endi + +if $data01 != 1 then + print =====data01=$data01 + goto loop4 +endi + +sql insert into t1 values(1648791213000,2,2,3,1.0); + +$loop_count = 0 +loop5: +sleep 200 +sql select * from streamt4; + +$loop_count = $loop_count + 1 +if $loop_count == 10 then + return -1 +endi + +if $rows != 0 then + print =====rows=$rows + goto loop5 +endi + + + system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/tsim/stream/partitionbyColumnInterval.sim b/tests/script/tsim/stream/partitionbyColumnInterval.sim index fd1d796fdb..8375df5064 100644 --- a/tests/script/tsim/stream/partitionbyColumnInterval.sim +++ b/tests/script/tsim/stream/partitionbyColumnInterval.sim @@ -587,8 +587,6 @@ sleep 300 sql delete from st where ts = 1648791223000; -sql select * from test.streamt5; - $loop_count = 0 loop15: @@ -604,11 +602,10 @@ if $rows != 4 then print =====rows=$rows print =====rows=$rows print =====rows=$rows -# goto loop15 + #goto loop15 endi - $loop_all = $loop_all + 1 print ============loop_all=$loop_all diff --git a/tests/script/tsim/stream/sliding.sim b/tests/script/tsim/stream/sliding.sim index b7477fe36c..49e22db1b1 100644 --- a/tests/script/tsim/stream/sliding.sim +++ b/tests/script/tsim/stream/sliding.sim @@ -5,15 +5,15 @@ sleep 50 sql connect print =============== create database -sql create database test vgroups 1 -sql select * from information_schema.ins_databases +sql create database test vgroups 1; +sql select * from information_schema.ins_databases; if $rows != 3 then return -1 endi print $data00 $data01 $data02 -sql use test +sql use test; sql create stable st(ts timestamp, a int, b int, c int, d double) tags(ta int,tb int,tc int); sql create table t1 using st tags(1,1,1); sql create table t2 using st tags(2,2,2); @@ -48,8 +48,9 @@ if $loop_count == 10 then return -1 endi +print step 0 -sql select * from streamt +sql select * from streamt; # row 0 if $data01 != 1 then @@ -97,7 +98,7 @@ endi print step 1 -sql select * from streamt2 +sql select * from streamt2; # row 0 if $data01 != 1 then @@ -239,6 +240,67 @@ if $data32 != 6 then goto loop0 endi +print step 3.1 + +sql insert into t1 values(1648791216001,2,2,3,1.1); + +$loop_count = 0 + +loop00: +sleep 300 + +$loop_count = $loop_count + 1 +if $loop_count == 10 then + return -1 +endi + +sql select * from streamt2; + +# row 0 +if $data01 != 1 then + print =====data01=$data01 + goto loop00 +endi + +if $data02 != 1 then + print =====data02=$data02 + goto loop00 +endi + +# row 1 +if $data11 != 3 then + print =====data11=$data11 + goto loop00 +endi + +if $data12 != 5 then + print =====data12=$data12 + goto loop00 +endi + +# row 2 +if $data21 != 3 then + print =====data21=$data21 + goto loop00 +endi + +if $data22 != 7 then + print =====data22=$data22 + goto loop00 +endi + +# row 3 +if $data31 != 1 then + print =====data31=$data31 + goto loop00 +endi + +if $data32 != 3 then + print =====data32=$data32 + goto loop00 +endi + + print step 4 sql create database test1 vgroups 1 @@ -513,6 +575,8 @@ endi $loop_count = 0 +print step 7 + loop4: sleep 100 diff --git a/tests/system-test/0-others/show.py b/tests/system-test/0-others/show.py new file mode 100644 index 0000000000..673e795297 --- /dev/null +++ b/tests/system-test/0-others/show.py @@ -0,0 +1,60 @@ +################################################################### +# 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.log import * +from util.cases import * +from util.sql import * +import subprocess +from util.common import * + + +class TDTestCase: + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor()) + self.dbname = 'db' + self.ins_param_list = ['dnodes','mnodes','qnodes','cluster','functions','users','grants','topics','subscriptions','streams'] + self.perf_param = ['apps','connections','consumers','queries','transactions'] + self.perf_param_list = ['apps','connections','consumers','queries','trans'] + + def ins_check(self): + for param in self.ins_param_list: + tdSql.query(f'show {param}') + show_result = tdSql.queryResult + tdSql.query(f'select * from information_schema.ins_{param}') + select_result = tdSql.queryResult + tdSql.checkEqual(show_result,select_result) + + def perf_check(self): + for param in range(len(self.perf_param_list)): + tdSql.query(f'show {self.perf_param[param]}') + if len(tdSql.queryResult) != 0: + show_result = tdSql.queryResult[0][0] + tdSql.query(f'select * from performance_schema.perf_{self.perf_param_list[param]}') + select_result = tdSql.queryResult[0][0] + tdSql.checkEqual(show_result,select_result) + else : + continue + def run(self): + tdSql.prepare() + self.ins_check() + self.perf_check() + + + 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/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py index 371d147efc..9a94632a12 100644 --- a/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py +++ b/tests/system-test/6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateStb.py @@ -132,7 +132,7 @@ class TDTestCase: tdSql.error("create mnode on dnode 2") tdSql.query("select * from information_schema.ins_dnodes;") print(tdSql.queryResult) - clusterComCheck.checkDnodes(dnodeNumbers) + clusterComCheck.checkDnodes(dnodeNumbers, 60) # create database and stable clusterComCreate.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], paraDict["vgroups"],paraDict['replica']) diff --git a/tests/system-test/6-cluster/clusterCommonCheck.py b/tests/system-test/6-cluster/clusterCommonCheck.py index c37e3541d4..28c4810833 100644 --- a/tests/system-test/6-cluster/clusterCommonCheck.py +++ b/tests/system-test/6-cluster/clusterCommonCheck.py @@ -37,10 +37,10 @@ class ClusterComCheck: tdSql.init(conn.cursor()) # tdSql.init(conn.cursor(), logSql) # output sql.txt file - def checkDnodes(self,dnodeNumbers): + def checkDnodes(self,dnodeNumbers, timeout=30): count=0 # print(tdSql) - while count < 30: + while count < timeout: tdSql.query("select * from information_schema.ins_dnodes") # tdLog.debug(tdSql.queryResult) status=0 @@ -50,14 +50,14 @@ class ClusterComCheck: tdLog.info(status) if status == dnodeNumbers: - tdLog.success("it find cluster with %d dnodes and check that all cluster dnodes are ready within 30s! " %dnodeNumbers) + tdLog.success("it find cluster with %d dnodes and check that all cluster dnodes are ready within %ds! " % (dnodeNumbers, count)) return True count+=1 time.sleep(1) else: tdSql.query("select * from information_schema.ins_dnodes") tdLog.debug(tdSql.queryResult) - tdLog.exit("it find cluster with %d dnodes but check that there dnodes are not ready within 30s ! "%dnodeNumbers) + tdLog.exit("it find cluster with %d dnodes but check that there dnodes are not ready within %ds ! "% (dnodeNumbers, timeout)) def checkDbRows(self,dbNumbers): dbNumbers=int(dbNumbers) diff --git a/tests/system-test/fulltest.sh b/tests/system-test/fulltest.sh index a2bf935ebb..1c6aef6286 100755 --- a/tests/system-test/fulltest.sh +++ b/tests/system-test/fulltest.sh @@ -37,7 +37,7 @@ python3 ./test.py -f 1-insert/table_param_ttl.py -R python3 ./test.py -f 1-insert/update_data_muti_rows.py python3 ./test.py -f 1-insert/db_tb_name_check.py python3 ./test.py -f 1-insert/database_pre_suf.py - +python3 ./test.py -f 0-others/show.py python3 ./test.py -f 2-query/abs.py python3 ./test.py -f 2-query/abs.py -R python3 ./test.py -f 2-query/and_or_for_byte.py @@ -232,7 +232,7 @@ python3 ./test.py -f 6-cluster/5dnode2mnode.py -N 5 -M 3 python3 ./test.py -f 6-cluster/5dnode3mnodeStop.py -N 5 -M 3 python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3 python3 ./test.py -f 6-cluster/5dnode3mnodeStopLoop.py -N 5 -M 3 -python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py -N 5 -M 3 +# unstable python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopDnodeCreateDb.py -N 5 -M 3 python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDb.py -N 5 -M 3 python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopVnodeCreateDb.py -N 5 -M 3 python3 ./test.py -f 6-cluster/5dnode3mnodeSep1VnodeStopMnodeCreateDbRep3.py -N 5 -M 3 diff --git a/tools/shell/CMakeLists.txt b/tools/shell/CMakeLists.txt index 45a6f8c16f..552b77e6e9 100644 --- a/tools/shell/CMakeLists.txt +++ b/tools/shell/CMakeLists.txt @@ -28,7 +28,4 @@ target_include_directories( PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc" ) -IF (TD_LINUX_64 AND JEMALLOC_ENABLED) - add_dependencies(taosd jemalloc) -ENDIF () SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME taos) diff --git a/tools/shell/inc/shellAuto.h b/tools/shell/inc/shellAuto.h index 2cfab41f26..f86090d618 100644 --- a/tools/shell/inc/shellAuto.h +++ b/tools/shell/inc/shellAuto.h @@ -24,7 +24,7 @@ void pressTabKey(SShellCmd* cmd); // press othr key void pressOtherKey(char c); -// init shell auto funciton , shell start call once +// init shell auto funciton , shell start call once bool shellAutoInit(); // set conn diff --git a/tools/shell/inc/shellTire.h b/tools/shell/inc/shellTire.h index 88bae54809..b262aa68d8 100644 --- a/tools/shell/inc/shellTire.h +++ b/tools/shell/inc/shellTire.h @@ -16,68 +16,65 @@ #ifndef __TRIE__ #define __TRIE__ -// +// // The prefix search tree is a efficient storage words and search words tree, it support 95 visible ascii code character // #define FIRST_ASCII 40 // first visiable char is '0' #define LAST_ASCII 122 // last visilbe char is 'z' // capacity save char is 95 -#define CHAR_CNT (LAST_ASCII - FIRST_ASCII + 1) -#define MAX_WORD_LEN 256 // max insert word length +#define CHAR_CNT (LAST_ASCII - FIRST_ASCII + 1) +#define MAX_WORD_LEN 256 // max insert word length // define STire -#define TIRE_TREE 0 -#define TIRE_LIST 1 +#define TIRE_TREE 0 +#define TIRE_LIST 1 typedef struct STireNode { - struct STireNode** d; - bool end; // record end flag -}STireNode; + struct STireNode** d; + bool end; // record end flag +} STireNode; typedef struct StrName { - char * name; - struct StrName * next; -}StrName; - + char* name; + struct StrName* next; +} StrName; typedef struct STire { - char type; // see define TIRE_ - STireNode root; + char type; // see define TIRE_ + STireNode root; - StrName * head; - StrName * tail; + StrName* head; + StrName* tail; - int count; // all count - int ref; -}STire; + int count; // all count + int ref; +} STire; typedef struct SMatchNode { - char* word; - struct SMatchNode* next; -}SMatchNode; - + char* word; + struct SMatchNode* next; +} SMatchNode; typedef struct SMatch { - SMatchNode* head; - SMatchNode* tail; // append node to tail - int count; - char pre[MAX_WORD_LEN]; -}SMatch; - + SMatchNode* head; + SMatchNode* tail; // append node to tail + int count; + char pre[MAX_WORD_LEN]; +} SMatch; // ----------- interface ------------- -// create prefix search tree, return value call freeTire to free +// create prefix search tree, return value call freeTire to free STire* createTire(char type); // destroy prefix search tree void freeTire(STire* tire); -// add a new word +// add a new word bool insertWord(STire* tire, char* word); -// add a new word +// add a new word bool deleteWord(STire* tire, char* word); // match prefix words, if match is not NULL , put all item to match and return match diff --git a/tools/shell/src/shellAuto.c b/tools/shell/src/shellAuto.c index c648b6932b..8aafd747af 100644 --- a/tools/shell/src/shellAuto.c +++ b/tools/shell/src/shellAuto.c @@ -25,441 +25,326 @@ // #define UNION_ALL " union all " - // extern function -void shellClearScreen(int32_t ecmd_pos, int32_t cursor_pos); -void shellGetPrevCharSize(const char *str, int32_t pos, int32_t *size, int32_t *width); -void shellShowOnScreen(SShellCmd *cmd); -void shellInsertChar(SShellCmd *cmd, char *c, int size); -bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* p, int32_t len); - +void shellClearScreen(int32_t ecmd_pos, int32_t cursor_pos); +void shellGetPrevCharSize(const char* str, int32_t pos, int32_t* size, int32_t* width); +void shellShowOnScreen(SShellCmd* cmd); +void shellInsertChar(SShellCmd* cmd, char* c, int size); +bool appendAfterSelect(TAOS* con, SShellCmd* cmd, char* p, int32_t len); typedef struct SAutoPtr { STire* p; - int ref; -}SAutoPtr; + int ref; +} SAutoPtr; -typedef struct SWord{ - int type ; // word type , see WT_ define - char * word; - int32_t len; - struct SWord * next; - bool free; // if true need free -}SWord; +typedef struct SWord { + int type; // word type , see WT_ define + char* word; + int32_t len; + struct SWord* next; + bool free; // if true need free +} SWord; typedef struct { - char * source; - int32_t source_len; // valid data length in source + char* source; + int32_t source_len; // valid data length in source int32_t count; SWord* head; // matched information - int32_t matchIndex; // matched word index in words - int32_t matchLen; // matched length at matched word -}SWords; + int32_t matchIndex; // matched word index in words + int32_t matchLen; // matched length at matched word +} SWords; SWords shellCommands[] = { - {"alter database ;", 0, 0, NULL}, - {"alter dnode balance ", 0, 0, NULL}, - {"alter dnode resetlog;", 0, 0, NULL}, - {"alter dnode debugFlag 141;", 0, 0, NULL}, - {"alter dnode monitor 1;", 0, 0, NULL}, - {"alter all dnodes monitor ", 0, 0, NULL}, - {"alter alldnodes balance ", 0, 0, NULL}, - {"alter alldnodes resetlog;", 0, 0, NULL}, - {"alter alldnodes debugFlag 141;", 0, 0, NULL}, - {"alter alldnodes monitor 1;", 0, 0, NULL}, - {"alter table ;", 0, 0, NULL}, - {"alter table modify column", 0, 0, NULL}, - {"alter local resetlog;", 0, 0, NULL}, - {"alter local DebugFlag 143;", 0, 0, NULL}, - {"alter local cDebugFlag 143;", 0, 0, NULL}, - {"alter local uDebugFlag 143;", 0, 0, NULL}, - {"alter local rpcDebugFlag 143;", 0, 0, NULL}, - {"alter local tmrDebugFlag 143;", 0, 0, NULL}, - {"alter topic", 0, 0, NULL}, - {"alter user ;", 0, 0, NULL}, - // 20 - {"create table using tags(", 0, 0, NULL}, - {"create database ;", 0, 0, NULL}, - {"create dnode ", 0, 0, NULL}, - {"create index ", 0, 0, NULL}, - {"create mnode on dnode ;", 0, 0, NULL}, - {"create qnode on dnode ;", 0, 0, NULL}, - {"create stream into as select", 0, 0, NULL}, // 26 append sub sql - {"create topic as select", 0, 0, NULL}, // 27 append sub sql - {"create function ", 0, 0, NULL}, - {"create user pass sysinfo 0;", 0, 0, NULL}, - {"create user pass sysinfo 1;", 0, 0, NULL}, - {"describe ", 0, 0, NULL}, - {"delete from where ", 0, 0, NULL}, - {"drop database ", 0, 0, NULL}, - {"drop table ", 0, 0, NULL}, - {"drop dnode ", 0, 0, NULL}, - {"drop mnode on dnode ;", 0, 0, NULL}, - {"drop qnode on dnode ;", 0, 0, NULL}, - {"drop user ;", 0, 0, NULL}, - // 40 - {"drop function", 0, 0, NULL}, - {"drop consumer group on ", 0, 0, NULL}, - {"drop topic ;", 0, 0, NULL}, - {"drop stream ;", 0, 0, NULL}, - {"explain select", 0, 0, NULL}, // 44 append sub sql - {"grant all on to ;", 0, 0, NULL}, - {"grant read on to ;", 0, 0, NULL}, - {"grant write on to ;", 0, 0, NULL}, - {"kill connection ;", 0, 0, NULL}, - {"kill query ", 0, 0, NULL}, - {"kill transaction ", 0, 0, NULL}, - {"merge vgroup ", 0, 0, NULL}, - {"reset query cache;", 0, 0, NULL}, - {"revoke all on from ;", 0, 0, NULL}, - {"revoke read on from ;", 0, 0, NULL}, - {"revoke write on from ;", 0, 0, NULL}, - {"select * from ", 0, 0, NULL}, - {"select _block_dist() from \\G;", 0, 0, NULL}, - {"select client_version();", 0, 0, NULL}, - // 60 - {"select current_user();", 0, 0, NULL}, - {"select database();", 0, 0, NULL}, - {"select server_version();", 0, 0, NULL}, - {"select server_status();", 0, 0, NULL}, - {"select now();", 0, 0, NULL}, - {"select today();", 0, 0, NULL}, - {"select timezone();", 0, 0, NULL}, - {"set max_binary_display_width ", 0, 0, NULL}, - {"show apps;", 0, 0, NULL}, - {"show create database \\G;", 0, 0, NULL}, - {"show create stable \\G;", 0, 0, NULL}, - {"show create table \\G;", 0, 0, NULL}, - {"show connections;", 0, 0, NULL}, - {"show cluster;", 0, 0, NULL}, - {"show databases;", 0, 0, NULL}, - {"show dnodes;", 0, 0, NULL}, - {"show dnode variables;", 0, 0, NULL}, - {"show functions;", 0, 0, NULL}, - {"show mnodes;", 0, 0, NULL}, - {"show queries;", 0, 0, NULL}, - // 80 - {"show query ;", 0, 0, NULL}, - {"show qnodes;", 0, 0, NULL}, - {"show snodes;", 0, 0, NULL}, - {"show stables;", 0, 0, NULL}, - {"show stables like ", 0, 0, NULL}, - {"show streams;", 0, 0, NULL}, - {"show scores;", 0, 0, NULL}, - {"show subscriptions;", 0, 0, NULL}, - {"show tables;", 0, 0, NULL}, - {"show tables like", 0, 0, NULL}, - {"show table distributed ", 0, 0, NULL}, - {"show tags from ", 0, 0, NULL}, - {"show tags from ", 0, 0, NULL}, - {"show topics;", 0, 0, NULL}, - {"show transactions;", 0, 0, NULL}, - {"show users;", 0, 0, NULL}, - {"show variables;", 0, 0, NULL}, - {"show local variables;", 0, 0, NULL}, - {"show vnodes ", 0, 0, NULL}, - {"show vgroups;", 0, 0, NULL}, - {"show consumers;", 0, 0, NULL}, - {"show grants;", 0, 0, NULL}, - {"split vgroup ", 0, 0, NULL}, - {"insert into values(", 0, 0, NULL}, - {"insert into using tags(", 0, 0, NULL}, - {"insert into using values(", 0, 0, NULL}, - {"insert into file ", 0, 0, NULL}, - {"trim database ", 0, 0, NULL}, - {"use ", 0, 0, NULL}, - {"quit", 0, 0, NULL} + {"alter database " + " ;", + 0, 0, NULL}, + {"alter dnode balance ", 0, 0, NULL}, + {"alter dnode resetlog;", 0, 0, NULL}, + {"alter dnode debugFlag 141;", 0, 0, NULL}, + {"alter dnode monitor 1;", 0, 0, NULL}, + {"alter all dnodes monitor ", 0, 0, NULL}, + {"alter alldnodes balance ", 0, 0, NULL}, + {"alter alldnodes resetlog;", 0, 0, NULL}, + {"alter alldnodes debugFlag 141;", 0, 0, NULL}, + {"alter alldnodes monitor 1;", 0, 0, NULL}, + {"alter table ;", 0, 0, NULL}, + {"alter table modify column", 0, 0, NULL}, + {"alter local resetlog;", 0, 0, NULL}, + {"alter local DebugFlag 143;", 0, 0, NULL}, + {"alter local cDebugFlag 143;", 0, 0, NULL}, + {"alter local uDebugFlag 143;", 0, 0, NULL}, + {"alter local rpcDebugFlag 143;", 0, 0, NULL}, + {"alter local tmrDebugFlag 143;", 0, 0, NULL}, + {"alter topic", 0, 0, NULL}, + {"alter user ;", 0, 0, NULL}, + // 20 + {"create table using tags(", 0, 0, NULL}, + {"create database " + " " + " ;", + 0, 0, NULL}, + {"create dnode ", 0, 0, NULL}, + {"create index ", 0, 0, NULL}, + {"create mnode on dnode ;", 0, 0, NULL}, + {"create qnode on dnode ;", 0, 0, NULL}, + {"create stream into as select", 0, 0, NULL}, // 26 append sub sql + {"create topic as select", 0, 0, NULL}, // 27 append sub sql + {"create function ", 0, 0, NULL}, + {"create user pass sysinfo 0;", 0, 0, NULL}, + {"create user pass sysinfo 1;", 0, 0, NULL}, + {"describe ", 0, 0, NULL}, + {"delete from where ", 0, 0, NULL}, + {"drop database ", 0, 0, NULL}, + {"drop table ", 0, 0, NULL}, + {"drop dnode ", 0, 0, NULL}, + {"drop mnode on dnode ;", 0, 0, NULL}, + {"drop qnode on dnode ;", 0, 0, NULL}, + {"drop user ;", 0, 0, NULL}, + // 40 + {"drop function", 0, 0, NULL}, + {"drop consumer group on ", 0, 0, NULL}, + {"drop topic ;", 0, 0, NULL}, + {"drop stream ;", 0, 0, NULL}, + {"explain select", 0, 0, NULL}, // 44 append sub sql + {"grant all on to ;", 0, 0, NULL}, + {"grant read on to ;", 0, 0, NULL}, + {"grant write on to ;", 0, 0, NULL}, + {"kill connection ;", 0, 0, NULL}, + {"kill query ", 0, 0, NULL}, + {"kill transaction ", 0, 0, NULL}, + {"merge vgroup ", 0, 0, NULL}, + {"reset query cache;", 0, 0, NULL}, + {"revoke all on from ;", 0, 0, NULL}, + {"revoke read on from ;", 0, 0, NULL}, + {"revoke write on from ;", 0, 0, NULL}, + {"select * from ", 0, 0, NULL}, + {"select _block_dist() from \\G;", 0, 0, NULL}, + {"select client_version();", 0, 0, NULL}, + // 60 + {"select current_user();", 0, 0, NULL}, + {"select database();", 0, 0, NULL}, + {"select server_version();", 0, 0, NULL}, + {"select server_status();", 0, 0, NULL}, + {"select now();", 0, 0, NULL}, + {"select today();", 0, 0, NULL}, + {"select timezone();", 0, 0, NULL}, + {"set max_binary_display_width ", 0, 0, NULL}, + {"show apps;", 0, 0, NULL}, + {"show create database \\G;", 0, 0, NULL}, + {"show create stable \\G;", 0, 0, NULL}, + {"show create table \\G;", 0, 0, NULL}, + {"show connections;", 0, 0, NULL}, + {"show cluster;", 0, 0, NULL}, + {"show databases;", 0, 0, NULL}, + {"show dnodes;", 0, 0, NULL}, + {"show dnode variables;", 0, 0, NULL}, + {"show functions;", 0, 0, NULL}, + {"show mnodes;", 0, 0, NULL}, + {"show queries;", 0, 0, NULL}, + // 80 + {"show query ;", 0, 0, NULL}, + {"show qnodes;", 0, 0, NULL}, + {"show stables;", 0, 0, NULL}, + {"show stables like ", 0, 0, NULL}, + {"show streams;", 0, 0, NULL}, + {"show scores;", 0, 0, NULL}, + {"show snodes;", 0, 0, NULL}, + {"show subscriptions;", 0, 0, NULL}, + {"show tables;", 0, 0, NULL}, + {"show tables like", 0, 0, NULL}, + {"show table distributed ", 0, 0, NULL}, + {"show tags from ", 0, 0, NULL}, + {"show tags from ", 0, 0, NULL}, + {"show topics;", 0, 0, NULL}, + {"show transactions;", 0, 0, NULL}, + {"show users;", 0, 0, NULL}, + {"show variables;", 0, 0, NULL}, + {"show local variables;", 0, 0, NULL}, + {"show vnodes ", 0, 0, NULL}, + {"show vgroups;", 0, 0, NULL}, + {"show consumers;", 0, 0, NULL}, + {"show grants;", 0, 0, NULL}, + {"split vgroup ", 0, 0, NULL}, + {"insert into values(", 0, 0, NULL}, + {"insert into using tags(", 0, 0, NULL}, + {"insert into using values(", 0, 0, NULL}, + {"insert into file ", 0, 0, NULL}, + {"trim database ", 0, 0, NULL}, + {"use ", 0, 0, NULL}, + {"quit", 0, 0, NULL}}; + +char* keywords[] = { + "and ", "asc ", "desc ", "from ", "fill(", "limit ", "where ", + "interval(", "order by ", "order by ", "offset ", "or ", "group by ", "now()", + "session(", "sliding ", "slimit ", "soffset ", "state_window(", "today() ", "union all select ", + "partition by "}; + +char* functions[] = { + "count(", "sum(", + "avg(", "last(", + "last_row(", "top(", + "interp(", "max(", + "min(", "now()", + "today()", "percentile(", + "tail(", "pow(", + "abs(", "atan(", + "acos(", "asin(", + "apercentile(", "bottom(", + "cast(", "ceil(", + "char_length(", "cos(", + "concat(", "concat_ws(", + "csum(", "diff(", + "derivative(", "elapsed(", + "first(", "floor(", + "hyperloglog(", "histogram(", + "irate(", "leastsquares(", + "length(", "log(", + "lower(", "ltrim(", + "mavg(", "mode(", + "tan(", "round(", + "rtrim(", "sample(", + "sin(", "spread(", + "substr(", "statecount(", + "stateduration(", "stddev(", + "sqrt(", "timediff(", + "timezone(", "timetruncate(", + "twa(", "to_unixtimestamp(", + "unique(", "upper(", }; -char * keywords[] = { - "and ", - "asc ", - "desc ", - "from ", - "fill(", - "limit ", - "where ", - "interval(", - "order by ", - "order by ", - "offset ", - "or ", - "group by ", - "now()", - "session(", - "sliding ", - "slimit ", - "soffset ", - "state_window(", - "today() ", - "union all select ", - "partition by " +char* tb_actions[] = { + "add column ", "modify column ", "drop column ", "rename column ", "add tag ", + "modify tag ", "drop tag ", "rename tag ", "set tag ", }; -char * functions[] = { - "count(", - "sum(", - "avg(", - "last(", - "last_row(", - "top(", - "interp(", - "max(", - "min(", - "now()", - "today()", - "percentile(", - "tail(", - "pow(", - "abs(", - "atan(", - "acos(", - "asin(", - "apercentile(", - "bottom(", - "cast(", - "ceil(", - "char_length(", - "cos(", - "concat(", - "concat_ws(", - "csum(", - "diff(", - "derivative(", - "elapsed(", - "first(", - "floor(", - "hyperloglog(", - "histogram(", - "irate(", - "leastsquares(", - "length(", - "log(", - "lower(", - "ltrim(", - "mavg(", - "mode(", - "tan(", - "round(", - "rtrim(", - "sample(", - "sin(", - "spread(", - "substr(", - "statecount(", - "stateduration(", - "stddev(", - "sqrt(", - "timediff(", - "timezone(", - "timetruncate(", - "twa(", - "to_unixtimestamp(", - "unique(", - "upper(", -}; +char* user_actions[] = {"pass ", "enable ", "sysinfo "}; -char * tb_actions[] = { - "add column ", - "modify column ", - "drop column ", - "rename column ", - "add tag ", - "modify tag ", - "drop tag ", - "rename tag ", - "set tag ", -}; +char* tb_options[] = {"comment ", "watermark ", "max_delay ", "ttl ", "rollup(", "sma("}; -char * user_actions[] = { - "pass ", - "enable ", - "sysinfo " -}; +char* db_options[] = {"keep ", + "replica ", + "precision ", + "strict ", + "buffer ", + "cachemodel ", + "cachesize ", + "comp ", + "duration ", + "wal_fsync_period", + "maxrows ", + "minrows ", + "pages ", + "pagesize ", + "retentions ", + "wal_level ", + "vgroups ", + "single_stable ", + "wal_retention_period ", + "wal_roll_period ", + "wal_retention_size ", + "wal_segment_size "}; -char * tb_options[] = { - "comment ", - "watermark ", - "max_delay ", - "ttl ", - "rollup(", - "sma(" -}; +char* alter_db_options[] = {"keep ", "cachemodel ", "cachesize ", "wal_fsync_period ", "wal_level "}; -char * db_options[] = { - "keep ", - "replica ", - "precision ", - "strict ", - "buffer ", - "cachemodel ", - "cachesize ", - "comp ", - "duration ", - "wal_fsync_period", - "maxrows ", - "minrows ", - "pages ", - "pagesize ", - "retentions ", - "wal_level ", - "vgroups ", - "single_stable ", - "wal_retention_period ", - "wal_roll_period ", - "wal_retention_size ", - "wal_segment_size " -}; +char* data_types[] = {"timestamp", "int", + "int unsigned", "varchar(16)", + "float", "double", + "binary(16)", "nchar(16)", + "bigint", "bigint unsigned", + "smallint", "smallint unsigned", + "tinyint", "tinyint unsigned", + "bool", "json"}; -char * alter_db_options[] = { - "keep ", - "cachemodel ", - "cachesize ", - "wal_fsync_period ", - "wal_level " -}; +char* key_tags[] = {"tags("}; -char * data_types[] = { - "timestamp", - "int", - "int unsigned", - "varchar(16)", - "float", - "double", - "binary(16)", - "nchar(16)", - "bigint", - "bigint unsigned", - "smallint", - "smallint unsigned", - "tinyint", - "tinyint unsigned", - "bool", - "json" -}; - -char * key_tags[] = { - "tags(" -}; - -char * key_select[] = { - "select " -}; +char* key_select[] = {"select "}; // // ------- gobal variant define --------- // -int32_t firstMatchIndex = -1; // first match shellCommands index -int32_t lastMatchIndex = -1; // last match shellCommands index -int32_t curMatchIndex = -1; // current match shellCommands index -int32_t lastWordBytes = -1; // printShow last word length -bool waitAutoFill = false; - +int32_t firstMatchIndex = -1; // first match shellCommands index +int32_t lastMatchIndex = -1; // last match shellCommands index +int32_t curMatchIndex = -1; // current match shellCommands index +int32_t lastWordBytes = -1; // printShow last word length +bool waitAutoFill = false; // // ----------- global var array define ----------- // -#define WT_VAR_DBNAME 0 -#define WT_VAR_STABLE 1 -#define WT_VAR_TABLE 2 -#define WT_VAR_DNODEID 3 -#define WT_VAR_USERNAME 4 -#define WT_VAR_TOPIC 5 -#define WT_VAR_STREAM 6 -#define WT_VAR_ALLTABLE 7 -#define WT_VAR_FUNC 8 -#define WT_VAR_KEYWORD 9 -#define WT_VAR_TBACTION 10 -#define WT_VAR_DBOPTION 11 +#define WT_VAR_DBNAME 0 +#define WT_VAR_STABLE 1 +#define WT_VAR_TABLE 2 +#define WT_VAR_DNODEID 3 +#define WT_VAR_USERNAME 4 +#define WT_VAR_TOPIC 5 +#define WT_VAR_STREAM 6 +#define WT_VAR_ALLTABLE 7 +#define WT_VAR_FUNC 8 +#define WT_VAR_KEYWORD 9 +#define WT_VAR_TBACTION 10 +#define WT_VAR_DBOPTION 11 #define WT_VAR_ALTER_DBOPTION 12 -#define WT_VAR_DATATYPE 13 -#define WT_VAR_KEYTAGS 14 -#define WT_VAR_ANYWORD 15 -#define WT_VAR_TBOPTION 16 -#define WT_VAR_USERACTION 17 -#define WT_VAR_KEYSELECT 18 +#define WT_VAR_DATATYPE 13 +#define WT_VAR_KEYTAGS 14 +#define WT_VAR_ANYWORD 15 +#define WT_VAR_TBOPTION 16 +#define WT_VAR_USERACTION 17 +#define WT_VAR_KEYSELECT 18 +#define WT_VAR_CNT 19 -#define WT_VAR_CNT 19 +#define WT_FROM_DB_MAX 6 // max get content from db +#define WT_FROM_DB_CNT (WT_FROM_DB_MAX + 1) -#define WT_FROM_DB_MAX 6 // max get content from db -#define WT_FROM_DB_CNT (WT_FROM_DB_MAX + 1) +#define WT_TEXT 0xFF -#define WT_TEXT 0xFF - -char dbName[256] = ""; // save use database name; +char dbName[256] = ""; // save use database name; // tire array -STire* tires[WT_VAR_CNT]; +STire* tires[WT_VAR_CNT]; TdThreadMutex tiresMutex; -//save thread handle obtain var name from db server +// save thread handle obtain var name from db server TdThread* threads[WT_FROM_DB_CNT]; // obtain var name with sql from server -char varTypes[WT_VAR_CNT][64] = { - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" -}; - -char varSqls[WT_FROM_DB_CNT][64] = { - "show databases;", - "show stables;", - "show tables;", - "show dnodes;", - "show users;", - "show topics;", - "show streams;" -}; +char varTypes[WT_VAR_CNT][64] = {"", "", "", "", "", + "", "", "", "", "", + "", "", "", "", "", + "", "", "", ""}; +char varSqls[WT_FROM_DB_CNT][64] = {"show databases;", "show stables;", "show tables;", "show dnodes;", + "show users;", "show topics;", "show streams;"}; // var words current cursor, if user press any one key except tab, cursorVar can be reset to -1 -int cursorVar = -1; -bool varMode = false; // enter var names list mode - - -TAOS* varCon = NULL; -SShellCmd* varCmd = NULL; -SMatch* lastMatch = NULL; // save last match result -int cntDel = 0; // delete byte count after next press tab +int cursorVar = -1; +bool varMode = false; // enter var names list mode +TAOS* varCon = NULL; +SShellCmd* varCmd = NULL; +SMatch* lastMatch = NULL; // save last match result +int cntDel = 0; // delete byte count after next press tab // show auto tab introduction void printfIntroduction() { - printf(" **************************** How To Use TAB Key ********************************\n"); - printf(" * TDengine Command Line supports pressing TAB key to complete word, *\n"); + printf(" **************************** How To Use TAB Key ********************************\n"); + printf(" * TDengine Command Line supports pressing TAB key to complete word, *\n"); printf(" * including database name, table name, function name and keywords. *\n"); printf(" * Press TAB key anywhere, you'll get surprise. *\n"); printf(" * KEYBOARD SHORTCUT: *\n"); printf(" * [ TAB ] ...... Complete the word or show help if no input *\n"); printf(" * [ Ctrl + A ] ...... move cursor to [A]head of line *\n"); printf(" * [ Ctrl + E ] ...... move cursor to [E]nd of line *\n"); - printf(" * [ Ctrl + W ] ...... move cursor to line of middle *\n"); + printf(" * [ Ctrl + W ] ...... move cursor to line of middle *\n"); printf(" * [ Ctrl + L ] ...... clean screen *\n"); printf(" * [ Ctrl + K ] ...... clean after cursor *\n"); printf(" * [ Ctrl + U ] ...... clean before cursor *\n"); printf(" * *\n"); - printf(" **********************************************************************************\n\n"); + printf(" **********************************************************************************\n\n"); } void showHelp() { printf("\nThe following are supported commands for TDengine Command Line:"); - printf("\n\ + printf( + "\n\ ----- A ----- \n\ alter database \n\ alter dnode balance \n\ @@ -572,9 +457,10 @@ void showHelp() { use ;"); printf("\n\n"); - - //define in getDuration() function - printf("\ + + // define in getDuration() function + printf( + "\ Timestamp expression Format:\n\ b - nanosecond \n\ u - microsecond \n\ @@ -597,11 +483,10 @@ void showHelp() { #define SHELL_COMMAND_COUNT() (sizeof(shellCommands) / sizeof(SWords)) // get at -SWord * atWord(SWords * command, int32_t index) { - SWord * word = command->head; +SWord* atWord(SWords* command, int32_t index) { + SWord* word = command->head; for (int32_t i = 0; i < index; i++) { - if (word == NULL) - return NULL; + if (word == NULL) return NULL; word = word->next; } @@ -612,18 +497,17 @@ SWord * atWord(SWords * command, int32_t index) { int wordType(const char* p, int32_t len) { for (int i = 0; i < WT_VAR_CNT; i++) { - if (strncmp(p, varTypes[i], len) == 0) - return i; + if (strncmp(p, varTypes[i], len) == 0) return i; } return WT_TEXT; } // add word -SWord * addWord(const char* p, int32_t len, bool pattern) { - SWord* word = (SWord *) taosMemoryMalloc(sizeof(SWord)); +SWord* addWord(const char* p, int32_t len, bool pattern) { + SWord* word = (SWord*)taosMemoryMalloc(sizeof(SWord)); memset(word, 0, sizeof(SWord)); - word->word = (char* )p; - word->len = len; + word->word = (char*)p; + word->len = len; // check format if (pattern) { @@ -636,10 +520,10 @@ SWord * addWord(const char* p, int32_t len, bool pattern) { } // parse one command -void parseCommand(SWords * command, bool pattern) { - char * p = command->source; +void parseCommand(SWords* command, bool pattern) { + char* p = command->source; int32_t start = 0; - int32_t size = command->source_len > 0 ? command->source_len : strlen(p); + int32_t size = command->source_len > 0 ? command->source_len : strlen(p); bool lastBlank = false; for (int i = 0; i <= size; i++) { @@ -647,28 +531,28 @@ void parseCommand(SWords * command, bool pattern) { // check continue blank like ' ' if (p[i] == ' ') { if (lastBlank) { - start ++; + start++; continue; } - if (i == 0) { // first blank + if (i == 0) { // first blank lastBlank = true; - start ++; + start++; continue; } lastBlank = true; - } + } // found split or string end , append word if (command->head == NULL) { command->head = addWord(p + start, i - start, pattern); command->count = 1; } else { - SWord * word = command->head; + SWord* word = command->head; while (word->next) { word = word->next; } word->next = addWord(p + start, i - start, pattern); - command->count ++; + command->count++; } start = i + 1; } else { @@ -678,25 +562,23 @@ void parseCommand(SWords * command, bool pattern) { } // free SShellCmd -void freeCommand(SWords * command) { - SWord * word = command->head; +void freeCommand(SWords* command) { + SWord* word = command->head; if (word == NULL) { - return ; + return; } - // loop + // loop while (word->next) { - SWord * tmp = word; + SWord* tmp = word; word = word->next; // if malloc need free - if(tmp->free && tmp->word) - taosMemoryFree(tmp->word); + if (tmp->free && tmp->word) taosMemoryFree(tmp->word); taosMemoryFree(tmp); } // if malloc need free - if(word->free && word->word) - taosMemoryFree(word->word); + if (word->free && word->word) taosMemoryFree(word->word); taosMemoryFree(word); } @@ -715,12 +597,11 @@ void GenerateVarType(int type, char** p, int count) { // -------------------- shell auto ---------------- // - -// init shell auto funciton , shell start call once +// init shell auto funciton , shell start call once bool shellAutoInit() { // command int32_t count = SHELL_COMMAND_COUNT(); - for (int32_t i = 0; i < count; i ++) { + for (int32_t i = 0; i < count; i++) { parseCommand(shellCommands + i, true); } @@ -732,30 +613,28 @@ bool shellAutoInit() { memset(threads, 0, sizeof(TdThread*) * WT_FROM_DB_CNT); // generate varType - GenerateVarType(WT_VAR_FUNC, functions, sizeof(functions) /sizeof(char *)); - GenerateVarType(WT_VAR_KEYWORD, keywords, sizeof(keywords) /sizeof(char *)); - GenerateVarType(WT_VAR_DBOPTION, db_options, sizeof(db_options) /sizeof(char *)); - GenerateVarType(WT_VAR_ALTER_DBOPTION, alter_db_options, sizeof(alter_db_options) /sizeof(char *)); - GenerateVarType(WT_VAR_TBACTION, tb_actions, sizeof(tb_actions) /sizeof(char *)); - GenerateVarType(WT_VAR_DATATYPE, data_types, sizeof(data_types) /sizeof(char *)); - GenerateVarType(WT_VAR_KEYTAGS, key_tags, sizeof(key_tags) /sizeof(char *)); - GenerateVarType(WT_VAR_TBOPTION, tb_options, sizeof(tb_options) /sizeof(char *)); - GenerateVarType(WT_VAR_USERACTION, user_actions, sizeof(user_actions) /sizeof(char *)); - GenerateVarType(WT_VAR_KEYSELECT,key_select, sizeof(key_select) /sizeof(char *)); + GenerateVarType(WT_VAR_FUNC, functions, sizeof(functions) / sizeof(char*)); + GenerateVarType(WT_VAR_KEYWORD, keywords, sizeof(keywords) / sizeof(char*)); + GenerateVarType(WT_VAR_DBOPTION, db_options, sizeof(db_options) / sizeof(char*)); + GenerateVarType(WT_VAR_ALTER_DBOPTION, alter_db_options, sizeof(alter_db_options) / sizeof(char*)); + GenerateVarType(WT_VAR_TBACTION, tb_actions, sizeof(tb_actions) / sizeof(char*)); + GenerateVarType(WT_VAR_DATATYPE, data_types, sizeof(data_types) / sizeof(char*)); + GenerateVarType(WT_VAR_KEYTAGS, key_tags, sizeof(key_tags) / sizeof(char*)); + GenerateVarType(WT_VAR_TBOPTION, tb_options, sizeof(tb_options) / sizeof(char*)); + GenerateVarType(WT_VAR_USERACTION, user_actions, sizeof(user_actions) / sizeof(char*)); + GenerateVarType(WT_VAR_KEYSELECT, key_select, sizeof(key_select) / sizeof(char*)); return true; } // set conn -void shellSetConn(TAOS* conn) { - varCon = conn; -} +void shellSetConn(TAOS* conn) { varCon = conn; } // exit shell auto funciton, shell exit call once void shellAutoExit() { // free command int32_t count = SHELL_COMMAND_COUNT(); - for (int32_t i = 0; i < count; i ++) { + for (int32_t i = 0; i < count; i++) { freeCommand(shellCommands + i); } @@ -765,7 +644,7 @@ void shellAutoExit() { if (tires[i]) { freeTire(tires[i]); tires[i] = NULL; - } + } } taosThreadMutexUnlock(&tiresMutex); // destory @@ -790,8 +669,7 @@ void shellAutoExit() { // ------------------- auto ptr for tires -------------------------- // bool setNewAuotPtr(int type, STire* pNew) { - if (pNew == NULL) - return false; + if (pNew == NULL) return false; taosThreadMutexLock(&tiresMutex); STire* pOld = tires[type]; @@ -826,63 +704,61 @@ STire* getAutoPtr(int type) { // put back tire to tires[type], if tire not equal tires[type].p, need free tire void putBackAutoPtr(int type, STire* tire) { if (tire == NULL) { - return ; + return; } taosThreadMutexLock(&tiresMutex); if (tires[type] != tire) { - //update by out, can't put back , so free + // update by out, can't put back , so free if (--tire->ref == 1) { // support multi thread getAuotPtr freeTire(tire); } - + } else { tires[type]->ref--; assert(tires[type]->ref > 0); } taosThreadMutexUnlock(&tiresMutex); - return ; + return; } - - // // ------------------- var Word -------------------------- // -#define MAX_CACHED_CNT 100000 // max cached rows 10w +#define MAX_CACHED_CNT 100000 // max cached rows 10w // write sql result to var name, return write rows cnt int writeVarNames(int type, TAOS_RES* tres) { - // fetch row + // fetch row TAOS_ROW row = taos_fetch_row(tres); if (row == NULL) { return 0; } - TAOS_FIELD *fields = taos_fetch_fields(tres); + TAOS_FIELD* fields = taos_fetch_fields(tres); // create new tires - char tireType = type == WT_VAR_TABLE ? TIRE_TREE : TIRE_LIST; + char tireType = type == WT_VAR_TABLE ? TIRE_TREE : TIRE_LIST; STire* tire = createTire(tireType); // enum rows char name[1024]; - int numOfRows = 0; + int numOfRows = 0; do { int32_t* lengths = taos_fetch_lengths(tres); - int32_t bytes = lengths[0]; - if(fields[0].type == TSDB_DATA_TYPE_INT) { - sprintf(name,"%d", *(int16_t*)row[0]); + int32_t bytes = lengths[0]; + if (fields[0].type == TSDB_DATA_TYPE_INT) { + sprintf(name, "%d", *(int16_t*)row[0]); } else { memcpy(name, row[0], bytes); } - - name[bytes] = 0; //set string end + + name[bytes] = 0; // set string end // insert to tire insertWord(tire, name); - if (++numOfRows > MAX_CACHED_CNT ) { + if (++numOfRows > MAX_CACHED_CNT) { break; } @@ -895,12 +771,12 @@ int writeVarNames(int type, TAOS_RES* tres) { return numOfRows; } -bool firstMatchCommand(TAOS * con, SShellCmd * cmd); +bool firstMatchCommand(TAOS* con, SShellCmd* cmd); // -// thread obtain var thread from db server +// thread obtain var thread from db server // void* varObtainThread(void* param) { - int type = *(int* )param; + int type = *(int*)param; taosMemoryFree(param); if (varCon == NULL || type > WT_FROM_DB_MAX) { @@ -919,7 +795,7 @@ void* varObtainThread(void* param) { // free sql taos_free_result(pSql); - // check need call auto tab + // check need call auto tab if (cnt > 0 && waitAutoFill) { // press tab key by program firstMatchCommand(varCon, varCmd); @@ -949,11 +825,10 @@ char* matchNextPrefix(STire* tire, char* pre) { // NOT EMPTY match = matchPrefix(tire, pre, NULL); } - + // save to lastMatch if (match) { - if (lastMatch) - freeMatch(lastMatch); + if (lastMatch) freeMatch(lastMatch); lastMatch = match; } } @@ -967,11 +842,11 @@ char* matchNextPrefix(STire* tire, char* pre) { if (cursorVar == -1) { // first cursorVar = 0; - return strdup(match->head->word); + return strdup(match->head->word); } // according to cursorVar , calculate next one - int i = 0; + int i = 0; SMatchNode* item = match->head; while (item) { if (i == cursorVar + 1) { @@ -1008,12 +883,11 @@ char* tireSearchWord(int type, char* pre) { return NULL; } - if(type > WT_FROM_DB_MAX) { + if (type > WT_FROM_DB_MAX) { // NOT FROM DB , tires[type] alwary not null STire* tire = tires[type]; - if (tire == NULL) - return NULL; - return matchNextPrefix(tire, pre); + if (tire == NULL) return NULL; + return matchNextPrefix(tire, pre); } // TYPE CONTEXT GET FROM DB @@ -1025,7 +899,7 @@ char* tireSearchWord(int type, char* pre) { // need async obtain var names from db sever if (threads[type] != NULL) { if (taosThreadRunning(threads[type])) { - // thread running , need not obtain again, return + // thread running , need not obtain again, return taosThreadMutexUnlock(&tiresMutex); return NULL; } @@ -1033,10 +907,10 @@ char* tireSearchWord(int type, char* pre) { taosDestroyThread(threads[type]); threads[type] = NULL; } - + // create new - void * param = taosMemoryMalloc(sizeof(int)); - *((int* )param) = type; + void* param = taosMemoryMalloc(sizeof(int)); + *((int*)param) = type; threads[type] = taosCreateThread(varObtainThread, param); taosThreadMutexUnlock(&tiresMutex); return NULL; @@ -1056,9 +930,9 @@ char* tireSearchWord(int type, char* pre) { return str; } -// match var word, word1 is pattern , word2 is input from shell +// match var word, word1 is pattern , word2 is input from shell bool matchVarWord(SWord* word1, SWord* word2) { - // search input word from tire tree + // search input word from tire tree char pre[512]; memcpy(pre, word2->word, word2->len); pre[word2->len] = 0; @@ -1069,8 +943,7 @@ bool matchVarWord(SWord* word1, SWord* word2) { str = tireSearchWord(WT_VAR_STABLE, pre); if (str == NULL) { str = tireSearchWord(WT_VAR_TABLE, pre); - if(str == NULL) - return false; + if (str == NULL) return false; } } else { // OTHER @@ -1082,15 +955,15 @@ bool matchVarWord(SWord* word1, SWord* word2) { } // free previous malloc - if(word1->free && word1->word) { + if (word1->free && word1->word) { taosMemoryFree(word1->word); } // save word1->word = str; - word1->len = strlen(str); - word1->free = true; // need free - + word1->len = strlen(str); + word1->free = true; // need free + return true; } @@ -1098,11 +971,10 @@ bool matchVarWord(SWord* word1, SWord* word2) { // ------------------- match words -------------------------- // - // compare command cmd1 come from shellCommands , cmd2 come from user input -int32_t compareCommand(SWords * cmd1, SWords * cmd2) { - SWord * word1 = cmd1->head; - SWord * word2 = cmd2->head; +int32_t compareCommand(SWords* cmd1, SWords* cmd2) { + SWord* word1 = cmd1->head; + SWord* word2 = cmd2->head; if (word1 == NULL || word2 == NULL) { return -1; @@ -1112,8 +984,7 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) { if (word1->type == WT_TEXT) { // WT_TEXT match if (word1->len == word2->len) { - if (strncasecmp(word1->word, word2->word, word1->len) != 0) - return -1; + if (strncasecmp(word1->word, word2->word, word1->len) != 0) return -1; } else if (word1->len < word2->len) { return -1; } else { @@ -1128,7 +999,7 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) { } } else { // WT_VAR auto match any one word - if (word2->next == NULL) { // input words last one + if (word2->next == NULL) { // input words last one if (matchVarWord(word1, word2)) { cmd1->matchIndex = i; cmd1->matchLen = word2->len; @@ -1151,10 +1022,10 @@ int32_t compareCommand(SWords * cmd1, SWords * cmd2) { } // match command -SWords * matchCommand(SWords * input, bool continueSearch) { +SWords* matchCommand(SWords* input, bool continueSearch) { int32_t count = SHELL_COMMAND_COUNT(); - for (int32_t i = 0; i < count; i ++) { - SWords * shellCommand = shellCommands + i; + for (int32_t i = 0; i < count; i++) { + SWords* shellCommand = shellCommands + i; if (continueSearch && lastMatchIndex != -1 && i <= lastMatchIndex) { // new match must greate than lastMatchIndex if (varMode && i == lastMatchIndex) { @@ -1165,15 +1036,14 @@ SWords * matchCommand(SWords * input, bool continueSearch) { } // command is large - if (input->count > shellCommand->count ) { + if (input->count > shellCommand->count) { continue; } // compare int32_t index = compareCommand(shellCommand, input); if (index != -1) { - if (firstMatchIndex == -1) - firstMatchIndex = i; + if (firstMatchIndex == -1) firstMatchIndex = i; curMatchIndex = i; return &shellCommands[i]; } @@ -1188,7 +1058,7 @@ SWords * matchCommand(SWords * input, bool continueSearch) { // // delete char count -void deleteCount(SShellCmd * cmd, int count) { +void deleteCount(SShellCmd* cmd, int count) { int size = 0; int width = 0; int prompt_size = 6; @@ -1207,55 +1077,53 @@ void deleteCount(SShellCmd * cmd, int count) { } // show screen -void printScreen(TAOS * con, SShellCmd * cmd, SWords * match) { +void printScreen(TAOS* con, SShellCmd* cmd, SWords* match) { // modify SShellCmd if (firstMatchIndex == -1 || curMatchIndex == -1) { // no match - return ; + return; } - // first tab press - const char * str = NULL; - int strLen = 0; + // first tab press + const char* str = NULL; + int strLen = 0; if (firstMatchIndex == curMatchIndex && lastWordBytes == -1) { // first press tab - SWord * word = MATCH_WORD(match); + SWord* word = MATCH_WORD(match); str = word->word + match->matchLen; strLen = word->len - match->matchLen; lastMatchIndex = firstMatchIndex; lastWordBytes = word->len; } else { - if (lastWordBytes == -1) - return ; + if (lastWordBytes == -1) return; deleteCount(cmd, lastWordBytes); - SWord * word = MATCH_WORD(match); + SWord* word = MATCH_WORD(match); str = word->word; strLen = word->len; // set current to last lastMatchIndex = curMatchIndex; lastWordBytes = word->len; } - + // insert new - shellInsertChar(cmd, (char *)str, strLen); + shellInsertChar(cmd, (char*)str, strLen); } - // main key press tab , matched return true else false -bool firstMatchCommand(TAOS * con, SShellCmd * cmd) { +bool firstMatchCommand(TAOS* con, SShellCmd* cmd) { // parse command - SWords* input = (SWords *)taosMemoryMalloc(sizeof(SWords)); + SWords* input = (SWords*)taosMemoryMalloc(sizeof(SWords)); memset(input, 0, sizeof(SWords)); input->source = cmd->command; input->source_len = cmd->commandSize; parseCommand(input, false); // if have many , default match first, if press tab again , switch to next - curMatchIndex = -1; + curMatchIndex = -1; lastMatchIndex = -1; - SWords * match = matchCommand(input, true); + SWords* match = matchCommand(input, true); if (match == NULL) { // not match , nothing to do freeCommand(input); @@ -1265,27 +1133,31 @@ bool firstMatchCommand(TAOS * con, SShellCmd * cmd) { // print to screen printScreen(con, cmd, match); +#ifdef WINDOWS + printf("\r"); + shellShowOnScreen(cmd); +#endif freeCommand(input); taosMemoryFree(input); return true; } // create input source -void createInputFromFirst(SWords* input, SWords * firstMatch) { +void createInputFromFirst(SWords* input, SWords* firstMatch) { // // if next pressTabKey , input context come from firstMatch, set matched length with source_len // input->source = (char*)taosMemoryMalloc(1024); - memset((void* )input->source, 0, 1024); + memset((void*)input->source, 0, 1024); - SWord * word = firstMatch->head; + SWord* word = firstMatch->head; - // source_len = full match word->len + half match with firstMatch->matchLen + // source_len = full match word->len + half match with firstMatch->matchLen for (int i = 0; i < firstMatch->matchIndex && word; i++) { // combine source from each word strncpy(input->source + input->source_len, word->word, word->len); - strcat(input->source, " "); // append blank splite - input->source_len += word->len + 1; // 1 is blank length + strcat(input->source, " "); // append blank splite + input->source_len += word->len + 1; // 1 is blank length // move next word = word->next; } @@ -1297,11 +1169,11 @@ void createInputFromFirst(SWords* input, SWords * firstMatch) { } // user press Tabkey again is named next , matched return true else false -bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) { +bool nextMatchCommand(TAOS* con, SShellCmd* cmd, SWords* firstMatch) { if (firstMatch == NULL || firstMatch->head == NULL) { return false; } - SWords* input = (SWords *)taosMemoryMalloc(sizeof(SWords)); + SWords* input = (SWords*)taosMemoryMalloc(sizeof(SWords)); memset(input, 0, sizeof(SWords)); // create input from firstMatch @@ -1311,16 +1183,15 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) { parseCommand(input, false); // if have many , default match first, if press tab again , switch to next - SWords * match = matchCommand(input, true); + SWords* match = matchCommand(input, true); if (match == NULL) { // if not match , reset all index firstMatchIndex = -1; - curMatchIndex = -1; + curMatchIndex = -1; match = matchCommand(input, false); if (match == NULL) { freeCommand(input); - if (input->source) - taosMemoryFree(input->source); + if (input->source) taosMemoryFree(input->source); taosMemoryFree(input); return false; } @@ -1328,6 +1199,10 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) { // print to screen printScreen(con, cmd, match); +#ifdef WINDOWS + printf("\r"); + shellShowOnScreen(cmd); +#endif // free if (input->source) { @@ -1341,41 +1216,40 @@ bool nextMatchCommand(TAOS * con, SShellCmd * cmd, SWords * firstMatch) { } // fill with type -bool fillWithType(TAOS * con, SShellCmd * cmd, char* pre, int type) { +bool fillWithType(TAOS* con, SShellCmd* cmd, char* pre, int type) { // get type STire* tire = tires[type]; - char* str = matchNextPrefix(tire, pre); + char* str = matchNextPrefix(tire, pre); if (str == NULL) { return false; } // need insert part string - char * part = str + strlen(pre); + char* part = str + strlen(pre); // show int count = strlen(part); shellInsertChar(cmd, part, count); - cntDel = count; // next press tab delete current append count + cntDel = count; // next press tab delete current append count taosMemoryFree(str); return true; } // fill with type -bool fillTableName(TAOS * con, SShellCmd * cmd, char* pre) { +bool fillTableName(TAOS* con, SShellCmd* cmd, char* pre) { // search stable and table - char * str = tireSearchWord(WT_VAR_STABLE, pre); + char* str = tireSearchWord(WT_VAR_STABLE, pre); if (str == NULL) { str = tireSearchWord(WT_VAR_TABLE, pre); - if(str == NULL) - return false; + if (str == NULL) return false; } // need insert part string - char * part = str + strlen(pre); + char* part = str + strlen(pre); // delete autofill count last append - if(cntDel > 0) { + if (cntDel > 0) { deleteCount(cmd, cntDel); cntDel = 0; } @@ -1383,8 +1257,8 @@ bool fillTableName(TAOS * con, SShellCmd * cmd, char* pre) { // show int count = strlen(part); shellInsertChar(cmd, part, count); - cntDel = count; // next press tab delete current append count - + cntDel = count; // next press tab delete current append count + taosMemoryFree(str); return true; } @@ -1396,20 +1270,20 @@ bool fillTableName(TAOS * con, SShellCmd * cmd, char* pre) { // 2 select count(*),su -> select count(*), sum( // 3 select count(*), su -> select count(*), sum( // -char * lastWord(char * p) { - // get near from end revert find ' ' and ',' - char * p1 = strrchr(p, ' '); - char * p2 = strrchr(p, ','); +char* lastWord(char* p) { + // get near from end revert find ' ' and ',' + char* p1 = strrchr(p, ' '); + char* p2 = strrchr(p, ','); if (p1 && p2) { - return p1 > p2 ? p1 : p2 + 1; + return p1 > p2 ? p1 + 1 : p2 + 1; } else if (p1) { return p1 + 1; - } else if(p2) { + } else if (p2) { return p2 + 1; } else { return p; - } + } } bool fieldsInputEnd(char* sql) { @@ -1425,18 +1299,18 @@ bool fieldsInputEnd(char* sql) { } // not in ',' - char * p3 = strrchr(sql, ','); - char * p = p3; - // like select ts, age,' ' + char* p3 = strrchr(sql, ','); + char* p = p3; + // like select ts, age,' ' if (p) { ++p; - bool allBlank = true; // after last ',' all char is blank - int cnt = 0; // blank count , like ' ' as one blank - char * plast = NULL; // last blank position - while(*p) { + bool allBlank = true; // after last ',' all char is blank + int cnt = 0; // blank count , like ' ' as one blank + char* plast = NULL; // last blank position + while (*p) { if (*p == ' ') { plast = p; - cnt ++; + cnt++; } else { allBlank = false; } @@ -1444,7 +1318,7 @@ bool fieldsInputEnd(char* sql) { } // any one word is not blank - if(allBlank) { + if (allBlank) { return false; } @@ -1454,13 +1328,13 @@ bool fieldsInputEnd(char* sql) { } // if last char not ' ', then not end field, like 'select count(*), su' can fill sum( - if(sql[strlen(sql)-1] != ' ' && cnt <= 1) { + if (sql[strlen(sql) - 1] != ' ' && cnt <= 1) { return false; } } - char * p4 = strrchr(sql, ' '); - if(p4 == NULL) { + char* p4 = strrchr(sql, ' '); + if (p4 == NULL) { // only one word return false; } @@ -1469,9 +1343,9 @@ bool fieldsInputEnd(char* sql) { } // need insert from -bool needInsertFrom(char * sql, int len) { - // last is blank - if(sql[len-1] != ' ') { +bool needInsertFrom(char* sql, int len) { + // last is blank + if (sql[len - 1] != ' ') { // insert from keyword return false; } @@ -1486,45 +1360,45 @@ bool needInsertFrom(char * sql, int len) { } // p is string following select keyword -bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) { +bool appendAfterSelect(TAOS* con, SShellCmd* cmd, char* sql, int32_t len) { char* p = strndup(sql, len); // union all - char * p1; + char* p1; do { p1 = strstr(p, UNION_ALL); - if(p1) { + if (p1) { p = p1 + strlen(UNION_ALL); } } while (p1); - char * from = strstr(p, " from "); - //last word , maybe empty string or some letters of a string - char * last = lastWord(p); - bool ret = false; + char* from = strstr(p, " from "); + // last word , maybe empty string or some letters of a string + char* last = lastWord(p); + bool ret = false; if (from == NULL) { bool fieldEnd = fieldsInputEnd(p); // cheeck fields input end then insert from keyword - if (fieldEnd && p[len-1] == ' ') { + if (fieldEnd && p[len - 1] == ' ') { shellInsertChar(cmd, "from", 4); taosMemoryFree(p); return true; } // fill funciton - if(fieldEnd) { + if (fieldEnd) { // fields is end , need match keyword ret = fillWithType(con, cmd, last, WT_VAR_KEYWORD); } else { ret = fillWithType(con, cmd, last, WT_VAR_FUNC); } - + taosMemoryFree(p); return ret; } // have from - char * blank = strstr(from + 6, " "); + char* blank = strstr(from + 6, " "); if (blank == NULL) { // no table name, need fill ret = fillTableName(con, cmd, last); @@ -1538,13 +1412,12 @@ bool appendAfterSelect(TAOS * con, SShellCmd * cmd, char* sql, int32_t len) { int32_t searchAfterSelect(char* p, int32_t len) { // select * from st; - if(strncasecmp(p, "select ", 7) == 0) { + if (strncasecmp(p, "select ", 7) == 0) { // check nest query - char *p1 = p + 7; - while(1) { - char *p2 = strstr(p1, "select "); - if(p2 == NULL) - break; + char* p1 = p + 7; + while (1) { + char* p2 = strstr(p1, "select "); + if (p2 == NULL) break; p1 = p2 + 7; } @@ -1552,29 +1425,29 @@ int32_t searchAfterSelect(char* p, int32_t len) { } // explain as select * from st; - if(strncasecmp(p, "explain select ", 15) == 0) { + if (strncasecmp(p, "explain select ", 15) == 0) { return 15; } char* as_pos_end = strstr(p, " as select "); - if (as_pos_end == NULL) - return -1; + if (as_pos_end == NULL) return -1; as_pos_end += 11; // create stream as select - if(strncasecmp(p, "create stream ", 14) == 0) { - return as_pos_end - p;; + if (strncasecmp(p, "create stream ", 14) == 0) { + return as_pos_end - p; + ; } // create topic as select - if(strncasecmp(p, "create topic ", 13) == 0) { + if (strncasecmp(p, "create topic ", 13) == 0) { return as_pos_end - p; } return -1; } -bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { +bool matchSelectQuery(TAOS* con, SShellCmd* cmd) { // if continue press Tab , delete bytes by previous autofill if (cntDel > 0) { deleteCount(cmd, cntDel); @@ -1582,8 +1455,8 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { } // match select ... - int len = cmd->commandSize; - char * p = cmd->command; + int len = cmd->commandSize; + char* p = cmd->command; // remove prefix blank while (p[0] == ' ' && len > 0) { @@ -1592,17 +1465,16 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { } // special range - if(len < 7 || len > 512) { + if (len < 7 || len > 512) { return false; } // search - char* sql_cp = strndup(p, len); + char* sql_cp = strndup(p, len); int32_t n = searchAfterSelect(sql_cp, len); taosMemoryFree(sql_cp); - if(n == -1 || n > len) - return false; - p += n; + if (n == -1 || n > len) return false; + p += n; len -= n; // append @@ -1610,15 +1482,15 @@ bool matchSelectQuery(TAOS * con, SShellCmd * cmd) { } // if is input create fields or tags area, return true -bool isCreateFieldsArea(char * p) { - char * left = strrchr(p, '('); +bool isCreateFieldsArea(char* p) { + char* left = strrchr(p, '('); if (left == NULL) { // like 'create table st' return false; } - char * right = strrchr(p, ')'); - if(right == NULL) { + char* right = strrchr(p, ')'); + if (right == NULL) { // like 'create table st( ' return true; } @@ -1631,7 +1503,7 @@ bool isCreateFieldsArea(char * p) { return false; } -bool matchCreateTable(TAOS * con, SShellCmd * cmd) { +bool matchCreateTable(TAOS* con, SShellCmd* cmd) { // if continue press Tab , delete bytes by previous autofill if (cntDel > 0) { deleteCount(cmd, cntDel); @@ -1639,8 +1511,8 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { } // match select ... - int len = cmd->commandSize; - char * p = cmd->command; + int len = cmd->commandSize; + char* p = cmd->command; // remove prefix blank while (p[0] == ' ' && len > 0) { @@ -1649,12 +1521,12 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { } // special range - if(len < 7 || len > 1024) { + if (len < 7 || len > 1024) { return false; } - // select and from - if(strncasecmp(p, "create table ", 13) != 0) { + // select and from + if (strncasecmp(p, "create table ", 13) != 0) { // not select query clause return false; } @@ -1662,8 +1534,8 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { len -= 13; char* ps = strndup(p, len); - bool ret = false; - char * last = lastWord(ps); + bool ret = false; + char* last = lastWord(ps); // check in create fields or tags input area if (isCreateFieldsArea(ps)) { @@ -1673,9 +1545,9 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { // tags if (!ret) { // find only one ')' , can insert tags - char * p1 = strchr(ps, ')'); + char* p1 = strchr(ps, ')'); if (p1) { - if(strchr(p1 + 1, ')') == NULL && strstr(p1 + 1, "tags") == NULL) { + if (strchr(p1 + 1, ')') == NULL && strstr(p1 + 1, "tags") == NULL) { // can insert tags keyword ret = fillWithType(con, cmd, last, WT_VAR_KEYTAGS); } @@ -1685,9 +1557,9 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { // tb options if (!ret) { // find like create talbe st (...) tags(..) - char * p1 = strchr(ps, ')'); // first ')' end + char* p1 = strchr(ps, ')'); // first ')' end if (p1) { - if(strchr(p1 + 1, ')')) { // second ')' end + if (strchr(p1 + 1, ')')) { // second ')' end // here is tb options area, can insert option ret = fillWithType(con, cmd, last, WT_VAR_TBOPTION); } @@ -1698,8 +1570,8 @@ bool matchCreateTable(TAOS * con, SShellCmd * cmd) { return ret; } -bool matchOther(TAOS * con, SShellCmd * cmd) { - int len = cmd->commandSize; +bool matchOther(TAOS* con, SShellCmd* cmd) { + int len = cmd->commandSize; char* p = cmd->command; // '\\' @@ -1711,8 +1583,7 @@ bool matchOther(TAOS * con, SShellCmd * cmd) { } // too small - if(len < 8) - return false; + if (len < 8) return false; // like 'from ( ' char* sql = strndup(p, len); @@ -1721,36 +1592,35 @@ bool matchOther(TAOS * con, SShellCmd * cmd) { if (strcmp(last, "from(") == 0) { fillWithType(con, cmd, "", WT_VAR_KEYSELECT); taosMemoryFree(sql); - return true; + return true; } if (strncmp(last, "(", 1) == 0) { - last += 1; + last += 1; } char* from = strstr(sql, " from"); // find last ' from' while (from) { char* p1 = strstr(from + 5, " from"); - if (p1 == NULL) - break; + if (p1 == NULL) break; from = p1; } if (from) { // find next is '(' - char * p2 = from + 5; - bool found = false; // found 'from ... ( ...' ... is any count of blank - bool found1 = false; // found '(' + char* p2 = from + 5; + bool found = false; // found 'from ... ( ...' ... is any count of blank + bool found1 = false; // found '(' while (1) { - if ( p2 == last || *p2 == '\0') { + if (p2 == last || *p2 == '\0') { // last word or string end if (found1) { found = true; } break; - } else if(*p2 == '(') { + } else if (*p2 == '(') { found1 = true; - } else if(*p2 == ' ') { + } else if (*p2 == ' ') { // do nothing } else { // have any other char @@ -1768,24 +1638,22 @@ bool matchOther(TAOS * con, SShellCmd * cmd) { } } - // INSERT - + // INSERT taosMemoryFree(sql); - + return false; } - // main key press tab -void pressTabKey(SShellCmd * cmd) { - // check - if (cmd->commandSize == 0) { +void pressTabKey(SShellCmd* cmd) { + // check + if (cmd->commandSize == 0) { // empty showHelp(); shellShowOnScreen(cmd); - return ; - } + return; + } // save connection to global varCmd = cmd; @@ -1793,45 +1661,41 @@ void pressTabKey(SShellCmd * cmd) { // manual match like create table st( ... matched = matchCreateTable(varCon, cmd); - if (matched) - return ; + if (matched) return; - // shellCommands match + // shellCommands match if (firstMatchIndex == -1) { matched = firstMatchCommand(varCon, cmd); } else { matched = nextMatchCommand(varCon, cmd, &shellCommands[firstMatchIndex]); } - if (matched) - return ; + if (matched) return; // NOT MATCHED ANYONE // match other like '\G' ... matched = matchOther(varCon, cmd); - if (matched) - return ; + if (matched) return; // manual match like select * from ... matched = matchSelectQuery(varCon, cmd); - if (matched) - return ; + if (matched) return; - return ; + return; } // press othr key void pressOtherKey(char c) { // reset global variant firstMatchIndex = -1; - lastMatchIndex = -1; - curMatchIndex = -1; - lastWordBytes = -1; + lastMatchIndex = -1; + curMatchIndex = -1; + lastWordBytes = -1; // var names - cursorVar = -1; - varMode = false; + cursorVar = -1; + varMode = false; waitAutoFill = false; - cntDel = 0; + cntDel = 0; if (lastMatch) { freeMatch(lastMatch); @@ -1840,18 +1704,18 @@ void pressOtherKey(char c) { } // put name into name, return name length -int getWordName(char* p, char * name, int nameLen) { - //remove prefix blank +int getWordName(char* p, char* name, int nameLen) { + // remove prefix blank while (*p == ' ') { p++; } // get databases name; int i = 0; - while(p[i] != 0 && i < nameLen - 1) { - name[i] = p[i]; + while (p[i] != 0 && i < nameLen - 1) { + name[i] = p[i]; i++; - if(p[i] == ' ' || p[i] == ';'|| p[i] == '(') { + if (p[i] == ' ' || p[i] == ';' || p[i] == '(') { // name end break; } @@ -1862,22 +1726,22 @@ int getWordName(char* p, char * name, int nameLen) { } // deal use db, if have 'use' return true -bool dealUseDB(char * sql) { - // check use keyword - if(strncasecmp(sql, "use ", 4) != 0) { +bool dealUseDB(char* sql) { + // check use keyword + if (strncasecmp(sql, "use ", 4) != 0) { return false; } - - char db[256]; - char *p = sql + 4; + + char db[256]; + char* p = sql + 4; if (getWordName(p, db, sizeof(db)) == 0) { - // no name , return + // no name , return return true; } // dbName is previous use open db name if (strcasecmp(db, dbName) == 0) { - // same , no need switch + // same , no need switch return true; } @@ -1886,13 +1750,13 @@ bool dealUseDB(char * sql) { // STABLE set null STire* tire = tires[WT_VAR_STABLE]; tires[WT_VAR_STABLE] = NULL; - if(tire) { + if (tire) { freeTire(tire); } // TABLE set null tire = tires[WT_VAR_TABLE]; tires[WT_VAR_TABLE] = NULL; - if(tire) { + if (tire) { freeTire(tire); } // save @@ -1903,16 +1767,16 @@ bool dealUseDB(char * sql) { } // deal create, if have 'create' return true -bool dealCreateCommand(char * sql) { - // check keyword - if(strncasecmp(sql, "create ", 7) != 0) { +bool dealCreateCommand(char* sql) { + // check keyword + if (strncasecmp(sql, "create ", 7) != 0) { return false; } - - char name[1024]; - char *p = sql + 7; + + char name[1024]; + char* p = sql + 7; if (getWordName(p, name, sizeof(name)) == 0) { - // no name , return + // no name , return return true; } @@ -1921,7 +1785,7 @@ bool dealCreateCommand(char * sql) { if (strcasecmp(name, "database") == 0) { type = WT_VAR_DBNAME; } else if (strcasecmp(name, "table") == 0) { - if(strstr(sql, " tags") != NULL && strstr(sql, " using ") == NULL) + if (strstr(sql, " tags") != NULL && strstr(sql, " using ") == NULL) type = WT_VAR_STABLE; else type = WT_VAR_TABLE; @@ -1932,7 +1796,7 @@ bool dealCreateCommand(char * sql) { } else if (strcasecmp(name, "stream") == 0) { type = WT_VAR_STREAM; } else { - // no match , return + // no match , return return true; } @@ -1941,7 +1805,7 @@ bool dealCreateCommand(char * sql) { // get next word , that is table name if (getWordName(p, name, sizeof(name)) == 0) { - // no name , return + // no name , return return true; } @@ -1949,7 +1813,7 @@ bool dealCreateCommand(char * sql) { taosThreadMutexLock(&tiresMutex); // STABLE set null STire* tire = tires[type]; - if(tire) { + if (tire) { insertWord(tire, name); } taosThreadMutexUnlock(&tiresMutex); @@ -1958,16 +1822,16 @@ bool dealCreateCommand(char * sql) { } // deal create, if have 'drop' return true -bool dealDropCommand(char * sql) { - // check keyword - if(strncasecmp(sql, "drop ", 5) != 0) { +bool dealDropCommand(char* sql) { + // check keyword + if (strncasecmp(sql, "drop ", 5) != 0) { return false; } - - char name[1024]; - char *p = sql + 5; + + char name[1024]; + char* p = sql + 5; if (getWordName(p, name, sizeof(name)) == 0) { - // no name , return + // no name , return return true; } @@ -1986,7 +1850,7 @@ bool dealDropCommand(char * sql) { } else if (strcasecmp(name, "stream") == 0) { type = WT_VAR_STREAM; } else { - // no match , return + // no match , return return true; } @@ -1995,30 +1859,27 @@ bool dealDropCommand(char * sql) { // get next word , that is table name if (getWordName(p, name, sizeof(name)) == 0) { - // no name , return + // no name , return return true; } // switch new db taosThreadMutexLock(&tiresMutex); // STABLE set null - if(type == WT_VAR_ALLTABLE) { + if (type == WT_VAR_ALLTABLE) { bool del = false; // del in stable STire* tire = tires[WT_VAR_STABLE]; - if(tire) - del = deleteWord(tire, name); + if (tire) del = deleteWord(tire, name); // del in table - if(!del) { + if (!del) { tire = tires[WT_VAR_TABLE]; - if(tire) - del = deleteWord(tire, name); + if (tire) del = deleteWord(tire, name); } } else { // OTHER TYPE STire* tire = tires[type]; - if(tire) - deleteWord(tire, name); + if (tire) deleteWord(tire, name); } taosThreadMutexUnlock(&tiresMutex); @@ -2027,26 +1888,26 @@ bool dealDropCommand(char * sql) { // callback autotab module after shell sql execute void callbackAutoTab(char* sqlstr, TAOS* pSql, bool usedb) { - char * sql = sqlstr; + char* sql = sqlstr; // remove prefix blank while (*sql == ' ') { sql++; } - if(dealUseDB(sql)) { + if (dealUseDB(sql)) { // change to new db - return ; + return; } // create command add name to autotab - if(dealCreateCommand(sql)) { - return ; + if (dealCreateCommand(sql)) { + return; } // drop command remove name from autotab - if(dealDropCommand(sql)) { - return ; + if (dealDropCommand(sql)) { + return; } - return ; + return; } diff --git a/tools/shell/src/shellCommand.c b/tools/shell/src/shellCommand.c index cffa02824e..0b26d685fd 100644 --- a/tools/shell/src/shellCommand.c +++ b/tools/shell/src/shellCommand.c @@ -417,8 +417,9 @@ char taosGetConsoleChar() { static char mbStr[5]; static unsigned long bufLen = 0; static uint16_t bufIndex = 0, mbStrIndex = 0, mbStrLen = 0; + CONSOLE_READCONSOLE_CONTROL inputControl={ sizeof(CONSOLE_READCONSOLE_CONTROL), 0, 1< 0 && buf[0] == 0) bufLen = 0; bufIndex = 0; } diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c index 066b3a0156..fd0ea60323 100644 --- a/tools/shell/src/shellEngine.c +++ b/tools/shell/src/shellEngine.c @@ -88,9 +88,15 @@ int32_t shellRunSingleCommand(char *command) { if (shellRegexMatch(command, "^[ \t]*source[\t ]+[^ ]+[ \t;]*$", REG_EXTENDED | REG_ICASE)) { /* If source file. */ char *c_ptr = strtok(command, " ;"); - assert(c_ptr != NULL); + if (c_ptr == NULL) { + shellRunSingleCommandImp(command); + return 0; + } c_ptr = strtok(NULL, " ;"); - assert(c_ptr != NULL); + if (c_ptr == NULL) { + shellRunSingleCommandImp(command); + return 0; + } shellSourceFile(c_ptr); return 0; } @@ -781,9 +787,9 @@ void shellReadHistory() { TdFilePtr pFile = taosOpenFile(pHistory->file, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) return; - char *line = NULL; + char *line = taosMemoryMalloc(TSDB_MAX_ALLOWED_SQL_LEN + 1); int32_t read_size = 0; - while ((read_size = taosGetLineFile(pFile, &line)) != -1) { + while ((read_size = taosGetsFile(pFile, TSDB_MAX_ALLOWED_SQL_LEN, line)) != -1) { line[read_size - 1] = '\0'; taosMemoryFree(pHistory->hist[pHistory->hend]); pHistory->hist[pHistory->hend] = strdup(line); @@ -795,7 +801,7 @@ void shellReadHistory() { } } - if (line != NULL) taosMemoryFree(line); + taosMemoryFreeClear(line); taosCloseFile(&pFile); int64_t file_size; if (taosStatFile(pHistory->file, &file_size, NULL) == 0 && file_size > SHELL_MAX_COMMAND_SIZE) { @@ -859,7 +865,6 @@ void shellSourceFile(const char *file) { int32_t read_len = 0; char *cmd = taosMemoryCalloc(1, TSDB_MAX_ALLOWED_SQL_LEN + 1); size_t cmd_len = 0; - char *line = NULL; char fullname[PATH_MAX] = {0}; char sourceFileCommand[PATH_MAX + 8] = {0}; @@ -877,7 +882,8 @@ void shellSourceFile(const char *file) { return; } - while ((read_len = taosGetLineFile(pFile, &line)) != -1) { + char *line = taosMemoryMalloc(TSDB_MAX_ALLOWED_SQL_LEN + 1); + while ((read_len = taosGetsFile(pFile, TSDB_MAX_ALLOWED_SQL_LEN, line)) != -1) { if (read_len >= TSDB_MAX_ALLOWED_SQL_LEN) continue; line[--read_len] = '\0'; @@ -904,7 +910,7 @@ void shellSourceFile(const char *file) { } taosMemoryFree(cmd); - if (line != NULL) taosMemoryFree(line); + taosMemoryFreeClear(line); taosCloseFile(&pFile); } @@ -1106,7 +1112,9 @@ int32_t shellExecute() { #ifdef WEBSOCKET if (!shell.args.restful && !shell.args.cloud) { #endif +#ifndef WINDOWS printfIntroduction(); +#endif shellGetGrantInfo(); #ifdef WEBSOCKET } diff --git a/tools/shell/src/shellTire.c b/tools/shell/src/shellTire.c index dc5efa4e8d..2f1ee12d54 100644 --- a/tools/shell/src/shellTire.c +++ b/tools/shell/src/shellTire.c @@ -22,414 +22,405 @@ // create prefix search tree STire* createTire(char type) { - STire* tire = taosMemoryMalloc(sizeof(STire)); - memset(tire, 0, sizeof(STire)); - tire->ref = 1; // init is 1 - tire->type = type; - tire->root.d = (STireNode **)taosMemoryCalloc(CHAR_CNT, sizeof(STireNode *)); - return tire; + STire* tire = taosMemoryMalloc(sizeof(STire)); + memset(tire, 0, sizeof(STire)); + tire->ref = 1; // init is 1 + tire->type = type; + tire->root.d = (STireNode**)taosMemoryCalloc(CHAR_CNT, sizeof(STireNode*)); + return tire; } // free tire node void freeTireNode(STireNode* node) { - if (node == NULL) - return ; - - // nest free sub node on array d - if(node->d) { - for (int i = 0; i < CHAR_CNT; i++) { - freeTireNode(node->d[i]); - } - taosMemoryFree(node->d); - } + if (node == NULL) return; - // free self - taosMemoryFree(node); + // nest free sub node on array d + if (node->d) { + for (int i = 0; i < CHAR_CNT; i++) { + freeTireNode(node->d[i]); + } + taosMemoryFree(node->d); + } + + // free self + taosMemoryFree(node); } // destroy prefix search tree void freeTire(STire* tire) { - // free nodes - for (int i = 0; i < CHAR_CNT; i++) { - freeTireNode(tire->root.d[i]); - } - taosMemoryFree(tire->root.d); + // free nodes + for (int i = 0; i < CHAR_CNT; i++) { + freeTireNode(tire->root.d[i]); + } + taosMemoryFree(tire->root.d); - // free from list - StrName * item = tire->head; - while (item) { - StrName * next = item->next; - // free string - taosMemoryFree(item->name); - // free node - taosMemoryFree(item); + // free from list + StrName* item = tire->head; + while (item) { + StrName* next = item->next; + // free string + taosMemoryFree(item->name); + // free node + taosMemoryFree(item); - // move next - item = next; - } - tire->head = tire->tail = NULL; + // move next + item = next; + } + tire->head = tire->tail = NULL; - // free tire - taosMemoryFree(tire); + // free tire + taosMemoryFree(tire); } // insert a new word to list bool insertToList(STire* tire, char* word) { - StrName * p = (StrName *)taosMemoryMalloc(sizeof(StrName)); - p->name = strdup(word); - p->next = NULL; - - if(tire->head == NULL) { - tire->head = p; - tire->tail = p; - }else { - tire->tail->next = p; - tire->tail = p; - } + StrName* p = (StrName*)taosMemoryMalloc(sizeof(StrName)); + p->name = strdup(word); + p->next = NULL; - return true; + if (tire->head == NULL) { + tire->head = p; + tire->tail = p; + } else { + tire->tail->next = p; + tire->tail = p; + } + + return true; } // insert a new word to tree bool insertToTree(STire* tire, char* word, int len) { - int m = 0; - STireNode ** nodes = tire->root.d; - for (int i = 0; i < len; i++) { - m = word[i] - FIRST_ASCII; - if (m < 0 || m > CHAR_CNT) { - return false; - } - - if (nodes[m] == NULL) { - // no pointer - STireNode* p = (STireNode* )taosMemoryMalloc(sizeof(STireNode)); - memset(p, 0, sizeof(STireNode)); - nodes[m] = p; - if (i == len - 1) { - // is end - p->end = true; - break; - } - } - - if (nodes[m]->d == NULL) { - // malloc d - nodes[m]->d = (STireNode **)taosMemoryCalloc(CHAR_CNT, sizeof(STireNode *)); - } - - // move to next node - nodes = nodes[m]->d; + int m = 0; + STireNode** nodes = tire->root.d; + for (int i = 0; i < len; i++) { + m = word[i] - FIRST_ASCII; + if (m < 0 || m > CHAR_CNT) { + return false; } - // add count - tire->count += 1; - return true; + if (nodes[m] == NULL) { + // no pointer + STireNode* p = (STireNode*)taosMemoryMalloc(sizeof(STireNode)); + memset(p, 0, sizeof(STireNode)); + nodes[m] = p; + if (i == len - 1) { + // is end + p->end = true; + break; + } + } + + if (nodes[m]->d == NULL) { + // malloc d + nodes[m]->d = (STireNode**)taosMemoryCalloc(CHAR_CNT, sizeof(STireNode*)); + } + + // move to next node + nodes = nodes[m]->d; + } + + // add count + tire->count += 1; + return true; } -// insert a new word +// insert a new word bool insertWord(STire* tire, char* word) { - int len = strlen(word); - if (len >= MAX_WORD_LEN) { - return false; - } - - switch (tire->type) { - case TIRE_TREE: - return insertToTree(tire, word, len); - case TIRE_LIST: - return insertToList(tire, word); - default: - break; - } + int len = strlen(word); + if (len >= MAX_WORD_LEN) { return false; + } + + switch (tire->type) { + case TIRE_TREE: + return insertToTree(tire, word, len); + case TIRE_LIST: + return insertToList(tire, word); + default: + break; + } + return false; } // delete one word from list bool deleteFromList(STire* tire, char* word) { - StrName * item = tire->head; - while (item) { - if (strcmp(item->name, word) == 0) { - // found, reset empty to delete - item->name[0] = 0; - } - - // move next - item = item->next; + StrName* item = tire->head; + while (item) { + if (strcmp(item->name, word) == 0) { + // found, reset empty to delete + item->name[0] = 0; } - return true; + + // move next + item = item->next; + } + return true; } -// delete one word from tree +// delete one word from tree bool deleteFromTree(STire* tire, char* word, int len) { - int m = 0; - bool del = false; + int m = 0; + bool del = false; - STireNode** nodes = tire->root.d; - for (int i = 0; i < len; i++) { - m = word[i] - FIRST_ASCII; - if (m < 0 || m >= CHAR_CNT) { - return false; - } - - if (nodes[m] == NULL) { - // no found - return false; - } else { - // not null - if(i == len - 1) { - // this is last, only set end false , not free node - nodes[m]->end = false; - del = true; - break; - } - } - - if(nodes[m]->d == NULL) - break; - // move to next node - nodes = nodes[m]->d; + STireNode** nodes = tire->root.d; + for (int i = 0; i < len; i++) { + m = word[i] - FIRST_ASCII; + if (m < 0 || m >= CHAR_CNT) { + return false; } - // reduce count - if (del) { - tire->count -= 1; - } - - return del; -} - -// insert a new word -bool deleteWord(STire* tire, char* word) { - int len = strlen(word); - if (len >= MAX_WORD_LEN) { - return false; - } - - switch (tire->type) { - case TIRE_TREE: - return deleteFromTree(tire, word, len); - case TIRE_LIST: - return deleteFromList(tire, word); - default: - break; - } - return false; -} - -void addWordToMatch(SMatch* match, char* word){ - // malloc new - SMatchNode* node = (SMatchNode* )taosMemoryMalloc(sizeof(SMatchNode)); - memset(node, 0, sizeof(SMatchNode)); - node->word = strdup(word); - - // append to match - if (match->head == NULL) { - match->head = match->tail = node; + if (nodes[m] == NULL) { + // no found + return false; } else { - match->tail->next = node; - match->tail = node; + // not null + if (i == len - 1) { + // this is last, only set end false , not free node + nodes[m]->end = false; + del = true; + break; + } } - match->count += 1; + + if (nodes[m]->d == NULL) break; + // move to next node + nodes = nodes[m]->d; + } + + // reduce count + if (del) { + tire->count -= 1; + } + + return del; +} + +// insert a new word +bool deleteWord(STire* tire, char* word) { + int len = strlen(word); + if (len >= MAX_WORD_LEN) { + return false; + } + + switch (tire->type) { + case TIRE_TREE: + return deleteFromTree(tire, word, len); + case TIRE_LIST: + return deleteFromList(tire, word); + default: + break; + } + return false; +} + +void addWordToMatch(SMatch* match, char* word) { + // malloc new + SMatchNode* node = (SMatchNode*)taosMemoryMalloc(sizeof(SMatchNode)); + memset(node, 0, sizeof(SMatchNode)); + node->word = strdup(word); + + // append to match + if (match->head == NULL) { + match->head = match->tail = node; + } else { + match->tail->next = node; + match->tail = node; + } + match->count += 1; } // enum all words from node -void enumAllWords(STireNode** nodes, char* prefix, SMatch* match) { - STireNode * c; - char word[MAX_WORD_LEN]; - int len = strlen(prefix); - for (int i = 0; i < CHAR_CNT; i++) { - c = nodes[i]; - - if (c == NULL) { - // chain end node - continue; - } else { - // combine word string - memset(word, 0, sizeof(word)); - strcpy(word, prefix); - word[len] = FIRST_ASCII + i; // append current char +void enumAllWords(STireNode** nodes, char* prefix, SMatch* match) { + STireNode* c; + char word[MAX_WORD_LEN]; + int len = strlen(prefix); + for (int i = 0; i < CHAR_CNT; i++) { + c = nodes[i]; - // chain middle node - if (c->end) { - // have end flag - addWordToMatch(match, word); - } - // nested call next layer - if (c->d) - enumAllWords(c->d, word, match); - } + if (c == NULL) { + // chain end node + continue; + } else { + // combine word string + memset(word, 0, sizeof(word)); + strcpy(word, prefix); + word[len] = FIRST_ASCII + i; // append current char + + // chain middle node + if (c->end) { + // have end flag + addWordToMatch(match, word); + } + // nested call next layer + if (c->d) enumAllWords(c->d, word, match); } + } } // match prefix from list void matchPrefixFromList(STire* tire, char* prefix, SMatch* match) { - StrName * item = tire->head; - int len = strlen(prefix); - while (item) { - if ( strncmp(item->name, prefix, len) == 0) { - // prefix matched - addWordToMatch(match, item->name); - } - - // move next - item = item->next; + StrName* item = tire->head; + int len = strlen(prefix); + while (item) { + if (strncmp(item->name, prefix, len) == 0) { + // prefix matched + addWordToMatch(match, item->name); } + + // move next + item = item->next; + } } // match prefix words, if match is not NULL , put all item to match and return match void matchPrefixFromTree(STire* tire, char* prefix, SMatch* match) { - SMatch* root = match; - int m = 0; - STireNode* c = 0; - int len = strlen(prefix); - if (len >= MAX_WORD_LEN) { - return; + SMatch* root = match; + int m = 0; + STireNode* c = 0; + int len = strlen(prefix); + if (len >= MAX_WORD_LEN) { + return; + } + + STireNode** nodes = tire->root.d; + for (int i = 0; i < len; i++) { + m = prefix[i] - FIRST_ASCII; + if (m < 0 || m > CHAR_CNT) { + return; } - STireNode** nodes = tire->root.d; - for (int i = 0; i < len; i++) { - m = prefix[i] - FIRST_ASCII; - if (m < 0 || m > CHAR_CNT) { - return; - } - - // match - c = nodes[m]; - if (c == NULL) { - // arrive end - break; - } - - // previous items already matched - if (i == len - 1) { - // malloc match if not pass by param match - if (root == NULL) { - root = (SMatch* )taosMemoryMalloc(sizeof(SMatch)); - memset(root, 0, sizeof(SMatch)); - strcpy(root->pre, prefix); - } - - // prefix is match to end char - if (c->d) - enumAllWords(c->d, prefix, root); - } else { - // move to next node continue match - if(c->d == NULL) - break; - nodes = c->d; - } + // match + c = nodes[m]; + if (c == NULL) { + // arrive end + break; } - // return - return ; + // previous items already matched + if (i == len - 1) { + // malloc match if not pass by param match + if (root == NULL) { + root = (SMatch*)taosMemoryMalloc(sizeof(SMatch)); + memset(root, 0, sizeof(SMatch)); + strcpy(root->pre, prefix); + } + + // prefix is match to end char + if (c->d) enumAllWords(c->d, prefix, root); + } else { + // move to next node continue match + if (c->d == NULL) break; + nodes = c->d; + } + } + + // return + return; } SMatch* matchPrefix(STire* tire, char* prefix, SMatch* match) { - if(match == NULL) { - match = (SMatch* )taosMemoryMalloc(sizeof(SMatch)); - memset(match, 0, sizeof(SMatch)); - } + if (match == NULL) { + match = (SMatch*)taosMemoryMalloc(sizeof(SMatch)); + memset(match, 0, sizeof(SMatch)); + } - switch (tire->type) { - case TIRE_TREE: - matchPrefixFromTree(tire, prefix, match); - case TIRE_LIST: - matchPrefixFromList(tire, prefix, match); - default: - break; - } + switch (tire->type) { + case TIRE_TREE: + matchPrefixFromTree(tire, prefix, match); + case TIRE_LIST: + matchPrefixFromList(tire, prefix, match); + default: + break; + } - // return if need - if (match->count == 0) { - freeMatch(match); - match = NULL; - } + // return if need + if (match->count == 0) { + freeMatch(match); + match = NULL; + } - return match; + return match; } - // get all items from tires tree void enumFromList(STire* tire, SMatch* match) { - StrName * item = tire->head; - while (item) { - if (item->name[0] != 0) { - // not delete - addWordToMatch(match, item->name); - } - - // move next - item = item->next; + StrName* item = tire->head; + while (item) { + if (item->name[0] != 0) { + // not delete + addWordToMatch(match, item->name); } + + // move next + item = item->next; + } } // get all items from tires tree void enumFromTree(STire* tire, SMatch* match) { - char pre[2] ={0, 0}; - STireNode* c; - - // enum first layer - for (int i = 0; i < CHAR_CNT; i++) { - pre[0] = FIRST_ASCII + i; - - // each node - c = tire->root.d[i]; - if (c == NULL) { - // this branch no data - continue; - } + char pre[2] = {0, 0}; + STireNode* c; - // this branch have data - if(c->end) - addWordToMatch(match, pre); - else - matchPrefix(tire, pre, match); + // enum first layer + for (int i = 0; i < CHAR_CNT; i++) { + pre[0] = FIRST_ASCII + i; + + // each node + c = tire->root.d[i]; + if (c == NULL) { + // this branch no data + continue; } + + // this branch have data + if (c->end) + addWordToMatch(match, pre); + else + matchPrefix(tire, pre, match); + } } // get all items from tires tree SMatch* enumAll(STire* tire) { - SMatch* match = (SMatch* )taosMemoryMalloc(sizeof(SMatch)); - memset(match, 0, sizeof(SMatch)); + SMatch* match = (SMatch*)taosMemoryMalloc(sizeof(SMatch)); + memset(match, 0, sizeof(SMatch)); - switch (tire->type) { - case TIRE_TREE: - enumFromTree(tire, match); - case TIRE_LIST: - enumFromList(tire, match); - default: - break; - } + switch (tire->type) { + case TIRE_TREE: + enumFromTree(tire, match); + case TIRE_LIST: + enumFromList(tire, match); + default: + break; + } - // return if need - if (match->count == 0) { - freeMatch(match); - match = NULL; - } + // return if need + if (match->count == 0) { + freeMatch(match); + match = NULL; + } - return match; + return match; } - // free match result void freeMatchNode(SMatchNode* node) { - // first free next - if (node->next) - freeMatchNode(node->next); + // first free next + if (node->next) freeMatchNode(node->next); - // second free self - if (node->word) - taosMemoryFree(node->word); - taosMemoryFree(node); + // second free self + if (node->word) taosMemoryFree(node->word); + taosMemoryFree(node); } // free match result void freeMatch(SMatch* match) { - // first free next - if (match->head) { - freeMatchNode(match->head); - } + // first free next + if (match->head) { + freeMatchNode(match->head); + } - // second free self - taosMemoryFree(match); -} + // second free self + taosMemoryFree(match); +} \ No newline at end of file