diff --git a/.gitignore b/.gitignore
index 65e03e1933b6aa23718c9e58cc193794a19564ea..a69d2e44bd7eadf27d721ccf13c47ea91f6164ba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -101,6 +101,7 @@ tests/examples/JDBC/JDBCDemo/.settings/
source/libs/parser/inc/sql.*
tests/script/tmqResult.txt
tests/tmqResult.txt
+tests/script/jenkins/basic.txt
# Emacs
# -*- mode: gitignore; -*-
diff --git a/Jenkinsfile2 b/Jenkinsfile2
index de39f4fcecc53ce3d544d41f65a1d29761002c5b..80f6b8e9e78e35acba85418e7237d34197541b89 100644
--- a/Jenkinsfile2
+++ b/Jenkinsfile2
@@ -201,6 +201,7 @@ def pre_test_win(){
'''
bat '''
cd %WIN_COMMUNITY_ROOT%
+ git clean -fxd
git reset --hard
git remote prune origin
git fetch
@@ -361,7 +362,7 @@ pipeline {
}
parallel {
stage('check docs') {
- agent{label " worker03 || slave215 || slave217 || slave219 || Mac_catalina "}
+ agent{label " slave1_47 || slave1_48 || slave1_49 || slave1_52 || worker03 || slave215 || slave217 || slave219 || Mac_catalina "}
steps {
check_docs()
}
@@ -407,7 +408,7 @@ pipeline {
}
}
stage('linux test') {
- agent{label " worker03 || slave215 || slave217 || slave219 "}
+ agent{label " slave1_47 || slave1_48 || slave1_49 || slave1_52 || worker03 || slave215 || slave217 || slave219 "}
options { skipDefaultCheckout() }
when {
changeRequest()
diff --git a/README-CN.md b/README-CN.md
index 437d671bb97a1009f5d48d2423a3d17f75bf1494..a5d239a53296b5a7d96a3e1624879386ab57bf13 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -60,7 +60,7 @@ sudo apt-get install -y gcc cmake build-essential git libssl-dev
为了在 Ubuntu/Debian 系统上编译 [taos-tools](https://github.com/taosdata/taos-tools) 需要安装如下软件:
```bash
-sudo apt install build-essential libjansson-dev libsnappy-dev liblzma-dev libz-dev pkg-config
+sudo apt install build-essential libjansson-dev libsnappy-dev liblzma-dev libz-dev zlib1g pkg-config
```
### CentOS 7.9
@@ -85,7 +85,7 @@ sudo dnf install -y gcc gcc-c++ make cmake epel-release git openssl-devel
```
-sudo yum install -y zlib-devel xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libstdc++-static openssl-devel
+sudo yum install -y zlib-devel zlib-static xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libatomic-static libstdc++-static openssl-devel
```
#### CentOS 8/Rocky Linux
@@ -94,7 +94,7 @@ sudo yum install -y zlib-devel xz-devel snappy-devel jansson jansson-devel pkgco
sudo yum install -y epel-release
sudo yum install -y dnf-plugins-core
sudo yum config-manager --set-enabled powertools
-sudo yum install -y zlib-devel xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libstdc++-static openssl-devel
+sudo yum install -y zlib-devel zlib-static xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libatomic-static libstdc++-static openssl-devel
```
注意:由于 snappy 缺乏 pkg-config 支持(参考 [链接](https://github.com/google/snappy/pull/86)),会导致 cmake 提示无法发现 libsnappy,实际上工作正常。
diff --git a/README.md b/README.md
index 8d2567a816f9048cd689afa06426e9c88979a354..05c1c075f0c3b3894c93d0aa2e126a9dc6340758 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ TDengine is an open source, high-performance, cloud native [time-series database
- **[Easy Data Analytics](https://tdengine.com/tdengine/time-series-data-analytics-made-easy/)**: Through super tables, storage and compute separation, data partitioning by time interval, pre-computation and other means, TDengine makes it easy to explore, format, and get access to data in a highly efficient way.
-- **[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.
+- **[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 19.9k 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/). The easiest way to experience TDengine is through [TDengine Cloud](https://cloud.tdengine.com).
@@ -62,7 +62,7 @@ sudo apt-get install -y gcc cmake build-essential git libssl-dev
To build the [taosTools](https://github.com/taosdata/taos-tools) on Ubuntu/Debian, the following packages need to be installed.
```bash
-sudo apt install build-essential libjansson-dev libsnappy-dev liblzma-dev libz-dev pkg-config
+sudo apt install build-essential libjansson-dev libsnappy-dev liblzma-dev libz-dev zlib1g pkg-config
```
### CentOS 7.9
@@ -85,7 +85,7 @@ sudo dnf install -y gcc gcc-c++ make cmake epel-release git openssl-devel
#### CentOS 7.9
```
-sudo yum install -y zlib-devel xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libstdc++-static openssl-devel
+sudo yum install -y zlib-devel zlib-static xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libatomic-static libstdc++-static openssl-devel
```
#### CentOS 8/Rocky Linux
@@ -94,7 +94,7 @@ sudo yum install -y zlib-devel xz-devel snappy-devel jansson jansson-devel pkgco
sudo yum install -y epel-release
sudo yum install -y dnf-plugins-core
sudo yum config-manager --set-enabled powertools
-sudo yum install -y zlib-devel xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libstdc++-static openssl-devel
+sudo yum install -y zlib-devel zlib-static xz-devel snappy-devel jansson jansson-devel pkgconfig libatomic libatomic-static libstdc++-static openssl-devel
```
Note: Since snappy lacks pkg-config support (refer to [link](https://github.com/google/snappy/pull/86)), it leads a cmake prompt libsnappy not found. But snappy still works well.
diff --git a/cmake/cmake.define b/cmake/cmake.define
index 3f152f1f093e5eaf05f9883b874b195cdd785ca2..e34785cba6846d133d3d80c334089542cee8ac9d 100644
--- a/cmake/cmake.define
+++ b/cmake/cmake.define
@@ -123,14 +123,20 @@ ELSE ()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
ENDIF ()
- MESSAGE("System processor ID: ${CMAKE_SYSTEM_PROCESSOR}")
IF (TD_INTEL_64 OR TD_INTEL_32)
ADD_DEFINITIONS("-msse4.2")
IF("${FMA_SUPPORT}" MATCHES "true")
- MESSAGE(STATUS "turn fma function support on")
+ MESSAGE(STATUS "fma function supported")
ADD_DEFINITIONS("-mfma")
ELSE ()
- MESSAGE(STATUS "turn fma function support off")
+ MESSAGE(STATUS "fma function NOT supported")
+ ENDIF()
+
+ IF("${SIMD_SUPPORT}" MATCHES "true")
+ ADD_DEFINITIONS("-mavx -mavx2")
+ MESSAGE(STATUS "SIMD instructions (AVX/AVX2) is ACTIVATED")
+ ELSE()
+ MESSAGE(STATUS "SIMD instruction (AVX/AVX2)is NOT ACTIVATED")
ENDIF()
ENDIF ()
diff --git a/cmake/cmake.platform b/cmake/cmake.platform
index eb8b63b4c2f282b141d9fc1c4951819e36b06d42..711d74fa4cd94cb5c3e7527d816dd876f5f72148 100644
--- a/cmake/cmake.platform
+++ b/cmake/cmake.platform
@@ -1,20 +1,17 @@
cmake_minimum_required(VERSION 3.0)
-MESSAGE("Current system is ${CMAKE_SYSTEM_NAME}")
-
# init
SET(TD_LINUX FALSE)
SET(TD_WINDOWS FALSE)
SET(TD_DARWIN FALSE)
-MESSAGE("Compiler ID: ${CMAKE_CXX_COMPILER_ID}")
if(CMAKE_COMPILER_IS_GNUCXX MATCHES 1)
set(CXX_COMPILER_IS_GNU TRUE)
else()
set(CXX_COMPILER_IS_GNU FALSE)
endif()
-MESSAGE("Current system name is ${CMAKE_SYSTEM_NAME}.")
+MESSAGE("Current system: ${CMAKE_SYSTEM_NAME}")
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
@@ -26,6 +23,8 @@ IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin
set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -undefined dynamic_lookup")
ENDIF ()
+ MESSAGE("Current system processor: ${CMAKE_SYSTEM_PROCESSOR}")
+
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
SET(TD_LINUX TRUE)
@@ -44,7 +43,6 @@ IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin
SET(OSTYPE "macOS")
ADD_DEFINITIONS("-DDARWIN -Wno-tautological-pointer-compare")
- MESSAGE("Current system processor is ${CMAKE_SYSTEM_PROCESSOR}.")
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64")
MESSAGE("Current system arch is arm64")
SET(TD_DARWIN_64 TRUE)
@@ -80,24 +78,24 @@ ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
ENDIF()
IF ("${CPUTYPE}" STREQUAL "")
- MESSAGE(STATUS "The current platform " ${CMAKE_SYSTEM_PROCESSOR} " is detected")
-
IF (CMAKE_SYSTEM_PROCESSOR MATCHES "(amd64)|(AMD64)")
- MESSAGE(STATUS "The current platform is amd64")
+ MESSAGE(STATUS "Current platform is amd64")
SET(PLATFORM_ARCH_STR "amd64")
SET(TD_INTEL_64 TRUE)
+ ADD_DEFINITIONS("-D_TD_X86_")
ELSEIF (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)")
- MESSAGE(STATUS "The current platform is x86")
+ MESSAGE(STATUS "Current platform is x86")
SET(PLATFORM_ARCH_STR "i386")
SET(TD_INTEL_32 TRUE)
+ ADD_DEFINITIONS("-D_TD_X86_")
ELSEIF (CMAKE_SYSTEM_PROCESSOR MATCHES "armv7l")
- MESSAGE(STATUS "The current platform is aarch32")
+ MESSAGE(STATUS "Current platform is aarch32")
SET(PLATFORM_ARCH_STR "arm")
SET(TD_ARM_32 TRUE)
ADD_DEFINITIONS("-D_TD_ARM_")
ADD_DEFINITIONS("-D_TD_ARM_32")
ELSEIF (CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch64)|(arm64)")
- MESSAGE(STATUS "The current platform is aarch64")
+ MESSAGE(STATUS "Current platform is aarch64")
SET(PLATFORM_ARCH_STR "arm64")
SET(TD_ARM_64 TRUE)
ADD_DEFINITIONS("-D_TD_ARM_")
@@ -151,5 +149,5 @@ ENDIF ()
MESSAGE(STATUS "platform arch:" ${PLATFORM_ARCH_STR})
-MESSAGE("C Compiler ID: ${CMAKE_C_COMPILER_ID}")
-MESSAGE("CXX Compiler ID: ${CMAKE_CXX_COMPILER_ID}")
+MESSAGE("C Compiler: ${CMAKE_C_COMPILER} (${CMAKE_C_COMPILER_ID}, ${CMAKE_C_COMPILER_VERSION})")
+MESSAGE("CXX Compiler: ${CMAKE_CXX_COMPILER} (${CMAKE_C_COMPILER_ID}, ${CMAKE_CXX_COMPILER_VERSION})")
diff --git a/cmake/cmake.version b/cmake/cmake.version
index 5c5abe79bbe322ae561cb71c69ab662e0ea23875..b4084bd095b37d4b26024f8fee410a9f42bb0ef3 100644
--- a/cmake/cmake.version
+++ b/cmake/cmake.version
@@ -2,7 +2,7 @@
IF (DEFINED VERNUMBER)
SET(TD_VER_NUMBER ${VERNUMBER})
ELSE ()
- SET(TD_VER_NUMBER "3.0.1.7")
+ SET(TD_VER_NUMBER "3.0.2.0")
ENDIF ()
IF (DEFINED VERCOMPATIBLE)
@@ -26,7 +26,7 @@ ELSEIF (HAVE_GIT)
SET(TD_VER_GIT "no git commit id")
ENDIF ()
ELSE ()
- message(STATUS "no git cmd")
+ message(STATUS "no git found")
SET(TD_VER_GIT "no git commit id")
ENDIF ()
@@ -70,9 +70,9 @@ MESSAGE(STATUS "compatible: " ${TD_VER_COMPATIBLE})
MESSAGE(STATUS "commit id: " ${TD_VER_GIT})
MESSAGE(STATUS "build date: " ${TD_VER_DATE})
MESSAGE(STATUS "build type: " ${CMAKE_BUILD_TYPE})
-MESSAGE(STATUS "type: " ${TD_VER_VERTYPE})
-MESSAGE(STATUS "cpu: " ${TD_VER_CPUTYPE})
-MESSAGE(STATUS "os: " ${TD_VER_OSTYPE})
+MESSAGE(STATUS "type: " ${TD_VER_VERTYPE})
+MESSAGE(STATUS "cpu: " ${TD_VER_CPUTYPE})
+MESSAGE(STATUS "os: " ${TD_VER_OSTYPE})
MESSAGE(STATUS "============= compile version parameter information end ============= ")
STRING(REPLACE "." "_" TD_LIB_VER_NUMBER ${TD_VER_NUMBER})
diff --git a/cmake/taosadapter_CMakeLists.txt.in b/cmake/taosadapter_CMakeLists.txt.in
index cc46ef99386420196749b2d8b5886e1d65fa9943..75679a8ff5b229e649cdccb3a992dc0fc00fa8e2 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 ff7de07
+ GIT_TAG 566540d
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 d1c448b0940ba676cf332f6573b4c4e2112122b8..7247200fe7d56f1d9cbe46cd4068076d502a48f9 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 efa2a5f
+ GIT_TAG 4a4027c
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
BINARY_DIR ""
#BUILD_IN_SOURCE TRUE
diff --git a/docs/en/05-get-started/index.md b/docs/en/05-get-started/index.md
index 251581e98fbe3246d5c92cbc1d63cea432717f9e..12cfa22c69b1db8e82de4cb251ca3d8c67fc4546 100644
--- a/docs/en/05-get-started/index.md
+++ b/docs/en/05-get-started/index.md
@@ -8,6 +8,7 @@ import DiscordSVG from './discord.svg'
import TwitterSVG from './twitter.svg'
import YouTubeSVG from './youtube.svg'
import LinkedInSVG from './linkedin.svg'
+import StackOverflowSVG from './stackoverflow.svg'
You can install and run TDengine on Linux/Windows/macOS machines as well as Docker containers. You can also deploy TDengine as a managed service with TDengine Cloud.
@@ -35,10 +36,19 @@ The TDengine Knowledge Map covers the various knowledge points of TDengine, reve
diff --git a/docs/en/05-get-started/stackoverflow.svg b/docs/en/05-get-started/stackoverflow.svg
new file mode 100644
index 0000000000000000000000000000000000000000..22b4b64d3209aaeb1b4d571d17bfb34bfc230d24
--- /dev/null
+++ b/docs/en/05-get-started/stackoverflow.svg
@@ -0,0 +1,7 @@
+
diff --git a/docs/en/07-develop/03-insert-data/20-kafka-writting.mdx b/docs/en/07-develop/03-insert-data/20-kafka-writting.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..ffb969a8a6d0bc61e23fee44f245a24236db5b1b
--- /dev/null
+++ b/docs/en/07-develop/03-insert-data/20-kafka-writting.mdx
@@ -0,0 +1,46 @@
+---
+title: Write from Kafka
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import PyKafka from "./_py_kafka.mdx";
+
+## About Kafka
+
+Apache Kafka is an open-source distributed event streaming platform, used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications. For the key concepts of kafka, please refer to [kafka documentation](https://kafka.apache.org/documentation/#gettingStarted).
+
+### kafka topic
+
+Messages in Kafka are organized by topics. A topic may have one or more partitions. We can manage kafka topics through `kafka-topics`.
+
+create a topic named `kafka-events`:
+
+```
+bin/kafka-topics.sh --create --topic kafka-events --bootstrap-server localhost:9092
+```
+
+Alter `kafka-events` topic to set partitions to 3:
+
+```
+bin/kafka-topics.sh --alter --topic kafka-events --partitions 3 --bootstrap-server=localhost:9092
+```
+
+Show all topics and partitions in Kafka:
+
+```
+bin/kafka-topics.sh --bootstrap-server=localhost:9092 --describe
+```
+
+## Insert into TDengine
+
+We can write data into TDengine via SQL or Schemaless. For more information, please refer to [Insert Using SQL](/develop/insert-data/sql-writing/) or [High Performance Writing](/develop/insert-data/high-volume/) or [Schemaless Writing](/reference/schemaless/).
+
+## Examples
+
+
+
+
+
+
+
diff --git a/docs/en/07-develop/03-insert-data/02-influxdb-line.mdx b/docs/en/07-develop/03-insert-data/30-influxdb-line.mdx
similarity index 100%
rename from docs/en/07-develop/03-insert-data/02-influxdb-line.mdx
rename to docs/en/07-develop/03-insert-data/30-influxdb-line.mdx
diff --git a/docs/en/07-develop/03-insert-data/03-opentsdb-telnet.mdx b/docs/en/07-develop/03-insert-data/40-opentsdb-telnet.mdx
similarity index 100%
rename from docs/en/07-develop/03-insert-data/03-opentsdb-telnet.mdx
rename to docs/en/07-develop/03-insert-data/40-opentsdb-telnet.mdx
diff --git a/docs/en/07-develop/03-insert-data/04-opentsdb-json.mdx b/docs/en/07-develop/03-insert-data/50-opentsdb-json.mdx
similarity index 100%
rename from docs/en/07-develop/03-insert-data/04-opentsdb-json.mdx
rename to docs/en/07-develop/03-insert-data/50-opentsdb-json.mdx
diff --git a/docs/en/07-develop/03-insert-data/05-high-volume.md b/docs/en/07-develop/03-insert-data/60-high-volume.md
similarity index 100%
rename from docs/en/07-develop/03-insert-data/05-high-volume.md
rename to docs/en/07-develop/03-insert-data/60-high-volume.md
diff --git a/docs/en/07-develop/03-insert-data/_py_kafka.mdx b/docs/en/07-develop/03-insert-data/_py_kafka.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..dc43a0d415275189220287278547b015865e8d90
--- /dev/null
+++ b/docs/en/07-develop/03-insert-data/_py_kafka.mdx
@@ -0,0 +1,60 @@
+### python Kafka 客户端
+
+For python kafka client, please refer to [kafka client](https://cwiki.apache.org/confluence/display/KAFKA/Clients#Clients-Python). In this document, we use [kafka-python](http://github.com/dpkp/kafka-python).
+
+### consume from Kafka
+
+The simple way to consume messages from Kafka is to read messages one by one. The demo is as follows:
+
+```
+from kafka import KafkaConsumer
+consumer = KafkaConsumer('my_favorite_topic')
+for msg in consumer:
+ print (msg)
+```
+
+For higher performance, we can consume message from kafka in batch. The demo is as follows:
+
+```
+from kafka import KafkaConsumer
+consumer = KafkaConsumer('my_favorite_topic')
+while True:
+ msgs = consumer.poll(timeout_ms=500, max_records=1000)
+ if msgs:
+ print (msgs)
+```
+
+### multi-threading
+
+For more higher performance we can process data from kafka in multi-thread. We can use python's ThreadPoolExecutor to achieve multithreading. The demo is as follows:
+
+```
+from concurrent.futures import ThreadPoolExecutor, Future
+pool = ThreadPoolExecutor(max_workers=10)
+pool.submit(...)
+```
+
+### multi-process
+
+For more higher performance, sometimes we use multiprocessing. In this case, the number of Kafka Consumers should not be greater than the number of Kafka Topic Partitions. The demo is as follows:
+
+```
+from multiprocessing import Process
+
+ps = []
+for i in range(5):
+ p = Process(target=Consumer().consume())
+ p.start()
+ ps.append(p)
+
+for p in ps:
+ p.join()
+```
+
+In addition to python's built-in multithreading and multiprocessing library, we can also use the third-party library gunicorn.
+
+### Examples
+
+```py
+{{#include docs/examples/python/kafka_example.py}}
+```
diff --git a/docs/en/12-taos-sql/10-function.md b/docs/en/12-taos-sql/10-function.md
index 6145d8c00c97a411699f7decf731399c238ff84e..f0daf4b82a2fdc9d519d151451a1bbd10fd93e31 100644
--- a/docs/en/12-taos-sql/10-function.md
+++ b/docs/en/12-taos-sql/10-function.md
@@ -532,7 +532,12 @@ TIMEDIFF(expr1, expr2 [, time_unit])
#### TIMETRUNCATE
```sql
-TIMETRUNCATE(expr, time_unit)
+TIMETRUNCATE(expr, time_unit [, ignore_timezone])
+
+ignore_timezone: {
+ 0
+ | 1
+}
```
**Description**: Truncate the input timestamp with unit specified by `time_unit`
@@ -548,7 +553,10 @@ TIMETRUNCATE(expr, time_unit)
1b (nanoseconds), 1u (microseconds), 1a (milliseconds), 1s (seconds), 1m (minutes), 1h (hours), 1d (days), or 1w (weeks)
- The precision of the returned timestamp is same as the precision set for the current data base in use
- If the input data is not formatted as a timestamp, the returned value is null.
-
+- If `1d` is used as `time_unit` to truncate the timestamp, `ignore_timezone` option can be set to indicate if the returned result is affected by client timezone or not.
+ For example, if client timezone is set to UTC+0800, TIMETRUNCATE('2020-01-01 23:00:00', 1d, 0) will return '2020-01-01 08:00:00'.
+ Otherwise, TIMETRUNCATE('2020-01-01 23:00:00', 1d, 1) will return '2020-01-01 00:00:00'.
+ If `ignore_timezone` option is omitted, the default value is set to 1.
#### TIMEZONE
diff --git a/docs/en/14-reference/03-connector/index.mdx b/docs/en/14-reference/03-connector/index.mdx
index 54031db618b45e3fb314b973f9837b4ce9b4062f..ba8dbb85d4982c5d6c89f5dbe6157bd88a8c00a4 100644
--- a/docs/en/14-reference/03-connector/index.mdx
+++ b/docs/en/14-reference/03-connector/index.mdx
@@ -59,10 +59,10 @@ The different database framework specifications for various programming language
| -------------------------------------- | ------------- | --------------- | ------------- | ------------- | ------------- | ------------- |
| **Connection Management** | Support | Support | Support | Support | Support | Support |
| **Regular Query** | Support | Support | Support | Support | Support | Support |
-| **Parameter Binding** | Not supported | Not supported | Not supported | Support | Not supported | Support |
-| **Subscription (TMQ) ** | Not supported | Not supported | Not supported | Not supported | Not supported | Support |
+| **Parameter Binding** | Not supported | Not supported | support | Support | Not supported | Support |
+| **Subscription (TMQ) ** | Not supported | Not supported | support | Not supported | Not supported | Support |
| **Schemaless** | Not supported | Not supported | Not supported | Not supported | Not supported | Not supported |
-| **Bulk Pulling (based on WebSocket) ** | Support | Support | Not Supported | support | Not Supported | Supported |
+| **Bulk Pulling (based on WebSocket) ** | Support | Support | Support | support | Support | Support |
| **DataFrame** | Not supported | Support | Not supported | Not supported | Not supported | Not supported |
:::warning
diff --git a/docs/en/20-third-party/01-grafana.mdx b/docs/en/20-third-party/01-grafana.mdx
index e0fbefd5a8634d2001f2cc0601afa110aff33632..ca32ce8afce30eaa6756f7b403685b989d824bbf 100644
--- a/docs/en/20-third-party/01-grafana.mdx
+++ b/docs/en/20-third-party/01-grafana.mdx
@@ -76,7 +76,7 @@ sudo -u grafana grafana-cli plugins install tdengine-datasource
You can also download zip files from [GitHub](https://github.com/taosdata/grafanaplugin/releases/tag/latest) or [Grafana](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation) and install manually. The commands are as follows:
```bash
-GF_VERSION=3.2.2
+GF_VERSION=3.2.7
# from GitHub
wget https://github.com/taosdata/grafanaplugin/releases/download/v$GF_VERSION/tdengine-datasource-$GF_VERSION.zip
# from Grafana
diff --git a/docs/en/25-application/01-telegraf.md b/docs/en/25-application/01-telegraf.md
index f7003264496e61f33e843a4c8f2ec8227ba571b6..65fb08ee674cc9c952bbcfda57f0366fa129fdf2 100644
--- a/docs/en/25-application/01-telegraf.md
+++ b/docs/en/25-application/01-telegraf.md
@@ -38,15 +38,9 @@ Download the latest TDengine-server from the [Downloads](http://tdengine.com/en/
## Data Connection Setup
-### Download TDengine plug-in to grafana plug-in directory
+### Install Grafana Plugin and Configure Data Source
-```bash
-1. wget -c https://github.com/taosdata/grafanaplugin/releases/download/v3.1.3/tdengine-datasource-3.1.3.zip
-2. sudo unzip tdengine-datasource-3.1.3.zip -d /var/lib/grafana/plugins/
-3. sudo chown grafana:grafana -R /var/lib/grafana/plugins/tdengine
-4. echo -e "[plugins]\nallow_loading_unsigned_plugins = tdengine-datasource\n" | sudo tee -a /etc/grafana/grafana.ini
-5. sudo systemctl restart grafana-server.service
-```
+Please refer to [Install Grafana Plugin and Configure Data Source](/third-party/grafana/#install-grafana-plugin-and-configure-data-source)
### Modify /etc/telegraf/telegraf.conf
diff --git a/docs/en/25-application/02-collectd.md b/docs/en/25-application/02-collectd.md
index 692cd8d929f04a03e4433bd0b71f84101bc362cb..97412b230941435a08df12c859d63bca68b79ec9 100644
--- a/docs/en/25-application/02-collectd.md
+++ b/docs/en/25-application/02-collectd.md
@@ -41,15 +41,9 @@ Download the latest TDengine-server from the [Downloads](http://tdengine.com/en/
## Data Connection Setup
-### Copy the TDengine plugin to the grafana plugin directory
-
-```bash
-1. wget -c https://github.com/taosdata/grafanaplugin/releases/download/v3.1.3/tdengine-datasource-3.1.3.zip
-2. sudo unzip tdengine-datasource-3.1.3.zip -d /var/lib/grafana/plugins/
-3. sudo chown grafana:grafana -R /var/lib/grafana/plugins/tdengine
-4. echo -e "[plugins]\nallow_loading_unsigned_plugins = tdengine-datasource\n" | sudo tee -a /etc/grafana/grafana.ini
-5. sudo systemctl restart grafana-server.service
-```
+### Install Grafana Plugin and Configure Data Source
+
+Please refer to [Install Grafana Plugin and Configure Data Source](/third-party/grafana/#install-grafana-plugin-and-configure-data-source)
### Configure collectd
diff --git a/docs/en/28-releases/01-tdengine.md b/docs/en/28-releases/01-tdengine.md
index 8bfdf72cc7a848365834e7f6a87c884e46031c05..32bdc21e7c0552f5f891b38f806e48efb6c419ac 100644
--- a/docs/en/28-releases/01-tdengine.md
+++ b/docs/en/28-releases/01-tdengine.md
@@ -10,6 +10,10 @@ For TDengine 2.x installation packages by version, please visit [here](https://w
import Release from "/components/ReleaseV3";
+## 3.0.1.8
+
+
+
## 3.0.1.7
diff --git a/docs/en/28-releases/02-tools.md b/docs/en/28-releases/02-tools.md
index 2bc22a44500ca275c42cd1790074baaabb192cdb..7126b5a997043231d1cf93d633b8cd71e5f6275e 100644
--- a/docs/en/28-releases/02-tools.md
+++ b/docs/en/28-releases/02-tools.md
@@ -10,6 +10,10 @@ For other historical version installers, please visit [here](https://www.taosdat
import Release from "/components/ReleaseV3";
+## 2.3.0
+
+
+
## 2.2.9
diff --git a/docs/examples/csharp/wsConnect/Program.cs b/docs/examples/csharp/wsConnect/Program.cs
index f9a56c842fcfe1f0a032cca70460b4f84732cf18..a534bb8a6582be3b8da9ddd73daf39717909b40b 100644
--- a/docs/examples/csharp/wsConnect/Program.cs
+++ b/docs/examples/csharp/wsConnect/Program.cs
@@ -5,22 +5,24 @@ namespace Examples
{
public class WSConnExample
{
- static void Main(string[] args)
+ static int Main(string[] args)
{
string DSN = "ws://root:taosdata@127.0.0.1:6041/test";
IntPtr wsConn = LibTaosWS.WSConnectWithDSN(DSN);
if (wsConn == IntPtr.Zero)
{
- throw new Exception("get WS connection failed");
+ Console.WriteLine("get WS connection failed");
+ return -1;
}
else
{
Console.WriteLine("Establish connect success.");
+ // close connection.
+ LibTaosWS.WSClose(wsConn);
}
- // close connection.
- LibTaosWS.WSClose(wsConn);
+ return 0;
}
}
-}
\ No newline at end of file
+}
diff --git a/docs/examples/csharp/wsInsert/Program.cs b/docs/examples/csharp/wsInsert/Program.cs
index 1f2d0a67253f478913f7eb0093b732a1a0c0f541..7fa6af805c5f6fc136c89c903e20636eaaa0a0fc 100644
--- a/docs/examples/csharp/wsInsert/Program.cs
+++ b/docs/examples/csharp/wsInsert/Program.cs
@@ -5,7 +5,7 @@ namespace Examples
{
public class WSInsertExample
{
- static void Main(string[] args)
+ static int Main(string[] args)
{
string DSN = "ws://root:taosdata@127.0.0.1:6041/test";
IntPtr wsConn = LibTaosWS.WSConnectWithDSN(DSN);
@@ -13,7 +13,8 @@ namespace Examples
// Assert if connection is validate
if (wsConn == IntPtr.Zero)
{
- throw new Exception("get WS connection failed");
+ Console.WriteLine("get WS connection failed");
+ return -1;
}
else
{
@@ -36,6 +37,8 @@ namespace Examples
// close connection.
LibTaosWS.WSClose(wsConn);
+
+ return 0;
}
static void ValidInsert(string desc, IntPtr wsRes)
@@ -43,7 +46,7 @@ namespace Examples
int code = LibTaosWS.WSErrorNo(wsRes);
if (code != 0)
{
- throw new Exception($"execute SQL failed: reason: {LibTaosWS.WSErrorStr(wsRes)}, code:{code}");
+ Console.WriteLine($"execute SQL failed: reason: {LibTaosWS.WSErrorStr(wsRes)}, code:{code}");
}
else
{
@@ -55,4 +58,4 @@ namespace Examples
}
// Establish connect success.
// create table success affect 0 rows, cost 3717542 nanoseconds
-// insert data success affect 8 rows, cost 2613637 nanoseconds
\ No newline at end of file
+// insert data success affect 8 rows, cost 2613637 nanoseconds
diff --git a/docs/examples/csharp/wsQuery/Program.cs b/docs/examples/csharp/wsQuery/Program.cs
index a220cae9032bb2633f0514cbbd3f859a5f1a1f17..8ee900a05aaef527da83e88340057014a17d9053 100644
--- a/docs/examples/csharp/wsQuery/Program.cs
+++ b/docs/examples/csharp/wsQuery/Program.cs
@@ -7,13 +7,14 @@ namespace Examples
{
public class WSQueryExample
{
- static void Main(string[] args)
+ static int Main(string[] args)
{
string DSN = "ws://root:taosdata@127.0.0.1:6041/test";
IntPtr wsConn = LibTaosWS.WSConnectWithDSN(DSN);
if (wsConn == IntPtr.Zero)
{
- throw new Exception("get WS connection failed");
+ Console.WriteLine("get WS connection failed");
+ return -1;
}
else
{
@@ -28,7 +29,9 @@ namespace Examples
int code = LibTaosWS.WSErrorNo(wsRes);
if (code != 0)
{
- throw new Exception($"execute SQL failed: reason: {LibTaosWS.WSErrorStr(wsRes)}, code:{code}");
+ Console.WriteLine($"execute SQL failed: reason: {LibTaosWS.WSErrorStr(wsRes)}, code:{code}");
+ LibTaosWS.WSFreeResult(wsRes);
+ return -1;
}
// get meta data
@@ -58,6 +61,8 @@ namespace Examples
// close connection.
LibTaosWS.WSClose(wsConn);
+
+ return 0;
}
}
}
@@ -71,4 +76,4 @@ namespace Examples
// 1538548685000 | 10.3 | 219 | 0.31 | California.SanFrancisco | 2 |
// 1538548695000 | 12.6 | 218 | 0.33 | California.SanFrancisco | 2 |
// 1538548696800 | 12.3 | 221 | 0.31 | California.SanFrancisco | 2 |
-// 1538548696650 | 10.3 | 218 | 0.25 | California.SanFrancisco | 3 |
\ No newline at end of file
+// 1538548696650 | 10.3 | 218 | 0.25 | California.SanFrancisco | 3 |
diff --git a/docs/examples/csharp/wsStmt/Program.cs b/docs/examples/csharp/wsStmt/Program.cs
index 8af807ec39d72651c48ab82b79db7f4c5049225f..f8673357db6caef676294fa3d505f5bd4c2872c8 100644
--- a/docs/examples/csharp/wsStmt/Program.cs
+++ b/docs/examples/csharp/wsStmt/Program.cs
@@ -7,7 +7,7 @@ namespace Examples
{
public class WSStmtExample
{
- static void Main(string[] args)
+ static int Main(string[] args)
{
const string DSN = "ws://root:taosdata@127.0.0.1:6041/test";
const string table = "meters";
@@ -21,7 +21,8 @@ namespace Examples
IntPtr wsConn = LibTaosWS.WSConnectWithDSN(DSN);
if (wsConn == IntPtr.Zero)
{
- throw new Exception($"get WS connection failed");
+ Console.WriteLine($"get WS connection failed");
+ return -1;
}
else
{
@@ -66,18 +67,20 @@ namespace Examples
}
else
{
- throw new Exception("Init STMT failed...");
+ Console.WriteLine("Init STMT failed...");
}
// close connection.
LibTaosWS.WSClose(wsConn);
+
+ return 0;
}
static void ValidStmtStep(int code, IntPtr wsStmt, string desc)
{
if (code != 0)
{
- throw new Exception($"{desc} failed,reason: {LibTaosWS.WSErrorStr(wsStmt)}, code: {code}");
+ Console.WriteLine($"{desc} failed,reason: {LibTaosWS.WSErrorStr(wsStmt)}, code: {code}");
}
else
{
@@ -92,4 +95,4 @@ namespace Examples
// WSStmtBindParamBatch success...
// WSStmtAddBatch success...
// WSStmtExecute success...
-// WS STMT insert 5 rows...
\ No newline at end of file
+// WS STMT insert 5 rows...
diff --git a/docs/examples/python/kafka_example.py b/docs/examples/python/kafka_example.py
new file mode 100644
index 0000000000000000000000000000000000000000..735059eec0f3dcf5094810916e66a39db5682560
--- /dev/null
+++ b/docs/examples/python/kafka_example.py
@@ -0,0 +1,192 @@
+#! encoding = utf-8
+import json
+import time
+from json import JSONDecodeError
+from typing import Callable
+import logging
+from concurrent.futures import ThreadPoolExecutor, Future
+
+import taos
+from kafka import KafkaConsumer
+from kafka.consumer.fetcher import ConsumerRecord
+
+
+class Consumer(object):
+ DEFAULT_CONFIGS = {
+ 'kafka_brokers': 'localhost:9092',
+ 'kafka_topic': 'python_kafka',
+ 'kafka_group_id': 'taos',
+ 'taos_host': 'localhost',
+ 'taos_user': 'root',
+ 'taos_password': 'taosdata',
+ 'taos_database': 'power',
+ 'taos_port': 6030,
+ 'timezone': None,
+ 'clean_after_testing': False,
+ 'bath_consume': True,
+ 'batch_size': 1000,
+ 'async_model': True,
+ 'workers': 10
+ }
+
+ LOCATIONS = ['California.SanFrancisco', 'California.LosAngles', 'California.SanDiego', 'California.SanJose',
+ 'California.PaloAlto', 'California.Campbell', 'California.MountainView', 'California.Sunnyvale',
+ 'California.SantaClara', 'California.Cupertino']
+
+ CREATE_DATABASE_SQL = 'create database if not exists {} keep 365 duration 10 buffer 16 wal_level 1'
+ USE_DATABASE_SQL = 'use {}'
+ DROP_TABLE_SQL = 'drop table if exists meters'
+ DROP_DATABASE_SQL = 'drop database if exists {}'
+ CREATE_STABLE_SQL = 'create stable meters (ts timestamp, current float, voltage int, phase float) ' \
+ 'tags (location binary(64), groupId int)'
+ CREATE_TABLE_SQL = 'create table if not exists {} using meters tags (\'{}\', {})'
+ INSERT_SQL_HEADER = "insert into "
+ INSERT_PART_SQL = 'power.{} values (\'{}\', {}, {}, {})'
+
+ def __init__(self, **configs):
+ self.config: dict = self.DEFAULT_CONFIGS
+ self.config.update(configs)
+ self.consumer = KafkaConsumer(
+ self.config.get('kafka_topic'), # topic
+ bootstrap_servers=self.config.get('kafka_brokers'),
+ group_id=self.config.get('kafka_group_id'),
+ )
+ self.taos = taos.connect(
+ host=self.config.get('taos_host'),
+ user=self.config.get('taos_user'),
+ password=self.config.get('taos_password'),
+ port=self.config.get('taos_port'),
+ timezone=self.config.get('timezone'),
+ )
+ if self.config.get('async_model'):
+ self.pool = ThreadPoolExecutor(max_workers=self.config.get('workers'))
+ self.tasks: list[Future] = []
+ # tags and table mapping # key: {location}_{groupId} value:
+ self.tag_table_mapping = {}
+ i = 0
+ for location in self.LOCATIONS:
+ for j in range(1, 11):
+ table_name = 'd{}'.format(i)
+ self._cache_table(location=location, group_id=j, table_name=table_name)
+ i += 1
+
+ def init_env(self):
+ # create database and table
+ self.taos.execute(self.DROP_DATABASE_SQL.format(self.config.get('taos_database')))
+ self.taos.execute(self.CREATE_DATABASE_SQL.format(self.config.get('taos_database')))
+ self.taos.execute(self.USE_DATABASE_SQL.format(self.config.get('taos_database')))
+ self.taos.execute(self.DROP_TABLE_SQL)
+ self.taos.execute(self.CREATE_STABLE_SQL)
+ for tags, table_name in self.tag_table_mapping.items():
+ location, group_id = _get_location_and_group(tags)
+ self.taos.execute(self.CREATE_TABLE_SQL.format(table_name, location, group_id))
+
+ def consume(self):
+ logging.warning('## start consumer topic-[%s]', self.config.get('kafka_topic'))
+ try:
+ if self.config.get('bath_consume'):
+ self._run_batch(self._to_taos_batch)
+ else:
+ self._run(self._to_taos)
+ except KeyboardInterrupt:
+ logging.warning("## caught keyboard interrupt, stopping")
+ finally:
+ self.stop()
+
+ def stop(self):
+ # close consumer
+ if self.consumer is not None:
+ self.consumer.commit()
+ self.consumer.close()
+
+ # multi thread
+ if self.config.get('async_model'):
+ for task in self.tasks:
+ while not task.done():
+ pass
+ if self.pool is not None:
+ self.pool.shutdown()
+
+ # clean data
+ if self.config.get('clean_after_testing'):
+ self.taos.execute(self.DROP_TABLE_SQL)
+ self.taos.execute(self.DROP_DATABASE_SQL.format(self.config.get('taos_database')))
+ # close taos
+ if self.taos is not None:
+ self.taos.close()
+
+ def _run(self, f: Callable[[ConsumerRecord], bool]):
+ for message in self.consumer:
+ if self.config.get('async_model'):
+ self.pool.submit(f(message))
+ else:
+ f(message)
+
+ def _run_batch(self, f: Callable[[list[list[ConsumerRecord]]], None]):
+ while True:
+ messages = self.consumer.poll(timeout_ms=500, max_records=self.config.get('batch_size'))
+ if messages:
+ if self.config.get('async_model'):
+ self.pool.submit(f, messages.values())
+ else:
+ f(list(messages.values()))
+ if not messages:
+ time.sleep(0.1)
+
+ def _to_taos(self, message: ConsumerRecord) -> bool:
+ sql = self.INSERT_SQL_HEADER + self._build_sql(message.value)
+ if len(sql) == 0: # decode error, skip
+ return True
+ logging.info('## insert sql %s', sql)
+ return self.taos.execute(sql=sql) == 1
+
+ def _to_taos_batch(self, messages: list[list[ConsumerRecord]]):
+ sql = self._build_sql_batch(messages=messages)
+ if len(sql) == 0: # decode error, skip
+ return
+ self.taos.execute(sql=sql)
+
+ def _build_sql(self, msg_value: str) -> str:
+ try:
+ data = json.loads(msg_value)
+ except JSONDecodeError as e:
+ logging.error('## decode message [%s] error ', msg_value, e)
+ return ''
+ location = data.get('location')
+ group_id = data.get('groupId')
+ ts = data.get('ts')
+ current = data.get('current')
+ voltage = data.get('voltage')
+ phase = data.get('phase')
+
+ table_name = self._get_table_name(location=location, group_id=group_id)
+ return self.INSERT_PART_SQL.format(table_name, ts, current, voltage, phase)
+
+ def _build_sql_batch(self, messages: list[list[ConsumerRecord]]) -> str:
+ sql_list = []
+ for partition_messages in messages:
+ for message in partition_messages:
+ sql_list.append(self._build_sql(message.value))
+
+ return self.INSERT_SQL_HEADER + ' '.join(sql_list)
+
+ def _cache_table(self, location: str, group_id: int, table_name: str):
+ self.tag_table_mapping[_tag_table_mapping_key(location=location, group_id=group_id)] = table_name
+
+ def _get_table_name(self, location: str, group_id: int) -> str:
+ return self.tag_table_mapping.get(_tag_table_mapping_key(location=location, group_id=group_id))
+
+
+def _tag_table_mapping_key(location: str, group_id: int):
+ return '{}_{}'.format(location, group_id)
+
+
+def _get_location_and_group(key: str) -> (str, int):
+ fields = key.split('_')
+ return fields[0], fields[1]
+
+
+if __name__ == '__main__':
+ consumer = Consumer(async_model=True)
+ consumer.init_env()
+ consumer.consume()
\ No newline at end of file
diff --git a/docs/examples/python/tmq_example.py b/docs/examples/python/tmq_example.py
index 836beb2417c310337d73e678f97810e447824b63..a4625ca11accfbf7d263f4c1993f712987a136cb 100644
--- a/docs/examples/python/tmq_example.py
+++ b/docs/examples/python/tmq_example.py
@@ -4,6 +4,7 @@ from taos.tmq import *
conn = taos.connect()
print("init")
+conn.execute("drop topic if exists topic_ctb_column")
conn.execute("drop database if exists py_tmq")
conn.execute("create database if not exists py_tmq vgroups 2")
conn.select_db("py_tmq")
@@ -15,7 +16,6 @@ conn.execute("create table if not exists tb2 using stb1 tags(2)")
conn.execute("create table if not exists tb3 using stb1 tags(3)")
print("create topic")
-conn.execute("drop topic if exists topic_ctb_column")
conn.execute(
"create topic if not exists topic_ctb_column as select ts, c1, c2, c3 from stb1"
)
diff --git a/docs/zh/02-intro.md b/docs/zh/02-intro.md
index 47bfd3f96b6fdbb27d3f3e326e14a6b22108d508..525c8aa5c9764409381928ecddab49779346c206 100644
--- a/docs/zh/02-intro.md
+++ b/docs/zh/02-intro.md
@@ -69,7 +69,7 @@ TDengine 的主要功能如下:
- **[分析能力](https://www.taosdata.com/tdengine/easy_data_analytics)**:通过超级表、存储计算分离、分区分片、预计算和其它技术,TDengine 能够高效地浏览、格式化和访问数据。
-- **[核心开源](https://www.taosdata.com/tdengine/open_source_time-series_database)**:TDengine 的核心代码包括集群功能全部在开源协议下公开。全球超过 140k 个运行实例,GitHub Star 19k,且拥有一个活跃的开发者社区。
+- **[核心开源](https://www.taosdata.com/tdengine/open_source_time-series_database)**:TDengine 的核心代码包括集群功能全部在开源协议下公开。全球超过 140k 个运行实例,GitHub Star 20k,且拥有一个活跃的开发者社区。
采用 TDengine,可将典型的物联网、车联网、工业互联网大数据平台的总拥有成本大幅降低。表现在几个方面:
diff --git a/docs/zh/07-develop/03-insert-data/20-kafka-writting.mdx b/docs/zh/07-develop/03-insert-data/20-kafka-writting.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..32d3c2e5cbe5a167e4d7cb459ace8259c407b693
--- /dev/null
+++ b/docs/zh/07-develop/03-insert-data/20-kafka-writting.mdx
@@ -0,0 +1,47 @@
+---
+title: 从 Kafka 写入
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import PyKafka from "./_py_kafka.mdx";
+
+## Kafka 介绍
+
+Apache Kafka 是开源的分布式消息分发平台,被广泛应用于高性能数据管道、流式数据分析、数据集成和事件驱动类型的应用程序。Kafka 包含 Producer、Consumer 和 Topic,其中 Producer 是向 Kafka 发送消息的进程,Consumer 是从 Kafka 消费消息的进程。Kafka 相关概念可以参考[官方文档](https://kafka.apache.org/documentation/#gettingStarted)。
+
+
+### kafka topic
+
+Kafka 的消息按 topic 组织,每个 topic 会有一到多个 partition。可以通过 kafka 的 `kafka-topics` 管理 topic。
+
+创建名为 `kafka-events` 的topic:
+
+```
+bin/kafka-topics.sh --create --topic kafka-events --bootstrap-server localhost:9092
+```
+
+修改 `kafka-events` 的 partition 数量为 3:
+
+```
+bin/kafka-topics.sh --alter --topic kafka-events --partitions 3 --bootstrap-server=localhost:9092
+```
+
+展示所有的 topic 和 partition:
+
+```
+bin/kafka-topics.sh --bootstrap-server=localhost:9092 --describe
+```
+
+## 写入 TDengine
+
+TDengine 支持 Sql 方式和 Schemaless 方式的数据写入,Sql 方式数据写入可以参考 [TDengine SQL 写入](/develop/insert-data/sql-writing/) 和 [TDengine 高效写入](/develop/insert-data/high-volume/)。Schemaless 方式数据写入可以参考 [TDengine Schemaless 写入](/reference/schemaless/) 文档。
+
+## 示例代码
+
+
+
+
+
+
+
diff --git a/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx b/docs/zh/07-develop/03-insert-data/30-influxdb-line.mdx
similarity index 100%
rename from docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx
rename to docs/zh/07-develop/03-insert-data/30-influxdb-line.mdx
diff --git a/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx b/docs/zh/07-develop/03-insert-data/40-opentsdb-telnet.mdx
similarity index 100%
rename from docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx
rename to docs/zh/07-develop/03-insert-data/40-opentsdb-telnet.mdx
diff --git a/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx b/docs/zh/07-develop/03-insert-data/50-opentsdb-json.mdx
similarity index 100%
rename from docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx
rename to docs/zh/07-develop/03-insert-data/50-opentsdb-json.mdx
diff --git a/docs/zh/07-develop/03-insert-data/05-high-volume.md b/docs/zh/07-develop/03-insert-data/60-high-volume.md
similarity index 100%
rename from docs/zh/07-develop/03-insert-data/05-high-volume.md
rename to docs/zh/07-develop/03-insert-data/60-high-volume.md
diff --git a/docs/zh/07-develop/03-insert-data/_py_kafka.mdx b/docs/zh/07-develop/03-insert-data/_py_kafka.mdx
new file mode 100644
index 0000000000000000000000000000000000000000..cd7edf557d4ae41df0f55f4456fe405515132e51
--- /dev/null
+++ b/docs/zh/07-develop/03-insert-data/_py_kafka.mdx
@@ -0,0 +1,60 @@
+### python Kafka 客户端
+
+Kafka 的 python 客户端可以参考文档 [kafka client](https://cwiki.apache.org/confluence/display/KAFKA/Clients#Clients-Python)。推荐使用 [confluent-kafka-python](https://github.com/confluentinc/confluent-kafka-python) 和 [kafka-python](http://github.com/dpkp/kafka-python)。以下示例以 [kafka-python](http://github.com/dpkp/kafka-python) 为例。
+
+### 从 Kafka 消费数据
+
+Kafka 客户端采用 pull 的方式从 Kafka 消费数据,可以采用单条消费的方式或批量消费的方式读取数据。使用 [kafka-python](http://github.com/dpkp/kafka-python) 客户端单条消费数据的示例如下:
+
+```
+from kafka import KafkaConsumer
+consumer = KafkaConsumer('my_favorite_topic')
+for msg in consumer:
+ print (msg)
+```
+
+单条消费的方式在数据流量大的情况下往往存在性能瓶颈,导致 Kafka 消息积压,更推荐使用批量消费的方式消费数据。使用 [kafka-python](http://github.com/dpkp/kafka-python) 客户端批量消费数据的示例如下:
+
+```
+from kafka import KafkaConsumer
+consumer = KafkaConsumer('my_favorite_topic')
+while True:
+ msgs = consumer.poll(timeout_ms=500, max_records=1000)
+ if msgs:
+ print (msgs)
+```
+
+### Python 多线程
+
+为了提高数据写入效率,通常采用多线程的方式写入数据,可以使用 python 线程池 ThreadPoolExecutor 实现多线程。示例代码如下:
+
+```
+from concurrent.futures import ThreadPoolExecutor, Future
+pool = ThreadPoolExecutor(max_workers=10)
+pool.submit(...)
+```
+
+### Python 多进程
+
+单个python进程不能充分发挥多核 CPU 的性能,有时候我们会选择多进程的方式。在多进程的情况下,需要注意,Kafka Consumer 的数量应该小于等于 Kafka Topic Partition 数量。Python 多进程示例代码如下:
+
+```
+from multiprocessing import Process
+
+ps = []
+for i in range(5):
+ p = Process(target=Consumer().consume())
+ p.start()
+ ps.append(p)
+
+for p in ps:
+ p.join()
+```
+
+除了 Python 内置的多线程和多进程方式,还可以通过第三方库 gunicorn 实现并发。
+
+### 完整示例
+
+```py
+{{#include docs/examples/python/kafka_example.py}}
+```
diff --git a/docs/zh/08-connector/10-cpp.mdx b/docs/zh/08-connector/10-cpp.mdx
index 8a4f4946a71aa27e4bbfc6d27fc3469b260ce550..ad83aee734e03b5bea807959c36ee90be4e1731d 100644
--- a/docs/zh/08-connector/10-cpp.mdx
+++ b/docs/zh/08-connector/10-cpp.mdx
@@ -73,7 +73,95 @@ TDengine 客户端驱动的安装请参考 [安装指南](../#安装步骤)
```c
{{#include examples/c/demo.c}}
```
+格式化输出不同类型字段函数 taos_print_row
+```c
+int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields) {
+ int32_t len = 0;
+ for (int i = 0; i < num_fields; ++i) {
+ if (i > 0) {
+ str[len++] = ' ';
+ }
+
+ if (row[i] == NULL) {
+ len += sprintf(str + len, "%s", TSDB_DATA_NULL_STR);
+ continue;
+ }
+
+ switch (fields[i].type) {
+ case TSDB_DATA_TYPE_TINYINT:
+ len += sprintf(str + len, "%d", *((int8_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_UTINYINT:
+ len += sprintf(str + len, "%u", *((uint8_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_SMALLINT:
+ len += sprintf(str + len, "%d", *((int16_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_USMALLINT:
+ len += sprintf(str + len, "%u", *((uint16_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_INT:
+ len += sprintf(str + len, "%d", *((int32_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_UINT:
+ len += sprintf(str + len, "%u", *((uint32_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_BIGINT:
+ len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_UBIGINT:
+ len += sprintf(str + len, "%" PRIu64, *((uint64_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_FLOAT: {
+ float fv = 0;
+ fv = GET_FLOAT_VAL(row[i]);
+ len += sprintf(str + len, "%f", fv);
+ } break;
+
+ case TSDB_DATA_TYPE_DOUBLE: {
+ double dv = 0;
+ dv = GET_DOUBLE_VAL(row[i]);
+ len += sprintf(str + len, "%lf", dv);
+ } break;
+
+ case TSDB_DATA_TYPE_BINARY:
+ case TSDB_DATA_TYPE_NCHAR: {
+ int32_t charLen = varDataLen((char *)row[i] - VARSTR_HEADER_SIZE);
+ if (fields[i].type == TSDB_DATA_TYPE_BINARY) {
+ assert(charLen <= fields[i].bytes && charLen >= 0);
+ } else {
+ assert(charLen <= fields[i].bytes * TSDB_NCHAR_SIZE && charLen >= 0);
+ }
+
+ memcpy(str + len, row[i], charLen);
+ len += charLen;
+ } break;
+
+ case TSDB_DATA_TYPE_TIMESTAMP:
+ len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
+ break;
+
+ case TSDB_DATA_TYPE_BOOL:
+ len += sprintf(str + len, "%d", *((int8_t *)row[i]));
+ default:
+ break;
+ }
+ }
+ str[len] = 0;
+ return len;
+}
+
+```
+
### 异步查询示例
diff --git a/docs/zh/08-connector/index.md b/docs/zh/08-connector/index.md
index eecf564b905ddbf1e930acbb196cfb80869b67e9..a28a7cd66c1cc7598d473903eb95df5192d933d2 100644
--- a/docs/zh/08-connector/index.md
+++ b/docs/zh/08-connector/index.md
@@ -59,10 +59,10 @@ TDengine 版本更新往往会增加新的功能特性,列表中的连接器
| ------------------------------ | -------- | ---------- | -------- | -------- | ----------- | -------- |
| **连接管理** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
| **普通查询** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
-| **参数绑定** | 暂不支持 | 暂不支持 | 暂不支持 | 支持 | 暂不支持 | 支持 |
-| **数据订阅(TMQ)** | 暂不支持 | 暂不支持 | 暂不支持 | 暂不支持 | 暂不支持 | 支持 |
+| **参数绑定** | 暂不支持 | 暂不支持 | 支持 | 支持 | 暂不支持 | 支持 |
+| **数据订阅(TMQ)** | 暂不支持 | 暂不支持 | 支持 | 暂不支持 | 暂不支持 | 支持 |
| **Schemaless** | 暂不支持 | 暂不支持 | 暂不支持 | 暂不支持 | 暂不支持 | 暂不支持 |
-| **批量拉取(基于 WebSocket)** | 支持 | 支持 | 暂不支持 | 支持 | 暂不支持 | 支持 |
+| **批量拉取(基于 WebSocket)** | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
| **DataFrame** | 不支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
:::warning
diff --git a/docs/zh/12-taos-sql/10-function.md b/docs/zh/12-taos-sql/10-function.md
index 68c7fe6f3082e06cd8539df32bbf5ac8bbce6cee..afe90b8a93f5ef6f7b36d43619fb5ba222180ca3 100644
--- a/docs/zh/12-taos-sql/10-function.md
+++ b/docs/zh/12-taos-sql/10-function.md
@@ -533,7 +533,12 @@ TIMEDIFF(expr1, expr2 [, time_unit])
#### TIMETRUNCATE
```sql
-TIMETRUNCATE(expr, time_unit)
+TIMETRUNCATE(expr, time_unit [, ignore_timezone])
+
+ignore_timezone: {
+ 0
+ | 1
+}
```
**功能说明**:将时间戳按照指定时间单位 time_unit 进行截断。
@@ -549,6 +554,11 @@ TIMETRUNCATE(expr, time_unit)
1b(纳秒), 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小时),1d(天), 1w(周)。
- 返回的时间戳精度与当前 DATABASE 设置的时间精度一致。
- 输入包含不符合时间日期格式的字符串则返回 NULL。
+- 当使用 1d 作为时间单位对时间戳进行截断时, 可通过设置 ignore_timezone 参数指定返回结果的显示是否忽略客户端时区的影响。
+ 例如客户端所配置时区为 UTC+0800, 则 TIMETRUNCATE('2020-01-01 23:00:00', 1d, 0) 返回结果为 '2020-01-01 08:00:00'。
+ 而使用 TIMETRUNCATE('2020-01-01 23:00:00', 1d, 1) 设置忽略时区时,返回结果为 '2020-01-01 00:00:00'
+ ignore_timezone 如果忽略的话,则默认值为 1 。
+
#### TIMEZONE
@@ -1085,7 +1095,7 @@ ignore_negative: {
```sql
DIFF(expr [, ignore_negative])
-
+
ignore_negative: {
0
| 1
@@ -1249,4 +1259,4 @@ SELECT SERVER_VERSION();
SELECT SERVER_STATUS();
```
-**说明**:返回服务端当前的状态。
+**说明**:检测服务端是否所有 dnode 都在线,如果是则返回成功,否则返回无法建立连接的错误。
diff --git a/docs/zh/12-taos-sql/14-stream.md b/docs/zh/12-taos-sql/14-stream.md
index cd726e0a0ea644f575e16c656eeb4bb2cabf425d..932ad30b1a949d172d81819f2432daa42ce331c8 100644
--- a/docs/zh/12-taos-sql/14-stream.md
+++ b/docs/zh/12-taos-sql/14-stream.md
@@ -72,7 +72,7 @@ SHOW STREAMS;
若要展示更详细的信息,可以使用:
```sql
-SELECT * from performance_schema.`perf_streams`;
+SELECT * from information_schema.`ins_streams`;
```
## 流式计算的触发模式
diff --git a/docs/zh/20-third-party/01-grafana.mdx b/docs/zh/20-third-party/01-grafana.mdx
index 83f3f8bb25de4b99a345bafab7e8a43c3d35f14e..d5cfe847cada26a102b634573e7f4e2492adf60b 100644
--- a/docs/zh/20-third-party/01-grafana.mdx
+++ b/docs/zh/20-third-party/01-grafana.mdx
@@ -77,7 +77,7 @@ sudo -u grafana grafana-cli plugins install tdengine-datasource
或者从 [GitHub](https://github.com/taosdata/grafanaplugin/releases/tag/latest) 或 [Grafana](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation) 下载 .zip 文件到本地并解压到 Grafana 插件目录。命令行下载示例如下:
```bash
-GF_VERSION=3.2.2
+GF_VERSION=3.2.7
# from GitHub
wget https://github.com/taosdata/grafanaplugin/releases/download/v$GF_VERSION/tdengine-datasource-$GF_VERSION.zip
# from Grafana
diff --git a/docs/zh/25-application/01-telegraf.md b/docs/zh/25-application/01-telegraf.md
index 6338264d171b9246b2e99d418035e061d1068a4b..ec263d77927d2960ef684d9d94c9cad4073429b9 100644
--- a/docs/zh/25-application/01-telegraf.md
+++ b/docs/zh/25-application/01-telegraf.md
@@ -39,15 +39,9 @@ IT 运维监测数据通常都是对时间特性比较敏感的数据,例如
## 数据链路设置
-### 下载 TDengine 插件到 Grafana 插件目录
+### 安装 Grafana Plugin 并配置数据源
-```bash
-1. wget -c https://github.com/taosdata/grafanaplugin/releases/download/v3.1.3/tdengine-datasource-3.1.3.zip
-2. sudo unzip tdengine-datasource-3.1.3.zip -d /var/lib/grafana/plugins/
-3. sudo chown grafana:grafana -R /var/lib/grafana/plugins/tdengine
-4. echo -e "[plugins]\nallow_loading_unsigned_plugins = tdengine-datasource\n" | sudo tee -a /etc/grafana/grafana.ini
-5. sudo systemctl restart grafana-server.service
-```
+请参考[安装 Grafana Plugin 并配置数据源](/third-party/grafana/#%E5%AE%89%E8%A3%85-grafana-plugin-%E5%B9%B6%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E6%BA%90)。
### 修改 /etc/telegraf/telegraf.conf
diff --git a/docs/zh/25-application/02-collectd.md b/docs/zh/25-application/02-collectd.md
index c6230f48abb545e3064f406d9005a4a3ba8ea5ba..8b39a6431ddeebae2179f4dc535cabe841a499a1 100644
--- a/docs/zh/25-application/02-collectd.md
+++ b/docs/zh/25-application/02-collectd.md
@@ -41,15 +41,9 @@ IT 运维监测数据通常都是对时间特性比较敏感的数据,例如
## 数据链路设置
-### 复制 TDengine 插件到 grafana 插件目录
-
-```bash
-1. wget -c https://github.com/taosdata/grafanaplugin/releases/download/v3.1.3/tdengine-datasource-3.1.3.zip
-2. sudo unzip tdengine-datasource-3.1.3.zip -d /var/lib/grafana/plugins/
-3. sudo chown grafana:grafana -R /var/lib/grafana/plugins/tdengine
-4. echo -e "[plugins]\nallow_loading_unsigned_plugins = tdengine-datasource\n" | sudo tee -a /etc/grafana/grafana.ini
-5. sudo systemctl restart grafana-server.service
-```
+### 安装 Grafana Plugin 并配置数据源
+
+请参考[安装 Grafana Plugin 并配置数据源](/third-party/grafana/#%E5%AE%89%E8%A3%85-grafana-plugin-%E5%B9%B6%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E6%BA%90)。
### 配置 collectd
diff --git a/docs/zh/27-train-faq/01-faq.md b/docs/zh/27-train-faq/01-faq.md
index 9c2f1e790c66bddd6684e01b697d7ed536efa62d..595b69b08b87ee33e27937fb89b84adc41c89d08 100644
--- a/docs/zh/27-train-faq/01-faq.md
+++ b/docs/zh/27-train-faq/01-faq.md
@@ -201,3 +201,45 @@ TDengine 中时间戳的时区总是由客户端进行处理,而与服务端
OOM 是操作系统的保护机制,当操作系统内存(包括 SWAP )不足时,会杀掉某些进程,从而保证操作系统的稳定运行。通常内存不足主要是如下两个原因导致,一是剩余内存小于 vm.min_free_kbytes ;二是程序请求的内存大于剩余内存。还有一种情况是内存充足但程序占用了特殊的内存地址,也会触发 OOM 。
TDengine 会预先为每个 VNode 分配好内存,每个 Database 的 VNode 个数受 建库时的vgroups参数影响,每个 VNode 占用的内存大小受 buffer参数 影响。要防止 OOM,需要在项目建设之初合理规划内存,并合理设置 SWAP ,除此之外查询过量的数据也有可能导致内存暴涨,这取决于具体的查询语句。TDengine 企业版对内存管理做了优化,采用了新的内存分配器,对稳定性有更高要求的用户可以考虑选择企业版。
+
+### 19. 在macOS上遇到Too many open files怎么办?
+
+taosd日志文件报错Too many open file,是由于taosd打开文件数超过系统设置的上限所致。
+解决方案如下:
+1. 新建文件 /Library/LaunchDaemons/limit.maxfiles.plist,写入以下内容(以下示例将limit和maxfiles改为10万,可按需修改):
+```
+
+
+
+
+Label
+ limit.maxfiles
+ProgramArguments
+
+ launchctl
+ limit
+ maxfiles
+ 100000
+ 100000
+
+RunAtLoad
+
+ServiceIPC
+
+
+
+```
+2. 修改文件权限
+```
+sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
+sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist
+```
+3. 加载 plist 文件 (或重启系统后生效。launchd在启动时会自动加载该目录的 plist)
+```
+sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
+```
+4.确认更改后的限制
+```
+launchctl limit maxfiles
+```
diff --git a/docs/zh/28-releases/01-tdengine.md b/docs/zh/28-releases/01-tdengine.md
index fd2be899eb475efcb189e0b80b5c6cf180557cb9..7ed9e0c5a018401e2028a1e0786459d4e26f27b6 100644
--- a/docs/zh/28-releases/01-tdengine.md
+++ b/docs/zh/28-releases/01-tdengine.md
@@ -10,6 +10,11 @@ TDengine 2.x 各版本安装包请访问[这里](https://www.taosdata.com/all-do
import Release from "/components/ReleaseV3";
+## 3.0.1.8
+
+
+
+
## 3.0.1.7
diff --git a/docs/zh/28-releases/02-tools.md b/docs/zh/28-releases/02-tools.md
index 3f73b53fab46b8d57317c663cde5ffd54e66e1f8..67ca3fae67b36e5f08c57440bbaa64ec4f80bf4e 100644
--- a/docs/zh/28-releases/02-tools.md
+++ b/docs/zh/28-releases/02-tools.md
@@ -10,6 +10,10 @@ taosTools 各版本安装包下载链接如下:
import Release from "/components/ReleaseV3";
+## 2.3.0
+
+
+
## 2.2.9
diff --git a/examples/JDBC/taosdemo/pom.xml b/examples/JDBC/taosdemo/pom.xml
index 724ecc74077c4080269c695ca50a1cf300e39d0b..68224bbad5f719b74ff7ed103d4024985bbb2887 100644
--- a/examples/JDBC/taosdemo/pom.xml
+++ b/examples/JDBC/taosdemo/pom.xml
@@ -88,7 +88,7 @@
org.apache.logging.log4j
log4j-core
- 2.17.1
+ 2.17.2
diff --git a/examples/JDBC/taosdemo/readme.md b/examples/JDBC/taosdemo/readme.md
index e5f4eb132b2262990b8fa32fe3c40a617d16d247..edac97039934756ade2c6e8842fd2a3b4385c858 100644
--- a/examples/JDBC/taosdemo/readme.md
+++ b/examples/JDBC/taosdemo/readme.md
@@ -2,12 +2,10 @@
cd tests/examples/JDBC/taosdemo
mvn clean package -Dmaven.test.skip=true
# 先建表,再插入的
-java -jar target/taosdemo-2.0.1-jar-with-dependencies.jar -host [hostname] -database [database] -doCreateTable true -superTableSQL "create table weather(ts timestamp, f1 int) tags(t1 nchar(4))" -numOfTables 1000 -numOfRowsPerTable 100000000 -numOfThreadsForInsert 10 -numOfTablesPerSQL 10 -numOfValuesPerSQL 100
+java -jar target/taosdemo-2.0.1-jar-with-dependencies.jar -host -database -doCreateTable true -superTableSQL "create table weather(ts timestamp, f1 int) tags(t1 nchar(4))" -numOfTables 1000 -numOfRowsPerTable 100000000 -numOfThreadsForInsert 10 -numOfTablesPerSQL 10 -numOfValuesPerSQL 100
# 不建表,直接插入的
-java -jar target/taosdemo-2.0.1-jar-with-dependencies.jar -host [hostname] -database [database] -doCreateTable false -superTableSQL "create table weather(ts timestamp, f1 int) tags(t1 nchar(4))" -numOfTables 1000 -numOfRowsPerTable 100000000 -numOfThreadsForInsert 10 -numOfTablesPerSQL 10 -numOfValuesPerSQL 100
+java -jar target/taosdemo-2.0.1-jar-with-dependencies.jar -host -database -doCreateTable false -superTableSQL "create table weather(ts timestamp, f1 int) tags(t1 nchar(4))" -numOfTables 1000 -numOfRowsPerTable 100000000 -numOfThreadsForInsert 10 -numOfTablesPerSQL 10 -numOfValuesPerSQL 100
```
-需求:
-1. 可以读lowa的配置文件
-2. 支持JDBC-JNI和JDBC-restful
-3. 读取配置文件,持续执行查询
\ No newline at end of file
+如果发生错误 Exception in thread "main" java.lang.UnsatisfiedLinkError: no taos in java.library.path
+请检查是否安装 TDengine 客户端安装包或编译 TDengine 安装。如果确定已经安装过还出现这个错误,可以在命令行 java 后加 -Djava.library.path=/usr/local/lib 来指定寻找共享库的路径。
diff --git a/include/client/taos.h b/include/client/taos.h
index 25887b2879e3d534584f8d857ee3af670c7bcbd1..379363c51de7cdd11d8bd050b515ae21d1fa4858 100644
--- a/include/client/taos.h
+++ b/include/client/taos.h
@@ -149,7 +149,7 @@ DLL_EXPORT TAOS *taos_connect(const char *ip, const char *user, const char
DLL_EXPORT TAOS *taos_connect_auth(const char *ip, const char *user, const char *auth, const char *db, uint16_t port);
DLL_EXPORT void taos_close(TAOS *taos);
-const char *taos_data_type(int type);
+DLL_EXPORT const char *taos_data_type(int type);
DLL_EXPORT TAOS_STMT *taos_stmt_init(TAOS *taos);
DLL_EXPORT TAOS_STMT *taos_stmt_init_with_reqid(TAOS *taos, int64_t reqid);
@@ -185,6 +185,7 @@ DLL_EXPORT void taos_kill_query(TAOS *taos);
DLL_EXPORT int taos_field_count(TAOS_RES *res);
DLL_EXPORT int taos_num_fields(TAOS_RES *res);
DLL_EXPORT int taos_affected_rows(TAOS_RES *res);
+DLL_EXPORT int64_t taos_affected_rows64(TAOS_RES *res);
DLL_EXPORT TAOS_FIELD *taos_fetch_fields(TAOS_RES *res);
DLL_EXPORT int taos_select_db(TAOS *taos, const char *db);
@@ -218,6 +219,9 @@ DLL_EXPORT int taos_get_db_route_info(TAOS *taos, const char *db, TAOS_DB_ROUTE_
DLL_EXPORT int taos_get_table_vgId(TAOS *taos, const char *db, const char *table, int *vgId);
DLL_EXPORT int taos_load_table_info(TAOS *taos, const char *tableNameList);
+
+/* --------------------------schemaless INTERFACE------------------------------- */
+
DLL_EXPORT TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision);
DLL_EXPORT TAOS_RES *taos_schemaless_insert_with_reqid(TAOS *taos, char *lines[], int numLines, int protocol,
int precision, int64_t reqid);
@@ -225,6 +229,13 @@ DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw(TAOS *taos, char *lines, int len
int precision);
DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows,
int protocol, int precision, int64_t reqid);
+DLL_EXPORT TAOS_RES *taos_schemaless_insert_ttl(TAOS *taos, char *lines[], int numLines, int protocol, int precision, int32_t ttl);
+DLL_EXPORT TAOS_RES *taos_schemaless_insert_ttl_with_reqid(TAOS *taos, char *lines[], int numLines, int protocol,
+ int precision, int32_t ttl, int64_t reqid);
+DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw_ttl(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol,
+ int precision, int32_t ttl);
+DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw_ttl_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows,
+ int protocol, int precision, int32_t ttl, int64_t reqid);
/* --------------------------TMQ INTERFACE------------------------------- */
@@ -297,6 +308,7 @@ DLL_EXPORT tmq_res_t tmq_get_res_type(TAOS_RES *res);
DLL_EXPORT int32_t tmq_get_raw(TAOS_RES *res, tmq_raw_data *raw);
DLL_EXPORT int32_t tmq_write_raw(TAOS *taos, tmq_raw_data raw);
DLL_EXPORT int taos_write_raw_block(TAOS *taos, int numOfRows, char *pData, const char *tbname);
+DLL_EXPORT int taos_write_raw_block_with_fields(TAOS* taos, int rows, char* pData, const char* tbname, TAOS_FIELD *fields, int numFields);
DLL_EXPORT void tmq_free_raw(tmq_raw_data raw);
// Returning null means error. Returned result need to be freed by tmq_free_json_meta
DLL_EXPORT char *tmq_get_json_meta(TAOS_RES *res);
diff --git a/include/common/systable.h b/include/common/systable.h
index 57f85f16bcdaf8725156c47904bb91018d06328d..6f65c1e8b870d4a42427173bf3ea17ae7ade0ce1 100644
--- a/include/common/systable.h
+++ b/include/common/systable.h
@@ -47,6 +47,7 @@ extern "C" {
#define TSDB_INS_TABLE_TOPICS "ins_topics"
#define TSDB_INS_TABLE_STREAMS "ins_streams"
#define TSDB_INS_TABLE_STREAM_TASKS "ins_stream_tasks"
+#define TSDB_INS_TABLE_USER_PRIVILEGES "ins_user_privileges"
#define TSDB_PERFORMANCE_SCHEMA_DB "performance_schema"
#define TSDB_PERFS_TABLE_SMAS "perf_smas"
diff --git a/include/common/tcommon.h b/include/common/tcommon.h
index 674bdcf1718c5bab537e479c2c247d5377c9adb4..6ec3d5db1021b36ebcede457751938afb886d7a8 100644
--- a/include/common/tcommon.h
+++ b/include/common/tcommon.h
@@ -174,15 +174,28 @@ typedef struct SColumnDataAgg {
} SColumnDataAgg;
#pragma pack(pop)
+typedef struct SBlockID {
+ // The uid of table, from which current data block comes. And it is always 0, if current block is the
+ // result of calculation.
+ uint64_t uid;
+
+ // Block id, acquired and assigned from executor, which created according to the hysical planner. Block id is used
+ // to mark the stage of exec task.
+ uint64_t blockId;
+
+ // Generated by group/partition by [value|tags]. Created and assigned by table-scan operator, group-by operator,
+ // and partition by operator.
+ uint64_t groupId;
+} SBlockID;
+
typedef struct SDataBlockInfo {
STimeWindow window;
- int32_t rows; // todo hide this attribute
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;
- int16_t hasVarCol;
+ int32_t rows; // todo hide this attribute
uint32_t capacity;
+ SBlockID id;
+ int16_t hasVarCol;
+
// TODO: optimize and remove following
int64_t version; // used for stream, and need serialization
int32_t childId; // used for stream, do not serialize
@@ -190,8 +203,8 @@ typedef struct SDataBlockInfo {
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
+ char parTbName[TSDB_TABLE_NAME_LEN]; // used for stream partition
+ STag* pTag; // used for stream partition
} SDataBlockInfo;
typedef struct SSDataBlock {
@@ -225,21 +238,22 @@ typedef struct SVarColAttr {
// pBlockAgg->numOfNull == info.rows, all data are null
// pBlockAgg->numOfNull == 0, no data are null.
typedef struct SColumnInfoData {
- char* pData; // the corresponding block data in memory
+ char* pData; // the corresponding block data in memory
union {
char* nullbitmap; // bitmap, one bit for each item in the list
SVarColAttr varmeta;
};
- SColumnInfo info; // column info
- bool hasNull; // if current column data has null value.
+ SColumnInfo info; // column info
+ bool hasNull; // if current column data has null value.
} SColumnInfoData;
typedef struct SQueryTableDataCond {
uint64_t suid;
- int32_t order; // desc|asc order to iterate the data block
+ int32_t order; // desc|asc order to iterate the data block
int32_t numOfCols;
SColumnInfo* colList;
- int32_t type; // data block load type:
+ int32_t* pSlotList; // the column output destation slot, and it may be null
+ int32_t type; // data block load type:
STimeWindow twindows;
int64_t startVersion;
int64_t endVersion;
diff --git a/include/common/tdatablock.h b/include/common/tdatablock.h
index 502ba10d337d80107b94cb01b182a63d14a63cc9..e1d3b016113e6a117f81d2ceaf2034da38e7879c 100644
--- a/include/common/tdatablock.h
+++ b/include/common/tdatablock.h
@@ -24,11 +24,6 @@
extern "C" {
#endif
-typedef struct SCorEpSet {
- int32_t version;
- SEpSet epSet;
-} SCorEpSet;
-
typedef struct SBlockOrderInfo {
bool nullFirst;
int32_t order;
@@ -36,14 +31,6 @@ typedef struct SBlockOrderInfo {
SColumnInfoData* pColData;
} SBlockOrderInfo;
-int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp);
-void addEpIntoEpSet(SEpSet* pEpSet, const char* fqdn, uint16_t port);
-
-bool isEpsetEqual(const SEpSet* s1, const SEpSet* s2);
-
-void updateEpSet_s(SCorEpSet* pEpSet, SEpSet* pNewEpSet);
-SEpSet getEpSet_s(SCorEpSet* pEpSet);
-
#define NBIT (3u)
#define BitPos(_n) ((_n) & ((1 << NBIT) - 1))
#define BMCharPos(bm_, r_) ((bm_)[(r_) >> NBIT])
@@ -54,9 +41,9 @@ SEpSet getEpSet_s(SCorEpSet* pEpSet);
BMCharPos(bm_, r_) |= (1u << (7u - BitPos(r_))); \
} while (0)
-#define colDataSetNotNull_f(bm_, r_) \
- do { \
- BMCharPos(bm_, r_) &= ~(1u << (7u - BitPos(r_))); \
+#define colDataClearNull_f(bm_, r_) \
+ do { \
+ BMCharPos(bm_, r_) &= ((char)(~(1u << (7u - BitPos(r_))))); \
} while (0)
#define colDataIsNull_var(pColumnInfoData, row) (pColumnInfoData->varmeta.offset[row] == -1)
@@ -90,6 +77,33 @@ static FORCE_INLINE bool colDataIsNull_s(const SColumnInfoData* pColumnInfoData,
}
}
+static FORCE_INLINE bool colDataIsNNull_s(const SColumnInfoData* pColumnInfoData, int32_t startIndex,
+ uint32_t nRows) {
+ if (!pColumnInfoData->hasNull) {
+ return false;
+ }
+
+ if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) {
+ for (int32_t i = startIndex; i < nRows; ++i) {
+ if (!colDataIsNull_var(pColumnInfoData, i)) {
+ return false;
+ }
+ }
+ } else {
+ if (pColumnInfoData->nullbitmap == NULL) {
+ return false;
+ }
+
+ for (int32_t i = startIndex; i < nRows; ++i) {
+ if (!colDataIsNull_f(pColumnInfoData->nullbitmap, i)) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
static FORCE_INLINE bool colDataIsNull(const SColumnInfoData* pColumnInfoData, uint32_t totalRows, uint32_t row,
SColumnDataAgg* pColAgg) {
if (!pColumnInfoData->hasNull) {
@@ -137,9 +151,6 @@ static FORCE_INLINE void colDataAppendNNULL(SColumnInfoData* pColumnInfoData, ui
for (int32_t i = start; i < start + nRows; ++i) {
colDataSetNull_f(pColumnInfoData->nullbitmap, i);
}
-
- int32_t bytes = pColumnInfoData->info.bytes;
- memset(pColumnInfoData->pData + start * bytes, 0, nRows * bytes);
}
pColumnInfoData->hasNull = true;
@@ -220,9 +231,11 @@ int32_t blockDataSort_rv(SSDataBlock* pDataBlock, SArray* pOrderInfo, bool nullF
int32_t colInfoDataEnsureCapacity(SColumnInfoData* pColumn, uint32_t numOfRows, bool clearPayload);
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows);
+int32_t blockDataEnsureCapacityNoClear(SSDataBlock* pDataBlock, uint32_t numOfRows);
void colInfoDataCleanup(SColumnInfoData* pColumn, uint32_t numOfRows);
void blockDataCleanup(SSDataBlock* pDataBlock);
+void blockDataEmpty(SSDataBlock* pDataBlock);
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize);
diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h
index 2eda2f66cc143ddfd78f883f6c4b79547183d6e5..6855287fb2d354f52998342d368c46b3a852bf89 100644
--- a/include/common/tdataformat.h
+++ b/include/common/tdataformat.h
@@ -27,17 +27,17 @@
extern "C" {
#endif
-typedef struct SBuffer SBuffer;
-typedef struct SSchema SSchema;
-typedef struct STColumn STColumn;
-typedef struct STSchema STSchema;
-typedef struct SValue SValue;
-typedef struct SColVal SColVal;
-typedef struct STSRow2 STSRow2;
-typedef struct STSRowBuilder STSRowBuilder;
-typedef struct STagVal STagVal;
-typedef struct STag STag;
-typedef struct SColData SColData;
+typedef struct SBuffer SBuffer;
+typedef struct SSchema SSchema;
+typedef struct STColumn STColumn;
+typedef struct STSchema STSchema;
+typedef struct SValue SValue;
+typedef struct SColVal SColVal;
+typedef struct SRow SRow;
+typedef struct SRowIter SRowIter;
+typedef struct STagVal STagVal;
+typedef struct STag STag;
+typedef struct SColData SColData;
#define HAS_NONE ((uint8_t)0x1)
#define HAS_NULL ((uint8_t)0x2)
@@ -68,13 +68,10 @@ struct SBuffer {
void tBufferDestroy(SBuffer *pBuffer);
int32_t tBufferInit(SBuffer *pBuffer, int64_t size);
int32_t tBufferPut(SBuffer *pBuffer, const void *pData, int64_t nData);
+int32_t tBufferReserve(SBuffer *pBuffer, int64_t nData, void **ppData);
// STSchema ================================
-int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema **ppTSchema);
-void tTSchemaDestroy(STSchema *pTSchema);
-
-// SValue ================================
-static FORCE_INLINE int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type);
+void tDestroyTSchema(STSchema *pTSchema);
// SColVal ================================
#define CV_FLAG_VALUE ((int8_t)0x0)
@@ -89,26 +86,14 @@ static FORCE_INLINE int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type);
#define COL_VAL_IS_NULL(CV) ((CV)->flag == CV_FLAG_NULL)
#define COL_VAL_IS_VALUE(CV) ((CV)->flag == CV_FLAG_VALUE)
-// STSRow2 ================================
-#define TSROW_LEN(PROW, V) tGetI32v((uint8_t *)(PROW)->data, (V) ? &(V) : NULL)
-#define TSROW_SVER(PROW, V) tGetI32v((PROW)->data + TSROW_LEN(PROW, NULL), (V) ? &(V) : NULL)
-
-int32_t tTSRowNew(STSRowBuilder *pBuilder, SArray *pArray, STSchema *pTSchema, STSRow2 **ppRow);
-int32_t tTSRowClone(const STSRow2 *pRow, STSRow2 **ppRow);
-void tTSRowFree(STSRow2 *pRow);
-void tTSRowGet(STSRow2 *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
-int32_t tTSRowToArray(STSRow2 *pRow, STSchema *pTSchema, SArray **ppArray);
-int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow);
-int32_t tGetTSRow(uint8_t *p, STSRow2 **ppRow);
-
-// STSRowBuilder ================================
-#define tsRowBuilderInit() ((STSRowBuilder){0})
-#define tsRowBuilderClear(B) \
- do { \
- if ((B)->pBuf) { \
- taosMemoryFree((B)->pBuf); \
- } \
- } while (0)
+// SRow ================================
+int32_t tRowBuild(SArray *aColVal, STSchema *pTSchema, SBuffer *pBuffer);
+void tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
+
+// SRowIter ================================
+int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter);
+void tRowIterClose(SRowIter **ppIter);
+SColVal *tRowIterNext(SRowIter *pIter);
// STag ================================
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag);
@@ -147,29 +132,17 @@ struct STSchema {
int32_t numOfCols;
int32_t version;
int32_t flen;
- int32_t vlen;
int32_t tlen;
STColumn columns[];
};
-#define TSROW_HAS_NONE ((uint8_t)0x1)
-#define TSROW_HAS_NULL ((uint8_t)0x2U)
-#define TSROW_HAS_VAL ((uint8_t)0x4U)
-#define TSROW_KV_SMALL ((uint8_t)0x10U)
-#define TSROW_KV_MID ((uint8_t)0x20U)
-#define TSROW_KV_BIG ((uint8_t)0x40U)
-#pragma pack(push, 1)
-struct STSRow2 {
- TSKEY ts;
- uint8_t flags;
- uint8_t data[];
-};
-#pragma pack(pop)
-
-struct STSRowBuilder {
- // STSRow2 tsRow;
- int32_t szBuf;
- uint8_t *pBuf;
+struct SRow {
+ uint8_t flag;
+ uint8_t rsv;
+ uint16_t sver;
+ uint32_t len;
+ TSKEY ts;
+ uint8_t data[];
};
struct SValue {
@@ -258,37 +231,17 @@ typedef struct {
int32_t nCols;
schema_ver_t version;
uint16_t flen;
- int32_t vlen;
int32_t tlen;
STColumn *columns;
} STSchemaBuilder;
-// use 2 bits for bitmap(default: STSRow/sub block)
-#define TD_VTYPE_BITS 2
-#define TD_VTYPE_PARTS 4 // PARTITIONS: 1 byte / 2 bits
-#define TD_VTYPE_OPTR 3 // OPERATOR: 4 - 1, utilize to get remainder
-#define TD_BITMAP_BYTES(cnt) (((cnt) + TD_VTYPE_OPTR) >> 2)
-
-// use 1 bit for bitmap(super block)
-#define TD_VTYPE_BITS_I 1
-#define TD_VTYPE_PARTS_I 8 // PARTITIONS: 1 byte / 1 bit
-#define TD_VTYPE_OPTR_I 7 // OPERATOR: 8 - 1, utilize to get remainder
-#define TD_BITMAP_BYTES_I(cnt) (((cnt) + TD_VTYPE_OPTR_I) >> 3)
-
int32_t tdInitTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version);
void tdDestroyTSchemaBuilder(STSchemaBuilder *pBuilder);
void tdResetTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version);
int32_t tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int8_t flags, col_id_t colId, col_bytes_t bytes);
STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder);
-static FORCE_INLINE int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type) {
- if (IS_VAR_DATA_TYPE(type)) {
- return tGetBinary(p, &pValue->pData, pValue ? &pValue->nData : NULL);
- } else {
- memcpy(&pValue->val, p, tDataTypes[type].bytes);
- return tDataTypes[type].bytes;
- }
-}
+STSchema *tBuildTSchema(SSchema *aSchema, int32_t numOfCols, int32_t version);
#endif
diff --git a/include/common/tglobal.h b/include/common/tglobal.h
index 2076906f70a33de60da7e6a70ae890ffa1ad0eeb..92672311d0661af86fbf2026d23ac1cb8f5a345c 100644
--- a/include/common/tglobal.h
+++ b/include/common/tglobal.h
@@ -44,6 +44,8 @@ extern int32_t tsCompatibleModel;
extern bool tsPrintAuth;
extern int64_t tsTickPerMin[3];
extern int32_t tsCountAlwaysReturnValue;
+extern float tsSelectivityRatio;
+extern int32_t tsTagFilterResCacheSize;
// queue & threads
extern int32_t tsNumOfRpcThreads;
@@ -62,6 +64,11 @@ extern int32_t tsNumOfSnodeStreamThreads;
extern int32_t tsNumOfSnodeWriteThreads;
extern int64_t tsRpcQueueMemoryAllowed;
+// sync raft
+extern int32_t tsElectInterval;
+extern int32_t tsHeartbeatInterval;
+extern int32_t tsHeartbeatTimeout;
+
// monitor
extern bool tsEnableMonitor;
extern int32_t tsMonitorInterval;
@@ -90,6 +97,10 @@ extern int32_t tsQueryNodeChunkSize;
extern bool tsQueryUseNodeAllocator;
extern bool tsKeepColumnName;
extern bool tsEnableQueryHb;
+extern int32_t tsRedirectPeriod;
+extern int32_t tsRedirectFactor;
+extern int32_t tsRedirectMaxPeriod;
+extern int32_t tsMaxRetryWaitTime;
// client
extern int32_t tsMinSlidingTime;
@@ -120,9 +131,10 @@ extern char tsUdfdResFuncs[];
extern char tsUdfdLdLibPath[];
// schemaless
-extern char tsSmlChildTableName[];
-extern char tsSmlTagName[];
-extern bool tsSmlDataFormat;
+extern char tsSmlChildTableName[];
+extern char tsSmlTagName[];
+extern bool tsSmlDataFormat;
+extern int32_t tsSmlBatchSize;
// wal
extern int64_t tsWalFsyncDataSizeLimit;
@@ -130,6 +142,7 @@ extern int64_t tsWalFsyncDataSizeLimit;
// internal
extern int32_t tsTransPullupInterval;
extern int32_t tsMqRebalanceInterval;
+extern int32_t tsStreamCheckpointTickInterval;
extern int32_t tsTtlUnit;
extern int32_t tsTtlPushInterval;
extern int32_t tsGrantHBInterval;
@@ -138,7 +151,7 @@ extern int32_t tsUptimeInterval;
extern int32_t tsRpcRetryLimit;
extern int32_t tsRpcRetryInterval;
-//#define NEEDTO_COMPRESSS_MSG(size) (tsCompressMsgSize != -1 && (size) > tsCompressMsgSize)
+// #define NEEDTO_COMPRESSS_MSG(size) (tsCompressMsgSize != -1 && (size) > tsCompressMsgSize)
int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char **envCmd,
const char *envFile, char *apolloUrl, SArray *pArgs, bool tsc);
diff --git a/include/common/tmisce.h b/include/common/tmisce.h
new file mode 100644
index 0000000000000000000000000000000000000000..b9f5cf5b91f55a8f9ca14194b41673c8506bb3fa
--- /dev/null
+++ b/include/common/tmisce.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef TDENGINE_TMISCE_H
+#define TDENGINE_TMISCE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "tmsg.h"
+
+typedef struct SCorEpSet {
+ int32_t version;
+ SEpSet epSet;
+} SCorEpSet;
+
+int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp);
+void addEpIntoEpSet(SEpSet* pEpSet, const char* fqdn, uint16_t port);
+
+bool isEpsetEqual(const SEpSet* s1, const SEpSet* s2);
+
+void updateEpSet_s(SCorEpSet* pEpSet, SEpSet* pNewEpSet);
+SEpSet getEpSet_s(SCorEpSet* pEpSet);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // TDENGINE_TMISCE_H
diff --git a/include/common/tmsg.h b/include/common/tmsg.h
index 02d4c2279c543aab42f1d0dd933a282d99ef7386..bb1addf1b698479ca418882a1a16c3c59e5347cc 100644
--- a/include/common/tmsg.h
+++ b/include/common/tmsg.h
@@ -66,6 +66,15 @@ extern int32_t tMsgDict[];
typedef uint16_t tmsg_t;
+static inline bool vnodeIsMsgBlock(tmsg_t type) {
+ return (type == TDMT_VND_CREATE_TABLE) || (type == TDMT_VND_ALTER_TABLE) || (type == TDMT_VND_DROP_TABLE) ||
+ (type == TDMT_VND_UPDATE_TAG_VAL);
+}
+
+static inline bool syncUtilUserCommit(tmsg_t msgType) {
+ return msgType != TDMT_SYNC_NOOP && msgType != TDMT_SYNC_LEADER_TRANSFER;
+}
+
/* ------------------------ OTHER DEFINITIONS ------------------------ */
// IE type
#define TSDB_IE_TYPE_SEC 1
@@ -120,6 +129,7 @@ typedef enum _mgmt_table {
TSDB_MGMT_TABLE_VNODES,
TSDB_MGMT_TABLE_APPS,
TSDB_MGMT_TABLE_STREAM_TASKS,
+ TSDB_MGMT_TABLE_PRIVILEGES,
TSDB_MGMT_TABLE_MAX,
} EShowType;
@@ -141,16 +151,18 @@ typedef enum _mgmt_table {
#define TSDB_FILL_PREV 4
#define TSDB_FILL_NEXT 5
-#define TSDB_ALTER_USER_PASSWD 0x1
-#define TSDB_ALTER_USER_SUPERUSER 0x2
-#define TSDB_ALTER_USER_ADD_READ_DB 0x3
-#define TSDB_ALTER_USER_REMOVE_READ_DB 0x4
-#define TSDB_ALTER_USER_ADD_WRITE_DB 0x5
-#define TSDB_ALTER_USER_REMOVE_WRITE_DB 0x6
-#define TSDB_ALTER_USER_ADD_ALL_DB 0x7
-#define TSDB_ALTER_USER_REMOVE_ALL_DB 0x8
-#define TSDB_ALTER_USER_ENABLE 0x9
-#define TSDB_ALTER_USER_SYSINFO 0xA
+#define TSDB_ALTER_USER_PASSWD 0x1
+#define TSDB_ALTER_USER_SUPERUSER 0x2
+#define TSDB_ALTER_USER_ADD_READ_DB 0x3
+#define TSDB_ALTER_USER_REMOVE_READ_DB 0x4
+#define TSDB_ALTER_USER_ADD_WRITE_DB 0x5
+#define TSDB_ALTER_USER_REMOVE_WRITE_DB 0x6
+#define TSDB_ALTER_USER_ADD_ALL_DB 0x7
+#define TSDB_ALTER_USER_REMOVE_ALL_DB 0x8
+#define TSDB_ALTER_USER_ENABLE 0x9
+#define TSDB_ALTER_USER_SYSINFO 0xA
+#define TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC 0xB
+#define TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC 0xC
#define TSDB_ALTER_USER_PRIVILEGES 0x2
@@ -497,6 +509,8 @@ typedef struct {
char* pComment;
char* pAst1;
char* pAst2;
+ int64_t deleteMark1;
+ int64_t deleteMark2;
} SMCreateStbReq;
int32_t tSerializeSMCreateStbReq(void* buf, int32_t bufLen, SMCreateStbReq* pReq);
@@ -620,7 +634,7 @@ typedef struct {
int8_t enable;
char user[TSDB_USER_LEN];
char pass[TSDB_USET_PASSWORD_LEN];
- char dbname[TSDB_DB_FNAME_LEN];
+ char objname[TSDB_DB_FNAME_LEN]; // db or topic
} SAlterUserReq;
int32_t tSerializeSAlterUserReq(void* buf, int32_t bufLen, SAlterUserReq* pReq);
@@ -649,34 +663,6 @@ int32_t tSerializeSGetUserAuthRsp(void* buf, int32_t bufLen, SGetUserAuthRsp* pR
int32_t tDeserializeSGetUserAuthRsp(void* buf, int32_t bufLen, SGetUserAuthRsp* pRsp);
void tFreeSGetUserAuthRsp(SGetUserAuthRsp* pRsp);
-typedef struct {
- int16_t lowerRelOptr;
- int16_t upperRelOptr;
- int16_t filterstr; // denote if current column is char(binary/nchar)
-
- union {
- struct {
- int64_t lowerBndi;
- int64_t upperBndi;
- };
- struct {
- double lowerBndd;
- double upperBndd;
- };
- struct {
- int64_t pz;
- int64_t len;
- };
- };
-} SColumnFilterInfo;
-
-typedef struct {
- int16_t numOfFilters;
- union {
- int64_t placeholder;
- SColumnFilterInfo* filterInfo;
- };
-} SColumnFilterList;
/*
* for client side struct, only column id, type, bytes are necessary
* But for data in vnode side, we need all the following information.
@@ -687,10 +673,10 @@ typedef struct {
int16_t slotId;
};
- int8_t type;
- int32_t bytes;
uint8_t precision;
uint8_t scale;
+ int32_t bytes;
+ int8_t type;
} SColumnInfo;
typedef struct STimeWindow {
@@ -1087,6 +1073,7 @@ typedef struct {
int32_t vgId;
int8_t syncState;
int8_t syncRestore;
+ int8_t syncCanRead;
int64_t cacheUsage;
int64_t numOfTables;
int64_t numOfTimeSeries;
@@ -1172,6 +1159,13 @@ typedef struct {
int32_t tSerializeSMTimerMsg(void* buf, int32_t bufLen, SMTimerReq* pReq);
int32_t tDeserializeSMTimerMsg(void* buf, int32_t bufLen, SMTimerReq* pReq);
+typedef struct {
+ int64_t tick;
+} SMStreamTickReq;
+
+int32_t tSerializeSMStreamTickMsg(void* buf, int32_t bufLen, SMStreamTickReq* pReq);
+int32_t tDeserializeSMStreamTickMsg(void* buf, int32_t bufLen, SMStreamTickReq* pReq);
+
typedef struct {
int32_t id;
uint16_t port; // node sync Port
@@ -1420,8 +1414,8 @@ typedef struct {
int8_t streamBlockType;
int32_t compLen;
int32_t numOfBlocks;
- int32_t numOfRows;
- int32_t numOfCols;
+ int64_t numOfRows; // from int32_t change to int64_t
+ int64_t numOfCols;
int64_t skey;
int64_t ekey;
int64_t version; // for stream
@@ -1620,15 +1614,14 @@ typedef struct SSubQueryMsg {
int8_t explain;
int8_t needFetch;
uint32_t sqlLen;
- char *sql;
+ char* sql;
uint32_t msgLen;
- char *msg;
+ char* msg;
} SSubQueryMsg;
-int32_t tSerializeSSubQueryMsg(void *buf, int32_t bufLen, SSubQueryMsg *pReq);
-int32_t tDeserializeSSubQueryMsg(void *buf, int32_t bufLen, SSubQueryMsg *pReq);
-void tFreeSSubQueryMsg(SSubQueryMsg *pReq);
-
+int32_t tSerializeSSubQueryMsg(void* buf, int32_t bufLen, SSubQueryMsg* pReq);
+int32_t tDeserializeSSubQueryMsg(void* buf, int32_t bufLen, SSubQueryMsg* pReq);
+void tFreeSSubQueryMsg(SSubQueryMsg* pReq);
typedef struct {
SMsgHead header;
@@ -1667,6 +1660,9 @@ typedef struct {
int32_t execId;
} SResFetchReq;
+int32_t tSerializeSResFetchReq(void* buf, int32_t bufLen, SResFetchReq* pReq);
+int32_t tDeserializeSResFetchReq(void* buf, int32_t bufLen, SResFetchReq* pReq);
+
typedef struct {
SMsgHead header;
uint64_t sId;
@@ -1738,12 +1734,11 @@ typedef struct {
int32_t execId;
} STaskDropReq;
-int32_t tSerializeSTaskDropReq(void *buf, int32_t bufLen, STaskDropReq *pReq);
-int32_t tDeserializeSTaskDropReq(void *buf, int32_t bufLen, STaskDropReq *pReq);
-
-int32_t tSerializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pRsp);
-int32_t tDeserializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pRsp);
+int32_t tSerializeSTaskDropReq(void* buf, int32_t bufLen, STaskDropReq* pReq);
+int32_t tDeserializeSTaskDropReq(void* buf, int32_t bufLen, STaskDropReq* pReq);
+int32_t tSerializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp);
+int32_t tDeserializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp);
typedef struct {
int32_t code;
@@ -1771,6 +1766,8 @@ typedef struct {
int64_t watermark;
int32_t numOfTags;
SArray* pTags; // array of SField
+ // 3.0.20
+ int64_t checkpointFreq; // ms
} SCMCreateStreamReq;
typedef struct {
@@ -1970,6 +1967,12 @@ typedef struct {
SHashObj* rebSubHash; // SHashObj
} SMqDoRebalanceMsg;
+typedef struct {
+ int64_t streamId;
+ int64_t checkpointId;
+ char streamName[TSDB_STREAM_FNAME_LEN];
+} SMStreamDoCheckpointMsg;
+
typedef struct {
int64_t status;
} SMVSubscribeRsp;
@@ -2021,6 +2024,7 @@ typedef struct {
typedef struct {
int64_t maxdelay[2];
int64_t watermark[2];
+ int64_t deleteMark[2];
int32_t qmsgLen[2];
char* qmsg[2]; // pAst:qmsg:SRetention => trigger aggr task1/2
} SRSmaParam;
@@ -2742,6 +2746,7 @@ typedef struct {
char* tagsFilter;
char* sql;
char* ast;
+ int64_t deleteMark;
} SMCreateSmaReq;
int32_t tSerializeSMCreateSmaReq(void* buf, int32_t bufLen, SMCreateSmaReq* pReq);
@@ -2948,6 +2953,9 @@ typedef struct {
STqOffsetVal reqOffset;
} SMqPollReq;
+int32_t tSerializeSMqPollReq(void* buf, int32_t bufLen, SMqPollReq* pReq);
+int32_t tDeserializeSMqPollReq(void* buf, int32_t bufLen, SMqPollReq* pReq);
+
typedef struct {
int32_t vgId;
int64_t offset;
@@ -3159,7 +3167,8 @@ int32_t tDecodeDeleteRes(SDecoder* pCoder, SDeleteRes* pRes);
typedef struct {
// int64_t uid;
char tbname[TSDB_TABLE_NAME_LEN];
- int64_t ts;
+ int64_t startTs;
+ int64_t endTs;
} SSingleDeleteReq;
int32_t tEncodeSSingleDeleteReq(SEncoder* pCoder, const SSingleDeleteReq* pReq);
@@ -3181,8 +3190,8 @@ typedef struct {
} SBatchMsg;
typedef struct {
- SMsgHead header;
- SArray* pMsgs; //SArray
+ SMsgHead header;
+ SArray* pMsgs; // SArray
} SBatchReq;
typedef struct {
@@ -3194,11 +3203,11 @@ typedef struct {
} SBatchRspMsg;
typedef struct {
- SArray* pRsps; //SArray
+ SArray* pRsps; // SArray
} SBatchRsp;
-int32_t tSerializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq);
-int32_t tDeserializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq);
+int32_t tSerializeSBatchReq(void* buf, int32_t bufLen, SBatchReq* pReq);
+int32_t tDeserializeSBatchReq(void* buf, int32_t bufLen, SBatchReq* pReq);
static FORCE_INLINE void tFreeSBatchReqMsg(void* msg) {
if (NULL == msg) {
return;
@@ -3207,8 +3216,8 @@ static FORCE_INLINE void tFreeSBatchReqMsg(void* msg) {
taosMemoryFree(pMsg->msg);
}
-int32_t tSerializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp);
-int32_t tDeserializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp);
+int32_t tSerializeSBatchRsp(void* buf, int32_t bufLen, SBatchRsp* pRsp);
+int32_t tDeserializeSBatchRsp(void* buf, int32_t bufLen, SBatchRsp* pRsp);
static FORCE_INLINE void tFreeSBatchRspMsg(void* p) {
if (NULL == p) {
@@ -3219,11 +3228,10 @@ static FORCE_INLINE void tFreeSBatchRspMsg(void* p) {
taosMemoryFree(pRsp->msg);
}
-int32_t tSerializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq);
-int32_t tDeserializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq);
-int32_t tSerializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq);
-int32_t tDeserializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq);
-
+int32_t tSerializeSMqAskEpReq(void* buf, int32_t bufLen, SMqAskEpReq* pReq);
+int32_t tDeserializeSMqAskEpReq(void* buf, int32_t bufLen, SMqAskEpReq* pReq);
+int32_t tSerializeSMqHbReq(void* buf, int32_t bufLen, SMqHbReq* pReq);
+int32_t tDeserializeSMqHbReq(void* buf, int32_t bufLen, SMqHbReq* pReq);
#pragma pack(pop)
diff --git a/include/common/tmsgcb.h b/include/common/tmsgcb.h
index b5b997dac0a18c6ca83e07d5f5c597004df8a913..32d00bb4227c8b153e4112851ba6004b5ab7c88d 100644
--- a/include/common/tmsgcb.h
+++ b/include/common/tmsgcb.h
@@ -43,7 +43,6 @@ typedef int32_t (*PutToQueueFp)(void* pMgmt, EQueueType qtype, SRpcMsg* pMsg);
typedef int32_t (*GetQueueSizeFp)(void* pMgmt, int32_t vgId, EQueueType qtype);
typedef int32_t (*SendReqFp)(const SEpSet* pEpSet, SRpcMsg* pMsg);
typedef void (*SendRspFp)(SRpcMsg* pMsg);
-typedef void (*SendRedirectRspFp)(SRpcMsg* pMsg, const SEpSet* pNewEpSet);
typedef void (*RegisterBrokenLinkArgFp)(SRpcMsg* pMsg);
typedef void (*ReleaseHandleFp)(SRpcHandleInfo* pHandle, int8_t type);
typedef void (*ReportStartup)(const char* name, const char* desc);
@@ -55,7 +54,6 @@ typedef struct {
GetQueueSizeFp qsizeFp;
SendReqFp sendReqFp;
SendRspFp sendRspFp;
- SendRedirectRspFp sendRedirectRspFp;
RegisterBrokenLinkArgFp registerBrokenLinkArgFp;
ReleaseHandleFp releaseHandleFp;
ReportStartup reportStartupFp;
@@ -66,7 +64,6 @@ int32_t tmsgPutToQueue(const SMsgCb* msgcb, EQueueType qtype, SRpcMsg* pMsg);
int32_t tmsgGetQueueSize(const SMsgCb* msgcb, int32_t vgId, EQueueType qtype);
int32_t tmsgSendReq(const SEpSet* epSet, SRpcMsg* pMsg);
void tmsgSendRsp(SRpcMsg* pMsg);
-void tmsgSendRedirectRsp(SRpcMsg* pMsg, const SEpSet* pNewEpSet);
void tmsgRegisterBrokenLinkArg(SRpcMsg* pMsg);
void tmsgReleaseHandle(SRpcHandleInfo* pHandle, int8_t type);
void tmsgReportStartup(const char* name, const char* desc);
diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h
index 7ca552f179fe6da0bd189797ff0c33817c91dbf0..7833bdf1393c72b988b1553d691e7d8936b14603 100644
--- a/include/common/tmsgdef.h
+++ b/include/common/tmsgdef.h
@@ -172,6 +172,8 @@ enum {
TD_DEF_MSG_TYPE(TDMT_MND_SERVER_VERSION, "server-version", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_UPTIME_TIMER, "uptime-timer", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_TMQ_LOST_CONSUMER_CLEAR, "lost-consumer-clear", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_MND_STREAM_CHECKPOINT_TIMER, "stream-checkpoint-tmr", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_MND_STREAM_BEGIN_CHECKPOINT, "stream-begin-checkpoint", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_MAX_MSG, "mnd-max", NULL, NULL)
TD_NEW_MSG_SEG(TDMT_VND_MSG)
@@ -241,8 +243,11 @@ enum {
TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_DISPATCH, "stream-task-dispatch", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_STREAM_UNUSED1, "stream-unused1", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_STREAM_RETRIEVE, "stream-retrieve", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_STREAM_RECOVER_FINISH, "vnode-stream-finish", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_CHECK, "vnode-stream-task-check", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_STREAM_RECOVER_FINISH, "stream-recover-finish", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_CHECK, "stream-task-check", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_CHECKPOINT, "stream-checkpoint", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_REPORT_CHECKPOINT, "stream-report-checkpoint", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_STREAM_TASK_RESTORE_CHECKPOINT, "stream-restore-checkpoint", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_STREAM_MAX_MSG, "stream-max", NULL, NULL)
TD_NEW_MSG_SEG(TDMT_MON_MSG)
@@ -280,8 +285,9 @@ enum {
TD_NEW_MSG_SEG(TDMT_VND_STREAM_MSG)
TD_DEF_MSG_TYPE(TDMT_VND_STREAM_TRIGGER, "vnode-stream-trigger", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_VND_STREAM_RECOVER_STEP1, "vnode-stream-recover1", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_VND_STREAM_RECOVER_STEP2, "vnode-stream-recover2", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_VND_STREAM_RECOVER_NONBLOCKING_STAGE, "vnode-stream-recover1", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_VND_STREAM_RECOVER_BLOCKING_STAGE, "vnode-stream-recover2", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_VND_STREAM_CHECK_POINT_SOURCE, "vnode-stream-checkpoint-source", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_VND_STREAM_MAX_MSG, "vnd-stream-max", NULL, NULL)
TD_NEW_MSG_SEG(TDMT_VND_TMQ_MSG)
diff --git a/include/common/trow.h b/include/common/trow.h
index 9d183c8f80d926c9f646b83f73a0cbadacbd5afe..6a71a8844ed54baa45836d16f2c3ccf9b114cc0a 100644
--- a/include/common/trow.h
+++ b/include/common/trow.h
@@ -55,6 +55,14 @@ typedef struct STSRow {
#define TD_ROW_TP 0x0U // default
#define TD_ROW_KV 0x01U
+#define TD_VTYPE_PARTS 4 // PARTITIONS: 1 byte / 2 bits
+#define TD_VTYPE_OPTR 3 // OPERATOR: 4 - 1, utilize to get remainder
+#define TD_BITMAP_BYTES(cnt) (((cnt) + TD_VTYPE_OPTR) >> 2)
+
+#define TD_VTYPE_PARTS_I 8 // PARTITIONS: 1 byte / 1 bit
+#define TD_VTYPE_OPTR_I 7 // OPERATOR: 8 - 1, utilize to get remainder
+#define TD_BITMAP_BYTES_I(cnt) (((cnt) + TD_VTYPE_OPTR_I) >> 3)
+
/**
* @brief value type
* - for data from client input and STSRow in memory, 3 types of value none/null/norm available
@@ -244,7 +252,7 @@ int32_t tdGetBitmapValTypeI(const void *pBitmap, int16_t colIdx, TDRowValT *pVal
*/
static FORCE_INLINE void *tdGetBitmapAddrTp(STSRow *pRow, uint32_t flen) {
// The primary TS key is stored separatedly.
- return POINTER_SHIFT(TD_ROW_DATA(pRow), flen - sizeof(TSKEY));
+ return POINTER_SHIFT(TD_ROW_DATA(pRow), flen);
// return POINTER_SHIFT(pRow->ts, flen);
}
diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h
index f3c570aa8511c0ea82cbf822a811e2db556cf46e..fc630cfdc02bd40e5b01723be44cceb7e31cd74c 100644
--- a/include/common/ttokendef.h
+++ b/include/common/ttokendef.h
@@ -58,282 +58,285 @@
#define TK_TO 40
#define TK_REVOKE 41
#define TK_FROM 42
-#define TK_NK_COMMA 43
-#define TK_READ 44
-#define TK_WRITE 45
-#define TK_NK_DOT 46
-#define TK_DNODE 47
-#define TK_PORT 48
-#define TK_DNODES 49
-#define TK_NK_IPTOKEN 50
-#define TK_FORCE 51
-#define TK_LOCAL 52
-#define TK_QNODE 53
-#define TK_BNODE 54
-#define TK_SNODE 55
-#define TK_MNODE 56
-#define TK_DATABASE 57
-#define TK_USE 58
-#define TK_FLUSH 59
-#define TK_TRIM 60
-#define TK_IF 61
-#define TK_NOT 62
-#define TK_EXISTS 63
-#define TK_BUFFER 64
-#define TK_CACHEMODEL 65
-#define TK_CACHESIZE 66
-#define TK_COMP 67
-#define TK_DURATION 68
-#define TK_NK_VARIABLE 69
-#define TK_MAXROWS 70
-#define TK_MINROWS 71
-#define TK_KEEP 72
-#define TK_PAGES 73
-#define TK_PAGESIZE 74
-#define TK_TSDB_PAGESIZE 75
-#define TK_PRECISION 76
-#define TK_REPLICA 77
-#define TK_STRICT 78
-#define TK_VGROUPS 79
-#define TK_SINGLE_STABLE 80
-#define TK_RETENTIONS 81
-#define TK_SCHEMALESS 82
-#define TK_WAL_LEVEL 83
-#define TK_WAL_FSYNC_PERIOD 84
-#define TK_WAL_RETENTION_PERIOD 85
-#define TK_WAL_RETENTION_SIZE 86
-#define TK_WAL_ROLL_PERIOD 87
-#define TK_WAL_SEGMENT_SIZE 88
-#define TK_STT_TRIGGER 89
-#define TK_TABLE_PREFIX 90
-#define TK_TABLE_SUFFIX 91
-#define TK_NK_COLON 92
-#define TK_MAX_SPEED 93
-#define TK_TABLE 94
-#define TK_NK_LP 95
-#define TK_NK_RP 96
-#define TK_STABLE 97
-#define TK_ADD 98
-#define TK_COLUMN 99
-#define TK_MODIFY 100
-#define TK_RENAME 101
-#define TK_TAG 102
-#define TK_SET 103
-#define TK_NK_EQ 104
-#define TK_USING 105
-#define TK_TAGS 106
-#define TK_COMMENT 107
-#define TK_BOOL 108
-#define TK_TINYINT 109
-#define TK_SMALLINT 110
-#define TK_INT 111
-#define TK_INTEGER 112
-#define TK_BIGINT 113
-#define TK_FLOAT 114
-#define TK_DOUBLE 115
-#define TK_BINARY 116
-#define TK_TIMESTAMP 117
-#define TK_NCHAR 118
-#define TK_UNSIGNED 119
-#define TK_JSON 120
-#define TK_VARCHAR 121
-#define TK_MEDIUMBLOB 122
-#define TK_BLOB 123
-#define TK_VARBINARY 124
-#define TK_DECIMAL 125
-#define TK_MAX_DELAY 126
-#define TK_WATERMARK 127
-#define TK_ROLLUP 128
-#define TK_TTL 129
-#define TK_SMA 130
-#define TK_FIRST 131
-#define TK_LAST 132
-#define TK_SHOW 133
-#define TK_DATABASES 134
-#define TK_TABLES 135
-#define TK_STABLES 136
-#define TK_MNODES 137
-#define TK_QNODES 138
-#define TK_FUNCTIONS 139
-#define TK_INDEXES 140
-#define TK_ACCOUNTS 141
-#define TK_APPS 142
-#define TK_CONNECTIONS 143
-#define TK_LICENCES 144
-#define TK_GRANTS 145
-#define TK_QUERIES 146
-#define TK_SCORES 147
-#define TK_TOPICS 148
-#define TK_VARIABLES 149
-#define TK_CLUSTER 150
-#define TK_BNODES 151
-#define TK_SNODES 152
-#define TK_TRANSACTIONS 153
-#define TK_DISTRIBUTED 154
-#define TK_CONSUMERS 155
-#define TK_SUBSCRIPTIONS 156
-#define TK_VNODES 157
-#define TK_LIKE 158
-#define TK_TBNAME 159
-#define TK_QTAGS 160
-#define TK_AS 161
-#define TK_INDEX 162
-#define TK_FUNCTION 163
-#define TK_INTERVAL 164
-#define TK_TOPIC 165
-#define TK_WITH 166
-#define TK_META 167
-#define TK_CONSUMER 168
-#define TK_GROUP 169
-#define TK_DESC 170
-#define TK_DESCRIBE 171
-#define TK_RESET 172
-#define TK_QUERY 173
-#define TK_CACHE 174
-#define TK_EXPLAIN 175
-#define TK_ANALYZE 176
-#define TK_VERBOSE 177
-#define TK_NK_BOOL 178
-#define TK_RATIO 179
-#define TK_NK_FLOAT 180
-#define TK_OUTPUTTYPE 181
-#define TK_AGGREGATE 182
-#define TK_BUFSIZE 183
-#define TK_STREAM 184
-#define TK_INTO 185
-#define TK_TRIGGER 186
-#define TK_AT_ONCE 187
-#define TK_WINDOW_CLOSE 188
-#define TK_IGNORE 189
-#define TK_EXPIRED 190
-#define TK_FILL_HISTORY 191
-#define TK_SUBTABLE 192
-#define TK_KILL 193
-#define TK_CONNECTION 194
-#define TK_TRANSACTION 195
-#define TK_BALANCE 196
-#define TK_VGROUP 197
-#define TK_MERGE 198
-#define TK_REDISTRIBUTE 199
-#define TK_SPLIT 200
-#define TK_DELETE 201
-#define TK_INSERT 202
-#define TK_NULL 203
-#define TK_NK_QUESTION 204
-#define TK_NK_ARROW 205
-#define TK_ROWTS 206
-#define TK_QSTART 207
-#define TK_QEND 208
-#define TK_QDURATION 209
-#define TK_WSTART 210
-#define TK_WEND 211
-#define TK_WDURATION 212
-#define TK_IROWTS 213
-#define TK_CAST 214
-#define TK_NOW 215
-#define TK_TODAY 216
-#define TK_TIMEZONE 217
-#define TK_CLIENT_VERSION 218
-#define TK_SERVER_VERSION 219
-#define TK_SERVER_STATUS 220
-#define TK_CURRENT_USER 221
-#define TK_COUNT 222
-#define TK_LAST_ROW 223
-#define TK_CASE 224
-#define TK_END 225
-#define TK_WHEN 226
-#define TK_THEN 227
-#define TK_ELSE 228
-#define TK_BETWEEN 229
-#define TK_IS 230
-#define TK_NK_LT 231
-#define TK_NK_GT 232
-#define TK_NK_LE 233
-#define TK_NK_GE 234
-#define TK_NK_NE 235
-#define TK_MATCH 236
-#define TK_NMATCH 237
-#define TK_CONTAINS 238
-#define TK_IN 239
-#define TK_JOIN 240
-#define TK_INNER 241
-#define TK_SELECT 242
-#define TK_DISTINCT 243
-#define TK_WHERE 244
-#define TK_PARTITION 245
-#define TK_BY 246
-#define TK_SESSION 247
-#define TK_STATE_WINDOW 248
-#define TK_SLIDING 249
-#define TK_FILL 250
-#define TK_VALUE 251
-#define TK_NONE 252
-#define TK_PREV 253
-#define TK_LINEAR 254
-#define TK_NEXT 255
-#define TK_HAVING 256
-#define TK_RANGE 257
-#define TK_EVERY 258
-#define TK_ORDER 259
-#define TK_SLIMIT 260
-#define TK_SOFFSET 261
-#define TK_LIMIT 262
-#define TK_OFFSET 263
-#define TK_ASC 264
-#define TK_NULLS 265
-#define TK_ABORT 266
-#define TK_AFTER 267
-#define TK_ATTACH 268
-#define TK_BEFORE 269
-#define TK_BEGIN 270
-#define TK_BITAND 271
-#define TK_BITNOT 272
-#define TK_BITOR 273
-#define TK_BLOCKS 274
-#define TK_CHANGE 275
-#define TK_COMMA 276
-#define TK_COMPACT 277
-#define TK_CONCAT 278
-#define TK_CONFLICT 279
-#define TK_COPY 280
-#define TK_DEFERRED 281
-#define TK_DELIMITERS 282
-#define TK_DETACH 283
-#define TK_DIVIDE 284
-#define TK_DOT 285
-#define TK_EACH 286
-#define TK_FAIL 287
-#define TK_FILE 288
-#define TK_FOR 289
-#define TK_GLOB 290
-#define TK_ID 291
-#define TK_IMMEDIATE 292
-#define TK_IMPORT 293
-#define TK_INITIALLY 294
-#define TK_INSTEAD 295
-#define TK_ISNULL 296
-#define TK_KEY 297
-#define TK_MODULES 298
-#define TK_NK_BITNOT 299
-#define TK_NK_SEMI 300
-#define TK_NOTNULL 301
-#define TK_OF 302
-#define TK_PLUS 303
-#define TK_PRIVILEGE 304
-#define TK_RAISE 305
-#define TK_REPLACE 306
-#define TK_RESTRICT 307
-#define TK_ROW 308
-#define TK_SEMI 309
-#define TK_STAR 310
-#define TK_STATEMENT 311
-#define TK_STRING 312
-#define TK_TIMES 313
-#define TK_UPDATE 314
-#define TK_VALUES 315
-#define TK_VARIABLE 316
-#define TK_VIEW 317
-#define TK_WAL 318
+#define TK_SUBSCRIBE 43
+#define TK_NK_COMMA 44
+#define TK_READ 45
+#define TK_WRITE 46
+#define TK_NK_DOT 47
+#define TK_DNODE 48
+#define TK_PORT 49
+#define TK_DNODES 50
+#define TK_NK_IPTOKEN 51
+#define TK_FORCE 52
+#define TK_LOCAL 53
+#define TK_QNODE 54
+#define TK_BNODE 55
+#define TK_SNODE 56
+#define TK_MNODE 57
+#define TK_DATABASE 58
+#define TK_USE 59
+#define TK_FLUSH 60
+#define TK_TRIM 61
+#define TK_IF 62
+#define TK_NOT 63
+#define TK_EXISTS 64
+#define TK_BUFFER 65
+#define TK_CACHEMODEL 66
+#define TK_CACHESIZE 67
+#define TK_COMP 68
+#define TK_DURATION 69
+#define TK_NK_VARIABLE 70
+#define TK_MAXROWS 71
+#define TK_MINROWS 72
+#define TK_KEEP 73
+#define TK_PAGES 74
+#define TK_PAGESIZE 75
+#define TK_TSDB_PAGESIZE 76
+#define TK_PRECISION 77
+#define TK_REPLICA 78
+#define TK_STRICT 79
+#define TK_VGROUPS 80
+#define TK_SINGLE_STABLE 81
+#define TK_RETENTIONS 82
+#define TK_SCHEMALESS 83
+#define TK_WAL_LEVEL 84
+#define TK_WAL_FSYNC_PERIOD 85
+#define TK_WAL_RETENTION_PERIOD 86
+#define TK_WAL_RETENTION_SIZE 87
+#define TK_WAL_ROLL_PERIOD 88
+#define TK_WAL_SEGMENT_SIZE 89
+#define TK_STT_TRIGGER 90
+#define TK_TABLE_PREFIX 91
+#define TK_TABLE_SUFFIX 92
+#define TK_NK_COLON 93
+#define TK_MAX_SPEED 94
+#define TK_TABLE 95
+#define TK_NK_LP 96
+#define TK_NK_RP 97
+#define TK_STABLE 98
+#define TK_ADD 99
+#define TK_COLUMN 100
+#define TK_MODIFY 101
+#define TK_RENAME 102
+#define TK_TAG 103
+#define TK_SET 104
+#define TK_NK_EQ 105
+#define TK_USING 106
+#define TK_TAGS 107
+#define TK_COMMENT 108
+#define TK_BOOL 109
+#define TK_TINYINT 110
+#define TK_SMALLINT 111
+#define TK_INT 112
+#define TK_INTEGER 113
+#define TK_BIGINT 114
+#define TK_FLOAT 115
+#define TK_DOUBLE 116
+#define TK_BINARY 117
+#define TK_TIMESTAMP 118
+#define TK_NCHAR 119
+#define TK_UNSIGNED 120
+#define TK_JSON 121
+#define TK_VARCHAR 122
+#define TK_MEDIUMBLOB 123
+#define TK_BLOB 124
+#define TK_VARBINARY 125
+#define TK_DECIMAL 126
+#define TK_MAX_DELAY 127
+#define TK_WATERMARK 128
+#define TK_ROLLUP 129
+#define TK_TTL 130
+#define TK_SMA 131
+#define TK_DELETE_MARK 132
+#define TK_FIRST 133
+#define TK_LAST 134
+#define TK_SHOW 135
+#define TK_PRIVILEGES 136
+#define TK_DATABASES 137
+#define TK_TABLES 138
+#define TK_STABLES 139
+#define TK_MNODES 140
+#define TK_QNODES 141
+#define TK_FUNCTIONS 142
+#define TK_INDEXES 143
+#define TK_ACCOUNTS 144
+#define TK_APPS 145
+#define TK_CONNECTIONS 146
+#define TK_LICENCES 147
+#define TK_GRANTS 148
+#define TK_QUERIES 149
+#define TK_SCORES 150
+#define TK_TOPICS 151
+#define TK_VARIABLES 152
+#define TK_CLUSTER 153
+#define TK_BNODES 154
+#define TK_SNODES 155
+#define TK_TRANSACTIONS 156
+#define TK_DISTRIBUTED 157
+#define TK_CONSUMERS 158
+#define TK_SUBSCRIPTIONS 159
+#define TK_VNODES 160
+#define TK_LIKE 161
+#define TK_TBNAME 162
+#define TK_QTAGS 163
+#define TK_AS 164
+#define TK_INDEX 165
+#define TK_FUNCTION 166
+#define TK_INTERVAL 167
+#define TK_TOPIC 168
+#define TK_WITH 169
+#define TK_META 170
+#define TK_CONSUMER 171
+#define TK_GROUP 172
+#define TK_DESC 173
+#define TK_DESCRIBE 174
+#define TK_RESET 175
+#define TK_QUERY 176
+#define TK_CACHE 177
+#define TK_EXPLAIN 178
+#define TK_ANALYZE 179
+#define TK_VERBOSE 180
+#define TK_NK_BOOL 181
+#define TK_RATIO 182
+#define TK_NK_FLOAT 183
+#define TK_OUTPUTTYPE 184
+#define TK_AGGREGATE 185
+#define TK_BUFSIZE 186
+#define TK_STREAM 187
+#define TK_INTO 188
+#define TK_TRIGGER 189
+#define TK_AT_ONCE 190
+#define TK_WINDOW_CLOSE 191
+#define TK_IGNORE 192
+#define TK_EXPIRED 193
+#define TK_FILL_HISTORY 194
+#define TK_SUBTABLE 195
+#define TK_KILL 196
+#define TK_CONNECTION 197
+#define TK_TRANSACTION 198
+#define TK_BALANCE 199
+#define TK_VGROUP 200
+#define TK_MERGE 201
+#define TK_REDISTRIBUTE 202
+#define TK_SPLIT 203
+#define TK_DELETE 204
+#define TK_INSERT 205
+#define TK_NULL 206
+#define TK_NK_QUESTION 207
+#define TK_NK_ARROW 208
+#define TK_ROWTS 209
+#define TK_QSTART 210
+#define TK_QEND 211
+#define TK_QDURATION 212
+#define TK_WSTART 213
+#define TK_WEND 214
+#define TK_WDURATION 215
+#define TK_IROWTS 216
+#define TK_CAST 217
+#define TK_NOW 218
+#define TK_TODAY 219
+#define TK_TIMEZONE 220
+#define TK_CLIENT_VERSION 221
+#define TK_SERVER_VERSION 222
+#define TK_SERVER_STATUS 223
+#define TK_CURRENT_USER 224
+#define TK_COUNT 225
+#define TK_LAST_ROW 226
+#define TK_CASE 227
+#define TK_END 228
+#define TK_WHEN 229
+#define TK_THEN 230
+#define TK_ELSE 231
+#define TK_BETWEEN 232
+#define TK_IS 233
+#define TK_NK_LT 234
+#define TK_NK_GT 235
+#define TK_NK_LE 236
+#define TK_NK_GE 237
+#define TK_NK_NE 238
+#define TK_MATCH 239
+#define TK_NMATCH 240
+#define TK_CONTAINS 241
+#define TK_IN 242
+#define TK_JOIN 243
+#define TK_INNER 244
+#define TK_SELECT 245
+#define TK_DISTINCT 246
+#define TK_WHERE 247
+#define TK_PARTITION 248
+#define TK_BY 249
+#define TK_SESSION 250
+#define TK_STATE_WINDOW 251
+#define TK_SLIDING 252
+#define TK_FILL 253
+#define TK_VALUE 254
+#define TK_NONE 255
+#define TK_PREV 256
+#define TK_LINEAR 257
+#define TK_NEXT 258
+#define TK_HAVING 259
+#define TK_RANGE 260
+#define TK_EVERY 261
+#define TK_ORDER 262
+#define TK_SLIMIT 263
+#define TK_SOFFSET 264
+#define TK_LIMIT 265
+#define TK_OFFSET 266
+#define TK_ASC 267
+#define TK_NULLS 268
+#define TK_ABORT 269
+#define TK_AFTER 270
+#define TK_ATTACH 271
+#define TK_BEFORE 272
+#define TK_BEGIN 273
+#define TK_BITAND 274
+#define TK_BITNOT 275
+#define TK_BITOR 276
+#define TK_BLOCKS 277
+#define TK_CHANGE 278
+#define TK_COMMA 279
+#define TK_COMPACT 280
+#define TK_CONCAT 281
+#define TK_CONFLICT 282
+#define TK_COPY 283
+#define TK_DEFERRED 284
+#define TK_DELIMITERS 285
+#define TK_DETACH 286
+#define TK_DIVIDE 287
+#define TK_DOT 288
+#define TK_EACH 289
+#define TK_FAIL 290
+#define TK_FILE 291
+#define TK_FOR 292
+#define TK_GLOB 293
+#define TK_ID 294
+#define TK_IMMEDIATE 295
+#define TK_IMPORT 296
+#define TK_INITIALLY 297
+#define TK_INSTEAD 298
+#define TK_ISNULL 299
+#define TK_KEY 300
+#define TK_MODULES 301
+#define TK_NK_BITNOT 302
+#define TK_NK_SEMI 303
+#define TK_NOTNULL 304
+#define TK_OF 305
+#define TK_PLUS 306
+#define TK_PRIVILEGE 307
+#define TK_RAISE 308
+#define TK_REPLACE 309
+#define TK_RESTRICT 310
+#define TK_ROW 311
+#define TK_SEMI 312
+#define TK_STAR 313
+#define TK_STATEMENT 314
+#define TK_STRING 315
+#define TK_TIMES 316
+#define TK_UPDATE 317
+#define TK_VALUES 318
+#define TK_VARIABLE 319
+#define TK_VIEW 320
+#define TK_WAL 321
#define TK_NK_SPACE 600
#define TK_NK_COMMENT 601
diff --git a/include/common/ttypes.h b/include/common/ttypes.h
index 761ffd0f1c1c9d480c312382897a5b30b52b7335..6350057c1f63b1bfb49694ca635e5e064c11d406 100644
--- a/include/common/ttypes.h
+++ b/include/common/ttypes.h
@@ -278,11 +278,9 @@ typedef struct {
#define IS_VALID_TINYINT(_t) ((_t) >= INT8_MIN && (_t) <= INT8_MAX)
#define IS_VALID_SMALLINT(_t) ((_t) >= INT16_MIN && (_t) <= INT16_MAX)
#define IS_VALID_INT(_t) ((_t) >= INT32_MIN && (_t) <= INT32_MAX)
-#define IS_VALID_BIGINT(_t) ((_t) >= INT64_MIN && (_t) <= INT64_MAX)
#define IS_VALID_UTINYINT(_t) ((_t) >= 0 && (_t) <= UINT8_MAX)
#define IS_VALID_USMALLINT(_t) ((_t) >= 0 && (_t) <= UINT16_MAX)
#define IS_VALID_UINT(_t) ((_t) >= 0 && (_t) <= UINT32_MAX)
-#define IS_VALID_UBIGINT(_t) ((_t) >= 0 && (_t) <= UINT64_MAX)
#define IS_VALID_FLOAT(_t) ((_t) >= -FLT_MAX && (_t) <= FLT_MAX)
#define IS_VALID_DOUBLE(_t) ((_t) >= -DBL_MAX && (_t) <= DBL_MAX)
diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h
index 6154882756e0cb738f94fdf566cd9883da766c32..a95db86d3fc2de33b290f9211ce24be6c2549972 100644
--- a/include/libs/catalog/catalog.h
+++ b/include/libs/catalog/catalog.h
@@ -211,6 +211,8 @@ int32_t catalogGetCachedSTableMeta(SCatalog* pCtg, const SName* pTableName, STab
int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists);
+int32_t catalogGetCachedTableVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta);
+
/**
* Force refresh DB's local cached vgroup info.
* @param pCtg (input, got with catalogGetHandle)
diff --git a/include/libs/executor/dataSinkMgt.h b/include/libs/executor/dataSinkMgt.h
index 8a02f372d1d605b359482b5e27810e6f95488433..ed7cbc812504ae09099abd79020c6b9d761d6674 100644
--- a/include/libs/executor/dataSinkMgt.h
+++ b/include/libs/executor/dataSinkMgt.h
@@ -68,7 +68,7 @@ typedef struct SInputData {
typedef struct SOutputData {
int32_t numOfBlocks;
- int32_t numOfRows;
+ int64_t numOfRows; // int32_t changed to int64_t
int32_t numOfCols;
int8_t compressed;
char* pData;
diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h
index 1fe30a2d66b0a42470ca846d1682ec68bd64f4f3..412b4b4cf6c950113a2f7e6d319692695cde0c07 100644
--- a/include/libs/executor/executor.h
+++ b/include/libs/executor/executor.h
@@ -142,14 +142,17 @@ int32_t qGetQueryTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* table
*/
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);
+void qCleanExecTaskBlockBuf(qTaskInfo_t tinfo);
+
/**
* kill the ongoing query asynchronously
* @param tinfo qhandle
* @return
*/
-int32_t qAsyncKillTask(qTaskInfo_t tinfo);
+int32_t qAsyncKillTask(qTaskInfo_t tinfo, int32_t rspCode);
/**
* destroy query info structure
@@ -157,13 +160,6 @@ int32_t qAsyncKillTask(qTaskInfo_t tinfo);
*/
void qDestroyTask(qTaskInfo_t tinfo);
-/**
- * Get the queried table uid
- * @param qHandle
- * @return
- */
-int64_t qGetQueriedTableUid(qTaskInfo_t tinfo);
-
/**
* Extract the qualified table id list, and than pass them to the TSDB driver to load the required table data blocks.
*
diff --git a/include/libs/function/function.h b/include/libs/function/function.h
index 6f2a67546658228615ebe20eade9e626e9a13ed7..32b8cc7389b96e7479697b2c864e98543d92e9a1 100644
--- a/include/libs/function/function.h
+++ b/include/libs/function/function.h
@@ -57,7 +57,7 @@ typedef struct SFuncExecFuncs {
#define MAX_INTERVAL_TIME_WINDOW 10000000 // maximum allowed time windows in final results
#define TOP_BOTTOM_QUERY_LIMIT 100
-#define FUNCTIONS_NAME_MAX_LENGTH 16
+#define FUNCTIONS_NAME_MAX_LENGTH 32
typedef struct SResultRowEntryInfo {
bool initialized : 1; // output buffer has been initialized
@@ -115,7 +115,7 @@ typedef struct SInputColumnInfoData {
int32_t startRowIndex; // handle started row index
int32_t numOfRows; // the number of rows needs to be handled
int32_t numOfInputCols; // PTS is not included
- bool colDataAggIsSet; // if agg is set or not
+ bool colDataSMAIsSet; // if agg is set or not
SColumnInfoData *pPTS; // primary timestamp column
SColumnInfoData **pData;
SColumnDataAgg **pColumnDataAgg;
@@ -137,22 +137,22 @@ typedef struct SqlFunctionCtx {
int16_t functionId; // function id
char *pOutput; // final result output buffer, point to sdata->data
int32_t numOfParams;
- SFunctParam *param; // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
- SColumnInfoData *pTsOutput; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
- int32_t offset;
- struct SResultRowEntryInfo *resultInfo;
- SSubsidiaryResInfo subsidiaries;
- SPoint1 start;
- SPoint1 end;
- SFuncExecFuncs fpSet;
- SScalarFuncExecFuncs sfp;
- struct SExprInfo *pExpr;
- struct SSDataBlock *pSrcBlock;
- struct SSDataBlock *pDstBlock; // used by indefinite rows function to set selectivity
- SSerializeDataHandle saveHandle;
- bool isStream;
-
- char udfName[TSDB_FUNC_NAME_LEN];
+ // input parameter, e.g., top(k, 20), the number of results of top query is kept in param
+ SFunctParam *param;
+ // corresponding output buffer for timestamp of each result, e.g., diff/csum
+ SColumnInfoData *pTsOutput;
+ int32_t offset;
+ SResultRowEntryInfo *resultInfo;
+ SSubsidiaryResInfo subsidiaries;
+ SPoint1 start;
+ SPoint1 end;
+ SFuncExecFuncs fpSet;
+ SScalarFuncExecFuncs sfp;
+ struct SExprInfo *pExpr;
+ struct SSDataBlock *pSrcBlock;
+ struct SSDataBlock *pDstBlock; // used by indefinite rows function to set selectivity
+ SSerializeDataHandle saveHandle;
+ char udfName[TSDB_FUNC_NAME_LEN];
} SqlFunctionCtx;
typedef struct tExprNode {
@@ -163,6 +163,7 @@ typedef struct tExprNode {
int32_t functionId;
int32_t num;
struct SFunctionNode *pFunctNode;
+ int32_t functionType;
} _function;
struct {
@@ -182,7 +183,6 @@ struct SScalarParam {
};
void cleanupResultRowEntry(struct SResultRowEntryInfo *pCell);
-//int32_t getNumOfResult(SqlFunctionCtx *pCtx, int32_t num, SSDataBlock *pResBlock);
bool isRowEntryCompleted(struct SResultRowEntryInfo *pEntry);
bool isRowEntryInitialized(struct SResultRowEntryInfo *pEntry);
@@ -194,32 +194,6 @@ typedef struct SPoint {
int32_t taosGetLinearInterpolationVal(SPoint *point, int32_t outputType, SPoint *point1, SPoint *point2,
int32_t inputType);
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// udf api
-/**
- * create udfd proxy, called once in process that call doSetupUdf/callUdfxxx/doTeardownUdf
- * @return error code
- */
-int32_t udfcOpen();
-
-/**
- * destroy udfd proxy
- * @return error code
- */
-int32_t udfcClose();
-
-/**
- * start udfd that serves udf function invocation under dnode startDnodeId
- * @param startDnodeId
- * @return
- */
-int32_t udfStartUdfd(int32_t startDnodeId);
-/**
- * stop udfd
- * @return
- */
-int32_t udfStopUdfd();
-
#ifdef __cplusplus
}
#endif
diff --git a/include/libs/function/functionMgt.h b/include/libs/function/functionMgt.h
index 81f63537e59ee7f51e01a0bc5c9527601be83300..9ca6a7a9fafe464f1f82682b9e3599d15b6dff79 100644
--- a/include/libs/function/functionMgt.h
+++ b/include/libs/function/functionMgt.h
@@ -130,6 +130,7 @@ typedef enum EFunctionType {
FUNCTION_TYPE_GROUP_KEY,
FUNCTION_TYPE_CACHE_LAST_ROW,
FUNCTION_TYPE_CACHE_LAST,
+ FUNCTION_TYPE_TABLE_COUNT,
// distributed splitting functions
FUNCTION_TYPE_APERCENTILE_PARTIAL = 4000,
diff --git a/include/libs/function/taosudf.h b/include/libs/function/taosudf.h
index 5f57e203b9c04de0efa34ede4eaeb57503e18db3..1b1339340b1dc13d85740e953400ac6c0ee85f40 100644
--- a/include/libs/function/taosudf.h
+++ b/include/libs/function/taosudf.h
@@ -228,7 +228,7 @@ static FORCE_INLINE int32_t udfColDataSet(SUdfColumn *pColumn, uint32_t currentR
newSize = 8;
}
- while (newSize < data->varLenCol.payloadLen + dataLen) {
+ while (newSize < (uint32_t)(data->varLenCol.payloadLen + dataLen)) {
newSize = newSize * UDF_MEMORY_EXP_GROWTH;
}
@@ -248,7 +248,7 @@ static FORCE_INLINE int32_t udfColDataSet(SUdfColumn *pColumn, uint32_t currentR
data->varLenCol.payloadLen += dataLen;
}
}
- data->numOfRows = (currentRow + 1 > data->numOfRows) ? (currentRow + 1) : data->numOfRows;
+ data->numOfRows = ((int32_t)(currentRow + 1) > data->numOfRows) ? (int32_t)(currentRow + 1) : data->numOfRows;
return 0;
}
diff --git a/include/libs/function/tudf.h b/include/libs/function/tudf.h
index 31cc53bb9f01a062db95fcdcc8b7704c23e12660..b71d50d43cc59988407576c1c1e0b9c2bce8fa3b 100644
--- a/include/libs/function/tudf.h
+++ b/include/libs/function/tudf.h
@@ -85,6 +85,32 @@ int32_t callUdfScalarFunc(char *udfName, SScalarParam *input, int32_t numOfCols,
int32_t cleanUpUdfs();
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// udf api
+/**
+ * create udfd proxy, called once in process that call doSetupUdf/callUdfxxx/doTeardownUdf
+ * @return error code
+ */
+int32_t udfcOpen();
+
+/**
+ * destroy udfd proxy
+ * @return error code
+ */
+int32_t udfcClose();
+
+/**
+ * start udfd that serves udf function invocation under dnode startDnodeId
+ * @param startDnodeId
+ * @return
+ */
+int32_t udfStartUdfd(int32_t startDnodeId);
+/**
+ * stop udfd
+ * @return
+ */
+int32_t udfStopUdfd();
+
#ifdef __cplusplus
}
#endif
diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h
index fc9bd461f61b9119296dfc2151f38701b493b22e..b1054e7b859c8ba9231ee1c942f12d7c1ec6b97c 100644
--- a/include/libs/nodes/cmdnodes.h
+++ b/include/libs/nodes/cmdnodes.h
@@ -42,9 +42,10 @@ extern "C" {
#define PRIVILEGE_TYPE_MASK(n) (1 << n)
-#define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0)
-#define PRIVILEGE_TYPE_READ PRIVILEGE_TYPE_MASK(1)
-#define PRIVILEGE_TYPE_WRITE PRIVILEGE_TYPE_MASK(2)
+#define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0)
+#define PRIVILEGE_TYPE_READ PRIVILEGE_TYPE_MASK(1)
+#define PRIVILEGE_TYPE_WRITE PRIVILEGE_TYPE_MASK(2)
+#define PRIVILEGE_TYPE_SUBSCRIBE PRIVILEGE_TYPE_MASK(3)
#define PRIVILEGE_TYPE_TEST_MASK(val, mask) (((val) & (mask)) != 0)
@@ -132,6 +133,9 @@ typedef struct STableOptions {
SNodeList* pWatermark;
int64_t watermark1;
int64_t watermark2;
+ SNodeList* pDeleteMark;
+ int64_t deleteMark1;
+ int64_t deleteMark2;
SNodeList* pRollupFuncs;
int32_t ttl;
SNodeList* pSma;
@@ -382,6 +386,7 @@ typedef struct SStreamOptions {
int8_t triggerType;
SNode* pDelay;
SNode* pWatermark;
+ SNode* pDeleteMark;
int8_t fillHistory;
int8_t ignoreExpired;
} SStreamOptions;
@@ -423,7 +428,7 @@ typedef struct SDropFunctionStmt {
typedef struct SGrantStmt {
ENodeType type;
char userName[TSDB_USER_LEN];
- char dbName[TSDB_DB_NAME_LEN];
+ char objName[TSDB_DB_NAME_LEN]; // db or topic
int64_t privileges;
} SGrantStmt;
diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h
index 00e896f586dec53a34c53ade66af9107bacea1d4..412054b13e3bdceec6234919040c4b99a43d6102 100644
--- a/include/libs/nodes/nodes.h
+++ b/include/libs/nodes/nodes.h
@@ -60,6 +60,12 @@ extern "C" {
for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); \
(NULL != cell ? (node = &(cell->pNode), true) : (node = NULL, false)); cell = cell->pNext)
+#define NODES_DESTORY_NODE(node) \
+ do { \
+ nodesDestroyNode((node)); \
+ (node) = NULL; \
+ } while (0)
+
#define NODES_DESTORY_LIST(list) \
do { \
nodesDestroyList((list)); \
@@ -187,6 +193,7 @@ typedef enum ENodeType {
QUERY_NODE_SHOW_TRANSACTIONS_STMT,
QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT,
QUERY_NODE_SHOW_VNODES_STMT,
+ QUERY_NODE_SHOW_USER_PRIVILEGES_STMT,
QUERY_NODE_SHOW_CREATE_DATABASE_STMT,
QUERY_NODE_SHOW_CREATE_TABLE_STMT,
QUERY_NODE_SHOW_CREATE_STABLE_STMT,
@@ -257,7 +264,8 @@ typedef enum ENodeType {
QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT,
QUERY_NODE_PHYSICAL_PLAN_DELETE,
QUERY_NODE_PHYSICAL_SUBPLAN,
- QUERY_NODE_PHYSICAL_PLAN
+ QUERY_NODE_PHYSICAL_PLAN,
+ QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN
} ENodeType;
/**
diff --git a/include/libs/nodes/plannodes.h b/include/libs/nodes/plannodes.h
index f942713f5da5a9ce9db9088c178f11813d9be48c..d62bdb93cfba5141e99642afaf1ddb71b46d502a 100644
--- a/include/libs/nodes/plannodes.h
+++ b/include/libs/nodes/plannodes.h
@@ -62,7 +62,8 @@ typedef enum EScanType {
SCAN_TYPE_STREAM,
SCAN_TYPE_TABLE_MERGE,
SCAN_TYPE_BLOCK_INFO,
- SCAN_TYPE_LAST_ROW
+ SCAN_TYPE_LAST_ROW,
+ SCAN_TYPE_TABLE_COUNT
} EScanType;
typedef struct SScanLogicNode {
@@ -90,6 +91,7 @@ typedef struct SScanLogicNode {
SNode* pTagIndexCond;
int8_t triggerType;
int64_t watermark;
+ int64_t deleteMark;
int8_t igExpired;
SArray* pSmaIndexes;
SNodeList* pGroupTags;
@@ -171,6 +173,7 @@ typedef struct SExchangeLogicNode {
SLogicNode node;
int32_t srcStartGroupId;
int32_t srcEndGroupId;
+ bool seqRecvData;
} SExchangeLogicNode;
typedef struct SMergeLogicNode {
@@ -211,6 +214,7 @@ typedef struct SWindowLogicNode {
SNode* pStateExpr;
int8_t triggerType;
int64_t watermark;
+ int64_t deleteMark;
int8_t igExpired;
EWindowAlgorithm windowAlgo;
EOrder inputTsOrder;
@@ -322,6 +326,8 @@ typedef struct SLastRowScanPhysiNode {
bool ignoreNull;
} SLastRowScanPhysiNode;
+typedef SLastRowScanPhysiNode STableCountScanPhysiNode;
+
typedef struct SSystemTableScanPhysiNode {
SScanPhysiNode scan;
SEpSet mgmtEpSet;
@@ -416,6 +422,7 @@ typedef struct SExchangePhysiNode {
int32_t srcEndGroupId;
bool singleChannel;
SNodeList* pSrcEndPoints; // element is SDownstreamSource, scheduler fill by calling qSetSuplanExecutionNode
+ bool seqRecvData;
} SExchangePhysiNode;
typedef struct SMergePhysiNode {
@@ -435,6 +442,7 @@ typedef struct SWinodwPhysiNode {
SNode* pTsEnd; // window end timestamp
int8_t triggerType;
int64_t watermark;
+ int64_t deleteMark;
int8_t igExpired;
EOrder inputTsOrder;
EOrder outputTsOrder;
diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h
index 5291130e4fb80733dd133bfafe49ba26d2ca2016..9f980fd0db577cc6a966a1cd28b4f8c48d1c791f 100644
--- a/include/libs/nodes/querynodes.h
+++ b/include/libs/nodes/querynodes.h
@@ -106,7 +106,7 @@ typedef struct SValueNode {
char* p;
} datum;
int64_t typeData;
- char unit;
+ int8_t unit;
} SValueNode;
typedef struct SLeftValueNode {
diff --git a/include/libs/parser/parser.h b/include/libs/parser/parser.h
index 1a7e6dc748c1f86c0c23ccbe8e70e41cf2912df8..9be79a539f468d20ad28d2278651fbae169ff4a6 100644
--- a/include/libs/parser/parser.h
+++ b/include/libs/parser/parser.h
@@ -29,7 +29,7 @@ struct SMetaData;
typedef struct SStmtCallback {
TAOS_STMT* pStmt;
int32_t (*getTbNameFn)(TAOS_STMT*, char**);
- int32_t (*setInfoFn)(TAOS_STMT*, STableMeta*, void*, char*, bool, SHashObj*, SHashObj*, const char*);
+ int32_t (*setInfoFn)(TAOS_STMT*, STableMeta*, void*, SName*, bool, SHashObj*, SHashObj*, const char*);
int32_t (*getExecInfoFn)(TAOS_STMT*, SHashObj**, SHashObj**);
} SStmtCallback;
@@ -108,7 +108,7 @@ int32_t qCreateSName(SName* pName, const char* pTableName, int32_t acctId, char*
void* smlInitHandle(SQuery* pQuery);
void smlDestroyHandle(void* pHandle);
int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols, bool format, STableMeta* pTableMeta,
- char* tableName, const char* sTableName, int32_t sTableNameLen, char* msgBuf, int16_t msgBufLen);
+ char* tableName, const char* sTableName, int32_t sTableNameLen, int32_t ttl, char* msgBuf, int16_t msgBufLen);
int32_t smlBuildOutput(void* handle, SHashObj* pVgHash);
int32_t rewriteToVnodeModifyOpStmt(SQuery* pQuery, SArray* pBufArray);
diff --git a/include/libs/planner/planner.h b/include/libs/planner/planner.h
index 82f5c478c1ec7a83728e18997b1b494c1e627057..f7bd68393e67b6c5a92587bc3fad56a20891b4fd 100644
--- a/include/libs/planner/planner.h
+++ b/include/libs/planner/planner.h
@@ -34,6 +34,7 @@ typedef struct SPlanContext {
bool showRewrite;
int8_t triggerType;
int64_t watermark;
+ int64_t deleteMark;
int8_t igExpired;
char* pMsg;
int32_t msgLen;
diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h
index 96ccef7164f9872664ac5b77259de62f70ea4123..91ec5f52e5f948f45410977d5db3111d4b2183f9 100644
--- a/include/libs/qcom/query.h
+++ b/include/libs/qcom/query.h
@@ -129,6 +129,7 @@ typedef struct SDBVgInfo {
int32_t numOfTable; // DB's table num, unit is TSDB_TABLE_NUM_UNIT
int64_t stateTs;
SHashObj* vgHash; // key:vgId, value:SVgroupInfo
+ SArray* vgArray;
} SDBVgInfo;
typedef struct SUseDbOutput {
@@ -238,6 +239,7 @@ int32_t dataConverToStr(char* str, int type, void* buf, int32_t bufSize, int32_t
char* parseTagDatatoJson(void* p);
int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst);
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
+void freeVgInfo(SDBVgInfo* vgInfo);
extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char** msg, int32_t msgSize, int32_t* msgLen,
void* (*mallocFp)(int64_t));
@@ -259,18 +261,24 @@ extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t
#define NEED_CLIENT_HANDLE_ERROR(_code) \
(NEED_CLIENT_RM_TBLMETA_ERROR(_code) || NEED_CLIENT_REFRESH_VG_ERROR(_code) || \
NEED_CLIENT_REFRESH_TBLMETA_ERROR(_code))
-#define NEED_REDIRECT_ERROR(_code) \
- ((_code) == TSDB_CODE_RPC_REDIRECT || (_code) == TSDB_CODE_RPC_NETWORK_UNAVAIL || \
- (_code) == TSDB_CODE_NODE_NOT_DEPLOYED || (_code) == TSDB_CODE_SYN_NOT_LEADER || \
- (_code) == TSDB_CODE_APP_NOT_READY || (_code) == TSDB_CODE_RPC_BROKEN_LINK)
+
+#define SYNC_UNKNOWN_LEADER_REDIRECT_ERROR(_code) ((_code) == TSDB_CODE_SYN_NOT_LEADER || (_code) == TSDB_CODE_SYN_INTERNAL_ERROR || (_code) == TSDB_CODE_VND_STOPPED || (_code) == TSDB_CODE_APP_IS_STARTING || (_code) == TSDB_CODE_APP_IS_STOPPING)
+#define SYNC_SELF_LEADER_REDIRECT_ERROR(_code) ((_code) == TSDB_CODE_SYN_NOT_LEADER || (_code) == TSDB_CODE_SYN_RESTORING || (_code) == TSDB_CODE_SYN_INTERNAL_ERROR)
+#define SYNC_OTHER_LEADER_REDIRECT_ERROR(_code) ((_code) == TSDB_CODE_MNODE_NOT_FOUND)
+
+#define NO_RET_REDIRECT_ERROR(_code) ((_code) == TSDB_CODE_RPC_BROKEN_LINK || (_code) == TSDB_CODE_RPC_NETWORK_UNAVAIL)
+
+#define NEED_REDIRECT_ERROR(_code) \
+ (NO_RET_REDIRECT_ERROR(_code) || SYNC_UNKNOWN_LEADER_REDIRECT_ERROR(_code) || \
+ SYNC_SELF_LEADER_REDIRECT_ERROR(_code) || SYNC_OTHER_LEADER_REDIRECT_ERROR(_code))
+
#define NEED_CLIENT_RM_TBLMETA_REQ(_type) \
((_type) == TDMT_VND_CREATE_TABLE || (_type) == TDMT_MND_CREATE_STB || (_type) == TDMT_VND_DROP_TABLE || \
(_type) == TDMT_MND_DROP_STB)
-#define NEED_SCHEDULER_REDIRECT_ERROR(_code) \
- ((_code) == TSDB_CODE_RPC_REDIRECT || (_code) == TSDB_CODE_NODE_NOT_DEPLOYED || \
- (_code) == TSDB_CODE_SYN_NOT_LEADER || (_code) == TSDB_CODE_APP_NOT_READY)
+#define NEED_SCHEDULER_REDIRECT_ERROR(_code) \
+ (SYNC_UNKNOWN_LEADER_REDIRECT_ERROR(_code) || SYNC_SELF_LEADER_REDIRECT_ERROR(_code) || SYNC_OTHER_LEADER_REDIRECT_ERROR(_code))
#define REQUEST_TOTAL_EXEC_TIMES 2
diff --git a/include/libs/stream/streamState.h b/include/libs/stream/streamState.h
index 59f030a60c651a118b4f956996eb8e60ce42cd87..8fdac0da7fe3758a7ba335ee11c0709f2cf56e83 100644
--- a/include/libs/stream/streamState.h
+++ b/include/libs/stream/streamState.h
@@ -35,7 +35,7 @@ typedef struct STdbState {
TTB* pFillStateDb; // todo refactor
TTB* pSessionStateDb;
TTB* pParNameDb;
- TXN txn;
+ TXN* txn;
} STdbState;
// incremental state storage
diff --git a/include/libs/stream/tstream.h b/include/libs/stream/tstream.h
index ecd1b6f916c814fe5ddcb2b72591c80b6e6c450a..16cf96072426aee9cf1608accccd840ae56da7ac 100644
--- a/include/libs/stream/tstream.h
+++ b/include/libs/stream/tstream.h
@@ -140,15 +140,40 @@ typedef struct {
int8_t type;
} SStreamCheckpoint;
-typedef struct {
- int8_t type;
-} SStreamTaskDestroy;
-
typedef struct {
int8_t type;
SSDataBlock* pBlock;
} SStreamTrigger;
+typedef struct SStreamQueueNode SStreamQueueNode;
+
+struct SStreamQueueNode {
+ SStreamQueueItem* item;
+ SStreamQueueNode* next;
+};
+
+typedef struct {
+ SStreamQueueNode* head;
+ int64_t size;
+} SStreamQueueRes;
+
+void streamFreeQitem(SStreamQueueItem* data);
+
+bool streamQueueResEmpty(const SStreamQueueRes* pRes);
+int64_t streamQueueResSize(const SStreamQueueRes* pRes);
+SStreamQueueNode* streamQueueResFront(SStreamQueueRes* pRes);
+SStreamQueueNode* streamQueueResPop(SStreamQueueRes* pRes);
+void streamQueueResClear(SStreamQueueRes* pRes);
+SStreamQueueRes streamQueueBuildRes(SStreamQueueNode* pNode);
+
+typedef struct {
+ SStreamQueueNode* pHead;
+} SStreamQueue1;
+
+bool streamQueueHasTask(const SStreamQueue1* pQueue);
+int32_t streamQueuePush(SStreamQueue1* pQueue, SStreamQueueItem* pItem);
+SStreamQueueRes streamQueueGetRes(SStreamQueue1* pQueue);
+
typedef struct {
STaosQueue* queue;
STaosQall* qall;
@@ -250,31 +275,6 @@ typedef struct {
SEpSet epSet;
} SStreamChildEpInfo;
-typedef struct {
- int32_t srcNodeId;
- int32_t srcChildId;
- int64_t stateSaveVer;
- int64_t stateProcessedVer;
-} SStreamCheckpointInfo;
-
-typedef struct {
- int64_t streamId;
- int64_t checkTs;
- int32_t checkpointId; // incremental
- int32_t taskId;
- SArray* checkpointVer; // SArray
-} SStreamMultiVgCheckpointInfo;
-
-typedef struct {
- int32_t taskId;
- int32_t checkpointId; // incremental
-} SStreamCheckpointKey;
-
-typedef struct {
- int32_t taskId;
- SArray* checkpointVer;
-} SStreamRecoveringState;
-
typedef struct SStreamTask {
int64_t streamId;
int32_t taskId;
@@ -339,6 +339,10 @@ typedef struct SStreamTask {
int64_t checkReqId;
SArray* checkReqIds; // shuffle
int32_t refCnt;
+
+ int64_t checkpointingId;
+ int32_t checkpointAlignCnt;
+
} SStreamTask;
int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo);
@@ -484,6 +488,60 @@ typedef struct {
int32_t tEncodeSStreamRecoverFinishReq(SEncoder* pEncoder, const SStreamRecoverFinishReq* pReq);
int32_t tDecodeSStreamRecoverFinishReq(SDecoder* pDecoder, SStreamRecoverFinishReq* pReq);
+typedef struct {
+ int64_t streamId;
+ int64_t checkpointId;
+ int32_t taskId;
+ int32_t nodeId;
+ int64_t expireTime;
+} SStreamCheckpointSourceReq;
+
+typedef struct {
+ int64_t streamId;
+ int64_t checkpointId;
+ int32_t taskId;
+ int32_t nodeId;
+ int64_t expireTime;
+} SStreamCheckpointSourceRsp;
+
+int32_t tEncodeSStreamCheckpointSourceReq(SEncoder* pEncoder, const SStreamCheckpointSourceReq* pReq);
+int32_t tDecodeSStreamCheckpointSourceReq(SDecoder* pDecoder, SStreamCheckpointSourceReq* pReq);
+
+int32_t tEncodeSStreamCheckpointSourceRsp(SEncoder* pEncoder, const SStreamCheckpointSourceRsp* pRsp);
+int32_t tDecodeSStreamCheckpointSourceRsp(SDecoder* pDecoder, SStreamCheckpointSourceRsp* pRsp);
+
+typedef struct {
+ SMsgHead msgHead;
+ int64_t streamId;
+ int64_t checkpointId;
+ int32_t downstreamTaskId;
+ int32_t downstreamNodeId;
+ int32_t upstreamTaskId;
+ int32_t upstreamNodeId;
+ int32_t childId;
+ int64_t expireTime;
+ int8_t taskLevel;
+} SStreamCheckpointReq;
+
+typedef struct {
+ SMsgHead msgHead;
+ int64_t streamId;
+ int64_t checkpointId;
+ int32_t downstreamTaskId;
+ int32_t downstreamNodeId;
+ int32_t upstreamTaskId;
+ int32_t upstreamNodeId;
+ int32_t childId;
+ int64_t expireTime;
+ int8_t taskLevel;
+} SStreamCheckpointRsp;
+
+int32_t tEncodeSStreamCheckpointReq(SEncoder* pEncoder, const SStreamCheckpointReq* pReq);
+int32_t tDecodeSStreamCheckpointReq(SDecoder* pDecoder, SStreamCheckpointReq* pReq);
+
+int32_t tEncodeSStreamCheckpointRsp(SEncoder* pEncoder, const SStreamCheckpointRsp* pRsp);
+int32_t tDecodeSStreamCheckpointRsp(SDecoder* pDecoder, SStreamCheckpointRsp* pRsp);
+
typedef struct {
int64_t streamId;
int32_t downstreamTaskId;
@@ -562,7 +620,7 @@ typedef struct SStreamMeta {
SHashObj* pTasks;
SHashObj* pRecoverStatus;
void* ahandle;
- TXN txn;
+ TXN* txn;
FTaskExpand* expandFunc;
int32_t vgId;
SRWLatch lock;
@@ -573,18 +631,22 @@ void streamMetaClose(SStreamMeta* streamMeta);
int32_t streamMetaAddTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTask);
int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t startVer, char* msg, int32_t msgLen);
-int32_t streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId);
SStreamTask* streamMetaGetTask(SStreamMeta* pMeta, int32_t taskId);
SStreamTask* streamMetaAcquireTask(SStreamMeta* pMeta, int32_t taskId);
void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask);
-void streamMetaRemoveTask1(SStreamMeta* pMeta, int32_t taskId);
+void streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId);
int32_t streamMetaBegin(SStreamMeta* pMeta);
int32_t streamMetaCommit(SStreamMeta* pMeta);
int32_t streamMetaRollBack(SStreamMeta* pMeta);
int32_t streamLoadTasks(SStreamMeta* pMeta);
+// checkpoint
+int32_t streamProcessCheckpointSourceReq(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointSourceReq* pReq);
+int32_t streamProcessCheckpointReq(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointReq* pReq);
+int32_t streamProcessCheckpointRsp(SStreamMeta* pMeta, SStreamTask* pTask, SStreamCheckpointRsp* pRsp);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h
index 513ba8cb3432de72911be0a56a8c5dc87c05dc60..4cf4800472b856fc7da2603677cd33060794d00c 100644
--- a/include/libs/sync/sync.h
+++ b/include/libs/sync/sync.h
@@ -25,7 +25,7 @@ extern "C" {
#include "tlrucache.h"
#include "tmsgcb.h"
-#define SYNC_RESP_TTL_MS 10000000
+#define SYNC_RESP_TTL_MS 30000
#define SYNC_SPEED_UP_HB_TIMER 400
#define SYNC_SPEED_UP_AFTER_MS (1000 * 20)
#define SYNC_SLOW_DOWN_RANGE 100
@@ -40,12 +40,19 @@ extern "C" {
#define SNAPSHOT_MAX_CLOCK_SKEW_MS 1000 * 10
#define SNAPSHOT_WAIT_MS 1000 * 30
+#define SYNC_MAX_RETRY_BACKOFF 5
+#define SYNC_LOG_REPL_RETRY_WAIT_MS 100
#define SYNC_APPEND_ENTRIES_TIMEOUT_MS 10000
+#define SYNC_HEART_TIMEOUT_MS 1000 * 15
+
+#define SYNC_HEARTBEAT_SLOW_MS 1500
+#define SYNC_HEARTBEAT_REPLY_SLOW_MS 1500
+#define SYNC_SNAP_RESEND_MS 1000 * 60
#define SYNC_MAX_BATCH_SIZE 1
#define SYNC_INDEX_BEGIN 0
#define SYNC_INDEX_INVALID -1
-#define SYNC_TERM_INVALID 0xFFFFFFFFFFFFFFFF
+#define SYNC_TERM_INVALID -1 // 0xFFFFFFFFFFFFFFFF
typedef enum {
SYNC_STRATEGY_NO_SNAPSHOT = 0,
@@ -56,13 +63,14 @@ typedef enum {
typedef uint64_t SyncNodeId;
typedef int32_t SyncGroupId;
typedef int64_t SyncIndex;
-typedef uint64_t SyncTerm;
+typedef int64_t SyncTerm;
typedef struct SSyncNode SSyncNode;
typedef struct SWal SWal;
typedef struct SSyncRaftEntry SSyncRaftEntry;
typedef enum {
+ TAOS_SYNC_STATE_OFFLINE = 0,
TAOS_SYNC_STATE_FOLLOWER = 100,
TAOS_SYNC_STATE_CANDIDATE = 101,
TAOS_SYNC_STATE_LEADER = 102,
@@ -131,13 +139,13 @@ typedef struct SSnapshotMeta {
typedef struct SSyncFSM {
void* data;
- void (*FpCommitCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
- void (*FpPreCommitCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
- void (*FpRollBackCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
+ int32_t (*FpCommitCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
+ int32_t (*FpPreCommitCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
+ void (*FpRollBackCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
void (*FpRestoreFinishCb)(const struct SSyncFSM* pFsm);
- void (*FpReConfigCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SReConfigCbMeta* pMeta);
- void (*FpLeaderTransferCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
+ void (*FpReConfigCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SReConfigCbMeta* pMeta);
+ void (*FpLeaderTransferCb)(const struct SSyncFSM* pFsm, SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
bool (*FpApplyQueueEmptyCb)(const struct SSyncFSM* pFsm);
int32_t (*FpApplyQueueItems)(const struct SSyncFSM* pFsm);
@@ -161,7 +169,10 @@ typedef struct SSyncFSM {
// SWal implements it
typedef struct SSyncLogStore {
SLRUCache* pCache;
- void* data;
+ int32_t cacheHit;
+ int32_t cacheMiss;
+
+ void* data;
int32_t (*syncLogUpdateCommitIndex)(struct SSyncLogStore* pLogStore, SyncIndex index);
SyncIndex (*syncLogCommitIndex)(struct SSyncLogStore* pLogStore);
@@ -203,15 +214,20 @@ typedef struct SSyncInfo {
int32_t (*syncEqCtrlMsg)(const SMsgCb* msgcb, SRpcMsg* pMsg);
} SSyncInfo;
+// if state == leader
+// if restored, display "leader"
+// if !restored && canRead, display "leader*"
+// if !restored && !canRead, display "leader**"
typedef struct SSyncState {
ESyncState state;
bool restored;
+ bool canRead;
} SSyncState;
int32_t syncInit();
void syncCleanUp();
int64_t syncOpen(SSyncInfo* pSyncInfo);
-void syncStart(int64_t rid);
+int32_t syncStart(int64_t rid);
void syncStop(int64_t rid);
void syncPreStop(int64_t rid);
int32_t syncPropose(int64_t rid, SRpcMsg* pMsg, bool isWeak);
@@ -222,6 +238,8 @@ int32_t syncEndSnapshot(int64_t rid);
int32_t syncLeaderTransfer(int64_t rid);
int32_t syncStepDown(int64_t rid, SyncTerm newTerm);
bool syncIsReadyForRead(int64_t rid);
+bool syncSnapshotSending(int64_t rid);
+bool syncSnapshotRecving(int64_t rid);
SSyncState syncGetState(int64_t rid);
void syncGetRetryEpSet(int64_t rid, SEpSet* pEpSet);
diff --git a/include/libs/transport/trpc.h b/include/libs/transport/trpc.h
index 8cc37910fd6436e8cf44b0e895020364e4956c88..87f753e6aa48061528ba0df6b8c280d284532801 100644
--- a/include/libs/transport/trpc.h
+++ b/include/libs/transport/trpc.h
@@ -72,6 +72,7 @@ typedef struct SRpcMsg {
typedef void (*RpcCfp)(void *parent, SRpcMsg *, SEpSet *epset);
typedef bool (*RpcRfp)(int32_t code, tmsg_t msgType);
typedef bool (*RpcTfp)(int32_t code, tmsg_t msgType);
+typedef bool (*RpcFFfp)(tmsg_t msgType);
typedef void (*RpcDfp)(void *ahandle);
typedef struct SRpcInit {
@@ -85,6 +86,14 @@ typedef struct SRpcInit {
int32_t retryLimit; // retry limit
int32_t retryInterval; // retry interval ms
+ int32_t retryMinInterval; // retry init interval
+ int32_t retryStepFactor; // retry interval factor
+ int32_t retryMaxInterval; // retry max interval
+ int64_t retryMaxTimouet;
+
+ int32_t failFastThreshold;
+ int32_t failFastInterval;
+
int32_t compressSize; // -1: no compress, 0 : all data compressed, size: compress data if larger than size
int8_t encryption; // encrypt or not
@@ -102,6 +111,8 @@ typedef struct SRpcInit {
// destroy client ahandle;
RpcDfp dfp;
+ // fail fast fp
+ RpcFFfp ffp;
void *parent;
} SRpcInit;
diff --git a/include/libs/wal/wal.h b/include/libs/wal/wal.h
index ed85fd3517f09f42548133a0360376f846c885ee..a1ae1e429dd5dbb18f6521b263576e7096482327 100644
--- a/include/libs/wal/wal.h
+++ b/include/libs/wal/wal.h
@@ -33,16 +33,16 @@ extern "C" {
#define wTrace(...) { if (wDebugFlag & DEBUG_TRACE) { taosPrintLog("WAL ", DEBUG_TRACE, wDebugFlag, __VA_ARGS__); }}
// clang-format on
-#define WAL_PROTO_VER 0
-#define WAL_NOSUFFIX_LEN 20
-#define WAL_SUFFIX_AT (WAL_NOSUFFIX_LEN + 1)
-#define WAL_LOG_SUFFIX "log"
-#define WAL_INDEX_SUFFIX "idx"
-#define WAL_REFRESH_MS 1000
-#define WAL_PATH_LEN (TSDB_FILENAME_LEN + 12)
-#define WAL_FILE_LEN (WAL_PATH_LEN + 32)
-#define WAL_MAGIC 0xFAFBFCFDF4F3F2F1ULL
-#define WAL_SCAN_BUF_SIZE (1024 * 1024 * 3)
+#define WAL_PROTO_VER 0
+#define WAL_NOSUFFIX_LEN 20
+#define WAL_SUFFIX_AT (WAL_NOSUFFIX_LEN + 1)
+#define WAL_LOG_SUFFIX "log"
+#define WAL_INDEX_SUFFIX "idx"
+#define WAL_REFRESH_MS 1000
+#define WAL_PATH_LEN (TSDB_FILENAME_LEN + 12)
+#define WAL_FILE_LEN (WAL_PATH_LEN + 32)
+#define WAL_MAGIC 0xFAFBFCFDF4F3F2F1ULL
+#define WAL_SCAN_BUF_SIZE (1024 * 1024 * 3)
typedef enum {
TAOS_WAL_WRITE = 1,
@@ -107,6 +107,8 @@ typedef struct SWal {
TdFilePtr pIdxFile;
int32_t writeCur;
SArray *fileInfoSet; // SArray
+ // gc
+ SArray *toDeleteFiles; // SArray
// status
int64_t totSize;
int64_t lastRollSeq;
@@ -170,7 +172,7 @@ int32_t walWriteWithSyncInfo(SWal *, int64_t index, tmsg_t msgType, SWalSyncInfo
// Assign version automatically and return to caller,
// -1 will be returned for failed writes
-int64_t walAppendLog(SWal *, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, int32_t bodyLen);
+int64_t walAppendLog(SWal *, int64_t index, tmsg_t msgType, SWalSyncInfo syncMeta, const void *body, int32_t bodyLen);
void walFsync(SWal *, bool force);
diff --git a/include/os/os.h b/include/os/os.h
index e780611c41235b159c119780ee60cd0a0eb5593f..b27fa84406b843f15ba99d52f7d9fde8580a0899 100644
--- a/include/os/os.h
+++ b/include/os/os.h
@@ -27,6 +27,7 @@ extern "C" {
#if !defined(WINDOWS)
#include
+#include
#include
#include
#include
@@ -48,6 +49,9 @@ extern "C" {
#else
#include
#include
+#if defined(_TD_X86_)
+#include
+#endif
#endif
#else
@@ -82,6 +86,12 @@ extern "C" {
#include
#include
+#if __AVX__
+#include
+#elif __SSE4_2__
+#include
+#endif
+
#include "osThread.h"
#include "osAtomic.h"
diff --git a/include/os/osDef.h b/include/os/osDef.h
index 297d19e21a4383e2fcc6c4f1ecf3dc86cb30f570..c18728c9a74276fe743e911b4301c57baa44e150 100644
--- a/include/os/osDef.h
+++ b/include/os/osDef.h
@@ -120,12 +120,6 @@ void syslog(int unused, const char *format, ...);
#define POINTER_SHIFT(p, b) ((void *)((char *)(p) + (b)))
#define POINTER_DISTANCE(p1, p2) ((char *)(p1) - (char *)(p2))
-#ifndef NDEBUG
-#define ASSERT(x) assert(x)
-#else
-#define ASSERT(x)
-#endif
-
#ifndef UNUSED
#define UNUSED(x) ((void)(x))
#endif
@@ -168,22 +162,22 @@ void syslog(int unused, const char *format, ...);
} \
} while (0)
-#define DEFAULT_DOUBLE_COMP(x, y) \
- do { \
- if (isnan(x) && isnan(y)) { \
- return 0; \
- } \
- if (isnan(x)) { \
- return -1; \
- } \
- if (isnan(y)) { \
- return 1; \
- } \
- if ((x) == (y)) { \
- return 0; \
- } else { \
- return (x) < (y) ? -1 : 1; \
- } \
+#define DEFAULT_DOUBLE_COMP(x, y) \
+ do { \
+ if (isnan(x) && isnan(y)) { \
+ return 0; \
+ } \
+ if (isnan(x)) { \
+ return -1; \
+ } \
+ if (isnan(y)) { \
+ return 1; \
+ } \
+ if (fabs((x) - (y)) <= DBL_EPSILON) { \
+ return 0; \
+ } else { \
+ return (x) < (y) ? -1 : 1; \
+ } \
} while (0)
#define DEFAULT_FLOAT_COMP(x, y) DEFAULT_DOUBLE_COMP(x, y)
diff --git a/include/os/osDir.h b/include/os/osDir.h
index 40012f8141d9be3ad4b1d669327e019516448df4..73871602c5e7818f0d9b050280d7326ee39678ef 100644
--- a/include/os/osDir.h
+++ b/include/os/osDir.h
@@ -62,6 +62,7 @@ int32_t taosRealPath(char *dirname, char *realPath, int32_t maxlen);
bool taosIsDir(const char *dirname);
char *taosDirName(char *dirname);
char *taosDirEntryBaseName(char *dirname);
+void taosGetCwd(char *buf, int32_t len);
TdDirPtr taosOpenDir(const char *dirname);
TdDirEntryPtr taosReadDir(TdDirPtr pDir);
diff --git a/include/os/osEnv.h b/include/os/osEnv.h
index c1fdc9e404c35dba510dafb76e2130ecbcc6ae05..a3bd209693a1bb3dc4958173d4f4a1744d13a713 100644
--- a/include/os/osEnv.h
+++ b/include/os/osEnv.h
@@ -36,6 +36,11 @@ extern int64_t tsStreamMax;
extern float tsNumOfCores;
extern int64_t tsTotalMemoryKB;
extern char *tsProcPath;
+extern char tsSIMDEnable;
+extern char tsSSE42Enable;
+extern char tsAVXEnable;
+extern char tsAVX2Enable;
+extern char tsFMAEnable;
extern char configDir[];
extern char tsDataDir[];
diff --git a/include/os/osFile.h b/include/os/osFile.h
index f6759d19a74499cc16e08ad84ff543c7a17d7550..ae77e0f27a26adf679f72be92c235e61b6ed0655 100644
--- a/include/os/osFile.h
+++ b/include/os/osFile.h
@@ -88,6 +88,7 @@ int32_t taosFsyncFile(TdFilePtr pFile);
int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count);
int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset);
int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count);
+int64_t taosPWriteFile(TdFilePtr pFile, const void *buf, int64_t count, int64_t offset);
void taosFprintfFile(TdFilePtr pFile, const char *format, ...);
int64_t taosGetLineFile(TdFilePtr pFile, char **__restrict ptrBuf);
diff --git a/include/os/osMemory.h b/include/os/osMemory.h
index 14d53a7a066f60b5f0d3c0f37526b2533b3b05af..4681ff66741d4781c88dba5ccc950094c96f6769 100644
--- a/include/os/osMemory.h
+++ b/include/os/osMemory.h
@@ -37,6 +37,7 @@ void taosMemoryFree(void *ptr);
int64_t taosMemorySize(void *ptr);
void taosPrintBackTrace();
void taosMemoryTrim(int32_t size);
+void *taosMemoryMallocAlign(uint32_t alignment, int64_t size);
#define taosMemoryFreeClear(ptr) \
do { \
diff --git a/include/os/osSemaphore.h b/include/os/osSemaphore.h
index e52da96f0170d4d67d9fb8fa3aeff7270223e2d3..5fc89d9d24a33c2d09ccf5c28e53ac2ec52f1593 100644
--- a/include/os/osSemaphore.h
+++ b/include/os/osSemaphore.h
@@ -29,7 +29,7 @@ typedef dispatch_semaphore_t tsem_t;
int tsem_init(tsem_t *sem, int pshared, unsigned int value);
int tsem_wait(tsem_t *sem);
-int tsem_timewait(tsem_t *sim, int64_t nanosecs);
+int tsem_timewait(tsem_t *sim, int64_t milis);
int tsem_post(tsem_t *sem);
int tsem_destroy(tsem_t *sem);
@@ -38,7 +38,7 @@ int tsem_destroy(tsem_t *sem);
#define tsem_t sem_t
#define tsem_init sem_init
int tsem_wait(tsem_t *sem);
-int tsem_timewait(tsem_t *sim, int64_t nanosecs);
+int tsem_timewait(tsem_t *sim, int64_t milis);
#define tsem_post sem_post
#define tsem_destroy sem_destroy
diff --git a/include/os/osSocket.h b/include/os/osSocket.h
index 2c7c579401c54fb74428dc90f972f817a010778c..3ba28d815655408821973d30e6c3e11deb53ddb0 100644
--- a/include/os/osSocket.h
+++ b/include/os/osSocket.h
@@ -169,6 +169,9 @@ void taosSetMaskSIGPIPE();
uint32_t taosInetAddr(const char *ipAddr);
const char *taosInetNtoa(struct in_addr ipInt, char *dstStr, int32_t len);
+uint64_t taosHton64(uint64_t val);
+uint64_t taosNtoh64(uint64_t val);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/os/osString.h b/include/os/osString.h
index 4c3fbe46c3870d98ae8b22f4dcf9a6edcb9ab4f7..b609c9d3513177c836c79572d2fd019e9a09cc6b 100644
--- a/include/os/osString.h
+++ b/include/os/osString.h
@@ -62,7 +62,7 @@ typedef int32_t TdUcs4;
int32_t taosUcs4len(TdUcs4 *ucs4);
int64_t taosStr2int64(const char *str);
-void taosConvInit(void);
+int32_t taosConvInit(void);
void taosConvDestroy();
int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs);
bool taosMbsToUcs4(const char *mbs, size_t mbs_len, TdUcs4 *ucs4, int32_t ucs4_max_len, int32_t *len);
diff --git a/include/os/osSysinfo.h b/include/os/osSysinfo.h
index 47cdb02a6fb66be825484249434f2fa0c7a1a38e..7765a60f8833206a5b86cd38100e1d7fd884d8dd 100644
--- a/include/os/osSysinfo.h
+++ b/include/os/osSysinfo.h
@@ -40,6 +40,7 @@ int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen);
int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores);
int32_t taosGetCpuCores(float *numOfCores);
void taosGetCpuUsage(double *cpu_system, double *cpu_engine);
+int32_t taosGetCpuInstructions(char* sse42, char* avx, char* avx2, char* fma);
int32_t taosGetTotalMemory(int64_t *totalKB);
int32_t taosGetProcMemory(int64_t *usedKB);
int32_t taosGetSysMemory(int64_t *usedKB);
diff --git a/include/os/osSystem.h b/include/os/osSystem.h
index eca984c41a3a0502ba726dfbac228dcc82076298..8f1f5c58d5200d22583dcc7cc8c13663ce070941 100644
--- a/include/os/osSystem.h
+++ b/include/os/osSystem.h
@@ -46,6 +46,29 @@ void taosSetTerminalMode();
int32_t taosGetOldTerminalMode();
void taosResetTerminalMode();
+#if !defined(WINDOWS)
+#define taosPrintTrace(flags, level, dflag) \
+ { \
+ void* array[100]; \
+ int32_t size = backtrace(array, 100); \
+ char** strings = backtrace_symbols(array, size); \
+ if (strings != NULL) { \
+ taosPrintLog(flags, level, dflag, "obtained %d stack frames", size); \
+ for (int32_t i = 0; i < size; i++) { \
+ taosPrintLog(flags, level, dflag, "frame:%d, %s", i, strings[i]); \
+ } \
+ } \
+ \
+ taosMemoryFree(strings); \
+ }
+#else
+#define taosPrintTrace(flags, level, dflag) \
+ { \
+ taosPrintLog(flags, level, dflag, \
+ "backtrace not implemented on windows, so detailed stack information cannot be printed"); \
+ }
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/include/os/osTime.h b/include/os/osTime.h
index 48f046d4d0d3664c73538514633529a46eecd383..0a0a54119b4a40b79e54b7183b0cdc57cac03ca7 100644
--- a/include/os/osTime.h
+++ b/include/os/osTime.h
@@ -35,6 +35,7 @@ extern "C" {
#ifdef WINDOWS
#define CLOCK_REALTIME 0
+#define CLOCK_MONOTONIC 0
#define MILLISECOND_PER_SECOND (1000i64)
#else
@@ -82,6 +83,13 @@ static FORCE_INLINE int64_t taosGetTimestampNs() {
return (int64_t)systemTime.tv_sec * 1000000000LL + (int64_t)systemTime.tv_nsec;
}
+//@return timestamp of monotonic clock in millisecond
+static FORCE_INLINE int64_t taosGetMonoTimestampMs() {
+ struct timespec systemTime = {0};
+ taosClockGetTime(CLOCK_MONOTONIC, &systemTime);
+ return (int64_t)systemTime.tv_sec * 1000LL + (int64_t)systemTime.tv_nsec / 1000000;
+}
+
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);
diff --git a/include/util/talgo.h b/include/util/talgo.h
index 2ffca029bfbfa8a1f8599da3be66a6f690e3ae8e..f9d51c4b5bc68b988bf562bcdf7452a3dd1208a5 100644
--- a/include/util/talgo.h
+++ b/include/util/talgo.h
@@ -27,7 +27,8 @@ extern "C" {
typedef int32_t (*__compar_fn_t)(const void *, const void *);
#endif
-typedef void *(*FCopy)(void *);
+typedef void *(*__array_item_dup_fn_t)(void *);
+
typedef void (*FDelete)(void *);
typedef int32_t (*FEncode)(void **buf, const void *dst);
typedef void *(*FDecode)(const void *buf, void *dst);
@@ -41,7 +42,6 @@ typedef void *(*FDecode)(const void *buf, void *dst);
#define elePtrAt(base, size, idx) (void *)((char *)(base) + (size) * (idx))
typedef int32_t (*__ext_compar_fn_t)(const void *p1, const void *p2, const void *param);
-typedef void (*__ext_swap_fn_t)(void *p1, void *p2, const void *param);
/**
* quick sort, with the compare function requiring additional parameters support
diff --git a/include/util/taoserror.h b/include/util/taoserror.h
index e5d0bcb249b1d0d76517506421ee95a87d873051..e352cfb569cd5d2ffdc699101f797b732b365e1e 100644
--- a/include/util/taoserror.h
+++ b/include/util/taoserror.h
@@ -40,48 +40,64 @@ int32_t* taosGetErrno();
#define TSDB_CODE_FAILED -1 // unknown or needn't tell detail error
// rpc
-#define TSDB_CODE_RPC_AUTH_FAILURE TAOS_DEF_ERROR_CODE(0, 0x0003)
-#define TSDB_CODE_RPC_REDIRECT TAOS_DEF_ERROR_CODE(0, 0x0004)
+// #define TSDB_CODE_RPC_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0001) // 2.x
+// #define TSDB_CODE_RPC_AUTH_REQUIRED TAOS_DEF_ERROR_CODE(0, 0x0002) // 2.x
+// #define TSDB_CODE_RPC_AUTH_FAILURE TAOS_DEF_ERROR_CODE(0, 0x0003) // 2.x
+// #define TSDB_CODE_RPC_REDIRECT TAOS_DEF_ERROR_CODE(0, 0x0004) // 2.x
+// #define TSDB_CODE_RPC_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0005) // 2.x
+// #define TSDB_CODE_RPC_ALREADY_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0006) // 2.x
+// #define TSDB_CODE_RPC_LAST_SESSION_NOT_FINI. TAOS_DEF_ERROR_CODE(0, 0x0007) // 2.x
+// #define TSDB_CODE_RPC_MISMATCHED_LINK_ID TAOS_DEF_ERROR_CODE(0, 0x0008) // 2.x
+// #define TSDB_CODE_RPC_TOO_SLOW TAOS_DEF_ERROR_CODE(0, 0x0009) // 2.x
+// #define TSDB_CODE_RPC_MAX_SESSIONS TAOS_DEF_ERROR_CODE(0, 0x000A) // 2.x
#define TSDB_CODE_RPC_NETWORK_UNAVAIL TAOS_DEF_ERROR_CODE(0, 0x000B)
+// #define TSDB_CODE_RPC_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x000C) // 2.x
+// #define TSDB_CODE_RPC_UNEXPECTED_RESPONSE TAOS_DEF_ERROR_CODE(0, 0x000D) // 2.x
+// #define TSDB_CODE_RPC_INVALID_VALUE TAOS_DEF_ERROR_CODE(0, 0x000E) // 2.x
+// #define TSDB_CODE_RPC_INVALID_TRAN_ID TAOS_DEF_ERROR_CODE(0, 0x000F) // 2.x
+// #define TSDB_CODE_RPC_INVALID_SESSION_ID TAOS_DEF_ERROR_CODE(0, 0x0010) // 2.x
+// #define TSDB_CODE_RPC_INVALID_MSG_TYPE TAOS_DEF_ERROR_CODE(0, 0x0011) // 2.x
+// #define TSDB_CODE_RPC_INVALID_RESPONSE_TYPE TAOS_DEF_ERROR_CODE(0, 0x0012) // 2.x
+#define TSDB_CODE_TIME_UNSYNCED TAOS_DEF_ERROR_CODE(0, 0x0013) //
+// #define TSDB_CODE_APP_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0014) // 2.x
#define TSDB_CODE_RPC_FQDN_ERROR TAOS_DEF_ERROR_CODE(0, 0x0015)
-#define TSDB_CODE_RPC_PORT_EADDRINUSE TAOS_DEF_ERROR_CODE(0, 0x0017)
-#define TSDB_CODE_RPC_BROKEN_LINK TAOS_DEF_ERROR_CODE(0, 0x0018)
-#define TSDB_CODE_RPC_TIMEOUT TAOS_DEF_ERROR_CODE(0, 0x0019)
+// #define TSDB_CODE_RPC_INVALID_VERSION TAOS_DEF_ERROR_CODE(0, 0x0016) // 2.x
+#define TSDB_CODE_RPC_PORT_EADDRINUSE TAOS_DEF_ERROR_CODE(0, 0x0017) //
+#define TSDB_CODE_RPC_BROKEN_LINK TAOS_DEF_ERROR_CODE(0, 0x0018) //
+#define TSDB_CODE_RPC_TIMEOUT TAOS_DEF_ERROR_CODE(0, 0x0019) //
//common & util
-#define TSDB_CODE_TIME_UNSYNCED TAOS_DEF_ERROR_CODE(0, 0x0013)
-#define TSDB_CODE_APP_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0014)
-
-#define TSDB_CODE_OPS_NOT_SUPPORT TAOS_DEF_ERROR_CODE(0, 0x0100)
-#define TSDB_CODE_MEMORY_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0101)
+#define TSDB_CODE_OPS_NOT_SUPPORT TAOS_DEF_ERROR_CODE(0, 0x0100) //
+// #define TSDB_CODE_MEMORY_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0101) // 2.x
#define TSDB_CODE_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0102)
-#define TSDB_CODE_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0104)
-#define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0105)
-#define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0106)
-#define TSDB_CODE_REF_ID_REMOVED TAOS_DEF_ERROR_CODE(0, 0x0107)
-#define TSDB_CODE_REF_INVALID_ID TAOS_DEF_ERROR_CODE(0, 0x0108)
-#define TSDB_CODE_REF_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0109)
-#define TSDB_CODE_REF_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x010A)
-
-#define TSDB_CODE_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0110)
-#define TSDB_CODE_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0111)
-#define TSDB_CODE_OUT_OF_RANGE TAOS_DEF_ERROR_CODE(0, 0x0112)
-#define TSDB_CODE_OUT_OF_SHM_MEM TAOS_DEF_ERROR_CODE(0, 0x0113)
-#define TSDB_CODE_INVALID_SHM_ID TAOS_DEF_ERROR_CODE(0, 0x0114)
-#define TSDB_CODE_INVALID_MSG TAOS_DEF_ERROR_CODE(0, 0x0115)
-#define TSDB_CODE_INVALID_MSG_LEN TAOS_DEF_ERROR_CODE(0, 0x0116)
-#define TSDB_CODE_INVALID_PTR TAOS_DEF_ERROR_CODE(0, 0x0117)
-#define TSDB_CODE_INVALID_PARA TAOS_DEF_ERROR_CODE(0, 0x0118)
-#define TSDB_CODE_INVALID_CFG TAOS_DEF_ERROR_CODE(0, 0x0119)
-#define TSDB_CODE_INVALID_OPTION TAOS_DEF_ERROR_CODE(0, 0x011A)
-#define TSDB_CODE_INVALID_JSON_FORMAT TAOS_DEF_ERROR_CODE(0, 0x011B)
-#define TSDB_CODE_INVALID_VERSION_NUMBER TAOS_DEF_ERROR_CODE(0, 0x011C)
-#define TSDB_CODE_INVALID_VERSION_STRING TAOS_DEF_ERROR_CODE(0, 0x011D)
-#define TSDB_CODE_VERSION_NOT_COMPATIBLE TAOS_DEF_ERROR_CODE(0, 0x011E)
-#define TSDB_CODE_CHECKSUM_ERROR TAOS_DEF_ERROR_CODE(0, 0x011F)
+// #define TSDB_CODE_COM_INVALID_CFG_MSG TAOS_DEF_ERROR_CODE(0, 0x0103) // 2.x
+#define TSDB_CODE_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0104) //
+// #define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0105) // 2.x
+#define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0106) // internal
+#define TSDB_CODE_REF_ID_REMOVED TAOS_DEF_ERROR_CODE(0, 0x0107) // internal
+#define TSDB_CODE_REF_INVALID_ID TAOS_DEF_ERROR_CODE(0, 0x0108) // internal
+#define TSDB_CODE_REF_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0109) // internal
+#define TSDB_CODE_REF_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x010A) // internal
+
+#define TSDB_CODE_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0110) //
+#define TSDB_CODE_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0111) // internal
+#define TSDB_CODE_OUT_OF_RANGE TAOS_DEF_ERROR_CODE(0, 0x0112) //
+// #define TSDB_CODE_OUT_OF_SHM_MEM TAOS_DEF_ERROR_CODE(0, 0x0113)
+// #define TSDB_CODE_INVALID_SHM_ID TAOS_DEF_ERROR_CODE(0, 0x0114)
+#define TSDB_CODE_INVALID_MSG TAOS_DEF_ERROR_CODE(0, 0x0115) //
+#define TSDB_CODE_INVALID_MSG_LEN TAOS_DEF_ERROR_CODE(0, 0x0116) //
+#define TSDB_CODE_INVALID_PTR TAOS_DEF_ERROR_CODE(0, 0x0117) // internal
+#define TSDB_CODE_INVALID_PARA TAOS_DEF_ERROR_CODE(0, 0x0118) //
+#define TSDB_CODE_INVALID_CFG TAOS_DEF_ERROR_CODE(0, 0x0119) // internal
+#define TSDB_CODE_INVALID_OPTION TAOS_DEF_ERROR_CODE(0, 0x011A) // internal
+#define TSDB_CODE_INVALID_JSON_FORMAT TAOS_DEF_ERROR_CODE(0, 0x011B) // internal
+#define TSDB_CODE_INVALID_VERSION_NUMBER TAOS_DEF_ERROR_CODE(0, 0x011C) // internal
+#define TSDB_CODE_INVALID_VERSION_STRING TAOS_DEF_ERROR_CODE(0, 0x011D) // internal
+#define TSDB_CODE_VERSION_NOT_COMPATIBLE TAOS_DEF_ERROR_CODE(0, 0x011E) // internal
+#define TSDB_CODE_CHECKSUM_ERROR TAOS_DEF_ERROR_CODE(0, 0x011F) // internal
#define TSDB_CODE_COMPRESS_ERROR TAOS_DEF_ERROR_CODE(0, 0x0120)
-#define TSDB_CODE_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0121)
+#define TSDB_CODE_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0121) //
#define TSDB_CODE_CFG_NOT_FOUND TAOS_DEF_ERROR_CODE(0, 0x0122)
#define TSDB_CODE_REPEAT_INIT TAOS_DEF_ERROR_CODE(0, 0x0123)
#define TSDB_CODE_DUP_KEY TAOS_DEF_ERROR_CODE(0, 0x0124)
@@ -92,6 +108,10 @@ int32_t* taosGetErrno();
#define TSDB_CODE_NO_AVAIL_DISK TAOS_DEF_ERROR_CODE(0, 0x0129)
#define TSDB_CODE_NOT_FOUND TAOS_DEF_ERROR_CODE(0, 0x012A)
#define TSDB_CODE_NO_DISKSPACE TAOS_DEF_ERROR_CODE(0, 0x012B)
+#define TSDB_CODE_TIMEOUT_ERROR TAOS_DEF_ERROR_CODE(0, 0x012C)
+
+#define TSDB_CODE_APP_IS_STARTING TAOS_DEF_ERROR_CODE(0, 0x0130) //
+#define TSDB_CODE_APP_IS_STOPPING TAOS_DEF_ERROR_CODE(0, 0x0131) //
//client
#define TSDB_CODE_TSC_INVALID_OPERATION TAOS_DEF_ERROR_CODE(0, 0x0200)
@@ -106,11 +126,11 @@ int32_t* taosGetErrno();
#define TSDB_CODE_TSC_INVALID_DB_LENGTH TAOS_DEF_ERROR_CODE(0, 0x0209)
#define TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH TAOS_DEF_ERROR_CODE(0, 0x020A)
#define TSDB_CODE_TSC_INVALID_CONNECTION TAOS_DEF_ERROR_CODE(0, 0x020B)
-#define TSDB_CODE_TSC_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x020C)
+// #define TSDB_CODE_TSC_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x020C) // 2.x
#define TSDB_CODE_TSC_QUERY_CACHE_ERASED TAOS_DEF_ERROR_CODE(0, 0x020E)
#define TSDB_CODE_TSC_QUERY_CANCELLED TAOS_DEF_ERROR_CODE(0, 0x020F)
#define TSDB_CODE_TSC_SORTED_RES_TOO_MANY TAOS_DEF_ERROR_CODE(0, 0x0210)
-#define TSDB_CODE_TSC_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0211)
+// #define TSDB_CODE_TSC_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0211) // 2.x
#define TSDB_CODE_TSC_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0212)
#define TSDB_CODE_TSC_DISCONNECTED TAOS_DEF_ERROR_CODE(0, 0x0213)
#define TSDB_CODE_TSC_NO_WRITE_AUTH TAOS_DEF_ERROR_CODE(0, 0x0214)
@@ -138,32 +158,41 @@ int32_t* taosGetErrno();
#define TSDB_CODE_TSC_NOT_STABLE_ERROR TAOS_DEF_ERROR_CODE(0, 0X022F)
// mnode-common
+// #define TSDB_CODE_MND_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0300) // 2.x
+// #define TSDB_CODE_MND_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0301) // 2.x
+// #define TSDB_CODE_MND_ACTION_NEED_REPROCESSEDTAOS_DEF_ERROR_CODE(0, 0x0302) // 2.x
#define TSDB_CODE_MND_NO_RIGHTS TAOS_DEF_ERROR_CODE(0, 0x0303)
-#define TSDB_CODE_MND_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0304)
-#define TSDB_CODE_MND_INVALID_CONNECTION TAOS_DEF_ERROR_CODE(0, 0x0305)
+// #define TSDB_CODE_MND_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0304) // 2.x
+// #define TSDB_CODE_MND_INVALID_CONNECTION TAOS_DEF_ERROR_CODE(0, 0x0305) // 2.x
+// #define TSDB_CODE_MND_INVALID_MSG_VERSION TAOS_DEF_ERROR_CODE(0, 0x0306) // 2.x
+// #define TSDB_CODE_MND_INVALID_MSG_LEN TAOS_DEF_ERROR_CODE(0, 0x0307) // 2.x
+// #define TSDB_CODE_MND_INVALID_MSG_TYPE TAOS_DEF_ERROR_CODE(0, 0x0308) // 2.x
+// #define TSDB_CODE_MND_TOO_MANY_SHELL_CONNS TAOS_DEF_ERROR_CODE(0, 0x0309) // 2.x
+// #define TSDB_CODE_MND_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x030A) // 2.x
#define TSDB_CODE_MND_INVALID_SHOWOBJ TAOS_DEF_ERROR_CODE(0, 0x030B)
#define TSDB_CODE_MND_INVALID_QUERY_ID TAOS_DEF_ERROR_CODE(0, 0x030C)
-#define TSDB_CODE_MND_INVALID_STREAM_ID TAOS_DEF_ERROR_CODE(0, 0x030D)
+// #define TSDB_CODE_MND_INVALID_STREAM_ID TAOS_DEF_ERROR_CODE(0, 0x030D) // 2.x
#define TSDB_CODE_MND_INVALID_CONN_ID TAOS_DEF_ERROR_CODE(0, 0x030E)
-#define TSDB_CODE_MND_MNODE_IS_RUNNING TAOS_DEF_ERROR_CODE(0, 0x0310)
-#define TSDB_CODE_MND_FAILED_TO_CONFIG_SYNC TAOS_DEF_ERROR_CODE(0, 0x0311)
-#define TSDB_CODE_MND_FAILED_TO_START_SYNC TAOS_DEF_ERROR_CODE(0, 0x0312)
-#define TSDB_CODE_MND_FAILED_TO_CREATE_DIR TAOS_DEF_ERROR_CODE(0, 0x0313)
-#define TSDB_CODE_MND_FAILED_TO_INIT_STEP TAOS_DEF_ERROR_CODE(0, 0x0314)
+// #define TSDB_CODE_MND_MNODE_IS_RUNNING TAOS_DEF_ERROR_CODE(0, 0x0310) // 2.x
+// #define TSDB_CODE_MND_FAILED_TO_CONFIG_SYNC TAOS_DEF_ERROR_CODE(0, 0x0311) // 2.x
+// #define TSDB_CODE_MND_FAILED_TO_START_SYNC TAOS_DEF_ERROR_CODE(0, 0x0312) // 2.x
+// #define TSDB_CODE_MND_FAILED_TO_CREATE_DIR TAOS_DEF_ERROR_CODE(0, 0x0313) // 2.x
+// #define TSDB_CODE_MND_FAILED_TO_INIT_STEP TAOS_DEF_ERROR_CODE(0, 0x0314) // 2.x
#define TSDB_CODE_MND_USER_DISABLED TAOS_DEF_ERROR_CODE(0, 0x0315)
// mnode-sdb
-#define TSDB_CODE_SDB_OBJ_ALREADY_THERE TAOS_DEF_ERROR_CODE(0, 0x0320)
-#define TSDB_CODE_SDB_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0321) // internal
-#define TSDB_CODE_SDB_INVALID_TABLE_TYPE TAOS_DEF_ERROR_CODE(0, 0x0322)
+#define TSDB_CODE_SDB_OBJ_ALREADY_THERE TAOS_DEF_ERROR_CODE(0, 0x0320) // internal
+// #define TSDB_CODE_MND_SDB_ERROR TAOS_DEF_ERROR_CODE(0, 0x0321) // 2.x
+#define TSDB_CODE_SDB_INVALID_TABLE_TYPE TAOS_DEF_ERROR_CODE(0, 0x0322) // internal
#define TSDB_CODE_SDB_OBJ_NOT_THERE TAOS_DEF_ERROR_CODE(0, 0x0323)
-#define TSDB_CODE_SDB_INVALID_KEY_TYPE TAOS_DEF_ERROR_CODE(0, 0x0325)
-#define TSDB_CODE_SDB_INVALID_ACTION_TYPE TAOS_DEF_ERROR_CODE(0, 0x0326)
-#define TSDB_CODE_SDB_INVALID_STATUS_TYPE TAOS_DEF_ERROR_CODE(0, 0x0327)
-#define TSDB_CODE_SDB_INVALID_DATA_VER TAOS_DEF_ERROR_CODE(0, 0x0328)
-#define TSDB_CODE_SDB_INVALID_DATA_LEN TAOS_DEF_ERROR_CODE(0, 0x0329)
+// #define TSDB_CODE_MND_SDB_INVAID_META_ROW TAOS_DEF_ERROR_CODE(0, 0x0324) // 2.x
+// #define TSDB_CODE_SDB_INVALID_KEY_TYPE TAOS_DEF_ERROR_CODE(0, 0x0325) // 2.x
+#define TSDB_CODE_SDB_INVALID_ACTION_TYPE TAOS_DEF_ERROR_CODE(0, 0x0326) // internal
+// #define TSDB_CODE_SDB_INVALID_STATUS_TYPE TAOS_DEF_ERROR_CODE(0, 0x0327) // unused
+#define TSDB_CODE_SDB_INVALID_DATA_VER TAOS_DEF_ERROR_CODE(0, 0x0328) // internal
+#define TSDB_CODE_SDB_INVALID_DATA_LEN TAOS_DEF_ERROR_CODE(0, 0x0329) // internal
#define TSDB_CODE_SDB_INVALID_DATA_CONTENT TAOS_DEF_ERROR_CODE(0, 0x032A)
-#define TSDB_CODE_SDB_INVALID_WAl_VER TAOS_DEF_ERROR_CODE(0, 0x032B)
+// #define TSDB_CODE_SDB_INVALID_WAl_VER TAOS_DEF_ERROR_CODE(0, 0x032B) // unused
#define TSDB_CODE_SDB_OBJ_CREATING TAOS_DEF_ERROR_CODE(0, 0x032C)
#define TSDB_CODE_SDB_OBJ_DROPPING TAOS_DEF_ERROR_CODE(0, 0x032D)
@@ -197,22 +226,31 @@ int32_t* taosGetErrno();
// mnode-stable-part1
#define TSDB_CODE_MND_STB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0360)
+// #define TSDB_CODE_MND_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0361) // 2.x
#define TSDB_CODE_MND_STB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0362)
+// #define TSDB_CODE_MND_INVALID_TABLE_TYPE TAOS_DEF_ERROR_CODE(0, 0x0363) // 2.x
#define TSDB_CODE_MND_TOO_MANY_TAGS TAOS_DEF_ERROR_CODE(0, 0x0364)
#define TSDB_CODE_MND_TOO_MANY_COLUMNS TAOS_DEF_ERROR_CODE(0, 0x0365)
+// #define TSDB_CODE_MND_TOO_MANY_TIMESERIES TAOS_DEF_ERROR_CODE(0, 0x0366) // 2.x
+// #define TSDB_CODE_MND_NOT_SUPER_TABLE TAOS_DEF_ERROR_CODE(0, 0x0367) // 2.x
+// #define TSDB_CODE_MND_COL_NAME_TOO_LONG TAOS_DEF_ERROR_CODE(0, 0x0368) // 2.x
#define TSDB_CODE_MND_TAG_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0369)
#define TSDB_CODE_MND_TAG_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x036A)
#define TSDB_CODE_MND_COLUMN_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x036B)
#define TSDB_CODE_MND_COLUMN_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x036C)
+// #define TSDB_CODE_MND_INVALID_STABLE_NAME TAOS_DEF_ERROR_CODE(0, 0x036D) // 2.x
#define TSDB_CODE_MND_INVALID_STB_OPTION TAOS_DEF_ERROR_CODE(0, 0x036E)
#define TSDB_CODE_MND_INVALID_ROW_BYTES TAOS_DEF_ERROR_CODE(0, 0x036F)
// mnode-func
#define TSDB_CODE_MND_INVALID_FUNC_NAME TAOS_DEF_ERROR_CODE(0, 0x0370)
+// #define TSDB_CODE_MND_INVALID_FUNC_LEN TAOS_DEF_ERROR_CODE(0, 0x0371) // 2.x
#define TSDB_CODE_MND_INVALID_FUNC_CODE TAOS_DEF_ERROR_CODE(0, 0x0372)
#define TSDB_CODE_MND_FUNC_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0373)
#define TSDB_CODE_MND_FUNC_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0374)
#define TSDB_CODE_MND_INVALID_FUNC_BUFSIZE TAOS_DEF_ERROR_CODE(0, 0x0375)
+// #define TSDB_CODE_MND_INVALID_TAG_LENGTH TAOS_DEF_ERROR_CODE(0, 0x0376) // 2.x
+// #define TSDB_CODE_MND_INVALID_COLUMN_LENGTH TAOS_DEF_ERROR_CODE(0, 0x0377) // 2.x
#define TSDB_CODE_MND_INVALID_FUNC_COMMENT TAOS_DEF_ERROR_CODE(0, 0x0378)
#define TSDB_CODE_MND_INVALID_FUNC_RETRIEVE TAOS_DEF_ERROR_CODE(0, 0x0379)
@@ -278,6 +316,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_MND_TRANS_CONFLICT TAOS_DEF_ERROR_CODE(0, 0x03D3)
#define TSDB_CODE_MND_TRANS_CLOG_IS_NULL TAOS_DEF_ERROR_CODE(0, 0x03D4)
#define TSDB_CODE_MND_TRANS_NETWORK_UNAVAILL TAOS_DEF_ERROR_CODE(0, 0x03D5)
+#define TSDB_CODE_MND_LAST_TRANS_NOT_FINISHED TAOS_DEF_ERROR_CODE(0, 0x03D6) //internal
#define TSDB_CODE_MND_TRANS_UNKNOW_ERROR TAOS_DEF_ERROR_CODE(0, 0x03DF)
// mnode-mq
@@ -310,19 +349,57 @@ int32_t* taosGetErrno();
#define TSDB_CODE_MND_INVALID_SMA_OPTION TAOS_DEF_ERROR_CODE(0, 0x0482)
// dnode
-#define TSDB_CODE_NODE_OFFLINE TAOS_DEF_ERROR_CODE(0, 0x0408)
-#define TSDB_CODE_NODE_ALREADY_DEPLOYED TAOS_DEF_ERROR_CODE(0, 0x0409)
-#define TSDB_CODE_NODE_NOT_DEPLOYED TAOS_DEF_ERROR_CODE(0, 0x040A)
+// #define TSDB_CODE_DND_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0400) // 2.x
+// #define TSDB_CODE_DND_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0401) // 2.x
+// #define TSDB_CODE_DND_NO_WRITE_ACCESS TAOS_DEF_ERROR_CODE(0, 0x0402) // 2.x
+// #define TSDB_CODE_DND_INVALID_MSG_LEN TAOS_DEF_ERROR_CODE(0, 0x0403) // 2.x
+// #define TSDB_CODE_DND_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0404) // 2.x
+// #define TSDB_CODE_DND_TOO_MANY_VNODES TAOS_DEF_ERROR_CODE(0, 0x0405) // 2.x
+// #define TSDB_CODE_DND_EXITING TAOS_DEF_ERROR_CODE(0, 0x0406) // 2.x
+// #define TSDB_CODE_DND_VNODE_OPEN_FAILED TAOS_DEF_ERROR_CODE(0, 0x0407) // 2.x
+#define TSDB_CODE_DNODE_OFFLINE TAOS_DEF_ERROR_CODE(0, 0x0408)
+#define TSDB_CODE_MNODE_ALREADY_DEPLOYED TAOS_DEF_ERROR_CODE(0, 0x0409)
+#define TSDB_CODE_MNODE_NOT_FOUND TAOS_DEF_ERROR_CODE(0, 0x040A)
+#define TSDB_CODE_MNODE_NOT_DEPLOYED TAOS_DEF_ERROR_CODE(0, 0x040B)
+#define TSDB_CODE_QNODE_ALREADY_DEPLOYED TAOS_DEF_ERROR_CODE(0, 0x040C)
+#define TSDB_CODE_QNODE_NOT_FOUND TAOS_DEF_ERROR_CODE(0, 0x040D)
+#define TSDB_CODE_QNODE_NOT_DEPLOYED TAOS_DEF_ERROR_CODE(0, 0x040E)
+#define TSDB_CODE_SNODE_ALREADY_DEPLOYED TAOS_DEF_ERROR_CODE(0, 0x040F)
+#define TSDB_CODE_SNODE_NOT_FOUND TAOS_DEF_ERROR_CODE(0, 0x0410)
+#define TSDB_CODE_SNODE_NOT_DEPLOYED TAOS_DEF_ERROR_CODE(0, 0x0411)
// vnode
+// #define TSDB_CODE_VND_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0500) // 2.x
+// #define TSDB_CODE_VND_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0501) // 2.x
+// #define TSDB_CODE_VND_ACTION_NEED_REPROCESS. TAOS_DEF_ERROR_CODE(0, 0x0502) // 2.x
#define TSDB_CODE_VND_INVALID_VGROUP_ID TAOS_DEF_ERROR_CODE(0, 0x0503)
+// #define TSDB_CODE_VND_INIT_FAILED TAOS_DEF_ERROR_CODE(0, 0x0504) // 2.x
+// #define TSDB_CODE_VND_NO_DISKSPACE TAOS_DEF_ERROR_CODE(0, 0x0505) // 2.x
+// #define TSDB_CODE_VND_NO_DISK_PERMISSIONS TAOS_DEF_ERROR_CODE(0, 0x0506) // 2.x
+// #define TSDB_CODE_VND_NO_SUCH_FILE_OR_DIR TAOS_DEF_ERROR_CODE(0, 0x0507) // 2.x
+// #define TSDB_CODE_VND_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0508) // 2.x
+// #define TSDB_CODE_VND_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0509) // 2.x
+// #define TSDB_CODE_VND_INVALID_VRESION_FILE TAOS_DEF_ERROR_CODE(0, 0x050A) // 2.x
+// #define TSDB_CODE_VND_IS_FULL TAOS_DEF_ERROR_CODE(0, 0x050B) // 2.x
+// #define TSDB_CODE_VND_IS_FLOWCTRL TAOS_DEF_ERROR_CODE(0, 0x050C) // 2.x
+// #define TSDB_CODE_VND_IS_DROPPING TAOS_DEF_ERROR_CODE(0, 0x050D) // 2.x
+// #define TSDB_CODE_VND_IS_BALANCING TAOS_DEF_ERROR_CODE(0, 0x050E) // 2.x
+// #define TSDB_CODE_VND_IS_CLOSING TAOS_DEF_ERROR_CODE(0, 0x0510) // 2.x
+// #define TSDB_CODE_VND_NOT_SYNCED TAOS_DEF_ERROR_CODE(0, 0x0511) // 2.x
#define TSDB_CODE_VND_NO_WRITE_AUTH TAOS_DEF_ERROR_CODE(0, 0x0512)
+// #define TSDB_CODE_VND_IS_SYNCING TAOS_DEF_ERROR_CODE(0, 0x0513) // 2.x
+// #define TSDB_CODE_VND_INVALID_TSDB_STATE TAOS_DEF_ERROR_CODE(0, 0x0514) // 2.x
+// #define TSDB_CODE_WAIT_THREAD_TOO_MANY TAOS_DEF_ERROR_CODE(0, 0x0515) // 2.x
+#define TSDB_CODE_VND_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0520) // internal
+#define TSDB_CODE_VND_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0521) // internal
#define TSDB_CODE_VND_HASH_MISMATCH TAOS_DEF_ERROR_CODE(0, 0x0522)
#define TSDB_CODE_VND_INVALID_TABLE_ACTION TAOS_DEF_ERROR_CODE(0, 0x0524)
#define TSDB_CODE_VND_COL_ALREADY_EXISTS TAOS_DEF_ERROR_CODE(0, 0x0525)
#define TSDB_CODE_VND_COL_NOT_EXISTS TAOS_DEF_ERROR_CODE(0, 0x0526)
#define TSDB_CODE_VND_COL_SUBSCRIBED TAOS_DEF_ERROR_CODE(0, 0x0527)
#define TSDB_CODE_VND_NO_AVAIL_BUFPOOL TAOS_DEF_ERROR_CODE(0, 0x0528)
+#define TSDB_CODE_VND_STOPPED TAOS_DEF_ERROR_CODE(0, 0x0529)
+#define TSDB_CODE_VND_DUP_REQUEST TAOS_DEF_ERROR_CODE(0, 0x0530)
// tsdb
#define TSDB_CODE_TDB_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0600)
@@ -332,8 +409,8 @@ int32_t* taosGetErrno();
#define TSDB_CODE_TDB_INVALID_CONFIG TAOS_DEF_ERROR_CODE(0, 0x0604)
#define TSDB_CODE_TDB_INIT_FAILED TAOS_DEF_ERROR_CODE(0, 0x0605)
#define TSDB_CODE_TDB_NO_DISK_PERMISSIONS TAOS_DEF_ERROR_CODE(0, 0x0607)
-#define TSDB_CODE_TDB_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0608)
-#define TSDB_CODE_TDB_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0609)
+// #define TSDB_CODE_TDB_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0608) // 2.x
+// #define TSDB_CODE_TDB_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0609) // 2.x
#define TSDB_CODE_TDB_TAG_VER_OUT_OF_DATE TAOS_DEF_ERROR_CODE(0, 0x060A)
#define TSDB_CODE_TDB_TIMESTAMP_OUT_OF_RANGE TAOS_DEF_ERROR_CODE(0, 0x060B)
#define TSDB_CODE_TDB_SUBMIT_MSG_MSSED_UP TAOS_DEF_ERROR_CODE(0, 0x060C)
@@ -347,6 +424,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_TDB_MESSED_MSG TAOS_DEF_ERROR_CODE(0, 0x0614)
#define TSDB_CODE_TDB_IVLD_TAG_VAL TAOS_DEF_ERROR_CODE(0, 0x0615)
#define TSDB_CODE_TDB_NO_CACHE_LAST_ROW TAOS_DEF_ERROR_CODE(0, 0x0616)
+// #define TSDB_CODE_TDB_INCOMPLETE_DFILESET TAOS_DEF_ERROR_CODE(0, 0x0617) // 2.x
#define TSDB_CODE_TDB_TABLE_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0618)
#define TSDB_CODE_TDB_STB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0619)
#define TSDB_CODE_TDB_STB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x061A)
@@ -357,8 +435,9 @@ int32_t* taosGetErrno();
// query
#define TSDB_CODE_QRY_INVALID_QHANDLE TAOS_DEF_ERROR_CODE(0, 0x0700)
#define TSDB_CODE_QRY_INVALID_MSG TAOS_DEF_ERROR_CODE(0, 0x0701)
-#define TSDB_CODE_QRY_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0703)
-#define TSDB_CODE_QRY_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0704)
+// #define TSDB_CODE_QRY_NO_DISKSPACE TAOS_DEF_ERROR_CODE(0, 0x0702) // 2.x
+// #define TSDB_CODE_QRY_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0703) // 2.x
+// #define TSDB_CODE_QRY_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0704) // 2.x
#define TSDB_CODE_QRY_DUP_JOIN_KEY TAOS_DEF_ERROR_CODE(0, 0x0705)
#define TSDB_CODE_QRY_EXCEED_TAGS_LIMIT TAOS_DEF_ERROR_CODE(0, 0x0706)
#define TSDB_CODE_QRY_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0707)
@@ -370,6 +449,8 @@ int32_t* taosGetErrno();
#define TSDB_CODE_QRY_SYS_ERROR TAOS_DEF_ERROR_CODE(0, 0x070D)
#define TSDB_CODE_QRY_INVALID_TIME_CONDITION TAOS_DEF_ERROR_CODE(0, 0x070E)
#define TSDB_CODE_QRY_INVALID_INPUT TAOS_DEF_ERROR_CODE(0, 0x070F)
+// #define TSDB_CODE_QRY_INVALID_SCHEMA_VERSION TAOS_DEF_ERROR_CODE(0, 0x0710) // 2.x
+// #define TSDB_CODE_QRY_RESULT_TOO_LARGE TAOS_DEF_ERROR_CODE(0, 0x0711) // 2.x
#define TSDB_CODE_QRY_SCH_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0720)
#define TSDB_CODE_QRY_TASK_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0721)
#define TSDB_CODE_QRY_TASK_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0722)
@@ -405,7 +486,17 @@ int32_t* taosGetErrno();
#define TSDB_CODE_GRANT_TABLE_LIMITED TAOS_DEF_ERROR_CODE(0, 0x080D)
// sync
+// #define TSDB_CODE_SYN_INVALID_CONFIG TAOS_DEF_ERROR_CODE(0, 0x0900) // 2.x
+// #define TSDB_CODE_SYN_NOT_ENABLED TAOS_DEF_ERROR_CODE(0, 0x0901) // 2.x
+// #define TSDB_CODE_SYN_INVALID_VERSION TAOS_DEF_ERROR_CODE(0, 0x0902) // 2.x
#define TSDB_CODE_SYN_TIMEOUT TAOS_DEF_ERROR_CODE(0, 0x0903)
+// #define TSDB_CODE_SYN_TOO_MANY_FWDINFO TAOS_DEF_ERROR_CODE(0, 0x0904) // 2.x
+// #define TSDB_CODE_SYN_MISMATCHED_PROTOCOL TAOS_DEF_ERROR_CODE(0, 0x0905) // 2.x
+// #define TSDB_CODE_SYN_MISMATCHED_CLUSTERID TAOS_DEF_ERROR_CODE(0, 0x0906) // 2.x
+// #define TSDB_CODE_SYN_MISMATCHED_SIGNATURE TAOS_DEF_ERROR_CODE(0, 0x0907) // 2.x
+// #define TSDB_CODE_SYN_INVALID_CHECKSUM TAOS_DEF_ERROR_CODE(0, 0x0908) // 2.x
+// #define TSDB_CODE_SYN_INVALID_MSGLEN TAOS_DEF_ERROR_CODE(0, 0x0909) // 2.x
+// #define TSDB_CODE_SYN_INVALID_MSGTYPE TAOS_DEF_ERROR_CODE(0, 0x090A) // 2.x
#define TSDB_CODE_SYN_IS_LEADER TAOS_DEF_ERROR_CODE(0, 0x090B)
#define TSDB_CODE_SYN_NOT_LEADER TAOS_DEF_ERROR_CODE(0, 0x090C)
#define TSDB_CODE_SYN_ONE_REPLICA TAOS_DEF_ERROR_CODE(0, 0x090D)
@@ -415,14 +506,15 @@ int32_t* taosGetErrno();
#define TSDB_CODE_SYN_PROPOSE_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0911)
#define TSDB_CODE_SYN_STANDBY_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0912)
#define TSDB_CODE_SYN_BATCH_ERROR TAOS_DEF_ERROR_CODE(0, 0x0913)
+#define TSDB_CODE_SYN_RESTORING TAOS_DEF_ERROR_CODE(0, 0x0914)
#define TSDB_CODE_SYN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x09FF)
// tq
#define TSDB_CODE_TQ_INVALID_CONFIG TAOS_DEF_ERROR_CODE(0, 0x0A00)
#define TSDB_CODE_TQ_INIT_FAILED TAOS_DEF_ERROR_CODE(0, 0x0A01)
#define TSDB_CODE_TQ_NO_DISK_PERMISSIONS TAOS_DEF_ERROR_CODE(0, 0x0A03)
-#define TSDB_CODE_TQ_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0A04)
-#define TSDB_CODE_TQ_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0A05)
+// #define TSDB_CODE_TQ_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x0A04)
+// #define TSDB_CODE_TQ_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0A05)
#define TSDB_CODE_TQ_FILE_ALREADY_EXISTS TAOS_DEF_ERROR_CODE(0, 0x0A06)
#define TSDB_CODE_TQ_FAILED_TO_CREATE_DIR TAOS_DEF_ERROR_CODE(0, 0x0A07)
#define TSDB_CODE_TQ_META_NO_SUCH_KEY TAOS_DEF_ERROR_CODE(0, 0x0A08)
@@ -433,16 +525,17 @@ int32_t* taosGetErrno();
#define TSDB_CODE_TQ_NO_COMMITTED_OFFSET TAOS_DEF_ERROR_CODE(0, 0x0A0D)
// wal
-#define TSDB_CODE_WAL_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x1000)
+// #define TSDB_CODE_WAL_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x1000) // 2.x
#define TSDB_CODE_WAL_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x1001)
#define TSDB_CODE_WAL_SIZE_LIMIT TAOS_DEF_ERROR_CODE(0, 0x1002)
#define TSDB_CODE_WAL_INVALID_VER TAOS_DEF_ERROR_CODE(0, 0x1003)
-#define TSDB_CODE_WAL_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x1004)
+// #define TSDB_CODE_WAL_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x1004) // 2.x
#define TSDB_CODE_WAL_LOG_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x1005)
#define TSDB_CODE_WAL_CHKSUM_MISMATCH TAOS_DEF_ERROR_CODE(0, 0x1006)
#define TSDB_CODE_WAL_LOG_INCOMPLETE TAOS_DEF_ERROR_CODE(0, 0x1007)
// tfs
+// #define TSDB_CODE_FS_OUT_OF_MEMORY TAOS_DEF_ERROR_CODE(0, 0x2200) // 2.x
#define TSDB_CODE_FS_INVLD_CFG TAOS_DEF_ERROR_CODE(0, 0x2201)
#define TSDB_CODE_FS_TOO_MANY_MOUNT TAOS_DEF_ERROR_CODE(0, 0x2202)
#define TSDB_CODE_FS_DUP_PRIMARY TAOS_DEF_ERROR_CODE(0, 0x2203)
@@ -451,7 +544,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_FS_FILE_ALREADY_EXISTS TAOS_DEF_ERROR_CODE(0, 0x2206)
#define TSDB_CODE_FS_INVLD_LEVEL TAOS_DEF_ERROR_CODE(0, 0x2207)
#define TSDB_CODE_FS_NO_VALID_DISK TAOS_DEF_ERROR_CODE(0, 0x2208)
-#define TSDB_CODE_FS_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x220F)
+// #define TSDB_CODE_FS_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x220F) // 2.x
// catalog
#define TSDB_CODE_CTG_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2400)
@@ -606,7 +699,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_RSMA_INVALID_ENV TAOS_DEF_ERROR_CODE(0, 0x3150)
#define TSDB_CODE_RSMA_INVALID_STAT TAOS_DEF_ERROR_CODE(0, 0x3151)
#define TSDB_CODE_RSMA_QTASKINFO_CREATE TAOS_DEF_ERROR_CODE(0, 0x3152)
-#define TSDB_CODE_RSMA_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x3153)
+// #define TSDB_CODE_RSMA_FILE_CORRUPTED TAOS_DEF_ERROR_CODE(0, 0x3153)
#define TSDB_CODE_RSMA_REMOVE_EXISTS TAOS_DEF_ERROR_CODE(0, 0x3154)
#define TSDB_CODE_RSMA_FETCH_MSG_MSSED_UP TAOS_DEF_ERROR_CODE(0, 0x3155)
#define TSDB_CODE_RSMA_EMPTY_INFO TAOS_DEF_ERROR_CODE(0, 0x3156)
diff --git a/include/util/tarray.h b/include/util/tarray.h
index e95568197b63b8b58e62ecf56783ed3f4dc231ee..0e78397ecb7c35d75211e06170ea5cdb99030e34 100644
--- a/include/util/tarray.h
+++ b/include/util/tarray.h
@@ -104,6 +104,15 @@ static FORCE_INLINE void* taosArrayPush(SArray* pArray, const void* pData) {
return taosArrayAddBatch(pArray, pData, 1);
}
+/**
+ * @brief reserve the capacity of the array
+ *
+ * @param pArray
+ * @param num
+ * @return void* the start position of the reserved memory
+ */
+void* taosArrayReserve(SArray* pArray, int32_t num);
+
/**
*
* @param pArray
@@ -196,13 +205,7 @@ SArray* taosArrayFromList(const void* src, size_t size, size_t elemSize);
* clone a new array
* @param pSrc
*/
-SArray* taosArrayDup(const SArray* pSrc);
-
-/**
- * deep copy a new array
- * @param pSrc
- */
-SArray* taosArrayDeepCopy(const SArray* pSrc, FCopy deepCopy);
+SArray* taosArrayDup(const SArray* pSrc, __array_item_dup_fn_t fn);
/**
* clear the array (remove all element)
@@ -217,15 +220,10 @@ void taosArrayClear(SArray* pArray);
*/
void taosArrayClearEx(SArray* pArray, void (*fp)(void*));
-/**
- * clear the array (remove all element)
- * @param pArray
- * @param fp
- */
-void taosArrayClearP(SArray* pArray, FDelete fp);
-
void* taosArrayDestroy(SArray* pArray);
+
void taosArrayDestroyP(SArray* pArray, FDelete fp);
+
void taosArrayDestroyEx(SArray* pArray, FDelete fp);
/**
@@ -235,12 +233,6 @@ void taosArrayDestroyEx(SArray* pArray, FDelete fp);
*/
void taosArraySort(SArray* pArray, __compar_fn_t comparFn);
-/**
- * sort string array
- * @param pArray
- */
-void taosArraySortString(SArray* pArray, __compar_fn_t comparFn);
-
/**
* search the array
* @param pArray
diff --git a/include/util/tcoding.h b/include/util/tcoding.h
index 38eb0d8fc6691459acfe75148b16eb3858123961..b1bd09e1238d55aa0505f9d496dca4a66f191962 100644
--- a/include/util/tcoding.h
+++ b/include/util/tcoding.h
@@ -17,6 +17,7 @@
#define _TD_UTIL_CODING_H_
#include "os.h"
+#include "tlog.h"
#ifdef __cplusplus
extern "C" {
diff --git a/include/util/tdef.h b/include/util/tdef.h
index 48dedd3e3e5bc80f703662cc25644b6ccf8cac76..e0089014aa505fcb2f95ff9e96a4b8616c89a4e1 100644
--- a/include/util/tdef.h
+++ b/include/util/tdef.h
@@ -280,7 +280,8 @@ typedef enum ELogicConditionType {
#define TSDB_DNODE_ROLE_MGMT 1
#define TSDB_DNODE_ROLE_VNODE 2
-#define TSDB_MAX_REPLICA 5
+#define TSDB_MAX_REPLICA 5
+#define TSDB_SYNC_LOG_BUFFER_SIZE 4096
#define TSDB_TBNAME_COLUMN_INDEX (-1)
#define TSDB_MULTI_TABLEMETA_MAX_NUM 100000 // maximum batch size allowed to load table meta
@@ -306,8 +307,9 @@ typedef enum ELogicConditionType {
#define TSDB_MIN_DURATION_PER_FILE 60 // unit minute
#define TSDB_MAX_DURATION_PER_FILE (3650 * 1440)
#define TSDB_DEFAULT_DURATION_PER_FILE (10 * 1440)
-#define TSDB_MIN_KEEP (1 * 1440) // data in db to be reserved. unit minute
-#define TSDB_MAX_KEEP (365000 * 1440) // data in db to be reserved.
+#define TSDB_MIN_KEEP (1 * 1440) // data in db to be reserved. unit minute
+#define TSDB_MAX_KEEP (365000 * 1440) // data in db to be reserved.
+#define TSDB_MAX_KEEP_NS (365 * 292 * 1440) // data in db to be reserved.
#define TSDB_DEFAULT_KEEP (3650 * 1440) // ten years
#define TSDB_MIN_MINROWS_FBLOCK 10
#define TSDB_MAX_MINROWS_FBLOCK 1000
@@ -380,13 +382,16 @@ typedef enum ELogicConditionType {
#define TSDB_DB_MIN_WAL_SEGMENT_SIZE 0
#define TSDB_DEFAULT_DB_WAL_SEGMENT_SIZE 0
-#define TSDB_MIN_ROLLUP_MAX_DELAY 1 // unit millisecond
-#define TSDB_MAX_ROLLUP_MAX_DELAY (15 * 60 * 1000)
-#define TSDB_MIN_ROLLUP_WATERMARK 0 // unit millisecond
-#define TSDB_MAX_ROLLUP_WATERMARK (15 * 60 * 1000)
-#define TSDB_DEFAULT_ROLLUP_WATERMARK 5000
-#define TSDB_MIN_TABLE_TTL 0
-#define TSDB_DEFAULT_TABLE_TTL 0
+#define TSDB_MIN_ROLLUP_MAX_DELAY 1 // unit millisecond
+#define TSDB_MAX_ROLLUP_MAX_DELAY (15 * 60 * 1000)
+#define TSDB_MIN_ROLLUP_WATERMARK 0 // unit millisecond
+#define TSDB_MAX_ROLLUP_WATERMARK (15 * 60 * 1000)
+#define TSDB_DEFAULT_ROLLUP_WATERMARK 5000
+#define TSDB_MIN_ROLLUP_DELETE_MARK 0 // unit millisecond
+#define TSDB_MAX_ROLLUP_DELETE_MARK INT64_MAX
+#define TSDB_DEFAULT_ROLLUP_DELETE_MARK 900000 // 900s
+#define TSDB_MIN_TABLE_TTL 0
+#define TSDB_DEFAULT_TABLE_TTL 0
#define TSDB_MIN_EXPLAIN_RATIO 0
#define TSDB_MAX_EXPLAIN_RATIO 1
@@ -406,7 +411,7 @@ typedef enum ELogicConditionType {
#ifdef WINDOWS
#define TSDB_MAX_RPC_THREADS 4 // windows pipe only support 4 connections.
#else
-#define TSDB_MAX_RPC_THREADS 10
+#define TSDB_MAX_RPC_THREADS 20
#endif
#define TSDB_QUERY_TYPE_NON_TYPE 0x00u // none type
diff --git a/include/util/tlist.h b/include/util/tlist.h
index 1954bda145a48f249875bda8ea3389b4fbed22be..3dbdb72f9e478e49aff67ab19d8ff81561a132d5 100644
--- a/include/util/tlist.h
+++ b/include/util/tlist.h
@@ -225,7 +225,7 @@ void *tdListFree(SList *list);
void tdListPrependNode(SList *list, SListNode *node);
void tdListAppendNode(SList *list, SListNode *node);
int32_t tdListPrepend(SList *list, void *data);
-int32_t tdListAppend(SList *list, void *data);
+int32_t tdListAppend(SList *list, const void *data);
SListNode *tdListPopHead(SList *list);
SListNode *tdListPopTail(SList *list);
SListNode *tdListGetHead(SList *list);
diff --git a/include/util/tlog.h b/include/util/tlog.h
index 68b004cda74f158791d38decf73346425bf44de9..e6ef7f388ff7af4bab6c29a8a62d39d01d31f256 100644
--- a/include/util/tlog.h
+++ b/include/util/tlog.h
@@ -38,6 +38,7 @@ typedef void (*LogFp)(int64_t ts, ELogLevel level, const char *content);
extern bool tsLogEmbedded;
extern bool tsAsyncLog;
+extern bool tsAssert;
extern int32_t tsNumOfLogLines;
extern int32_t tsLogKeepDays;
extern LogFp tsLogFp;
@@ -82,6 +83,10 @@ void taosPrintLongString(const char *flags, ELogLevel level, int32_t dflag, cons
#endif
;
+bool taosAssert(bool condition, const char *file, int32_t line, const char *format, ...);
+#define ASSERTS(condition, ...) taosAssert(condition, __FILE__, __LINE__, __VA_ARGS__)
+#define ASSERT(condition) ASSERTS(condition, "assert info not provided")
+
// clang-format off
#define uFatal(...) { if (uDebugFlag & DEBUG_FATAL) { taosPrintLog("UTL FATAL", DEBUG_FATAL, tsLogEmbedded ? 255 : uDebugFlag, __VA_ARGS__); }}
#define uError(...) { if (uDebugFlag & DEBUG_ERROR) { taosPrintLog("UTL ERROR ", DEBUG_ERROR, tsLogEmbedded ? 255 : uDebugFlag, __VA_ARGS__); }}
diff --git a/include/util/tpagedbuf.h b/include/util/tpagedbuf.h
index 5f81ccfcfd08cb1cfbd6ff84ea83b4430da45dad..73af65997d7984a6c9c2077ab70a7a44576d8e90 100644
--- a/include/util/tpagedbuf.h
+++ b/include/util/tpagedbuf.h
@@ -24,12 +24,9 @@
extern "C" {
#endif
-typedef struct SArray* SIDList;
typedef struct SPageInfo SPageInfo;
typedef struct SDiskbasedBuf SDiskbasedBuf;
-#define DEFAULT_INTERN_BUF_PAGE_SIZE (1024LL) // in bytes
-
typedef struct SFilePage {
int32_t num;
char data[];
@@ -69,7 +66,7 @@ void* getNewBufPage(SDiskbasedBuf* pBuf, int32_t* pageId);
* @param pBuf
* @return
*/
-SIDList getDataBufPagesIdList(SDiskbasedBuf* pBuf);
+SArray* getDataBufPagesIdList(SDiskbasedBuf* pBuf);
/**
* get the specified buffer page by id
@@ -111,7 +108,7 @@ void destroyDiskbasedBuf(SDiskbasedBuf* pBuf);
* @param pList
* @return
*/
-SPageInfo* getLastPageInfo(SIDList pList);
+SPageInfo* getLastPageInfo(SArray* pList);
/**
*
diff --git a/packaging/MPtestJenkinsfile b/packaging/MPtestJenkinsfile
index dad5b7f129440e1fcf38524c95097b9bf8c1fd03..0570bae191b622ed62f840b4bb1caf8628f3cefb 100644
--- a/packaging/MPtestJenkinsfile
+++ b/packaging/MPtestJenkinsfile
@@ -120,20 +120,20 @@ pipeline {
for verModeSin in ${verModeList}
do
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
done
'''
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
'''
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t deb
+ bash testpackage.sh -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t deb
python3 checkPackageRuning.py
'''
}
@@ -152,20 +152,20 @@ pipeline {
for verModeSin in ${verModeList}
do
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
done
'''
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
'''
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t deb
+ bash testpackage.sh -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t deb
python3 checkPackageRuning.py
dpkg -r tdengine
'''
@@ -185,20 +185,20 @@ pipeline {
for verModeSin in ${verModeList}
do
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
done
'''
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
'''
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t rpm
+ bash testpackage.sh -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t rpm
python3 checkPackageRuning.py
'''
}
@@ -217,20 +217,20 @@ pipeline {
for verModeSin in ${verModeList}
do
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
done
'''
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
'''
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t rpm
+ bash testpackage.sh -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t rpm
python3 checkPackageRuning.py
sudo rpm -e tdengine
'''
@@ -250,7 +250,7 @@ pipeline {
for verModeSin in ${verModeList}
do
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m ${verModeSin} -f server -l false -c arm64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ bash testpackage.sh -m ${verModeSin} -f server -l false -c arm64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py
done
'''
@@ -273,10 +273,9 @@ pipeline {
for verModeSin in ${verModeList}
do
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m ${verModeSin} -f client -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
- python3 checkPackageRuning.py
+ bash testpackage.sh -m ${verModeSin} -f client -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py 192.168.0.21
done
- python3 checkPackageRuning.py 192.168.0.21
'''
}
}
@@ -286,10 +285,8 @@ pipeline {
steps {
timeout(time: 30, unit: 'MINUTES'){
sh '''
- verModeList=community
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m ${verModeSin} -f client -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
- python3 checkPackageRuning.py
+ bash testpackage.sh -m community -f client -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
python3 checkPackageRuning.py 192.168.0.24
'''
}
@@ -309,10 +306,9 @@ pipeline {
for verModeSin in ${verModeList}
do
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh -f server -m ${verModeSin} -f client -l false -c arm64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
- python3 checkPackageRuning.py
+ bash testpackage.sh -m ${verModeSin} -f client -l false -c arm64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py 192.168.0.21
done
- python3 checkPackageRuning.py 192.168.0.21
'''
}
}
diff --git a/packaging/docker/DockerfileCloud b/packaging/docker/DockerfileCloud
index 21e387bab3f81053683b83208e6632cd76fea652..fa8fcabf344f60f73d80c776cc3e46e5b08feecc 100644
--- a/packaging/docker/DockerfileCloud
+++ b/packaging/docker/DockerfileCloud
@@ -12,6 +12,7 @@ RUN apt install -y curl
COPY ${pkgFile} /root/
ENV TINI_VERSION v0.19.0
+ENV TAOS_DISABLE_ADAPTER 1
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${cpuType} /tini
ENV DEBIAN_FRONTEND=noninteractive
WORKDIR /root/
@@ -26,4 +27,4 @@ COPY ./bin/* /usr/bin/
ENTRYPOINT ["/tini", "--", "/usr/bin/entrypoint.sh"]
CMD ["bash", "-c", "/usr/bin/run.sh"]
-VOLUME [ "/var/lib/taos", "/var/log/taos", "/corefile" ]
+VOLUME [ "/var/lib/taos", "/var/log/taos" ]
diff --git a/packaging/docker/run.sh b/packaging/docker/run.sh
deleted file mode 100755
index 3654beadcb5abb538ccc5a496694b6b059964c50..0000000000000000000000000000000000000000
--- a/packaging/docker/run.sh
+++ /dev/null
@@ -1,205 +0,0 @@
-#!/bin/bash
-
-TAOS_RUN_TAOSBENCHMARK_TEST_ONCE=0
-#ADMIN_URL=${ADMIN_URL:-http://172.26.10.84:10001}
-TAOSD_STARTUP_TIMEOUT_SECOND=${TAOSD_STARTUP_TIMEOUT_SECOND:-160}
-TAOS_TIMEOUT_SECOND=${TAOS_TIMEOUT_SECOND:-5}
-BACKUP_CORE_FOLDER=/var/log/corefile
-ALERT_URL=app/system/alert/add
-
-echo "ADMIN_URL: ${ADMIN_URL}"
-echo "TAOS_TIMEOUT_SECOND: ${TAOS_TIMEOUT_SECOND}"
-
-function set_service_state() {
- #echo "set service state: $1, $2"
- service_state="$1"
- service_msg="$2"
-}
-set_service_state "init" "ok"
-app_name=`hostname |cut -d\- -f1`
-
-function check_taosd() {
- timeout $TAOS_TIMEOUT_SECOND taos -s "show databases;" >/dev/null
- local ret=$?
- if [ $ret -ne 0 ]; then
- echo "`date` check taosd error $ret"
- if [ "x$1" != "xignore" ]; then
- set_service_state "error" "taos check failed $ret"
- fi
- else
- set_service_state "ready" "ok"
- fi
-}
-function post_error_msg() {
- if [ ! -z "${ADMIN_URL}" ]; then
- taos_version=`taos --version`
- echo "app_name: ${app_name}"
- echo "service_state: ${service_state}"
- echo "`date` service_msg: ${service_msg}"
- echo "${taos_version}"
- curl --connect-timeout 10 --max-time 20 -X POST -H "Content-Type: application/json" \
- -d"{\"appName\":\"${app_name}\",\
- \"alertLevel\":\"${service_state}\",\
- \"taosVersion\":\"${taos_version}\",\
- \"alertMsg\":\"${service_msg}\"}" \
- ${ADMIN_URL}/${ALERT_URL}
- fi
-}
-function check_taosd_exit_type() {
- local core_pattern=`cat /proc/sys/kernel/core_pattern`
- echo "$core_pattern" | grep -q "^/"
- if [ $? -eq 0 ]; then
- core_folder=`dirname $core_pattern`
- core_prefix=`basename $core_pattern | sed "s/%.*//"`
- else
- core_folder=`pwd`
- core_prefix="$core_pattern"
- fi
- local core_files=`ls $core_folder | grep "^${core_prefix}"`
- if [ ! -z "$core_files" ]; then
- # move core files to another folder
- mkdir -p ${BACKUP_CORE_FOLDER}
- cp ${core_folder}/${core_prefix}* ${BACKUP_CORE_FOLDER}/
- rm -f ${core_folder}/${core_prefix}*
- set_service_state "error" "taosd exit with core file"
- else
- set_service_state "error" "taosd exit without core file"
- fi
-}
-disk_usage_level=(60 80 99)
-current_disk_level=0
-disk_state="ok"
-disk_msg="ok"
-get_usage_ok="yes"
-function post_disk_error_msg() {
- if [ ! -z "${ADMIN_URL}" ]; then
- taos_version=`taos --version`
- echo "app_name: ${app_name}"
- echo "disk_state: ${disk_state}"
- echo "`date` disk_msg: ${disk_msg}"
- echo "${taos_version}"
- curl --connect-timeout 10 --max-time 20 -X POST -H "Content-Type: application/json" \
- -d"{\"appName\":\"${app_name}\",\
- \"alertLevel\":\"${disk_state}\",\
- \"taosVersion\":\"${taos_version}\",\
- \"alertMsg\":\"${disk_msg}\"}" \
- ${ADMIN_URL}/${ALERT_URL}
- fi
-}
-function check_disk() {
- local folder=`cat /etc/taos/taos.cfg|grep -v "^#"|grep dataDir|awk '{print $NF}'`
- if [ -z "$folder" ]; then
- folder="/var/lib/taos"
- fi
- local mount_point="$folder"
- local usage=""
- while [ -z "$usage" ]; do
- usage=`df -h|grep -w "${mount_point}"|awk '{print $5}'|grep -v Use|sed "s/%$//"`
- if [ "x${mount_point}" = "x/" ]; then
- break
- fi
- mount_point=`dirname ${mount_point}`
- done
- if [ -z "$usage" ]; then
- disk_state="error"
- disk_msg="cannot get disk usage"
- if [ "$get_usage_ok" = "yes" ]; then
- post_disk_error_msg
- get_usage_ok="no"
- fi
- else
- get_usage_ok="yes"
- local current_level=0
- for level in ${disk_usage_level[*]}; do
- if [ ${usage} -ge ${level} ]; then
- disk_state="error"
- disk_msg="disk usage over ${level}%"
- current_level=${level}
- fi
- done
- if [ ${current_level} -gt ${current_disk_level} ]; then
- post_disk_error_msg
- elif [ ${current_level} -lt ${current_disk_level} ]; then
- echo "disk usage reduced from ${current_disk_level} to ${current_level}"
- fi
- current_disk_level=${current_level}
- fi
-}
-function run_taosd() {
- taosd
- set_service_state "error" "taosd exit"
- # post error msg
- # check crash or OOM
- check_taosd_exit_type
- post_error_msg
-}
-function print_service_state_change() {
- if [ "x$1" != "x${service_state}" ]; then
- echo "`date` service state: ${service_state}, ${service_msg}"
- fi
-}
-taosd_start_time=`date +%s`
-while ((1))
-do
- check_disk
- # echo "outer loop: $a"
- output=`timeout $TAOS_TIMEOUT_SECOND taos -k`
- if [ -z "${output}" ]; then
- echo "`date` taos -k error"
- status=""
- else
- status=${output:0:1}
- fi
- # echo $output
- # echo $status
- if [ "$status"x = "0"x ]
- then
- # taosd_start_time=`date +%s`
- run_taosd &
- fi
- # echo "$status"x "$TAOS_RUN_TAOSBENCHMARK_TEST"x "$TAOS_RUN_TAOSBENCHMARK_TEST_ONCE"x
- if [ "$status"x = "2"x ] && [ "$TAOS_RUN_TAOSBENCHMARK_TEST"x = "1"x ] && [ "$TAOS_RUN_TAOSBENCHMARK_TEST_ONCE"x = "0"x ]
- then
- TAOS_RUN_TAOSBENCHMARK_TEST_ONCE=1
- # result=`taos -s "show databases;" | grep " test "`
- # if [ "${result:0:5}"x != " test"x ]
- # then
- # taosBenchmark -y -t 1000 -n 1000 -S 900000
- # fi
- taos -s "select stable_name from information_schema.ins_stables where db_name = 'test';"|grep -q -w meters
- if [ $? -ne 0 ]; then
- taosBenchmark -y -t 1000 -n 1000 -S 900000
- taos -s "create user admin_user pass 'NDS65R6t' sysinfo 0;"
- taos -s "GRANT ALL on test.* to admin_user;"
- fi
- fi
- # check taosd status
- if [ "$service_state" = "ready" ]; then
- # check taosd status
- check_taosd
- print_service_state_change "ready"
- if [ "$service_state" = "error" ]; then
- post_error_msg
- fi
- elif [ "$service_state" = "init" ]; then
- check_taosd "ignore"
- # check timeout
- current_time=`date +%s`
- time_elapsed=$(( current_time - taosd_start_time ))
- if [ ${time_elapsed} -gt ${TAOSD_STARTUP_TIMEOUT_SECOND} ]; then
- set_service_state "error" "taosd startup timeout"
- post_error_msg
- fi
- print_service_state_change "init"
- elif [ "$service_state" = "error" ]; then
- # check taosd status
- check_taosd
- print_service_state_change "error"
- fi
- # check taosadapter
- nc -z localhost 6041
- if [ $? -ne 0 ]; then
- taosadapter &
- fi
- sleep 10
-done
diff --git a/packaging/testpackage.sh b/packaging/testpackage.sh
index 846c8d160fe446d5a99a210ab33a1e53785573b6..78d5043b0cf664e02d840fe307b93dc9cc8d9a68 100755
--- a/packaging/testpackage.sh
+++ b/packaging/testpackage.sh
@@ -206,6 +206,10 @@ else
fi
+if [[ ${packgeName} =~ "server" ]] ;then
+ echoColor BD " pkill -9 taosd "
+ pkill -9 taosd
+fi
echoColor G "===== new workroom path ====="
@@ -334,7 +338,7 @@ elif ([[ ${packgeName} =~ "arm64" ]] && [[ ${packgeName} =~ "client" ]]);then
echoColor G "===== install taos-tools arm when package is arm64-client ====="
cd ${installPath}
if [ ! -f "taosTools-2.1.3-Linux-x64.tar.gz " ];then
- wgetFile taosTools-2.1.3-Linux-x64.tar.gz v2.1.3 web
+ wgetFile taosTools-2.1.3-Linux-arm64.tar.gz v2.1.3 web
tar xf taosTools-2.1.3-Linux-arm64.tar.gz
fi
diff --git a/packaging/tools/install.sh b/packaging/tools/install.sh
index 660bfd4fbfe426b71f8a0e4983b51de687d51808..63009e5421ec9db8e787980846c00b14beaab75a 100755
--- a/packaging/tools/install.sh
+++ b/packaging/tools/install.sh
@@ -213,7 +213,7 @@ function install_bin() {
[ -x ${install_main_dir}/bin/${benchmarkName} ] && ${csudo}ln -s ${install_main_dir}/bin/${benchmarkName} ${bin_link_dir}/${demoName} || :
[ -x ${install_main_dir}/bin/${benchmarkName} ] && ${csudo}ln -s ${install_main_dir}/bin/${benchmarkName} ${bin_link_dir}/${benchmarkName} || :
[ -x ${install_main_dir}/bin/${dumpName} ] && ${csudo}ln -s ${install_main_dir}/bin/${dumpName} ${bin_link_dir}/${dumpName} || :
- [ -x ${install_main_dir}/bin/${xname} ] && ${csudo}ln -s ${install_main_dir}/bin/${dumpName} ${bin_link_dir}/${xname} || :
+ [ -x ${install_main_dir}/bin/${xname} ] && ${csudo}ln -s ${install_main_dir}/bin/${xname} ${bin_link_dir}/${xname} || :
[ -x ${install_main_dir}/bin/TDinsight.sh ] && ${csudo}ln -s ${install_main_dir}/bin/TDinsight.sh ${bin_link_dir}/TDinsight.sh || :
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
[ -x ${install_main_dir}/bin/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
diff --git a/packaging/tools/makeclient.sh b/packaging/tools/makeclient.sh
index 4e32e9ad8faafa1b9f1df923c7386001d9a5f70d..edec338c55c4ada6a7669a670a89d5db68e97ca3 100755
--- a/packaging/tools/makeclient.sh
+++ b/packaging/tools/makeclient.sh
@@ -187,7 +187,7 @@ if [[ $productName == "TDengine" ]]; then
git clone --depth 1 https://github.com/taosdata/taos-connector-dotnet ${install_dir}/connector/dotnet
rm -rf ${install_dir}/connector/dotnet/.git ||:
# cp -r ${connector_dir}/nodejs ${install_dir}/connector
- git clone --depth 1 https://github.com/taosdata/libtaos-rs ${install_dir}/connector/rust
+ git clone --depth 1 https://github.com/taosdata/taos-connector-rust ${install_dir}/connector/rust
rm -rf ${install_dir}/connector/rust/.git ||:
fi
fi
diff --git a/packaging/tools/makepkg.sh b/packaging/tools/makepkg.sh
index 2776683a249c3376b9cf5e5d54ba43f534f3df47..4169bed3eb3b4f732ef928425e92c7ff7ee20561 100755
--- a/packaging/tools/makepkg.sh
+++ b/packaging/tools/makepkg.sh
@@ -318,7 +318,7 @@ if [ "$verMode" == "cluster" ] || [ "$verMode" == "cloud" ]; then
git clone --depth 1 https://github.com/taosdata/taos-connector-dotnet ${install_dir}/connector/dotnet
rm -rf ${install_dir}/connector/dotnet/.git ||:
- git clone --depth 1 https://github.com/taosdata/libtaos-rs ${install_dir}/connector/rust
+ git clone --depth 1 https://github.com/taosdata/taos-connector-rust ${install_dir}/connector/rust
rm -rf ${install_dir}/connector/rust/.git ||:
# cp -r ${connector_dir}/python ${install_dir}/connector
@@ -379,4 +379,4 @@ if [ -n "${taostools_bin_files}" ]; then
fi
fi
-cd ${curr_dir}
\ No newline at end of file
+cd ${curr_dir}
diff --git a/packaging/tools/post.sh b/packaging/tools/post.sh
index 37307f0543f334fad0557868a83c3ad8b9b596ec..482345dcd819dce683d3aa68438e6fa9fd5a4a9f 100755
--- a/packaging/tools/post.sh
+++ b/packaging/tools/post.sh
@@ -205,6 +205,7 @@ function set_hostname() {
break
else
read -p "Please enter one hostname(must not be 'localhost'):" newHostname
+ break
fi
done
@@ -324,7 +325,9 @@ function local_fqdn_check() {
;;
*)
+ set_ipAsFqdn
echo "Invalid input..."
+ break
;;
esac
fi
diff --git a/packaging/tools/tdengine.iss b/packaging/tools/tdengine.iss
index 2e9c46d06b1e37530a22660f60c9da33bb3f50f3..3a22c737743872528887616b83b3ec58329e8795 100644
--- a/packaging/tools/tdengine.iss
+++ b/packaging/tools/tdengine.iss
@@ -51,7 +51,7 @@ Source: taos.bat; DestDir: "{app}\include"; Flags: igNoreversion;
;Source: taosdemo.png; DestDir: "{app}\include"; Flags: igNoreversion;
;Source: taosShell.png; DestDir: "{app}\include"; Flags: igNoreversion;
Source: favicon.ico; DestDir: "{app}\include"; Flags: igNoreversion;
-Source: {#MyAppSourceDir}{#MyAppDLLName}; DestDir: "{win}\System32"; Flags: 64bit;Check:IsWin64;
+Source: {#MyAppSourceDir}{#MyAppDLLName}; DestDir: "{win}\System32"; Flags: igNoreversion recursesubdirs createallsubdirs 64bit;Check:IsWin64;
Source: {#MyAppSourceDir}{#MyAppCfgName}; DestDir: "{app}\cfg"; Flags: igNoreversion recursesubdirs createallsubdirs onlyifdoesntexist uninsneveruninstall
Source: {#MyAppSourceDir}{#MyAppDriverName}; DestDir: "{app}\driver"; Flags: igNoreversion recursesubdirs createallsubdirs
;Source: {#MyAppSourceDir}{#MyAppConnectorName}; DestDir: "{app}\connector"; Flags: igNoreversion recursesubdirs createallsubdirs
diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h
index e569a977239c5feca935b99fe200096053755849..ea76f726ea1b4ee7e89cd28053c11ac1d6dca2e1 100644
--- a/source/client/inc/clientInt.h
+++ b/source/client/inc/clientInt.h
@@ -26,7 +26,7 @@ extern "C" {
#include "query.h"
#include "taos.h"
#include "tcommon.h"
-#include "tdatablock.h"
+#include "tmisce.h"
#include "tdef.h"
#include "thash.h"
#include "tlist.h"
@@ -171,9 +171,9 @@ typedef struct SReqResultInfo {
char** convertBuf;
TAOS_ROW row;
SResultColumn* pCol;
- uint32_t numOfRows;
+ uint64_t numOfRows; // from int32_t change to int64_t
uint64_t totalRows;
- uint32_t current;
+ uint64_t current;
bool localResultFetched;
bool completed;
int32_t precision;
diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c
index 3f4e1bb513ef6ef4db76710aa388df6de23ec4d1..c694a6c1a04c5f91b66b89e6b33b57f224cd6ab9 100644
--- a/source/client/src/clientEnv.c
+++ b/source/client/src/clientEnv.c
@@ -148,6 +148,10 @@ void *openTransporter(const char *user, const char *auth, int32_t numOfThread) {
rpcInit.dfp = destroyAhandle;
rpcInit.retryLimit = tsRpcRetryLimit;
rpcInit.retryInterval = tsRpcRetryInterval;
+ rpcInit.retryMinInterval = tsRedirectPeriod;
+ rpcInit.retryStepFactor = tsRedirectFactor;
+ rpcInit.retryMaxInterval = tsRedirectMaxPeriod;
+ rpcInit.retryMaxTimouet = tsMaxRetryWaitTime;
void *pDnodeConn = rpcOpen(&rpcInit);
if (pDnodeConn == NULL) {
@@ -227,10 +231,9 @@ void destroyTscObj(void *pObj) {
tscDebug("connObj 0x%" PRIx64 " p:%p destroyed, remain inst totalConn:%" PRId64, pTscObj->id, pTscObj,
pTscObj->pAppInfo->numOfConns);
- int64_t connNum = atomic_sub_fetch_64(&pTscObj->pAppInfo->numOfConns, 1);
- if (0 == connNum) {
- destroyAppInst(pTscObj->pAppInfo);
- }
+ // In any cases, we should not free app inst here. Or an race condition rises.
+ /*int64_t connNum = */atomic_sub_fetch_64(&pTscObj->pAppInfo->numOfConns, 1);
+
taosThreadMutexDestroy(&pTscObj->mutex);
taosMemoryFree(pTscObj);
@@ -240,14 +243,14 @@ void destroyTscObj(void *pObj) {
void *createTscObj(const char *user, const char *auth, const char *db, int32_t connType, SAppInstInfo *pAppInfo) {
STscObj *pObj = (STscObj *)taosMemoryCalloc(1, sizeof(STscObj));
if (NULL == pObj) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
pObj->pRequests = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
if (NULL == pObj->pRequests) {
taosMemoryFree(pObj);
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
@@ -277,7 +280,7 @@ int32_t releaseTscObj(int64_t rid) { return taosReleaseRef(clientConnRefPool, ri
void *createRequest(uint64_t connId, int32_t type, int64_t reqid) {
SRequestObj *pRequest = (SRequestObj *)taosMemoryCalloc(1, sizeof(SRequestObj));
if (NULL == pRequest) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
@@ -393,8 +396,8 @@ void taos_init_imp(void) {
deltaToUtcInitOnce();
if (taosCreateLog("taoslog", 10, configDir, NULL, NULL, NULL, NULL, 1) != 0) {
- tscInitRes = -1;
- return;
+ // ignore create log failed, only print
+ printf(" WARING: Create taoslog failed. configDir=%s\n", configDir);
}
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1) != 0) {
@@ -404,7 +407,9 @@ void taos_init_imp(void) {
initQueryModuleMsgHandle();
- taosConvInit();
+ if (taosConvInit() != 0) {
+ ASSERTS(0, "failed to init conv");
+ }
rpcInit();
diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c
index 0f881beb66812b0f5ce509596bcc31f5764c349d..47ed2cf035a13314b81f2208718d2c466efb5c68 100644
--- a/source/client/src/clientHb.c
+++ b/source/client/src/clientHb.c
@@ -69,7 +69,8 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog
} else {
SDBVgInfo *vgInfo = taosMemoryCalloc(1, sizeof(SDBVgInfo));
if (NULL == vgInfo) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _return;
}
vgInfo->vgVersion = rsp->vgVersion;
@@ -81,7 +82,8 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog
if (NULL == vgInfo->vgHash) {
taosMemoryFree(vgInfo);
tscError("hash init[%d] failed", rsp->vgNum);
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _return;
}
for (int32_t j = 0; j < rsp->vgNum; ++j) {
@@ -90,7 +92,8 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog
tscError("hash push failed, errno:%d", errno);
taosHashCleanup(vgInfo->vgHash);
taosMemoryFree(vgInfo);
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _return;
}
}
@@ -98,12 +101,14 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog
}
if (code) {
- return code;
+ goto _return;
}
}
+_return:
+
tFreeSUseDbBatchRsp(&batchUseRsp);
- return TSDB_CODE_SUCCESS;
+ return code;
}
static int32_t hbProcessStbInfoRsp(void *value, int32_t valueLen, struct SCatalog *pCatalog) {
@@ -361,7 +366,7 @@ int32_t hbBuildQueryDesc(SQueryHbReqBasic *hbBasic, STscObj *pObj) {
desc.subDesc = taosArrayInit(desc.subPlanNum, sizeof(SQuerySubDesc));
if (NULL == desc.subDesc) {
releaseRequest(*rid);
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
code = schedulerGetTasksStatus(pRequest->body.queryJob, desc.subDesc);
@@ -389,14 +394,14 @@ int32_t hbGetQueryBasicInfo(SClientHbKey *connKey, SClientHbReq *req) {
STscObj *pTscObj = (STscObj *)acquireTscObj(connKey->tscRid);
if (NULL == pTscObj) {
tscWarn("tscObj rid %" PRIx64 " not exist", connKey->tscRid);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
SQueryHbReqBasic *hbBasic = (SQueryHbReqBasic *)taosMemoryCalloc(1, sizeof(SQueryHbReqBasic));
if (NULL == hbBasic) {
tscError("calloc %d failed", (int32_t)sizeof(SQueryHbReqBasic));
releaseTscObj(connKey->tscRid);
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
hbBasic->connId = pTscObj->connId;
@@ -414,7 +419,7 @@ int32_t hbGetQueryBasicInfo(SClientHbKey *connKey, SClientHbReq *req) {
tscWarn("taosArrayInit %d queryDesc failed", numOfQueries);
releaseTscObj(connKey->tscRid);
taosMemoryFree(hbBasic);
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
int32_t code = hbBuildQueryDesc(hbBasic, pTscObj);
@@ -608,7 +613,7 @@ static FORCE_INLINE void hbMgrInitHandle() {
SClientHbBatchReq *hbGatherAllInfo(SAppHbMgr *pAppHbMgr) {
SClientHbBatchReq *pBatchReq = taosMemoryCalloc(1, sizeof(SClientHbBatchReq));
if (pBatchReq == NULL) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
int32_t connKeyCnt = atomic_load_32(&pAppHbMgr->connKeyCnt);
@@ -732,7 +737,7 @@ static void *hbThreadFunc(void *param) {
int tlen = tSerializeSClientHbBatchReq(NULL, 0, pReq);
void *buf = taosMemoryMalloc(tlen);
if (buf == NULL) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
tFreeClientHbBatchReq(pReq);
// hbClearReqInfo(pAppHbMgr);
taosArrayPush(mgr, &pAppHbMgr);
@@ -743,7 +748,7 @@ static void *hbThreadFunc(void *param) {
SMsgSendInfo *pInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (pInfo == NULL) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
tFreeClientHbBatchReq(pReq);
// hbClearReqInfo(pAppHbMgr);
taosMemoryFree(buf);
diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c
index c3140371c4f50175772131ae2f2c9a0abf0f8787..e6584f4a00638670cd3098813a128c7f36c51625 100644
--- a/source/client/src/clientImpl.c
+++ b/source/client/src/clientImpl.c
@@ -131,7 +131,7 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas
p = taosMemoryCalloc(1, sizeof(struct SAppInstInfo));
p->mgmtEp = epSet;
taosThreadMutexInit(&p->qnodeMutex, NULL);
- p->pTransporter = openTransporter(user, secretEncrypt, tsNumOfCores);
+ p->pTransporter = openTransporter(user, secretEncrypt, tsNumOfCores / 2);
p->pAppHbMgr = appHbMgrInit(p, key);
if (NULL == p->pAppHbMgr) {
destroyAppInst(p);
@@ -166,7 +166,7 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param,
tscError("0x%" PRIx64 " failed to prepare sql string buffer, %s", (*pRequest)->self, sql);
destroyRequest(*pRequest);
*pRequest = NULL;
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
strntolower((*pRequest)->sqlstr, sql, (int32_t)sqlLen);
@@ -179,7 +179,7 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param,
if (pParam == NULL) {
destroyRequest(*pRequest);
*pRequest = NULL;
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
tsem_init(&pParam->sem, 0, 0);
@@ -198,7 +198,7 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param,
taosMemoryFree(param);
destroyRequest(*pRequest);
*pRequest = NULL;
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
(*pRequest)->allocatorRefId = -1;
@@ -209,7 +209,7 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param,
(*pRequest)->self, (*pRequest)->requestId, pTscObj->id, sql);
destroyRequest(*pRequest);
*pRequest = NULL;
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
}
@@ -317,7 +317,7 @@ void asyncExecLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
tscError("0x%" PRIx64 " fetch results failed, code:%s, reqId:0x%" PRIx64, pRequest->self, tstrerror(code),
pRequest->requestId);
} else {
- tscDebug("0x%" PRIx64 " fetch results, numOfRows:%d total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
+ tscDebug("0x%" PRIx64 " fetch results, numOfRows:%" PRId64 " total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
pRequest->self, pResultInfo->numOfRows, pResultInfo->totalRows, pResultInfo->completed,
pRequest->requestId);
}
@@ -373,7 +373,7 @@ int32_t updateQnodeList(SAppInstInfo* pInfo, SArray* pNodeList) {
}
if (pNodeList) {
- pInfo->pQnodeList = taosArrayDup(pNodeList);
+ pInfo->pQnodeList = taosArrayDup(pNodeList, NULL);
taosArraySort(pInfo->pQnodeList, compareQueryNodeLoad);
tscDebug("QnodeList updated in cluster 0x%" PRIx64 ", num:%ld", pInfo->clusterId,
taosArrayGetSize(pInfo->pQnodeList));
@@ -404,7 +404,7 @@ int32_t getQnodeList(SRequestObj* pRequest, SArray** pNodeList) {
taosThreadMutexLock(&pInfo->qnodeMutex);
if (pInfo->pQnodeList) {
- *pNodeList = taosArrayDup(pInfo->pQnodeList);
+ *pNodeList = taosArrayDup(pInfo->pQnodeList, NULL);
}
taosThreadMutexUnlock(&pInfo->qnodeMutex);
@@ -593,13 +593,13 @@ int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray
if (pRes->code) {
pQnodeList = NULL;
} else {
- pQnodeList = taosArrayDup((SArray*)pRes->pRes);
+ pQnodeList = taosArrayDup((SArray*)pRes->pRes, NULL);
}
} else {
SAppInstInfo* pInst = pRequest->pTscObj->pAppInfo;
taosThreadMutexLock(&pInst->qnodeMutex);
if (pInst->pQnodeList) {
- pQnodeList = taosArrayDup(pInst->pQnodeList);
+ pQnodeList = taosArrayDup(pInst->pQnodeList, NULL);
}
taosThreadMutexUnlock(&pInst->qnodeMutex);
}
@@ -609,7 +609,7 @@ int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray
}
default:
tscError("unknown query policy: %d", tsQueryPolicy);
- return TSDB_CODE_TSC_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
taosArrayDestroy(pDbVgList);
@@ -670,7 +670,7 @@ int32_t buildSyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray*
}
default:
tscError("unknown query policy: %d", tsQueryPolicy);
- return TSDB_CODE_TSC_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
_return:
@@ -1136,7 +1136,7 @@ int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest) {
int32_t tblNum = taosArrayGetSize(pRequest->tableList);
if (dbNum <= 0 && tblNum <= 0) {
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &pCatalog);
@@ -1231,7 +1231,7 @@ STscObj* taosConnectImpl(const char* user, const char* auth, const char* db, __t
SAppInstInfo* pAppInfo, int connType) {
STscObj* pTscObj = createTscObj(user, auth, db, connType, pAppInfo);
if (NULL == pTscObj) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return pTscObj;
}
@@ -1268,7 +1268,7 @@ STscObj* taosConnectImpl(const char* user, const char* auth, const char* db, __t
static SMsgSendInfo* buildConnectMsg(SRequestObj* pRequest) {
SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (pMsgSendInfo == NULL) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
@@ -1527,7 +1527,7 @@ void* doFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertUcs4)
return NULL;
}
- tscDebug("0x%" PRIx64 " fetch results, numOfRows:%d total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
+ tscDebug("0x%" PRIx64 " fetch results, numOfRows:%" PRId64 " total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
pRequest->self, pResInfo->numOfRows, pResInfo->totalRows, pResInfo->completed, pRequest->requestId);
STscObj* pTscObj = pRequest->pTscObj;
@@ -1645,7 +1645,7 @@ int32_t getVersion1BlockMetaSize(const char* p, int32_t numOfCols) {
static int32_t estimateJsonLen(SReqResultInfo* pResultInfo, int32_t numOfCols, int32_t numOfRows) {
char* p = (char*)pResultInfo->pData;
- // version + length + numOfRows + numOfCol + groupId + flag_segment + column_info
+ // | version | total length | total rows | total columns | flag seg| block group id | column schema | each column length |
int32_t len = getVersion1BlockMetaSize(p, numOfCols);
int32_t* colLength = (int32_t*)(p + len);
len += sizeof(int32_t) * numOfCols;
@@ -1941,7 +1941,7 @@ int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableR
pResultInfo->pRspMsg = (const char*)pRsp;
pResultInfo->pData = (void*)pRsp->data;
- pResultInfo->numOfRows = htonl(pRsp->numOfRows);
+ pResultInfo->numOfRows = htobe64(pRsp->numOfRows);
pResultInfo->current = 0;
pResultInfo->completed = (pRsp->completed == 1);
pResultInfo->payloadLen = htonl(pRsp->compLen);
@@ -2293,10 +2293,16 @@ TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly) {
taosAsyncQueryImpl(*(int64_t*)taos, sql, syncQueryFn, param, validateOnly);
tsem_wait(¶m->sem);
+
+ SRequestObj *pRequest = NULL;
if (param->pRequest != NULL) {
param->pRequest->syncQuery = true;
+ pRequest = param->pRequest;
+ } else {
+ taosMemoryFree(param);
}
- return param->pRequest;
+
+ return pRequest;
}
TAOS_RES* taosQueryImplWithReqid(TAOS* taos, const char* sql, bool validateOnly, int64_t reqid) {
@@ -2310,8 +2316,14 @@ TAOS_RES* taosQueryImplWithReqid(TAOS* taos, const char* sql, bool validateOnly,
taosAsyncQueryImplWithReqid(*(int64_t*)taos, sql, syncQueryFn, param, validateOnly, reqid);
tsem_wait(¶m->sem);
+
+ SRequestObj *pRequest = NULL;
if (param->pRequest != NULL) {
param->pRequest->syncQuery = true;
+ pRequest = param->pRequest;
+ } else {
+ taosMemoryFree(param);
}
- return param->pRequest;
+
+ return pRequest;
}
diff --git a/source/client/src/clientJniConnector.c b/source/client/src/clientJniConnector.c
index b5a6ebadeec74e6565fd5225144cd139f6c9aaab..34fc480432f5dac71f80b6316718fe22397eb125 100644
--- a/source/client/src/clientJniConnector.c
+++ b/source/client/src/clientJniConnector.c
@@ -136,7 +136,7 @@ int32_t check_for_params(jobject jobj, jlong conn, jlong res) {
}
if ((TAOS_RES *)res == NULL) {
- jniError("jobj:%p, conn:%p, res is null", jobj, (TAOS *)conn);
+ jniError("jobj:%p, conn:%p, param res is null", jobj, (TAOS *)conn);
return JNI_RESULT_SET_NULL;
}
@@ -393,9 +393,8 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_freeResultSetImp(
return code;
}
- taos_free_result((void *)res);
jniDebug("jobj:%p, conn:%p, free resultset:%p", jobj, (TAOS *)con, (void *)res);
-
+ taos_free_result((void *)res);
return JNI_SUCCESS;
}
@@ -489,7 +488,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn
numOfFields);
return JNI_FETCH_END;
} else {
- jniDebug("jobj:%p, conn:%p, interrupted query", jobj, tscon);
+ jniDebug("jobj:%p, conn:%p, interrupted query. fetch row error code: %d, msg:%s", jobj, tscon, code, taos_errstr(result));
return JNI_RESULT_SET_NULL;
}
}
@@ -584,7 +583,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchBlockImp(JNI
jniDebug("jobj:%p, conn:%p, resultset:%p, no data to retrieve", jobj, tscon, (void *)res);
return JNI_FETCH_END;
} else {
- jniError("jobj:%p, conn:%p, query interrupted", jobj, tscon);
+ jniError("jobj:%p, conn:%p, query interrupted. fetch block error code:%d, msg:%s", jobj, tscon, error_code, taos_errstr(tres));
return JNI_RESULT_SET_NULL;
}
}
diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c
index 423cfcdc5b1f5c30f16cf1dcb50ce1b2bb28c53e..87f5e5fa40ff06efb0983689767f3b4f582be55b 100644
--- a/source/client/src/clientMain.c
+++ b/source/client/src/clientMain.c
@@ -20,8 +20,8 @@
#include "functionMgt.h"
#include "os.h"
#include "query.h"
-#include "qworker.h"
#include "scheduler.h"
+#include "tdatablock.h"
#include "tglobal.h"
#include "tmsg.h"
#include "tref.h"
@@ -146,7 +146,6 @@ void taos_close(TAOS *taos) {
int taos_errno(TAOS_RES *res) {
if (res == NULL || TD_RES_TMQ_META(res)) {
- if (terrno == TSDB_CODE_RPC_REDIRECT) terrno = TSDB_CODE_QRY_NOT_READY;
return terrno;
}
@@ -154,12 +153,11 @@ int taos_errno(TAOS_RES *res) {
return 0;
}
- return ((SRequestObj *)res)->code == TSDB_CODE_RPC_REDIRECT ? TSDB_CODE_QRY_NOT_READY : ((SRequestObj *)res)->code;
+ return ((SRequestObj *)res)->code;
}
const char *taos_errstr(TAOS_RES *res) {
if (res == NULL || TD_RES_TMQ_META(res)) {
- if (terrno == TSDB_CODE_RPC_REDIRECT) terrno = TSDB_CODE_QRY_NOT_READY;
return (const char *)tstrerror(terrno);
}
@@ -171,8 +169,7 @@ const char *taos_errstr(TAOS_RES *res) {
if (NULL != pRequest->msgBuf && (strlen(pRequest->msgBuf) > 0 || pRequest->code == TSDB_CODE_RPC_FQDN_ERROR)) {
return pRequest->msgBuf;
} else {
- return pRequest->code == TSDB_CODE_RPC_REDIRECT ? (const char *)tstrerror(TSDB_CODE_QRY_NOT_READY)
- : (const char *)tstrerror(pRequest->code);
+ return (const char *)tstrerror(pRequest->code);
}
}
@@ -181,16 +178,18 @@ void taos_free_result(TAOS_RES *res) {
return;
}
+ tscDebug("taos free res %p", res);
+
if (TD_RES_QUERY(res)) {
SRequestObj *pRequest = (SRequestObj *)res;
tscDebug("0x%" PRIx64 " taos_free_result start to free query", pRequest->requestId);
destroyRequest(pRequest);
} else if (TD_RES_TMQ_METADATA(res)) {
SMqTaosxRspObj *pRsp = (SMqTaosxRspObj *)res;
- if (pRsp->rsp.blockData) taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
- if (pRsp->rsp.blockDataLen) taosArrayDestroy(pRsp->rsp.blockDataLen);
- if (pRsp->rsp.withTbName) taosArrayDestroyP(pRsp->rsp.blockTbName, taosMemoryFree);
- if (pRsp->rsp.withSchema) taosArrayDestroyP(pRsp->rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
+ taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
+ taosArrayDestroy(pRsp->rsp.blockDataLen);
+ taosArrayDestroyP(pRsp->rsp.blockTbName, taosMemoryFree);
+ taosArrayDestroyP(pRsp->rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
// taosx
taosArrayDestroy(pRsp->rsp.createTableLen);
taosArrayDestroyP(pRsp->rsp.createTableReq, taosMemoryFree);
@@ -200,10 +199,10 @@ void taos_free_result(TAOS_RES *res) {
taosMemoryFree(pRsp);
} else if (TD_RES_TMQ(res)) {
SMqRspObj *pRsp = (SMqRspObj *)res;
- if (pRsp->rsp.blockData) taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
- if (pRsp->rsp.blockDataLen) taosArrayDestroy(pRsp->rsp.blockDataLen);
- if (pRsp->rsp.withTbName) taosArrayDestroyP(pRsp->rsp.blockTbName, taosMemoryFree);
- if (pRsp->rsp.withSchema) taosArrayDestroyP(pRsp->rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
+ taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
+ taosArrayDestroy(pRsp->rsp.blockDataLen);
+ taosArrayDestroyP(pRsp->rsp.blockTbName, taosMemoryFree);
+ taosArrayDestroyP(pRsp->rsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
pRsp->resInfo.pRspMsg = NULL;
doFreeReqResultInfo(&pRsp->resInfo);
taosMemoryFree(pRsp);
@@ -438,11 +437,23 @@ const char *taos_data_type(int type) {
const char *taos_get_client_info() { return version; }
+// return int32_t
int taos_affected_rows(TAOS_RES *res) {
if (res == NULL || TD_RES_TMQ(res) || TD_RES_TMQ_META(res) || TD_RES_TMQ_METADATA(res)) {
return 0;
}
+ SRequestObj *pRequest = (SRequestObj *)res;
+ SReqResultInfo *pResInfo = &pRequest->body.resInfo;
+ return (int)pResInfo->numOfRows;
+}
+
+// return int64_t
+int64_t taos_affected_rows64(TAOS_RES *res) {
+ if (res == NULL || TD_RES_TMQ(res) || TD_RES_TMQ_META(res) || TD_RES_TMQ_METADATA(res)) {
+ return 0;
+ }
+
SRequestObj *pRequest = (SRequestObj *)res;
SReqResultInfo *pResInfo = &pRequest->body.resInfo;
return pResInfo->numOfRows;
@@ -787,9 +798,11 @@ static void doAsyncQueryFromParse(SMetaData *pResultMeta, void *param, int32_t c
SQuery *pQuery = pRequest->pQuery;
pRequest->metric.ctgEnd = taosGetTimestampUs();
- qDebug("0x%" PRIx64 " start to continue parse, reqId:0x%" PRIx64, pRequest->self, pRequest->requestId);
+ qDebug("0x%" PRIx64 " start to continue parse, reqId:0x%" PRIx64 ", code:%s", pRequest->self, pRequest->requestId,
+ tstrerror(code));
if (code == TSDB_CODE_SUCCESS) {
+ //pWrapper->pCatalogReq->forceUpdate = false;
code = qContinueParseSql(pWrapper->pParseCtx, pWrapper->pCatalogReq, pResultMeta, pQuery);
}
@@ -870,6 +883,11 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) {
if (pRequest->retry++ > REQUEST_TOTAL_EXEC_TIMES) {
code = pRequest->prevCode;
+ terrno = code;
+ pRequest->code = code;
+ tscDebug("call sync query cb with code: %s", tstrerror(code));
+ pRequest->body.queryFp(pRequest->body.param, pRequest, code);
+ return;
}
if (TSDB_CODE_SUCCESS == code) {
@@ -920,6 +938,17 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) {
tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code),
pRequest->requestId);
destorySqlCallbackWrapper(pWrapper);
+ qDestroyQuery(pRequest->pQuery);
+ pRequest->pQuery = NULL;
+
+ if (NEED_CLIENT_HANDLE_ERROR(code)) {
+ tscDebug("0x%" PRIx64 " client retry to handle the error, code:%d - %s, tryCount:%d, reqId:0x%" PRIx64,
+ pRequest->self, code, tstrerror(code), pRequest->retry, pRequest->requestId);
+ pRequest->prevCode = code;
+ doAsyncQuery(pRequest, true);
+ return;
+ }
+
terrno = code;
pRequest->code = code;
pRequest->body.queryFp(pRequest->body.param, pRequest, code);
@@ -959,7 +988,7 @@ static void fetchCallback(void *pResult, void *param, int32_t code) {
tscError("0x%" PRIx64 " fetch results failed, code:%s, reqId:0x%" PRIx64, pRequest->self, tstrerror(code),
pRequest->requestId);
} else {
- tscDebug("0x%" PRIx64 " fetch results, numOfRows:%d total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
+ tscDebug("0x%" PRIx64 " fetch results, numOfRows:%" PRId64 " total Rows:%" PRId64 ", complete:%d, reqId:0x%" PRIx64,
pRequest->self, pResultInfo->numOfRows, pResultInfo->totalRows, pResultInfo->completed,
pRequest->requestId);
diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c
index 8437c93bae498591739024d3873d4afc71efaddd..85027ff371c921cc6bf9137d4f7eaece092c2e7d 100644
--- a/source/client/src/clientMsgHandler.c
+++ b/source/client/src/clientMsgHandler.c
@@ -20,6 +20,8 @@
#include "query.h"
#include "tdef.h"
#include "tname.h"
+#include "tdatablock.h"
+#include "systable.h"
static void setErrno(SRequestObj* pRequest, int32_t code) {
pRequest->code = code;
@@ -47,8 +49,6 @@ int32_t genericRspCallback(void* param, SDataBuf* pMsg, int32_t code) {
int32_t processConnectRsp(void* param, SDataBuf* pMsg, int32_t code) {
SRequestObj *pRequest = acquireRequest(*(int64_t*)param);
if (NULL == pRequest) {
- setErrno(pRequest, TSDB_CODE_TSC_DISCONNECTED);
- tsem_post(&pRequest->body.rspSem);
goto End;
}
@@ -86,7 +86,7 @@ int32_t processConnectRsp(void* param, SDataBuf* pMsg, int32_t code) {
/*assert(connectRsp.epSet.numOfEps > 0);*/
if (connectRsp.epSet.numOfEps == 0) {
- setErrno(pRequest, TSDB_CODE_MND_APP_ERROR);
+ setErrno(pRequest, TSDB_CODE_APP_ERROR);
tsem_post(&pRequest->body.rspSem);
goto End;
}
@@ -326,6 +326,17 @@ int32_t processDropDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
int32_t code = catalogGetHandle(pRequest->pTscObj->pAppInfo->clusterId, &pCatalog);
if (TSDB_CODE_SUCCESS == code) {
catalogRemoveDB(pCatalog, dropdbRsp.db, dropdbRsp.uid);
+ STscObj* pTscObj = pRequest->pTscObj;
+
+ SRequestConnInfo conn = {.pTrans = pTscObj->pAppInfo->pTransporter,
+ .requestId = pRequest->requestId,
+ .requestObjRefId = pRequest->self,
+ .mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
+ char dbFName[TSDB_DB_FNAME_LEN];
+ snprintf(dbFName, sizeof(dbFName) - 1, "%d.%s", pTscObj->acctId, TSDB_INFORMATION_SCHEMA_DB);
+ catalogRefreshDBVgInfo(pCatalog, &conn, dbFName);
+ snprintf(dbFName, sizeof(dbFName) - 1, "%d.%s", pTscObj->acctId, TSDB_PERFORMANCE_SCHEMA_DB);
+ catalogRefreshDBVgInfo(pCatalog, &conn, dbFName);
}
}
@@ -439,7 +450,7 @@ static int32_t buildShowVariablesRsp(SArray* pVars, SRetrieveTableRsp** pRsp) {
(*pRsp)->precision = 0;
(*pRsp)->compressed = 0;
(*pRsp)->compLen = 0;
- (*pRsp)->numOfRows = htonl(pBlock->info.rows);
+ (*pRsp)->numOfRows = htobe64((int64_t)pBlock->info.rows);
(*pRsp)->numOfCols = htonl(SHOW_VARIABLES_RESULT_COLS);
int32_t len = blockEncode(pBlock, (*pRsp)->data, SHOW_VARIABLES_RESULT_COLS);
diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c
index 90a2adb64743585070a4f5a2e5414c1d45648bf2..150194aa278deebc757d4108eb0f92469cae71f0 100644
--- a/source/client/src/clientRawBlockWrite.c
+++ b/source/client/src/clientRawBlockWrite.c
@@ -1211,6 +1211,208 @@ static void destroyVgHash(void* data) {
taosMemoryFreeClear(vgData->data);
}
+int taos_write_raw_block_with_fields(TAOS* taos, int rows, char* pData, const char* tbname, TAOS_FIELD *fields, int numFields){
+ int32_t code = TSDB_CODE_SUCCESS;
+ STableMeta* pTableMeta = NULL;
+ SQuery* pQuery = NULL;
+ SSubmitReq* subReq = NULL;
+
+ SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0);
+ if (!pRequest) {
+ uError("WriteRaw:createRequest error request is null");
+ code = terrno;
+ goto end;
+ }
+
+ pRequest->syncQuery = true;
+ if (!pRequest->pDb) {
+ uError("WriteRaw:not use db");
+ code = TSDB_CODE_PAR_DB_NOT_SPECIFIED;
+ goto end;
+ }
+
+ SName pName = {TSDB_TABLE_NAME_T, pRequest->pTscObj->acctId, {0}, {0}};
+ tstrncpy(pName.dbname, pRequest->pDb, sizeof(pName.dbname));
+ tstrncpy(pName.tname, tbname, sizeof(pName.tname));
+
+ struct SCatalog* pCatalog = NULL;
+ code = catalogGetHandle(pRequest->pTscObj->pAppInfo->clusterId, &pCatalog);
+ if (code != TSDB_CODE_SUCCESS) {
+ uError("WriteRaw: get gatlog error");
+ goto end;
+ }
+
+ SRequestConnInfo conn = {0};
+ conn.pTrans = pRequest->pTscObj->pAppInfo->pTransporter;
+ conn.requestId = pRequest->requestId;
+ conn.requestObjRefId = pRequest->self;
+ conn.mgmtEps = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
+
+ SVgroupInfo vgData = {0};
+ code = catalogGetTableHashVgroup(pCatalog, &conn, &pName, &vgData);
+ if (code != TSDB_CODE_SUCCESS) {
+ uError("WriteRaw:catalogGetTableHashVgroup failed. table name: %s", tbname);
+ goto end;
+ }
+
+ code = catalogGetTableMeta(pCatalog, &conn, &pName, &pTableMeta);
+ if (code != TSDB_CODE_SUCCESS) {
+ uError("WriteRaw:catalogGetTableMeta failed. table name: %s", tbname);
+ goto end;
+ }
+ uint64_t suid = (TSDB_NORMAL_TABLE == pTableMeta->tableType ? 0 : pTableMeta->suid);
+ uint64_t uid = pTableMeta->uid;
+ int32_t numOfCols = pTableMeta->tableInfo.numOfColumns;
+
+ uint16_t fLen = 0;
+ int32_t rowSize = 0;
+ int16_t nVar = 0;
+ for (int i = 0; i < pTableMeta->tableInfo.numOfColumns; i++) {
+ SSchema* schema = pTableMeta->schema + i;
+ fLen += TYPE_BYTES[schema->type];
+ rowSize += schema->bytes;
+ if (IS_VAR_DATA_TYPE(schema->type)) {
+ nVar++;
+ }
+ }
+
+ fLen -= sizeof(TSKEY);
+
+ int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
+ (int32_t)TD_BITMAP_BYTES(numOfCols - 1);
+ int32_t schemaLen = 0;
+ int32_t submitLen = sizeof(SSubmitBlk) + schemaLen + rows * extendedRowSize;
+
+ int32_t totalLen = sizeof(SSubmitReq) + submitLen;
+ subReq = taosMemoryCalloc(1, totalLen);
+ SSubmitBlk* blk = POINTER_SHIFT(subReq, sizeof(SSubmitReq));
+ void* blkSchema = POINTER_SHIFT(blk, sizeof(SSubmitBlk));
+ STSRow* rowData = POINTER_SHIFT(blkSchema, schemaLen);
+
+ SRowBuilder rb = {0};
+ tdSRowInit(&rb, pTableMeta->sversion);
+ tdSRowSetTpInfo(&rb, numOfCols, fLen);
+ int32_t dataLen = 0;
+
+ // | version | total length | total rows | total columns | flag seg| block group id | column schema | each column length |
+ char* pStart = pData + getVersion1BlockMetaSize(pData, numFields);
+ int32_t* colLength = (int32_t*)pStart;
+ pStart += sizeof(int32_t) * numFields;
+
+ SResultColumn* pCol = taosMemoryCalloc(numFields, sizeof(SResultColumn));
+
+ for (int32_t i = 0; i < numFields; ++i) {
+ if (IS_VAR_DATA_TYPE(fields[i].type)) {
+ pCol[i].offset = (int32_t*)pStart;
+ pStart += rows * sizeof(int32_t);
+ } else {
+ pCol[i].nullbitmap = pStart;
+ pStart += BitmapLen(rows);
+ }
+
+ pCol[i].pData = pStart;
+ pStart += colLength[i];
+ }
+
+ SHashObj* schemaHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
+ for (int i = 0; i < numFields; i++) {
+ TAOS_FIELD* schema = &fields[i];
+ taosHashPut(schemaHash, schema->name, strlen(schema->name), &i, sizeof(int32_t));
+ }
+
+ for (int32_t j = 0; j < rows; j++) {
+ tdSRowResetBuf(&rb, rowData);
+ int32_t offset = 0;
+ for (int32_t k = 0; k < numOfCols; k++) {
+ const SSchema* pColumn = &pTableMeta->schema[k];
+ int32_t* index = taosHashGet(schemaHash, pColumn->name, strlen(pColumn->name));
+ if (!index) { // add none
+ tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NONE, NULL, false, offset, k);
+ }else{
+ if (IS_VAR_DATA_TYPE(pColumn->type)) {
+ if (pCol[*index].offset[j] != -1) {
+ char* data = pCol[*index].pData + pCol[*index].offset[j];
+ tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, data, true, offset, k);
+ } else {
+ tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
+ }
+ } else {
+ if (!colDataIsNull_f(pCol[*index].nullbitmap, j)) {
+ char* data = pCol[*index].pData + pColumn->bytes * j;
+ tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, data, true, offset, k);
+ } else {
+ tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
+ }
+ }
+ }
+
+ if (pColumn->colId != PRIMARYKEY_TIMESTAMP_COL_ID) {
+ offset += TYPE_BYTES[pColumn->type];
+ }
+ }
+ tdSRowEnd(&rb);
+ int32_t rowLen = TD_ROW_LEN(rowData);
+ rowData = POINTER_SHIFT(rowData, rowLen);
+ dataLen += rowLen;
+ }
+
+ taosHashCleanup(schemaHash);
+ taosMemoryFree(pCol);
+
+ blk->uid = htobe64(uid);
+ blk->suid = htobe64(suid);
+ blk->sversion = htonl(pTableMeta->sversion);
+ blk->schemaLen = htonl(schemaLen);
+ blk->numOfRows = htonl(rows);
+ blk->dataLen = htonl(dataLen);
+ subReq->length = sizeof(SSubmitReq) + sizeof(SSubmitBlk) + schemaLen + dataLen;
+ subReq->numOfBlocks = 1;
+
+ pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
+ if (NULL == pQuery) {
+ uError("create SQuery error");
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto end;
+ }
+ pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
+ pQuery->haveResultSet = false;
+ pQuery->msgType = TDMT_VND_SUBMIT;
+ pQuery->pRoot = (SNode*)nodesMakeNode(QUERY_NODE_VNODE_MODIF_STMT);
+ if (NULL == pQuery->pRoot) {
+ uError("create pQuery->pRoot error");
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto end;
+ }
+ SVnodeModifOpStmt* nodeStmt = (SVnodeModifOpStmt*)(pQuery->pRoot);
+ nodeStmt->pDataBlocks = taosArrayInit(1, POINTER_BYTES);
+
+ SVgDataBlocks* dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
+ if (NULL == dst) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto end;
+ }
+ dst->vg = vgData;
+ dst->numOfTables = subReq->numOfBlocks;
+ dst->size = subReq->length;
+ dst->pData = (char*)subReq;
+ subReq->header.vgId = htonl(dst->vg.vgId);
+ subReq->version = htonl(1);
+ subReq->header.contLen = htonl(subReq->length);
+ subReq->length = htonl(subReq->length);
+ subReq->numOfBlocks = htonl(subReq->numOfBlocks);
+ subReq = NULL; // no need free
+ taosArrayPush(nodeStmt->pDataBlocks, &dst);
+
+ launchQueryImpl(pRequest, pQuery, true, NULL);
+ code = pRequest->code;
+
+ end:
+ taosMemoryFreeClear(pTableMeta);
+ qDestroyQuery(pQuery);
+ taosMemoryFree(subReq);
+ return code;
+}
+
int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname) {
int32_t code = TSDB_CODE_SUCCESS;
STableMeta* pTableMeta = NULL;
@@ -1275,6 +1477,7 @@ int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname)
nVar++;
}
}
+ fLen -= sizeof(TSKEY);
int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
(int32_t)TD_BITMAP_BYTES(numOfCols - 1);
@@ -1292,6 +1495,7 @@ int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname)
tdSRowSetTpInfo(&rb, numOfCols, fLen);
int32_t dataLen = 0;
+ // | version | total length | total rows | total columns | flag seg| block group id | column schema | each column length |
char* pStart = pData + getVersion1BlockMetaSize(pData, numOfCols);
int32_t* colLength = (int32_t*)pStart;
pStart += sizeof(int32_t) * numOfCols;
@@ -1333,7 +1537,9 @@ int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname)
}
}
- offset += TYPE_BYTES[pColumn->type];
+ if (pColumn->colId != PRIMARYKEY_TIMESTAMP_COL_ID) {
+ offset += TYPE_BYTES[pColumn->type];
+ }
}
tdSRowEnd(&rb);
int32_t rowLen = TD_ROW_LEN(rowData);
@@ -1373,7 +1579,7 @@ int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname)
SVgDataBlocks* dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
if (NULL == dst) {
- code = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
dst->vg = vgData;
@@ -1503,6 +1709,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
nVar++;
}
}
+ fLen -= sizeof(TSKEY);
int32_t rows = rspObj.resInfo.numOfRows;
int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
@@ -1519,7 +1726,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
int32_t totalLen = ((SSubmitReq*)(vgData.data))->length + submitLen;
void* tmp = taosMemoryRealloc(vgData.data, totalLen);
if (tmp == NULL) {
- code = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
vgData.data = tmp;
@@ -1530,7 +1737,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
int32_t totalLen = sizeof(SSubmitReq) + submitLen;
void* tmp = taosMemoryCalloc(1, totalLen);
if (tmp == NULL) {
- code = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
vgData.data = tmp;
@@ -1573,7 +1780,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
const SSchema* pColumn = &pTableMeta->schema[k];
int32_t* index = taosHashGet(schemaHash, pColumn->name, strlen(pColumn->name));
if (!index) {
- tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
+ tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NONE, NULL, false, offset, k);
} else {
char* colData = rspObj.resInfo.row[*index];
if (!colData) {
@@ -1585,8 +1792,9 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, colData, true, offset, k);
}
}
-
- offset += TYPE_BYTES[pColumn->type];
+ if (pColumn->colId != PRIMARYKEY_TIMESTAMP_COL_ID) {
+ offset += TYPE_BYTES[pColumn->type];
+ }
}
tdSRowEnd(&rb);
int32_t rowLen = TD_ROW_LEN(rowData);
@@ -1632,7 +1840,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
while (vData) {
SVgDataBlocks* dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
if (NULL == dst) {
- code = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
dst->vg = vData->vg;
@@ -1665,6 +1873,7 @@ end:
return code;
}
+
static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) {
int32_t code = TSDB_CODE_SUCCESS;
SHashObj* pVgHash = NULL;
@@ -1803,6 +2012,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
nVar++;
}
}
+ fLen -= sizeof(TSKEY);
int32_t rows = rspObj.resInfo.numOfRows;
int32_t extendedRowSize = rowSize + TD_ROW_HEAD_LEN - sizeof(TSKEY) + nVar * sizeof(VarDataOffsetT) +
@@ -1819,7 +2029,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
int32_t totalLen = ((SSubmitReq*)(vgData.data))->length + submitLen;
void* tmp = taosMemoryRealloc(vgData.data, totalLen);
if (tmp == NULL) {
- code = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
vgData.data = tmp;
@@ -1830,7 +2040,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
int32_t totalLen = sizeof(SSubmitReq) + submitLen;
void* tmp = taosMemoryCalloc(1, totalLen);
if (tmp == NULL) {
- code = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
vgData.data = tmp;
@@ -1876,7 +2086,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
const SSchema* pColumn = &pTableMeta->schema[k];
int32_t* index = taosHashGet(schemaHash, pColumn->name, strlen(pColumn->name));
if (!index) {
- tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, offset, k);
+ tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NONE, NULL, false, offset, k);
} else {
char* colData = rspObj.resInfo.row[*index];
if (!colData) {
@@ -1888,8 +2098,9 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, colData, true, offset, k);
}
}
-
- offset += TYPE_BYTES[pColumn->type];
+ if (pColumn->colId != PRIMARYKEY_TIMESTAMP_COL_ID) {
+ offset += TYPE_BYTES[pColumn->type];
+ }
}
tdSRowEnd(&rb);
int32_t rowLen = TD_ROW_LEN(rowData);
@@ -1935,7 +2146,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
while (vData) {
SVgDataBlocks* dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
if (NULL == dst) {
- code = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
dst->vg = vData->vg;
@@ -1956,7 +2167,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);
diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c
index 4cd1b5416c31e7d22dce0d8f8a15c56c6c51c9b2..a4e943da3224995c3767c91e0229a78bf706eb25 100644
--- a/source/client/src/clientSml.c
+++ b/source/client/src/clientSml.c
@@ -79,7 +79,6 @@
#define NCHAR_ADD_LEN 3 // L"nchar" 3 means L" "
#define MAX_RETRY_TIMES 5
-#define LINE_BATCH 2000
//=================================================================================================
typedef TSDB_SML_PROTOCOL_TYPE SMLProtocolType;
@@ -140,6 +139,8 @@ typedef struct {
int32_t numOfSTables;
int32_t numOfCTables;
int32_t numOfCreateSTables;
+ int32_t numOfAlterColSTables;
+ int32_t numOfAlterTagSTables;
int64_t parseTime;
int64_t schemaTime;
@@ -162,7 +163,9 @@ typedef struct {
SMLProtocolType protocol;
int8_t precision;
- bool dataFormat; // true means that the name and order of keys in each line are the same(only for influx protocol)
+ bool dataFormat; // true means that the name and order of keys in each line are the same(only for influx protocol)
+ bool isRawLine;
+ int32_t ttl;
SHashObj *childTables;
SHashObj *superTables;
@@ -179,6 +182,8 @@ typedef struct {
SSmlMsgBuf msgBuf;
SHashObj *dumplicateKey; // for dumplicate key
SArray *colsContainer; // for cols parse, if dataFormat == false
+
+ cJSON *root; // for parse json
} SSmlHandle;
//=================================================================================================
@@ -463,6 +468,13 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
goto end;
}
info->cost.numOfCreateSTables++;
+ taosMemoryFreeClear(pTableMeta);
+
+ code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
+ if (code != TSDB_CODE_SUCCESS) {
+ uError("SML:0x%" PRIx64 " catalogGetSTableMeta failed. super table name %s", info->id, pName.tname);
+ goto end;
+ }
} else if (code == TSDB_CODE_SUCCESS) {
hashTmp = taosHashInit(pTableMeta->tableInfo.numOfTags, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true,
HASH_NO_LOCK);
@@ -501,16 +513,17 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, pName.tname);
goto end;
}
- }
- taosMemoryFreeClear(pTableMeta);
- code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1);
- if (code != TSDB_CODE_SUCCESS) {
- goto end;
- }
- code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
- if (code != TSDB_CODE_SUCCESS) {
- goto end;
+ info->cost.numOfAlterTagSTables++;
+ taosMemoryFreeClear(pTableMeta);
+ code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto end;
+ }
+ code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto end;
+ }
}
taosHashClear(hashTmp);
@@ -548,12 +561,20 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
uError("SML:0x%" PRIx64 " smlSendMetaMsg failed. can not create %s", info->id, pName.tname);
goto end;
}
- }
- code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1);
- if (code != TSDB_CODE_SUCCESS) {
- goto end;
+ info->cost.numOfAlterColSTables++;
+ taosMemoryFreeClear(pTableMeta);
+ code = catalogRefreshTableMeta(info->pCatalog, &conn, &pName, -1);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto end;
+ }
+ code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
+ if (code != TSDB_CODE_SUCCESS) {
+ uError("SML:0x%" PRIx64 " catalogGetSTableMeta failed. super table name %s", info->id, pName.tname);
+ goto end;
+ }
}
+
needCheckMeta = true;
taosHashCleanup(hashTmp);
hashTmp = NULL;
@@ -561,13 +582,6 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
uError("SML:0x%" PRIx64 " load table meta error: %s", info->id, tstrerror(code));
goto end;
}
- taosMemoryFreeClear(pTableMeta);
-
- code = catalogGetSTableMeta(info->pCatalog, &conn, &pName, &pTableMeta);
- if (code != TSDB_CODE_SUCCESS) {
- uError("SML:0x%" PRIx64 " catalogGetSTableMeta failed. super table name %s", info->id, pName.tname);
- goto end;
- }
if (needCheckMeta) {
code = smlCheckMeta(&(pTableMeta->schema[pTableMeta->tableInfo.numOfColumns]), pTableMeta->tableInfo.numOfTags,
@@ -592,7 +606,7 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) {
end:
taosHashCleanup(hashTmp);
taosMemoryFreeClear(pTableMeta);
- catalogRefreshTableMeta(info->pCatalog, &conn, &pName, 1);
+// catalogRefreshTableMeta(info->pCatalog, &conn, &pName, 1);
return code;
}
@@ -861,8 +875,12 @@ static int32_t smlParseTS(SSmlHandle *info, const char *data, int32_t len, SArra
} else {
ASSERT(0);
}
+ uDebug("SML:0x%" PRIx64 " smlParseTS:%" PRId64, info->id, ts);
- if (ts == -1) return TSDB_CODE_INVALID_TIMESTAMP;
+ if (ts <= 0) {
+ uError("SML:0x%" PRIx64 " smlParseTS error:%" PRId64, info->id, ts);
+ return TSDB_CODE_INVALID_TIMESTAMP;
+ }
// add ts to
SSmlKv *kv = (SSmlKv *)taosMemoryCalloc(sizeof(SSmlKv), 1);
@@ -1317,10 +1335,6 @@ static void smlDestroyTableInfo(SSmlHandle *info, SSmlTableInfo *tag) {
SArray *kvArray = (SArray *)taosArrayGetP(tag->cols, i);
for (int j = 0; j < taosArrayGetSize(kvArray); ++j) {
SSmlKv *p = (SSmlKv *)taosArrayGetP(kvArray, j);
- if (info->protocol == TSDB_SML_JSON_PROTOCOL &&
- (p->type == TSDB_DATA_TYPE_NCHAR || p->type == TSDB_DATA_TYPE_BINARY)) {
- taosMemoryFree((void *)p->value);
- }
taosMemoryFree(p);
}
taosArrayDestroy(kvArray);
@@ -1338,17 +1352,8 @@ static void smlDestroyTableInfo(SSmlHandle *info, SSmlTableInfo *tag) {
}
for (size_t i = 0; i < taosArrayGetSize(tag->tags); i++) {
SSmlKv *p = (SSmlKv *)taosArrayGetP(tag->tags, i);
- if (info->protocol == TSDB_SML_JSON_PROTOCOL) {
- taosMemoryFree((void *)p->key);
- if (p->type == TSDB_DATA_TYPE_NCHAR || p->type == TSDB_DATA_TYPE_BINARY) {
- taosMemoryFree((void *)p->value);
- }
- }
taosMemoryFree(p);
}
- if (info->protocol == TSDB_SML_JSON_PROTOCOL && tag->sTableName) {
- taosMemoryFree((void *)tag->sTableName);
- }
taosArrayDestroy(tag->cols);
taosArrayDestroy(tag->tags);
taosMemoryFree(tag);
@@ -1412,7 +1417,7 @@ static int32_t smlDealCols(SSmlTableInfo *oneTable, bool dataFormat, SArray *col
SHashObj *kvHash = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
if (!kvHash) {
uError("SML:smlDealCols failed to allocate memory");
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
for (size_t i = 0; i < taosArrayGetSize(cols); i++) {
SSmlKv *kv = (SSmlKv *)taosArrayGetP(cols, i);
@@ -1508,6 +1513,8 @@ static void smlDestroyInfo(SSmlHandle *info) {
taosArrayDestroy(info->colsContainer);
}
destroyRequest(info->pRequest);
+
+ cJSON_Delete(info->root);
taosMemoryFreeClear(info);
}
@@ -1583,16 +1590,6 @@ cleanup:
}
/************* TSDB_SML_JSON_PROTOCOL function start **************/
-static int32_t smlJsonCreateSring(const char **output, char *input, int32_t inputLen) {
- *output = (const char *)taosMemoryCalloc(1, inputLen);
- if (*output == NULL) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
- }
-
- memcpy((void *)(*output), input, inputLen);
- return TSDB_CODE_SUCCESS;
-}
-
static int32_t smlParseMetricFromJSON(SSmlHandle *info, cJSON *root, SSmlTableInfo *tinfo) {
cJSON *metric = cJSON_GetObjectItem(root, "metric");
if (!cJSON_IsString(metric)) {
@@ -1605,7 +1602,8 @@ static int32_t smlParseMetricFromJSON(SSmlHandle *info, cJSON *root, SSmlTableIn
return TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH;
}
- return smlJsonCreateSring(&tinfo->sTableName, metric->valuestring, tinfo->sTableNameLen);
+ tinfo->sTableName = metric->valuestring;
+ return TSDB_CODE_SUCCESS;
}
static int32_t smlParseTSFromJSONObj(SSmlHandle *info, cJSON *root, int64_t *tsVal) {
@@ -1857,7 +1855,8 @@ static int32_t smlConvertJSONString(SSmlKv *pVal, char *typeStr, cJSON *value) {
return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN;
}
- return smlJsonCreateSring(&pVal->value, value->valuestring, pVal->length);
+ pVal->value = value->valuestring;
+ return TSDB_CODE_SUCCESS;
}
static int32_t smlParseValueFromJSONObj(cJSON *root, SSmlKv *kv) {
@@ -2015,10 +2014,8 @@ static int32_t smlParseTagsFromJSON(cJSON *root, SArray *pKVs, char *childTableN
// key
kv->keyLen = keyLen;
- ret = smlJsonCreateSring(&kv->key, tag->string, kv->keyLen);
- if (ret != TSDB_CODE_SUCCESS) {
- return ret;
- }
+ kv->key = tag->string;
+
// value
ret = smlParseValueFromJSON(tag, kv);
if (ret != TSDB_CODE_SUCCESS) {
@@ -2082,7 +2079,7 @@ static int32_t smlParseJSONString(SSmlHandle *info, cJSON *root, SSmlTableInfo *
static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql, const int len) {
SSmlLineInfo elements = {0};
- uDebug("SML:0x%" PRIx64 " smlParseInfluxLine sql", info->id);
+ uDebug("SML:0x%" PRIx64 " smlParseInfluxLine raw:%d, len:%d, sql:%s", info->id, info->isRawLine, len, (info->isRawLine ? "rawdata" : sql));
int ret = smlParseInfluxString(sql, sql + len, &elements, &info->msgBuf);
if (ret != TSDB_CODE_SUCCESS) {
@@ -2095,7 +2092,7 @@ static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql, const int l
cols = taosArrayInit(16, POINTER_BYTES);
if (cols == NULL) {
uError("SML:0x%" PRIx64 " smlParseInfluxLine failed to allocate memory", info->id);
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
} else { // if dataFormat is false, cols do not need to save data, there is another new memory to save data
cols = info->colsContainer;
@@ -2124,7 +2121,7 @@ static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql, const int l
if (!tinfo) {
smlDestroyCols(cols);
if (info->dataFormat) taosArrayDestroy(cols);
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
taosHashPut(info->childTables, elements.measure, elements.measureTagsLen, &tinfo, POINTER_BYTES);
oneTable = &tinfo;
@@ -2195,13 +2192,13 @@ static int32_t smlParseTelnetLine(SSmlHandle *info, void *data, const int len) {
int ret = TSDB_CODE_SUCCESS;
SSmlTableInfo *tinfo = smlBuildTableInfo();
if (!tinfo) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
SArray *cols = taosArrayInit(16, POINTER_BYTES);
if (cols == NULL) {
uError("SML:0x%" PRIx64 " smlParseTelnetLine failed to allocate memory", info->id);
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
if (info->protocol == TSDB_SML_TELNET_PROTOCOL) {
@@ -2278,16 +2275,16 @@ static int32_t smlParseJSON(SSmlHandle *info, char *payload) {
return TSDB_CODE_TSC_INVALID_JSON;
}
- cJSON *root = cJSON_Parse(payload);
- if (root == NULL) {
+ info->root = cJSON_Parse(payload);
+ if (info->root == NULL) {
uError("SML:0x%" PRIx64 " parse json failed:%s", info->id, payload);
return TSDB_CODE_TSC_INVALID_JSON;
}
// multiple data points must be sent in JSON array
- if (cJSON_IsObject(root)) {
+ if (cJSON_IsObject(info->root)) {
payloadNum = 1;
- } else if (cJSON_IsArray(root)) {
- payloadNum = cJSON_GetArraySize(root);
+ } else if (cJSON_IsArray(info->root)) {
+ payloadNum = cJSON_GetArraySize(info->root);
} else {
uError("SML:0x%" PRIx64 " Invalid JSON Payload", info->id);
ret = TSDB_CODE_TSC_INVALID_JSON;
@@ -2295,7 +2292,7 @@ static int32_t smlParseJSON(SSmlHandle *info, char *payload) {
}
for (int32_t i = 0; i < payloadNum; ++i) {
- cJSON *dataPoint = (payloadNum == 1 && cJSON_IsObject(root)) ? root : cJSON_GetArrayItem(root, i);
+ cJSON *dataPoint = (payloadNum == 1 && cJSON_IsObject(info->root)) ? info->root : cJSON_GetArrayItem(info->root, i);
ret = smlParseTelnetLine(info, dataPoint, -1);
if (ret != TSDB_CODE_SUCCESS) {
uError("SML:0x%" PRIx64 " Invalid JSON Payload", info->id);
@@ -2304,7 +2301,6 @@ static int32_t smlParseJSON(SSmlHandle *info, char *payload) {
}
end:
- cJSON_Delete(root);
return ret;
}
@@ -2343,7 +2339,7 @@ static int32_t smlInsertData(SSmlHandle *info) {
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);
+ info->ttl, info->msgBuf.buf, info->msgBuf.len);
if (code != TSDB_CODE_SUCCESS) {
uError("SML:0x%" PRIx64 " smlBindData failed", info->id);
return code;
@@ -2376,11 +2372,12 @@ static int32_t smlInsertData(SSmlHandle *info) {
static void smlPrintStatisticInfo(SSmlHandle *info) {
uError("SML:0x%" PRIx64
- " smlInsertLines result, code:%d,lineNum:%d,stable num:%d,ctable num:%d,create stable num:%d \
+ " smlInsertLines result, code:%d,lineNum:%d,stable num:%d,ctable num:%d,create stable num:%d,alter stable tag num:%d,alter stable col num:%d \
parse cost:%" PRId64 ",schema cost:%" PRId64 ",bind cost:%" PRId64 ",rpc cost:%" PRId64 ",total cost:%" PRId64
"",
info->id, info->cost.code, info->cost.lineNum, info->cost.numOfSTables, info->cost.numOfCTables,
- info->cost.numOfCreateSTables, info->cost.schemaTime - info->cost.parseTime,
+ info->cost.numOfCreateSTables, info->cost.numOfAlterTagSTables, info->cost.numOfAlterColSTables,
+ info->cost.schemaTime - info->cost.parseTime,
info->cost.insertBindTime - info->cost.schemaTime, info->cost.insertRpcTime - info->cost.insertBindTime,
info->cost.endTime - info->cost.insertRpcTime, info->cost.endTime - info->cost.parseTime);
}
@@ -2534,7 +2531,7 @@ static void smlInsertCallback(void *param, void *res, int32_t code) {
}
TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char *rawLine, char *rawLineEnd,
- int numLines, int protocol, int precision) {
+ int numLines, int protocol, int precision, int32_t ttl) {
int batchs = 0;
STscObj *pTscObj = request->pTscObj;
@@ -2579,7 +2576,7 @@ TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char
goto end;
}
- batchs = ceil(((double)numLines) / LINE_BATCH);
+ batchs = ceil(((double)numLines) / tsSmlBatchSize);
params.total = batchs;
for (int i = 0; i < batchs; ++i) {
SRequestObj *req = (SRequestObj *)createRequest(pTscObj->id, TSDB_SQL_INSERT, 0);
@@ -2595,7 +2592,10 @@ TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char
goto end;
}
- int32_t perBatch = LINE_BATCH;
+ info->isRawLine = (rawLine == NULL);
+ info->ttl = ttl;
+
+ int32_t perBatch = tsSmlBatchSize;
if (numLines > perBatch) {
numLines -= perBatch;
@@ -2657,13 +2657,14 @@ end:
* @return TAOS_RES
*/
-TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision) {
+TAOS_RES *taos_schemaless_insert_ttl_with_reqid(TAOS *taos, char *lines[], int numLines, int protocol, int precision,
+ int32_t ttl, int64_t reqid) {
if (NULL == taos) {
terrno = TSDB_CODE_TSC_DISCONNECTED;
return NULL;
}
- SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, 0);
+ SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, reqid);
if (!request) {
uError("SML:taos_schemaless_insert error request is null");
return NULL;
@@ -2676,40 +2677,29 @@ TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int pr
return (TAOS_RES *)request;
}
- return taos_schemaless_insert_inner(request, lines, NULL, NULL, numLines, protocol, precision);
+ return taos_schemaless_insert_inner(request, lines, NULL, NULL, numLines, protocol, precision, ttl);
}
-TAOS_RES *taos_schemaless_insert_with_reqid(TAOS *taos, char *lines[], int numLines, int protocol, int precision,
- int64_t reqid) {
- if (NULL == taos) {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- return NULL;
- }
-
- SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, reqid);
- if (!request) {
- uError("SML:taos_schemaless_insert error request is null");
- return NULL;
- }
+TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision) {
+ return taos_schemaless_insert_ttl_with_reqid(taos, lines, numLines, protocol, precision, TSDB_DEFAULT_TABLE_TTL, 0);
+}
- if (!lines) {
- SSmlMsgBuf msg = {ERROR_MSG_BUF_DEFAULT_SIZE, request->msgBuf};
- request->code = TSDB_CODE_SML_INVALID_DATA;
- smlBuildInvalidDataMsg(&msg, "lines is null", NULL);
- return (TAOS_RES *)request;
- }
+TAOS_RES *taos_schemaless_insert_ttl(TAOS *taos, char *lines[], int numLines, int protocol, int precision, int32_t ttl) {
+ return taos_schemaless_insert_ttl_with_reqid(taos, lines, numLines, protocol, precision, ttl, 0);
+}
- return taos_schemaless_insert_inner(request, lines, NULL, NULL, numLines, protocol, precision);
+TAOS_RES *taos_schemaless_insert_with_reqid(TAOS *taos, char *lines[], int numLines, int protocol, int precision, int64_t reqid) {
+ return taos_schemaless_insert_ttl_with_reqid(taos, lines, numLines, protocol, precision, TSDB_DEFAULT_TABLE_TTL, reqid);
}
-TAOS_RES *taos_schemaless_insert_raw(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol,
- int precision) {
+TAOS_RES *taos_schemaless_insert_raw_ttl_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol,
+ int precision, int32_t ttl, int64_t reqid) {
if (NULL == taos) {
terrno = TSDB_CODE_TSC_DISCONNECTED;
return NULL;
}
- SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, 0);
+ SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, reqid);
if (!request) {
uError("SML:taos_schemaless_insert error request is null");
return NULL;
@@ -2734,40 +2724,16 @@ TAOS_RES *taos_schemaless_insert_raw(TAOS *taos, char *lines, int len, int32_t *
tmp = lines + i + 1;
}
}
- return taos_schemaless_insert_inner(request, NULL, lines, lines + len, numLines, protocol, precision);
+ return taos_schemaless_insert_inner(request, NULL, lines, lines + len, numLines, protocol, precision, ttl);
}
-TAOS_RES *taos_schemaless_insert_raw_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol,
- int precision, int64_t reqid) {
- if (NULL == taos) {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- return NULL;
- }
-
- SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, reqid);
- if (!request) {
- uError("SML:taos_schemaless_insert error request is null");
- return NULL;
- }
-
- if (!lines || len <= 0) {
- SSmlMsgBuf msg = {ERROR_MSG_BUF_DEFAULT_SIZE, request->msgBuf};
- request->code = TSDB_CODE_SML_INVALID_DATA;
- smlBuildInvalidDataMsg(&msg, "lines is null", NULL);
- return (TAOS_RES *)request;
- }
+TAOS_RES *taos_schemaless_insert_raw_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol, int precision, int64_t reqid) {
+ return taos_schemaless_insert_raw_ttl_with_reqid(taos, lines, len, totalRows, protocol, precision, TSDB_DEFAULT_TABLE_TTL, reqid);
+}
+TAOS_RES *taos_schemaless_insert_raw_ttl(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol, int precision, int32_t ttl) {
+ return taos_schemaless_insert_raw_ttl_with_reqid(taos, lines, len, totalRows, protocol, precision, ttl, 0);
+}
- int numLines = 0;
- *totalRows = 0;
- char *tmp = lines;
- for (int i = 0; i < len; i++) {
- if (lines[i] == '\n' || i == len - 1) {
- numLines++;
- if (tmp[0] != '#' || protocol != TSDB_SML_LINE_PROTOCOL) { // ignore comment
- (*totalRows)++;
- }
- tmp = lines + i + 1;
- }
- }
- return taos_schemaless_insert_inner(request, NULL, lines, lines + len, numLines, protocol, precision);
+TAOS_RES *taos_schemaless_insert_raw(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol, int precision) {
+ return taos_schemaless_insert_raw_ttl_with_reqid(taos, lines, len, totalRows, protocol, precision, TSDB_DEFAULT_TABLE_TTL, 0);
}
diff --git a/source/client/src/clientStmt.c b/source/client/src/clientStmt.c
index c5f49bce89d14dbd49361b964e7aabb7a6acc484..82ea9e0d8f8f6e70829567ce34e9b9d1ae444da4 100644
--- a/source/client/src/clientStmt.c
+++ b/source/client/src/clientStmt.c
@@ -83,7 +83,7 @@ int32_t stmtSwitchStatus(STscStmt* pStmt, STMT_STATUS newStatus) {
}
break;
default:
- code = TSDB_CODE_TSC_APP_ERROR;
+ code = TSDB_CODE_APP_ERROR;
break;
}
@@ -118,7 +118,7 @@ int32_t stmtBackupQueryFields(STscStmt* pStmt) {
pRes->fields = taosMemoryMalloc(size);
pRes->userFields = taosMemoryMalloc(size);
if (NULL == pRes->fields || NULL == pRes->userFields) {
- STMT_ERR_RET(TSDB_CODE_TSC_OUT_OF_MEMORY);
+ STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
memcpy(pRes->fields, pStmt->exec.pRequest->body.resInfo.fields, size);
memcpy(pRes->userFields, pStmt->exec.pRequest->body.resInfo.userFields, size);
@@ -136,7 +136,7 @@ int32_t stmtRestoreQueryFields(STscStmt* pStmt) {
if (NULL == pStmt->exec.pRequest->body.resInfo.fields) {
pStmt->exec.pRequest->body.resInfo.fields = taosMemoryMalloc(size);
if (NULL == pStmt->exec.pRequest->body.resInfo.fields) {
- STMT_ERR_RET(TSDB_CODE_TSC_OUT_OF_MEMORY);
+ STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
memcpy(pStmt->exec.pRequest->body.resInfo.fields, pRes->fields, size);
}
@@ -144,7 +144,7 @@ int32_t stmtRestoreQueryFields(STscStmt* pStmt) {
if (NULL == pStmt->exec.pRequest->body.resInfo.userFields) {
pStmt->exec.pRequest->body.resInfo.userFields = taosMemoryMalloc(size);
if (NULL == pStmt->exec.pRequest->body.resInfo.userFields) {
- STMT_ERR_RET(TSDB_CODE_TSC_OUT_OF_MEMORY);
+ STMT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
memcpy(pStmt->exec.pRequest->body.resInfo.userFields, pRes->userFields, size);
}
@@ -152,13 +152,16 @@ int32_t stmtRestoreQueryFields(STscStmt* pStmt) {
return TSDB_CODE_SUCCESS;
}
-int32_t stmtUpdateBindInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, char* tbFName, const char* sTableName) {
+int32_t stmtUpdateBindInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, SName* tbName, const char* sTableName, bool autoCreateTbl) {
STscStmt* pStmt = (STscStmt*)stmt;
+ char tbFName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(tbName, tbFName);
+ memcpy(&pStmt->bInfo.sname, tbName, sizeof(*tbName));
strncpy(pStmt->bInfo.tbFName, tbFName, sizeof(pStmt->bInfo.tbFName) - 1);
pStmt->bInfo.tbFName[sizeof(pStmt->bInfo.tbFName) - 1] = 0;
- pStmt->bInfo.tbUid = pTableMeta->uid;
+ pStmt->bInfo.tbUid = autoCreateTbl ? 0 : pTableMeta->uid;
pStmt->bInfo.tbSuid = pTableMeta->suid;
pStmt->bInfo.tbType = pTableMeta->tableType;
pStmt->bInfo.boundTags = tags;
@@ -178,11 +181,11 @@ int32_t stmtUpdateExecInfo(TAOS_STMT* stmt, SHashObj* pVgHash, SHashObj* pBlockH
return TSDB_CODE_SUCCESS;
}
-int32_t stmtUpdateInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, char* tbFName, bool autoCreateTbl,
+int32_t stmtUpdateInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags, SName* tbName, bool autoCreateTbl,
SHashObj* pVgHash, SHashObj* pBlockHash, const char* sTableName) {
STscStmt* pStmt = (STscStmt*)stmt;
- STMT_ERR_RET(stmtUpdateBindInfo(stmt, pTableMeta, tags, tbFName, sTableName));
+ STMT_ERR_RET(stmtUpdateBindInfo(stmt, pTableMeta, tags, tbName, sTableName, autoCreateTbl));
STMT_ERR_RET(stmtUpdateExecInfo(stmt, pVgHash, pBlockHash, autoCreateTbl));
pStmt->sql.autoCreateTbl = autoCreateTbl;
@@ -460,7 +463,7 @@ int32_t stmtGetFromCache(STscStmt* pStmt) {
tscError("table [%s, %" PRIx64 ", %" PRIx64 "] found in exec blockHash, but not in sql blockHash",
pStmt->bInfo.tbFName, uid, cacheUid);
- STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
+ STMT_ERR_RET(TSDB_CODE_APP_ERROR);
}
pStmt->bInfo.needParse = false;
@@ -509,7 +512,7 @@ int32_t stmtResetStmt(STscStmt* pStmt) {
pStmt->sql.pTableCache = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
if (NULL == pStmt->sql.pTableCache) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
STMT_ERR_RET(terrno);
}
@@ -524,13 +527,13 @@ TAOS_STMT* stmtInit(STscObj* taos, int64_t reqid) {
pStmt = taosMemoryCalloc(1, sizeof(STscStmt));
if (NULL == pStmt) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
pStmt->sql.pTableCache = taosHashInit(100, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
if (NULL == pStmt->sql.pTableCache) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
taosMemoryFree(pStmt);
return NULL;
}
@@ -615,7 +618,7 @@ int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) {
(STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
if (NULL == pDataBlock) {
tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
- STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ STMT_ERR_RET(TSDB_CODE_APP_ERROR);
}
tscDebug("start to bind stmt tag values");
@@ -623,6 +626,8 @@ int stmtSetTbTags(TAOS_STMT* stmt, TAOS_MULTI_BIND* tags) {
pStmt->bInfo.sname.tname, tags, pStmt->exec.pRequest->msgBuf,
pStmt->exec.pRequest->msgBufLen));
+ pStmt->exec.autoCreateTbl = true;
+
return TSDB_CODE_SUCCESS;
}
@@ -636,7 +641,7 @@ int stmtFetchTagFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD_E** fields
(STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
if (NULL == pDataBlock) {
tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
- STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ STMT_ERR_RET(TSDB_CODE_APP_ERROR);
}
STMT_ERR_RET(qBuildStmtTagFields(*pDataBlock, pStmt->bInfo.boundTags, fieldNum, fields));
@@ -654,7 +659,7 @@ int stmtFetchColFields(STscStmt* pStmt, int32_t* fieldNum, TAOS_FIELD_E** fields
(STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
if (NULL == pDataBlock) {
tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
- STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ STMT_ERR_RET(TSDB_CODE_APP_ERROR);
}
STMT_ERR_RET(qBuildStmtColFields(*pDataBlock, fieldNum, fields));
@@ -728,7 +733,7 @@ int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) {
(STableDataBlocks**)taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
if (NULL == pDataBlock) {
tscError("table %s not found in exec blockHash", pStmt->bInfo.tbFName);
- STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ STMT_ERR_RET(TSDB_CODE_APP_ERROR);
}
if (colIdx < 0) {
@@ -740,7 +745,7 @@ int stmtBindBatch(TAOS_STMT* stmt, TAOS_MULTI_BIND* bind, int32_t colIdx) {
} else {
if (colIdx != (pStmt->bInfo.sBindLastIdx + 1) && colIdx != 0) {
tscError("bind column index not in sequence");
- STMT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ STMT_ERR_RET(TSDB_CODE_APP_ERROR);
}
pStmt->bInfo.sBindLastIdx = colIdx;
@@ -771,11 +776,9 @@ int stmtAddBatch(TAOS_STMT* stmt) {
int stmtUpdateTableUid(STscStmt* pStmt, SSubmitRsp* pRsp) {
tscDebug("stmt start to update tbUid, blockNum: %d", pRsp->nBlocks);
- if (pRsp->nBlocks <= 0) {
- return TSDB_CODE_SUCCESS;
- }
-
- size_t keyLen = 0;
+ int32_t code = 0;
+ int32_t finalCode = 0;
+ size_t keyLen = 0;
STableDataBlocks** pIter = taosHashIterate(pStmt->exec.pBlockHash, NULL);
while (pIter) {
STableDataBlocks* pBlock = *pIter;
@@ -809,14 +812,49 @@ int stmtUpdateTableUid(STscStmt* pStmt, SSubmitRsp* pRsp) {
pMeta->uid = blkRsp->uid;
pStmt->bInfo.tbUid = blkRsp->uid;
} else {
- tscError("table %s not found in submit rsp", pStmt->bInfo.tbFName);
- STMT_ERR_RET(TSDB_CODE_TSC_APP_ERROR);
+ tscDebug("table %s not found in submit rsp, will update from catalog", pStmt->bInfo.tbFName);
+ if (NULL == pStmt->pCatalog) {
+ code = catalogGetHandle(pStmt->taos->pAppInfo->clusterId, &pStmt->pCatalog);
+ if (code) {
+ pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
+ finalCode = code;
+ continue;
+ }
+ }
+
+ code = stmtCreateRequest(pStmt);
+ if (code) {
+ pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
+ finalCode = code;
+ continue;
+ }
+
+ STableMeta* pTableMeta = NULL;
+ SRequestConnInfo conn = {.pTrans = pStmt->taos->pAppInfo->pTransporter,
+ .requestId = pStmt->exec.pRequest->requestId,
+ .requestObjRefId = pStmt->exec.pRequest->self,
+ .mgmtEps = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp)};
+ int32_t code = catalogGetTableMeta(pStmt->pCatalog, &conn, &pStmt->bInfo.sname, &pTableMeta);
+
+ taos_free_result(pStmt->exec.pRequest);
+ pStmt->exec.pRequest = NULL;
+
+ if (code || NULL == pTableMeta) {
+ pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
+ finalCode = code;
+ taosMemoryFree(pTableMeta);
+ continue;
+ }
+
+ pMeta->uid = pTableMeta->uid;
+ pStmt->bInfo.tbUid = pTableMeta->uid;
+ taosMemoryFree(pTableMeta);
}
pIter = taosHashIterate(pStmt->exec.pBlockHash, pIter);
}
- return TSDB_CODE_SUCCESS;
+ return finalCode;
}
int stmtExec(TAOS_STMT* stmt) {
@@ -859,7 +897,7 @@ _return:
if (TSDB_CODE_SUCCESS == code && autoCreateTbl) {
if (NULL == pRsp) {
tscError("no submit resp got for auto create table");
- code = TSDB_CODE_TSC_APP_ERROR;
+ code = TSDB_CODE_APP_ERROR;
} else {
code = stmtUpdateTableUid(pStmt, pRsp);
}
diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c
index 28b41b97c51d8fb440a26b13b533e14e9316e151..4352ec69d328baed90f4f5c6606e1e1f23c9fe9c 100644
--- a/source/client/src/clientTmq.c
+++ b/source/client/src/clientTmq.c
@@ -25,6 +25,13 @@
#include "tref.h"
#include "ttimer.h"
+#if 0
+#undef tsem_post
+#define tsem_post(x) \
+ tscInfo("call sem post at %s %d", __FUNCTION__, __LINE__); \
+ sem_post(x)
+#endif
+
int32_t tmqAskEp(tmq_t* tmq, bool async);
typedef struct {
@@ -733,12 +740,12 @@ void tmqSendHbReq(void* param, void* tmrId) {
req.consumerId = tmq->consumerId;
req.epoch = tmq->epoch;
- int32_t tlen = tSerializeSMqHbReq(NULL, 0, &req);
+ int32_t tlen = tSerializeSMqHbReq(NULL, 0, &req);
if (tlen < 0) {
tscError("tSerializeSMqHbReq failed");
return;
}
- void *pReq = taosMemoryCalloc(1, tlen);
+ void* pReq = taosMemoryCalloc(1, tlen);
if (tlen < 0) {
tscError("failed to malloc MqHbReq msg, size:%d", tlen);
return;
@@ -807,24 +814,55 @@ int32_t tmqHandleAllDelayedTask(tmq_t* tmq) {
return 0;
}
+static void tmqFreeRspWrapper(SMqRspWrapper* rspWrapper) {
+ if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__END_RSP) {
+ // do nothing
+ } else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__EP_RSP) {
+ SMqAskEpRspWrapper* pEpRspWrapper = (SMqAskEpRspWrapper*)rspWrapper;
+ tDeleteSMqAskEpRsp(&pEpRspWrapper->msg);
+ } else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_RSP) {
+ SMqPollRspWrapper* pRsp = (SMqPollRspWrapper*)rspWrapper;
+ taosArrayDestroyP(pRsp->dataRsp.blockData, taosMemoryFree);
+ taosArrayDestroy(pRsp->dataRsp.blockDataLen);
+ taosArrayDestroyP(pRsp->dataRsp.blockTbName, taosMemoryFree);
+ taosArrayDestroyP(pRsp->dataRsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
+ } else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_META_RSP) {
+ SMqPollRspWrapper* pRsp = (SMqPollRspWrapper*)rspWrapper;
+ taosMemoryFree(pRsp->metaRsp.metaRsp);
+ } else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__TAOSX_RSP) {
+ SMqPollRspWrapper* pRsp = (SMqPollRspWrapper*)rspWrapper;
+ taosArrayDestroyP(pRsp->taosxRsp.blockData, taosMemoryFree);
+ taosArrayDestroy(pRsp->taosxRsp.blockDataLen);
+ taosArrayDestroyP(pRsp->taosxRsp.blockTbName, taosMemoryFree);
+ taosArrayDestroyP(pRsp->taosxRsp.blockSchema, (FDelete)tDeleteSSchemaWrapper);
+ // taosx
+ taosArrayDestroy(pRsp->taosxRsp.createTableLen);
+ taosArrayDestroyP(pRsp->taosxRsp.createTableReq, taosMemoryFree);
+ }
+}
+
void tmqClearUnhandleMsg(tmq_t* tmq) {
- SMqRspWrapper* msg = NULL;
+ SMqRspWrapper* rspWrapper = NULL;
while (1) {
- taosGetQitem(tmq->qall, (void**)&msg);
- if (msg)
- taosFreeQitem(msg);
- else
+ taosGetQitem(tmq->qall, (void**)&rspWrapper);
+ if (rspWrapper) {
+ tmqFreeRspWrapper(rspWrapper);
+ taosFreeQitem(rspWrapper);
+ } else {
break;
+ }
}
- msg = NULL;
+ rspWrapper = NULL;
taosReadAllQitems(tmq->mqueue, tmq->qall);
while (1) {
- taosGetQitem(tmq->qall, (void**)&msg);
- if (msg)
- taosFreeQitem(msg);
- else
+ taosGetQitem(tmq->qall, (void**)&rspWrapper);
+ if (rspWrapper) {
+ tmqFreeRspWrapper(rspWrapper);
+ taosFreeQitem(rspWrapper);
+ } else {
break;
+ }
}
}
@@ -868,6 +906,7 @@ void tmqFreeImpl(void* handle) {
tmq_t* tmq = (tmq_t*)handle;
// TODO stop timer
+ tmqClearUnhandleMsg(tmq);
if (tmq->mqueue) taosCloseQueue(tmq->mqueue);
if (tmq->delayedTask) taosCloseQueue(tmq->delayedTask);
if (tmq->qall) taosFreeQall(tmq->qall);
@@ -877,8 +916,7 @@ void tmqFreeImpl(void* handle) {
int32_t sz = taosArrayGetSize(tmq->clientTopics);
for (int32_t i = 0; i < sz; i++) {
SMqClientTopic* pTopic = taosArrayGet(tmq->clientTopics, i);
- if (pTopic->schema.nCols) taosMemoryFreeClear(pTopic->schema.pSchema);
- int32_t vgSz = taosArrayGetSize(pTopic->vgs);
+ taosMemoryFreeClear(pTopic->schema.pSchema);
taosArrayDestroy(pTopic->vgs);
}
taosArrayDestroy(tmq->clientTopics);
@@ -1208,6 +1246,8 @@ int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
taosMemoryFree(pMsg->pData);
taosMemoryFree(pMsg->pEpSet);
+ tscDebug("consumer:%" PRId64 ", put poll res into mqueue %p", tmq->consumerId, pRspWrapper);
+
taosWriteQitem(tmq->mqueue, pRspWrapper);
tsem_post(&tmq->rspSem);
@@ -1297,7 +1337,6 @@ bool tmqUpdateEp(tmq_t* tmq, int32_t epoch, const SMqAskEpRsp* pRsp) {
for (int32_t i = 0; i < sz; i++) {
SMqClientTopic* pTopic = taosArrayGet(tmq->clientTopics, i);
if (pTopic->schema.nCols) taosMemoryFreeClear(pTopic->schema.pSchema);
- int32_t vgSz = taosArrayGetSize(pTopic->vgs);
taosArrayDestroy(pTopic->vgs);
}
taosArrayDestroy(tmq->clientTopics);
@@ -1397,13 +1436,13 @@ int32_t tmqAskEp(tmq_t* tmq, bool async) {
req.epoch = tmq->epoch;
strcpy(req.cgroup, tmq->groupId);
- int32_t tlen = tSerializeSMqAskEpReq(NULL, 0, &req);
+ int32_t tlen = tSerializeSMqAskEpReq(NULL, 0, &req);
if (tlen < 0) {
tscError("tSerializeSMqAskEpReq failed");
return -1;
}
- void *pReq = taosMemoryCalloc(1, tlen);
- if (tlen < 0) {
+ void* pReq = taosMemoryCalloc(1, tlen);
+ if (pReq == NULL) {
tscError("failed to malloc askEpReq msg, size:%d", tlen);
return -1;
}
@@ -1461,12 +1500,7 @@ int32_t tmqAskEp(tmq_t* tmq, bool async) {
return code;
}
-SMqPollReq* tmqBuildConsumeReqImpl(tmq_t* tmq, int64_t timeout, SMqClientTopic* pTopic, SMqClientVg* pVg) {
- SMqPollReq* pReq = taosMemoryCalloc(1, sizeof(SMqPollReq));
- if (pReq == NULL) {
- return NULL;
- }
-
+void tmqBuildConsumeReqImpl(SMqPollReq* pReq, tmq_t* tmq, int64_t timeout, SMqClientTopic* pTopic, SMqClientVg* pVg) {
/*strcpy(pReq->topic, pTopic->topicName);*/
/*strcpy(pReq->cgroup, tmq->groupId);*/
@@ -1485,9 +1519,7 @@ SMqPollReq* tmqBuildConsumeReqImpl(tmq_t* tmq, int64_t timeout, SMqClientTopic*
pReq->useSnapshot = tmq->useSnapshot;
- pReq->head.vgId = htonl(pVg->vgId);
- pReq->head.contLen = htonl(sizeof(SMqPollReq));
- return pReq;
+ pReq->head.vgId = pVg->vgId;
}
SMqMetaRspObj* tmqBuildMetaRspFromWrapper(SMqPollRspWrapper* pWrapper) {
@@ -1559,15 +1591,32 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t timeout) {
#endif
}
atomic_store_32(&pVg->vgSkipCnt, 0);
- SMqPollReq* pReq = tmqBuildConsumeReqImpl(tmq, timeout, pTopic, pVg);
- if (pReq == NULL) {
+
+ SMqPollReq req = {0};
+ tmqBuildConsumeReqImpl(&req, tmq, timeout, pTopic, pVg);
+ int32_t msgSize = tSerializeSMqPollReq(NULL, 0, &req);
+ if (msgSize < 0) {
+ atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
+ tsem_post(&tmq->rspSem);
+ return -1;
+ }
+ char* msg = taosMemoryCalloc(1, msgSize);
+ if (NULL == msg) {
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
tsem_post(&tmq->rspSem);
return -1;
}
+
+ if (tSerializeSMqPollReq(msg, msgSize, &req) < 0) {
+ taosMemoryFree(msg);
+ atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
+ tsem_post(&tmq->rspSem);
+ return -1;
+ }
+
SMqPollCbParam* pParam = taosMemoryMalloc(sizeof(SMqPollCbParam));
if (pParam == NULL) {
- taosMemoryFree(pReq);
+ taosMemoryFree(msg);
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
tsem_post(&tmq->rspSem);
return -1;
@@ -1581,7 +1630,7 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t timeout) {
SMsgSendInfo* sendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (sendInfo == NULL) {
- taosMemoryFree(pReq);
+ taosMemoryFree(msg);
taosMemoryFree(pParam);
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
tsem_post(&tmq->rspSem);
@@ -1589,11 +1638,11 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t timeout) {
}
sendInfo->msgInfo = (SDataBuf){
- .pData = pReq,
- .len = sizeof(SMqPollReq),
+ .pData = msg,
+ .len = msgSize,
.handle = NULL,
};
- sendInfo->requestId = pReq->reqId;
+ sendInfo->requestId = req.reqId;
sendInfo->requestObjRefId = 0;
sendInfo->param = pParam;
sendInfo->fp = tmqPollCb;
@@ -1605,7 +1654,7 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t timeout) {
char offsetFormatBuf[80];
tFormatOffset(offsetFormatBuf, 80, &pVg->currentOffset);
tscDebug("consumer:%" PRId64 ", send poll to %s vgId:%d, epoch %d, req offset:%s, reqId:%" PRIu64,
- tmq->consumerId, pTopic->topicName, pVg->vgId, tmq->epoch, offsetFormatBuf, pReq->reqId);
+ tmq->consumerId, pTopic->topicName, pVg->vgId, tmq->epoch, offsetFormatBuf, req.reqId);
/*printf("send vgId:%d %" PRId64 "\n", pVg->vgId, pVg->currentOffset);*/
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, sendInfo);
pVg->pollCnt++;
@@ -1626,6 +1675,7 @@ int32_t tmqHandleNoPollRsp(tmq_t* tmq, SMqRspWrapper* rspWrapper, bool* pReset)
tDeleteSMqAskEpRsp(rspMsg);
*pReset = true;
} else {
+ tmqFreeRspWrapper(rspWrapper);
*pReset = false;
}
} else {
@@ -1648,6 +1698,8 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
}
}
+ tscDebug("consumer:%" PRId64 " handle rsp %p", tmq->consumerId, rspWrapper);
+
if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__END_RSP) {
taosFreeQitem(rspWrapper);
terrno = TSDB_CODE_TQ_NO_COMMITTED_OFFSET;
@@ -1675,6 +1727,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
} else {
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
pollRspWrapper->dataRsp.head.epoch, consumerEpoch);
+ tmqFreeRspWrapper(rspWrapper);
taosFreeQitem(pollRspWrapper);
}
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_META_RSP) {
@@ -1693,6 +1746,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
} else {
tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
pollRspWrapper->metaRsp.head.epoch, consumerEpoch);
+ tmqFreeRspWrapper(rspWrapper);
taosFreeQitem(pollRspWrapper);
}
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__TAOSX_RSP) {
@@ -1721,8 +1775,9 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
taosFreeQitem(pollRspWrapper);
return pRsp;
} else {
- tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d\n",
+ tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
pollRspWrapper->taosxRsp.head.epoch, consumerEpoch);
+ tmqFreeRspWrapper(rspWrapper);
taosFreeQitem(pollRspWrapper);
}
} else {
@@ -1774,7 +1829,7 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) {
while (1) {
tmqHandleAllDelayedTask(tmq);
if (tmqPollImpl(tmq, timeout) < 0) {
- tscDebug("return since poll err");
+ tscDebug("consumer:%" PRId64 " return since poll err", tmq->consumerId);
/*return NULL;*/
}
@@ -1787,17 +1842,20 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) {
return NULL;
}
if (timeout != -1) {
- int64_t endTime = taosGetTimestampMs();
- int64_t leftTime = endTime - startTime;
- if (leftTime > timeout) {
- tscDebug("consumer:%" PRId64 ", (epoch %d) timeout, no rsp, start time %" PRId64 ", end time %" PRId64,
- tmq->consumerId, tmq->epoch, startTime, endTime);
+ int64_t currentTime = taosGetTimestampMs();
+ int64_t passedTime = currentTime - startTime;
+ if (passedTime > timeout) {
+ tscDebug("consumer:%" PRId64 ", (epoch %d) timeout, no rsp, start time %" PRId64 ", current time %" PRId64,
+ tmq->consumerId, tmq->epoch, startTime, currentTime);
return NULL;
}
- tsem_timewait(&tmq->rspSem, leftTime * 1000);
+ /*tscInfo("consumer:%" PRId64 ", (epoch %d) wait, start time %" PRId64 ", current time %" PRId64*/
+ /*", left time %" PRId64,*/
+ /*tmq->consumerId, tmq->epoch, startTime, currentTime, (timeout - passedTime));*/
+ tsem_timewait(&tmq->rspSem, (timeout - passedTime));
} else {
// use tsem_timewait instead of tsem_wait to avoid unexpected stuck
- tsem_timewait(&tmq->rspSem, 500 * 1000);
+ tsem_timewait(&tmq->rspSem, 1000);
}
}
}
diff --git a/source/client/src/clientTmqConnector.c b/source/client/src/clientTmqConnector.c
index 42988b16fe5e9dce30a5e295288a65794e940098..ccfc4980bc13d2c89c5d1be4554098257e7b1d7c 100644
--- a/source/client/src/clientTmqConnector.c
+++ b/source/client/src/clientTmqConnector.c
@@ -303,7 +303,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_fetchRawBlockImp(
jniDebug("jobj:%p, conn:%p, resultset:%p, no data to retrieve", jobj, tscon, (void *)res);
return JNI_FETCH_END;
} else {
- jniError("jobj:%p, conn:%p, query interrupted", jobj, tscon);
+ jniError("jobj:%p, conn:%p, query interrupted, tmq fetch block error code:%d, msg:%s", jobj, tscon, error_code, taos_errstr(tres));
return JNI_RESULT_SET_NULL;
}
}
diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp
index 85814305bd9cce41efebec8bb997f207c8d1a847..82202b8820212fddfe401c769b77003fde2982fc 100644
--- a/source/client/test/clientTests.cpp
+++ b/source/client/test/clientTests.cpp
@@ -692,7 +692,6 @@ TEST(testCase, insert_test) {
taos_free_result(pRes);
taos_close(pConn);
}
-#endif
TEST(testCase, projection_query_tables) {
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
@@ -752,9 +751,6 @@ TEST(testCase, projection_query_tables) {
taos_close(pConn);
}
-
-#if 0
-
TEST(testCase, tsbs_perf_test) {
TdThread qid[20] = {0};
@@ -764,15 +760,16 @@ TEST(testCase, tsbs_perf_test) {
getchar();
}
+#endif
TEST(testCase, projection_query_stables) {
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
ASSERT_NE(pConn, nullptr);
- TAOS_RES* pRes = taos_query(pConn, "use abc1");
+ TAOS_RES* pRes = taos_query(pConn, "use test");
taos_free_result(pRes);
- pRes = taos_query(pConn, "select ts from st1");
+ pRes = taos_query(pConn, "select * from meters limit 50000000");
if (taos_errno(pRes) != 0) {
printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
taos_free_result(pRes);
@@ -785,14 +782,15 @@ TEST(testCase, projection_query_stables) {
char str[512] = {0};
while ((pRow = taos_fetch_row(pRes)) != NULL) {
- int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
- printf("%s\n", str);
+// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
+// printf("%s\n", str);
}
taos_free_result(pRes);
taos_close(pConn);
}
+#if 0
TEST(testCase, agg_query_tables) {
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
ASSERT_NE(pConn, nullptr);
diff --git a/source/common/src/systable.c b/source/common/src/systable.c
index c3a1f9f67ed3dea99f00e6a71481346fff29c602..60a673ef9cf25b61e8889f4941802a8500b726a2 100644
--- a/source/common/src/systable.c
+++ b/source/common/src/systable.c
@@ -206,16 +206,15 @@ static const SSysDbTableSchema vgroupsSchema[] = {
{.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
{.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
{.name = "tables", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
- {.name = "v1_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
- {.name = "v1_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
- {.name = "v2_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
- {.name = "v2_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
- {.name = "v3_dnode", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
- {.name = "v3_status", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
- {.name = "status", .bytes = 12 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
+ {.name = "v1_dnode", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
+ {.name = "v1_status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
+ {.name = "v2_dnode", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
+ {.name = "v2_status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
+ {.name = "v3_dnode", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
+ {.name = "v3_status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
+ {.name = "v4_dnode", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
+ {.name = "v4_status", .bytes = 9 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
{.name = "cacheload", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
- {.name = "nfiles", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
- {.name = "file_size", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
{.name = "tsma", .bytes = 1, .type = TSDB_DATA_TYPE_TINYINT, .sysInfo = true},
};
@@ -274,6 +273,12 @@ static const SSysDbTableSchema vnodesSchema[] = {
{.name = "dnode_ep", .bytes = TSDB_EP_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
};
+static const SSysDbTableSchema userUserPrivilegesSchema[] = {
+ {.name = "user_name", .bytes = TSDB_USER_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
+ {.name = "privilege", .bytes = 10 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
+ {.name = "object_name", .bytes = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
+};
+
static const SSysTableMeta infosMeta[] = {
{TSDB_INS_TABLE_DNODES, dnodesSchema, tListLen(dnodesSchema), true},
{TSDB_INS_TABLE_MNODES, mnodesSchema, tListLen(mnodesSchema), true},
@@ -298,6 +303,7 @@ static const SSysTableMeta infosMeta[] = {
{TSDB_INS_TABLE_STREAMS, streamSchema, tListLen(streamSchema), false},
{TSDB_INS_TABLE_STREAM_TASKS, streamTaskSchema, tListLen(streamTaskSchema), false},
{TSDB_INS_TABLE_VNODES, vnodesSchema, tListLen(vnodesSchema), true},
+ {TSDB_INS_TABLE_USER_PRIVILEGES, userUserPrivilegesSchema, tListLen(userUserPrivilegesSchema), false},
};
static const SSysDbTableSchema connectionsSchema[] = {
diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c
index 607db72ec67e81f5fee5ab40bb4a7e2383400c62..4f726ab194ce2d88d57a4e28897637ee2d11b5c6 100644
--- a/source/common/src/tdatablock.c
+++ b/source/common/src/tdatablock.c
@@ -19,6 +19,8 @@
#include "tlog.h"
#include "tname.h"
+#define MALLOC_ALIGN_BYTES 256
+
int32_t colDataGetLength(const SColumnInfoData* pColumnInfoData, int32_t numOfRows) {
ASSERT(pColumnInfoData != NULL);
if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) {
@@ -509,8 +511,12 @@ SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int3
isNull = colDataIsNull(pColData, pBlock->info.rows, j, pBlock->pBlockAgg[i]);
}
- char* p = colDataGetData(pColData, j);
- colDataAppend(pDstCol, j - startIndex, p, isNull);
+ if (isNull) {
+ colDataAppendNULL(pDstCol, j - startIndex);
+ } else {
+ char* p = colDataGetData(pColData, j);
+ colDataAppend(pDstCol, j - startIndex, p, false);
+ }
}
}
@@ -615,7 +621,7 @@ int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf) {
// todo remove this
int32_t blockDataFromBuf1(SSDataBlock* pBlock, const char* buf, size_t capacity) {
pBlock->info.rows = *(int32_t*)buf;
- pBlock->info.groupId = *(uint64_t*)(buf + sizeof(int32_t));
+ pBlock->info.id.groupId = *(uint64_t*)(buf + sizeof(int32_t));
size_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
@@ -652,7 +658,10 @@ int32_t blockDataFromBuf1(SSDataBlock* pBlock, const char* buf, size_t capacity)
ASSERT(pCol->varmeta.length <= pCol->varmeta.allocLen);
}
- memcpy(pCol->pData, pStart, colLength);
+ if (!colDataIsNNull_s(pCol, 0, pBlock->info.rows)) {
+ memcpy(pCol->pData, pStart, colLength);
+ }
+
pStart += pCol->info.bytes * capacity;
}
@@ -804,7 +813,9 @@ static int32_t blockDataAssign(SColumnInfoData* pCols, const SSDataBlock* pDataB
SColumnInfoData* pSrc = taosArrayGet(pDataBlock->pDataBlock, i);
if (IS_VAR_DATA_TYPE(pSrc->info.type)) {
- memcpy(pDst->pData, pSrc->pData, pSrc->varmeta.length);
+ if (pSrc->varmeta.length != 0) {
+ memcpy(pDst->pData, pSrc->pData, pSrc->varmeta.length);
+ }
pDst->varmeta.length = pSrc->varmeta.length;
for (int32_t j = 0; j < pDataBlock->info.rows; ++j) {
@@ -1126,13 +1137,15 @@ int32_t blockDataSort_rv(SSDataBlock* pDataBlock, SArray* pOrderInfo, bool nullF
}
void blockDataCleanup(SSDataBlock* pDataBlock) {
+ blockDataEmpty(pDataBlock);
SDataBlockInfo* pInfo = &pDataBlock->info;
+ pInfo->id.uid = 0;
+ pInfo->id.groupId = 0;
+}
- pInfo->rows = 0;
- pInfo->groupId = 0;
- pInfo->window.ekey = 0;
- pInfo->window.skey = 0;
-
+void blockDataEmpty(SSDataBlock* pDataBlock) {
+ SDataBlockInfo* pInfo = &pDataBlock->info;
+ ASSERT(pInfo->rows <= pDataBlock->info.capacity);
if (pInfo->capacity == 0) {
return;
}
@@ -1142,6 +1155,10 @@ void blockDataCleanup(SSDataBlock* pDataBlock) {
SColumnInfoData* p = taosArrayGet(pDataBlock->pDataBlock, i);
colInfoDataCleanup(p, pInfo->capacity);
}
+
+ pInfo->rows = 0;
+ pInfo->window.ekey = 0;
+ pInfo->window.skey = 0;
}
// todo temporarily disable it
@@ -1165,6 +1182,7 @@ static int32_t doEnsureCapacity(SColumnInfoData* pColumn, const SDataBlockInfo*
pColumn->varmeta.offset = (int32_t*)tmp;
memset(&pColumn->varmeta.offset[existedRows], 0, sizeof(int32_t) * (numOfRows - existedRows));
} else {
+ // prepare for the null bitmap
char* tmp = taosMemoryRealloc(pColumn->nullbitmap, BitmapLen(numOfRows));
if (tmp == NULL) {
return TSDB_CODE_OUT_OF_MEMORY;
@@ -1173,14 +1191,27 @@ static int32_t doEnsureCapacity(SColumnInfoData* pColumn, const SDataBlockInfo*
int32_t oldLen = BitmapLen(existedRows);
pColumn->nullbitmap = tmp;
memset(&pColumn->nullbitmap[oldLen], 0, BitmapLen(numOfRows) - oldLen);
-
ASSERT(pColumn->info.bytes);
- tmp = taosMemoryRealloc(pColumn->pData, numOfRows * pColumn->info.bytes);
+
+ // make sure the allocated memory is MALLOC_ALIGN_BYTES aligned
+ tmp = taosMemoryMallocAlign(MALLOC_ALIGN_BYTES, numOfRows * pColumn->info.bytes);
if (tmp == NULL) {
return TSDB_CODE_OUT_OF_MEMORY;
}
+ // copy back the existed data
+ if (pColumn->pData != NULL) {
+ memcpy(tmp, pColumn->pData, existedRows * pColumn->info.bytes);
+ taosMemoryFreeClear(pColumn->pData);
+ }
+
pColumn->pData = tmp;
+
+ // todo remove it soon
+#if defined LINUX
+ ASSERT((((uint64_t)pColumn->pData) & (MALLOC_ALIGN_BYTES - 1)) == 0x0);
+#endif
+
if (clearPayload) {
memset(tmp + pColumn->info.bytes * existedRows, 0, pColumn->info.bytes * (numOfRows - existedRows));
}
@@ -1228,6 +1259,25 @@ int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows) {
return TSDB_CODE_SUCCESS;
}
+int32_t blockDataEnsureCapacityNoClear(SSDataBlock* pDataBlock, uint32_t numOfRows) {
+ int32_t code = 0;
+ if (numOfRows == 0 || numOfRows <= pDataBlock->info.capacity) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ size_t numOfCols = taosArrayGetSize(pDataBlock->pDataBlock);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* p = taosArrayGet(pDataBlock->pDataBlock, i);
+ code = doEnsureCapacity(p, &pDataBlock->info, numOfRows, false);
+ if (code) {
+ return code;
+ }
+ }
+
+ pDataBlock->info.capacity = numOfRows;
+ return TSDB_CODE_SUCCESS;
+}
+
void blockDataFreeRes(SSDataBlock* pBlock) {
int32_t numOfOutput = taosArrayGetSize(pBlock->pDataBlock);
for (int32_t i = 0; i < numOfOutput; ++i) {
@@ -1302,12 +1352,9 @@ int32_t copyDataBlock(SSDataBlock* dst, const SSDataBlock* src) {
for (int32_t i = 0; i < numOfCols; ++i) {
SColumnInfoData* pDst = taosArrayGet(dst->pDataBlock, i);
SColumnInfoData* pSrc = taosArrayGet(src->pDataBlock, i);
- if (pSrc->pData == NULL) {
- continue;
- }
-
colDataAssign(pDst, pSrc, src->info.rows, &src->info);
}
+
uint32_t cap = dst->info.capacity;
dst->info = src->info;
dst->info.capacity = cap;
@@ -1317,7 +1364,7 @@ int32_t copyDataBlock(SSDataBlock* dst, const SSDataBlock* src) {
SSDataBlock* createSpecialDataBlock(EStreamType type) {
SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
pBlock->info.hasVarCol = false;
- pBlock->info.groupId = 0;
+ pBlock->info.id.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) +
@@ -1603,6 +1650,8 @@ static int32_t colDataMoveVarData(SColumnInfoData* pColInfoData, size_t start, s
static void colDataTrimFirstNRows(SColumnInfoData* pColInfoData, size_t n, size_t total) {
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
pColInfoData->varmeta.length = colDataMoveVarData(pColInfoData, n, total);
+
+ // clear the offset value of the unused entries.
memset(&pColInfoData->varmeta.offset[total - n], 0, n);
} else {
int32_t bytes = pColInfoData->info.bytes;
@@ -1617,7 +1666,7 @@ int32_t blockDataTrimFirstNRows(SSDataBlock* pBlock, size_t n) {
}
if (pBlock->info.rows <= n) {
- blockDataCleanup(pBlock);
+ blockDataEmpty(pBlock);
} else {
size_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
for (int32_t i = 0; i < numOfCols; ++i) {
@@ -1634,12 +1683,22 @@ static void colDataKeepFirstNRows(SColumnInfoData* pColInfoData, size_t n, size_
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
pColInfoData->varmeta.length = colDataMoveVarData(pColInfoData, 0, n);
memset(&pColInfoData->varmeta.offset[n], 0, total - n);
+ } else { // reset the bitmap value
+ /*int32_t stopIndex = BitmapLen(n) * 8;
+ for(int32_t i = n; i < stopIndex; ++i) {
+ colDataClearNull_f(pColInfoData->nullbitmap, i);
+ }
+
+ int32_t remain = BitmapLen(total) - BitmapLen(n);
+ if (remain > 0) {
+ memset(pColInfoData->nullbitmap+BitmapLen(n), 0, remain);
+ }*/
}
}
int32_t blockDataKeepFirstNRows(SSDataBlock* pBlock, size_t n) {
if (n == 0) {
- blockDataCleanup(pBlock);
+ blockDataEmpty(pBlock);
return TSDB_CODE_SUCCESS;
}
@@ -1658,7 +1717,7 @@ int32_t blockDataKeepFirstNRows(SSDataBlock* pBlock, size_t n) {
}
int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock) {
- int64_t tbUid = pBlock->info.uid;
+ int64_t tbUid = pBlock->info.id.uid;
int16_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
int16_t hasVarCol = pBlock->info.hasVarCol;
int32_t rows = pBlock->info.rows;
@@ -1696,7 +1755,7 @@ void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock) {
int16_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- buf = taosDecodeFixedU64(buf, &pBlock->info.uid);
+ buf = taosDecodeFixedU64(buf, &pBlock->info.id.uid);
buf = taosDecodeFixedI16(buf, &numOfCols);
buf = taosDecodeFixedI16(buf, &pBlock->info.hasVarCol);
buf = taosDecodeFixedI32(buf, &pBlock->info.rows);
@@ -1817,7 +1876,7 @@ void blockDebugShowDataBlocks(const SArray* dataBlocks, const char* flag) {
int32_t rows = pDataBlock->info.rows;
printf("%s |block ver %" PRIi64 " |block type %d |child id %d|group id %" PRIu64 "\n", flag,
pDataBlock->info.version, (int32_t)pDataBlock->info.type, pDataBlock->info.childId,
- pDataBlock->info.groupId);
+ pDataBlock->info.id.groupId);
for (int32_t j = 0; j < rows; j++) {
printf("%s |", flag);
for (int32_t k = 0; k < numOfCols; k++) {
@@ -1887,9 +1946,9 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf)
int32_t len = 0;
len += snprintf(dumpBuf + len, size - len,
"===stream===%s|block type %d|child id %d|group id:%" PRIu64 "|uid:%" PRId64
- "|rows:%d|version:%" PRIu64 "\n",
- flag, (int32_t)pDataBlock->info.type, pDataBlock->info.childId, pDataBlock->info.groupId,
- pDataBlock->info.uid, pDataBlock->info.rows, pDataBlock->info.version);
+ "|rows:%d|version:%" PRIu64 "|cal start:%" PRIu64 "|cal end:%" PRIu64 "\n",
+ flag, (int32_t)pDataBlock->info.type, pDataBlock->info.childId, pDataBlock->info.id.groupId,
+ pDataBlock->info.id.uid, pDataBlock->info.rows, pDataBlock->info.version, pDataBlock->info.calWin.skey, pDataBlock->info.calWin.ekey);
if (len >= size - 1) return dumpBuf;
for (int32_t j = 0; j < rows; j++) {
@@ -2018,8 +2077,6 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataB
for (int32_t i = 0; i < sz; ++i) {
int32_t colNum = taosArrayGetSize(pDataBlock->pDataBlock);
int32_t rows = pDataBlock->info.rows;
- // int32_t rowSize = pDataBlock->info.rowSize;
- // int64_t groupId = pDataBlock->info.groupId;
if (colNum <= 1) {
// invalid if only with TS col
@@ -2032,7 +2089,7 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataB
SSubmitBlk* pSubmitBlk = POINTER_SHIFT(pDataBuf, msgLen);
pSubmitBlk->suid = suid;
- pSubmitBlk->uid = pDataBlock->info.groupId;
+ pSubmitBlk->uid = pDataBlock->info.id.groupId;
pSubmitBlk->numOfRows = rows;
pSubmitBlk->sversion = pTSchema->version;
@@ -2052,6 +2109,7 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataB
isStartKey = true;
tdAppendColValToRow(&rb, PRIMARYKEY_TIMESTAMP_COL_ID, TSDB_DATA_TYPE_TIMESTAMP, TD_VTYPE_NORM, var, true,
offset, k);
+ continue; // offset should keep 0 for next column
} else if (colDataIsNull_s(pColInfoData, j)) {
tdAppendColValToRow(&rb, PRIMARYKEY_TIMESTAMP_COL_ID + k, TSDB_DATA_TYPE_TIMESTAMP, TD_VTYPE_NULL, NULL,
@@ -2274,7 +2332,7 @@ int32_t blockEncode(const SSDataBlock* pBlock, char* data, int32_t numOfCols) {
}
*actualLen = dataLen;
- *groupId = pBlock->info.groupId;
+ *groupId = pBlock->info.id.groupId;
ASSERT(dataLen > 0);
uDebug("build data block, actualLen:%d, rows:%d, cols:%d", dataLen, *rows, *cols);
@@ -2307,7 +2365,7 @@ const char* blockDecode(SSDataBlock* pBlock, const char* pData) {
pStart += sizeof(int32_t);
// group id sizeof(uint64_t)
- pBlock->info.groupId = *(uint64_t*)pStart;
+ pBlock->info.id.groupId = *(uint64_t*)pStart;
pStart += sizeof(uint64_t);
if (pBlock->pDataBlock == NULL) {
@@ -2317,7 +2375,7 @@ const char* blockDecode(SSDataBlock* pBlock, const char* pData) {
for (int32_t i = 0; i < numOfCols; ++i) {
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
- pColInfoData->info.type = *(int16_t*)pStart;
+ pColInfoData->info.type = *(int8_t*)pStart;
pStart += sizeof(int8_t);
pColInfoData->info.bytes = *(int32_t*)pStart;
diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c
index 73b887342cf995a1aa564b1aa6f5bae55dac01e1..fc49c033794c946a9881b6ae1efeabcb101e99a7 100644
--- a/source/common/src/tdataformat.c
+++ b/source/common/src/tdataformat.c
@@ -43,606 +43,672 @@ int32_t tBufferPut(SBuffer *pBuffer, const void *pData, int64_t nData) {
return code;
}
+int32_t tBufferReserve(SBuffer *pBuffer, int64_t nData, void **ppData) {
+ int32_t code = tRealloc(&pBuffer->pBuf, pBuffer->nBuf + nData);
+ if (code) return code;
+
+ *ppData = pBuffer->pBuf + pBuffer->nBuf;
+ pBuffer->nBuf += nData;
+
+ return code;
+}
+
// ================================
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson);
+// SRow ========================================================================
+#define KV_FLG_LIT ((uint8_t)0x10)
+#define KV_FLG_MID ((uint8_t)0x20)
+#define KV_FLG_BIG ((uint8_t)0x30)
+
+#define ROW_BIT_NONE ((uint8_t)0x0)
+#define ROW_BIT_NULL ((uint8_t)0x1)
+#define ROW_BIT_VALUE ((uint8_t)0x2)
+
#pragma pack(push, 1)
typedef struct {
- int16_t nCols;
- uint8_t idx[];
-} STSKVRow;
+ int16_t nCol;
+ char idx[]; // uint8_t * | uint16_t * | uint32_t *
+} SKVIdx;
#pragma pack(pop)
-#define TSROW_IS_KV_ROW(r) ((r)->flags & TSROW_KV_ROW)
-
-// SValue
-static FORCE_INLINE int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) {
- if (IS_VAR_DATA_TYPE(type)) {
- return tPutBinary(p, pValue->pData, pValue->nData);
- } else {
- if (p) memcpy(p, &pValue->val, tDataTypes[type].bytes);
- return tDataTypes[type].bytes;
- }
-}
-
-// STSRow2 ========================================================================
-static void setBitMap(uint8_t *pb, uint8_t v, int32_t idx, uint8_t flags) {
- if (pb) {
- switch (flags & 0xf) {
- case TSROW_HAS_NULL | TSROW_HAS_NONE:
- case TSROW_HAS_VAL | TSROW_HAS_NONE:
- if (v) {
- SET_BIT1(pb, idx, (uint8_t)1);
- } else {
- SET_BIT1(pb, idx, (uint8_t)0);
- }
- break;
- case TSROW_HAS_VAL | TSROW_HAS_NULL:
- v = v - 1;
- SET_BIT1(pb, idx, v);
- break;
- case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
- SET_BIT2(pb, idx, v);
- break;
-
- default:
- ASSERT(0);
- }
- }
-}
-#define SET_IDX(p, i, n, f) \
- do { \
- if ((f)&TSROW_KV_SMALL) { \
- ((uint8_t *)(p))[i] = (n); \
- } else if ((f)&TSROW_KV_MID) { \
- ((uint16_t *)(p))[i] = (n); \
- } else { \
- ((uint32_t *)(p))[i] = (n); \
- } \
+#define ROW_SET_BITMAP(PB, FLAG, IDX, VAL) \
+ do { \
+ if (PB) { \
+ switch (FLAG) { \
+ case (HAS_NULL | HAS_NONE): \
+ SET_BIT1(PB, IDX, VAL); \
+ break; \
+ case (HAS_VALUE | HAS_NONE): \
+ SET_BIT1(PB, IDX, (VAL) ? (VAL)-1 : 0); \
+ break; \
+ case (HAS_VALUE | HAS_NULL): \
+ SET_BIT1(PB, IDX, (VAL)-1); \
+ break; \
+ case (HAS_VALUE | HAS_NULL | HAS_NONE): \
+ SET_BIT2(PB, IDX, VAL); \
+ break; \
+ default: \
+ ASSERT(0); \
+ break; \
+ } \
+ } \
} while (0)
-#if 0
-int32_t tTSRowNew(STSRowBuilder *pBuilder, SArray *pArray, STSchema *pTSchema, STSRow2 **ppRow) {
- int32_t code = 0;
-#if 0
- STColumn *pTColumn;
- SColVal *pColVal;
- int32_t nColVal = taosArrayGetSize(pArray);
- int32_t iColVal;
-
- ASSERT(nColVal > 0);
-
- // try
- uint8_t flags = 0;
- uint32_t ntv = 0;
- uint32_t nkv = 0;
- int16_t nTag = 0;
- uint32_t maxIdx = 0;
-
- iColVal = 0;
- for (int32_t iColumn = 0; iColumn < pTSchema->numOfCols; iColumn++) {
- pTColumn = &pTSchema->columns[iColumn];
- if (iColVal < nColVal) {
- pColVal = (SColVal *)taosArrayGet(pArray, iColVal);
- } else {
- pColVal = NULL;
- }
- if (iColumn == 0) {
- ASSERT(pColVal->cid == pTColumn->colId);
- ASSERT(pTColumn->type == TSDB_DATA_TYPE_TIMESTAMP);
- ASSERT(pTColumn->colId == PRIMARYKEY_TIMESTAMP_COL_ID);
-
- iColVal++;
- } else {
- if (pColVal) {
- if (pColVal->cid == pTColumn->colId) {
- iColVal++;
+int32_t tRowBuild(SArray *aColVal, STSchema *pTSchema, SBuffer *pBuffer) {
+ int32_t code = 0;
- if (COL_VAL_IS_NONE(pColVal)) {
- flags |= TSROW_HAS_NONE;
- } else if (COL_VAL_IS_NULL(pColVal)) {
- flags |= TSROW_HAS_NULL;
- maxIdx = nkv;
- nTag++;
- nkv += tPutI16v(NULL, -pTColumn->colId);
+ ASSERT(taosArrayGetSize(aColVal) > 0);
+ ASSERT(((SColVal *)aColVal->pData)[0].cid == PRIMARYKEY_TIMESTAMP_COL_ID);
+ ASSERT(((SColVal *)aColVal->pData)[0].type == TSDB_DATA_TYPE_TIMESTAMP);
+
+ // scan ---------------
+ uint8_t flag = 0;
+ int32_t iColVal = 1;
+ const int32_t nColVal = taosArrayGetSize(aColVal);
+ SColVal *pColVal = (iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL;
+ int32_t iTColumn = 1;
+ STColumn *pTColumn = pTSchema->columns + iTColumn;
+ int32_t ntp = 0;
+ int32_t nkv = 0;
+ int32_t maxIdx = 0;
+ int32_t nIdx = 0;
+ while (pTColumn) {
+ if (pColVal) {
+ if (pColVal->cid == pTColumn->colId) {
+ ntp += TYPE_BYTES[pTColumn->type];
+ if (COL_VAL_IS_VALUE(pColVal)) { // VALUE
+ flag |= HAS_VALUE;
+ maxIdx = nkv;
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ ntp = ntp + tPutU32v(NULL, pColVal->value.nData) + pColVal->value.nData;
+ nkv = nkv + tPutI16v(NULL, pTColumn->colId) + tPutU32v(NULL, pColVal->value.nData) + pColVal->value.nData;
} else {
- flags |= TSROW_HAS_VAL;
- maxIdx = nkv;
- nTag++;
- nkv += tPutI16v(NULL, pTColumn->colId);
- nkv += tPutValue(NULL, &pColVal->value, pTColumn->type);
- if (IS_VAR_DATA_TYPE(pTColumn->type)) {
- ntv += tPutValue(NULL, &pColVal->value, pTColumn->type);
- }
+ nkv = nkv + tPutI16v(NULL, pTColumn->colId) + pTColumn->bytes;
}
- } else if (pColVal->cid > pTColumn->colId) {
- flags |= TSROW_HAS_NONE;
+ nIdx++;
+ } else if (COL_VAL_IS_NONE(pColVal)) { // NONE
+ flag |= HAS_NONE;
+ } else if (COL_VAL_IS_NULL(pColVal)) { // NULL
+ flag |= HAS_NULL;
+ maxIdx = nkv;
+ nkv += tPutI16v(NULL, -pTColumn->colId);
+ nIdx++;
} else {
ASSERT(0);
}
+
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
+ pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL;
+ } else if (pColVal->cid > pTColumn->colId) { // NONE
+ flag |= HAS_NONE;
+ ntp += TYPE_BYTES[pTColumn->type];
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
} else {
- flags |= TSROW_HAS_NONE;
+ pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL;
}
+ } else { // NONE
+ flag |= HAS_NONE;
+ ntp += TYPE_BYTES[pTColumn->type];
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
}
}
- ASSERT(flags);
-
- // decide
- uint32_t nData = 0;
- uint32_t nDataT = 0;
- uint32_t nDataK = 0;
- if (flags == TSROW_HAS_NONE || flags == TSROW_HAS_NULL) {
- nData = 0;
+ // compare ---------------
+ switch (flag) {
+ case HAS_NONE:
+ case HAS_NULL:
+ ntp = sizeof(SRow);
+ break;
+ case HAS_VALUE:
+ ntp = sizeof(SRow) + ntp;
+ break;
+ case (HAS_NULL | HAS_NONE):
+ ntp = sizeof(SRow) + BIT1_SIZE(pTSchema->numOfCols - 1);
+ break;
+ case (HAS_VALUE | HAS_NONE):
+ case (HAS_VALUE | HAS_NULL):
+ ntp = sizeof(SRow) + BIT1_SIZE(pTSchema->numOfCols - 1) + ntp;
+ break;
+ case (HAS_VALUE | HAS_NULL | HAS_NONE):
+ ntp = sizeof(SRow) + BIT2_SIZE(pTSchema->numOfCols - 1) + ntp;
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ if (maxIdx <= UINT8_MAX) {
+ nkv = sizeof(SRow) + sizeof(SKVIdx) + nIdx + nkv;
+ flag |= KV_FLG_LIT;
+ } else if (maxIdx <= UINT16_MAX) {
+ nkv = sizeof(SRow) + sizeof(SKVIdx) + (nIdx << 1) + nkv;
+ flag |= KV_FLG_MID;
} else {
- switch (flags) {
- case TSROW_HAS_VAL:
- nDataT = pTSchema->flen + ntv;
- break;
- case TSROW_HAS_NULL | TSROW_HAS_NONE:
- nDataT = BIT1_SIZE(pTSchema->numOfCols - 1);
- break;
- case TSROW_HAS_VAL | TSROW_HAS_NONE:
- case TSROW_HAS_VAL | TSROW_HAS_NULL:
- nDataT = BIT1_SIZE(pTSchema->numOfCols - 1) + pTSchema->flen + ntv;
- break;
- case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
- nDataT = BIT2_SIZE(pTSchema->numOfCols - 1) + pTSchema->flen + ntv;
- break;
- default:
- break;
- ASSERT(0);
- }
-
- uint8_t tflags = 0;
- if (maxIdx <= UINT8_MAX) {
- nDataK = sizeof(STSKVRow) + sizeof(uint8_t) * nTag + nkv;
- tflags |= TSROW_KV_SMALL;
- } else if (maxIdx <= UINT16_MAX) {
- nDataK = sizeof(STSKVRow) + sizeof(uint16_t) * nTag + nkv;
- tflags |= TSROW_KV_MID;
- } else {
- nDataK = sizeof(STSKVRow) + sizeof(uint32_t) * nTag + nkv;
- tflags |= TSROW_KV_BIG;
- }
-
- if (nDataT <= nDataK) {
- nData = nDataT;
- } else {
- nData = nDataK;
- flags |= tflags;
- }
+ nkv = sizeof(SRow) + sizeof(SKVIdx) + (nIdx << 2) + nkv;
+ flag |= KV_FLG_BIG;
+ }
+ int32_t nRow;
+ if (nkv < ntp) {
+ nRow = nkv;
+ } else {
+ nRow = ntp;
+ flag &= ((uint8_t)0x0f);
}
- // alloc
- if (pBuilder) {
- // create from a builder
- if (nData == 0) {
- pBuilder->tsRow.nData = 0;
- pBuilder->tsRow.pData = NULL;
- } else {
- if (pBuilder->szBuf < nData) {
- uint8_t *p = taosMemoryRealloc(pBuilder->pBuf, nData);
- if (p == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
- }
- pBuilder->pBuf = p;
- pBuilder->szBuf = nData;
- }
+ // alloc --------------
+ SRow *pRow = NULL;
+ code = tBufferReserve(pBuffer, nRow, (void **)&pRow);
+ if (code) return code;
- pBuilder->tsRow.nData = nData;
- pBuilder->tsRow.pData = pBuilder->pBuf;
- }
+ // build --------------
+ pColVal = (SColVal *)taosArrayGet(aColVal, 0);
- *ppRow = &pBuilder->tsRow;
- } else {
- // create a new one
- *ppRow = (STSRow2 *)taosMemoryMalloc(sizeof(STSRow2));
- if (*ppRow == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
- }
- if (nData == 0) {
- (*ppRow)->nData = 0;
- (*ppRow)->pData = NULL;
- } else {
- (*ppRow)->nData = nData;
- (*ppRow)->pData = taosMemoryMalloc(nData);
- if ((*ppRow)->pData == NULL) {
- taosMemoryFree(*ppRow);
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
- }
- }
+ pRow->flag = flag;
+ pRow->rsv = 0;
+ pRow->sver = pTSchema->version;
+ pRow->len = nRow;
+ memcpy(&pRow->ts, &pColVal->value.val, sizeof(TSKEY));
+
+ if (flag == HAS_NONE || flag == HAS_NULL) {
+ goto _exit;
}
- // build
- (*ppRow)->flags = flags;
- (*ppRow)->sver = pTSchema->version;
-
- pColVal = (SColVal *)taosArrayGet(pArray, 0);
- (*ppRow)->ts = pColVal->value.ts;
-
- if ((*ppRow)->pData) {
- STSKVRow *pTSKVRow = NULL;
- uint8_t *pidx = NULL;
- uint8_t *pkv = NULL;
- uint8_t *pb = NULL;
- uint8_t *pf = NULL;
- uint8_t *ptv = NULL;
- nkv = 0;
- ntv = 0;
- iColVal = 1;
-
- if ((flags & 0xf0) == 0) {
- switch (flags & 0xf) {
- case TSROW_HAS_VAL:
- pf = (*ppRow)->pData;
- ptv = pf + pTSchema->flen;
- break;
- case TSROW_HAS_NULL | TSROW_HAS_NONE:
- pb = (*ppRow)->pData;
- break;
- case TSROW_HAS_VAL | TSROW_HAS_NONE:
- case TSROW_HAS_VAL | TSROW_HAS_NULL:
- pb = (*ppRow)->pData;
- pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
- ptv = pf + pTSchema->flen;
- break;
- case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
- pb = (*ppRow)->pData;
- pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
- ptv = pf + pTSchema->flen;
- break;
- default:
- ASSERT(0);
- break;
- }
+ iColVal = 1;
+ pColVal = (iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL;
+ iTColumn = 1;
+ pTColumn = pTSchema->columns + iTColumn;
+ if (flag & 0xf0) { // KV
+ SKVIdx *pIdx = (SKVIdx *)pRow->data;
+ int32_t iIdx = 0;
+ int32_t nv = 0;
+ uint8_t *pv = NULL;
+ if (flag & KV_FLG_LIT) {
+ pv = pIdx->idx + nIdx;
+ } else if (flag & KV_FLG_MID) {
+ pv = pIdx->idx + (nIdx << 1);
} else {
- pTSKVRow = (STSKVRow *)(*ppRow)->pData;
- pTSKVRow->nCols = 0;
- pidx = pTSKVRow->idx;
- if (flags & TSROW_KV_SMALL) {
- pkv = pidx + sizeof(uint8_t) * nTag;
- } else if (flags & TSROW_KV_MID) {
- pkv = pidx + sizeof(uint16_t) * nTag;
- } else {
- pkv = pidx + sizeof(uint32_t) * nTag;
- }
+ pv = pIdx->idx + (nIdx << 2);
}
+ pIdx->nCol = nIdx;
- for (int32_t iColumn = 1; iColumn < pTSchema->numOfCols; iColumn++) {
- pTColumn = &pTSchema->columns[iColumn];
- if (iColVal < nColVal) {
- pColVal = (SColVal *)taosArrayGet(pArray, iColVal);
- } else {
- pColVal = NULL;
- }
-
+ while (pTColumn) {
if (pColVal) {
if (pColVal->cid == pTColumn->colId) {
- iColVal++;
+ if (COL_VAL_IS_VALUE(pColVal)) {
+ if (flag & KV_FLG_LIT) {
+ ((uint8_t *)pIdx->idx)[iIdx] = (uint8_t)nv;
+ } else if (flag & KV_FLG_MID) {
+ ((uint16_t *)pIdx->idx)[iIdx] = (uint16_t)nv;
+ } else {
+ ((uint32_t *)pIdx->idx)[iIdx] = (uint32_t)nv;
+ }
+ iIdx++;
- if (COL_VAL_IS_NONE(pColVal)) {
- goto _set_none;
+ nv += tPutI16v(pv + nv, pTColumn->colId);
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ nv += tPutU32v(pv + nv, pColVal->value.nData);
+ memcpy(pv + nv, pColVal->value.pData, pColVal->value.nData);
+ nv += pColVal->value.nData;
+ } else {
+ memcpy(pv + nv, &pColVal->value.val, pTColumn->bytes);
+ nv += pTColumn->bytes;
+ }
} else if (COL_VAL_IS_NULL(pColVal)) {
- goto _set_null;
- } else {
- goto _set_value;
+ if (flag & KV_FLG_LIT) {
+ ((uint8_t *)pIdx->idx)[iIdx] = (uint8_t)nv;
+ } else if (flag & KV_FLG_MID) {
+ ((uint16_t *)pIdx->idx)[iIdx] = (uint16_t)nv;
+ } else {
+ ((uint32_t *)pIdx->idx)[iIdx] = (uint32_t)nv;
+ }
+ iIdx++;
+ nv += tPutI16v(pv + nv, -pTColumn->colId);
}
- } else if (pColVal->cid > pTColumn->colId) {
- goto _set_none;
+
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
+ pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL;
+ } else if (pColVal->cid > pTColumn->colId) { // NONE
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
} else {
- ASSERT(0);
+ pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL;
}
- } else {
- goto _set_none;
+ } else { // NONE
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
}
+ }
+ } else { // TUPLE
+ uint8_t *pb = NULL;
+ uint8_t *pf = NULL;
+ uint8_t *pv = NULL;
+ int32_t nv = 0;
- _set_none:
- if ((flags & 0xf0) == 0) {
- setBitMap(pb, 0, iColumn - 1, flags);
- if (flags & TSROW_HAS_VAL) { // set 0
- if (IS_VAR_DATA_TYPE(pTColumn->type)) {
- *(VarDataOffsetT *)(pf + pTColumn->offset) = 0;
- } else {
- tPutValue(pf + pTColumn->offset, &((SValue){0}), pTColumn->type);
- }
- }
- }
- continue;
+ switch (flag) {
+ case (HAS_NULL | HAS_NONE):
+ pb = pRow->data;
+ break;
+ case HAS_VALUE:
+ pf = pRow->data;
+ pv = pf + pTSchema->flen;
+ break;
+ case (HAS_VALUE | HAS_NONE):
+ case (HAS_VALUE | HAS_NULL):
+ pb = pRow->data;
+ pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
+ pv = pf + pTSchema->flen;
+ break;
+ case (HAS_VALUE | HAS_NULL | HAS_NONE):
+ pb = pRow->data;
+ pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
+ pv = pf + pTSchema->flen;
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
- _set_null:
- if ((flags & 0xf0) == 0) {
- setBitMap(pb, 1, iColumn - 1, flags);
- if (flags & TSROW_HAS_VAL) { // set 0
- if (IS_VAR_DATA_TYPE(pTColumn->type)) {
- *(VarDataOffsetT *)(pf + pTColumn->offset) = 0;
- } else {
- tPutValue(pf + pTColumn->offset, &((SValue){0}), pTColumn->type);
- }
- }
- } else {
- SET_IDX(pidx, pTSKVRow->nCols, nkv, flags);
- pTSKVRow->nCols++;
- nkv += tPutI16v(pkv + nkv, -pTColumn->colId);
- }
- continue;
+ // build impl
+ while (pTColumn) {
+ if (pColVal) {
+ if (pColVal->cid == pTColumn->colId) {
+ if (COL_VAL_IS_VALUE(pColVal)) { // VALUE
+ ROW_SET_BITMAP(pb, flag, iTColumn - 1, ROW_BIT_VALUE);
- _set_value:
- if ((flags & 0xf0) == 0) {
- setBitMap(pb, 2, iColumn - 1, flags);
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ *(int32_t *)(pf + pTColumn->offset) = nv;
+ nv += tPutU32v(pv + nv, pColVal->value.nData);
+ if (pColVal->value.nData) {
+ memcpy(pv + nv, pColVal->value.pData, pColVal->value.nData);
+ nv += pColVal->value.nData;
+ }
+ } else {
+ memcpy(pf + pTColumn->offset, &pColVal->value.val, TYPE_BYTES[pTColumn->type]);
+ }
+ } else if (COL_VAL_IS_NONE(pColVal)) { // NONE
+ ROW_SET_BITMAP(pb, flag, iTColumn - 1, ROW_BIT_NONE);
+ if (pf) memset(pf + pTColumn->offset, 0, TYPE_BYTES[pTColumn->type]);
+ } else { // NULL
+ ROW_SET_BITMAP(pb, flag, iTColumn - 1, ROW_BIT_NULL);
+ if (pf) memset(pf + pTColumn->offset, 0, TYPE_BYTES[pTColumn->type]);
+ }
- if (IS_VAR_DATA_TYPE(pTColumn->type)) {
- *(VarDataOffsetT *)(pf + pTColumn->offset) = ntv;
- ntv += tPutValue(ptv + ntv, &pColVal->value, pTColumn->type);
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
+ pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL;
+ } else if (pColVal->cid > pTColumn->colId) { // NONE
+ ROW_SET_BITMAP(pb, flag, iTColumn - 1, ROW_BIT_NONE);
+ if (pf) memset(pf + pTColumn->offset, 0, TYPE_BYTES[pTColumn->type]);
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
} else {
- tPutValue(pf + pTColumn->offset, &pColVal->value, pTColumn->type);
+ pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL;
}
- } else {
- SET_IDX(pidx, pTSKVRow->nCols, nkv, flags);
- pTSKVRow->nCols++;
- nkv += tPutI16v(pkv + nkv, pColVal->cid);
- nkv += tPutValue(pkv + nkv, &pColVal->value, pTColumn->type);
+ } else { // NONE
+ ROW_SET_BITMAP(pb, flag, iTColumn - 1, ROW_BIT_NONE);
+ if (pf) memset(pf + pTColumn->offset, 0, TYPE_BYTES[pTColumn->type]);
+ pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL;
}
- continue;
}
}
-#endif
-_exit:
- return code;
-}
-
-int32_t tTSRowClone(const STSRow2 *pRow, STSRow2 **ppRow) {
- int32_t code = 0;
- int32_t rLen = 0;
-
- TSROW_LEN(pRow, rLen);
- (*ppRow) = (STSRow2 *)taosMemoryMalloc(rLen);
- if (*ppRow == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
- }
- memcpy(*ppRow, pRow, rLen);
-
_exit:
return code;
}
-void tTSRowFree(STSRow2 *pRow) {
- if (pRow) {
- taosMemoryFree(pRow);
- }
-}
-
-void tTSRowGet(STSRow2 *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
- uint8_t isTuple = ((pRow->flags & 0xf0) == 0) ? 1 : 0;
- STColumn *pTColumn = &pTSchema->columns[iCol];
- uint8_t flags = pRow->flags & (uint8_t)0xf;
- SValue value;
-
+void tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
ASSERT(iCol < pTSchema->numOfCols);
- ASSERT(flags);
ASSERT(pRow->sver == pTSchema->version);
+ STColumn *pTColumn = pTSchema->columns + iCol;
+
if (iCol == 0) {
- value.ts = pRow->ts;
- goto _return_value;
+ pColVal->cid = pTColumn->colId;
+ pColVal->type = pTColumn->type;
+ pColVal->flag = CV_FLAG_VALUE;
+ memcpy(&pColVal->value.val, &pRow->ts, sizeof(TSKEY));
+ return;
}
- if (flags == TSROW_HAS_NONE) {
- goto _return_none;
- } else if (flags == TSROW_HAS_NULL) {
- goto _return_null;
+ if (pRow->flag == HAS_NONE) {
+ *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
+ return;
}
- ASSERT(pRow->nData && pRow->pData);
+ if (pRow->flag == HAS_NULL) {
+ *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
+ return;
+ }
- if (isTuple) {
- uint8_t *pb = pRow->pData;
- uint8_t *pf = NULL;
+ if (pRow->flag & 0xf0) { // KV Row
+ SKVIdx *pIdx = (SKVIdx *)pRow->data;
uint8_t *pv = NULL;
- uint8_t *p;
- uint8_t b;
-
- // bit
- switch (flags) {
- case TSROW_HAS_VAL:
- pf = pb;
- break;
- case TSROW_HAS_NULL | TSROW_HAS_NONE:
- b = GET_BIT1(pb, iCol - 1);
- if (b == 0) {
- goto _return_none;
- } else {
- goto _return_null;
- }
- case TSROW_HAS_VAL | TSROW_HAS_NONE:
- b = GET_BIT1(pb, iCol - 1);
- if (b == 0) {
- goto _return_none;
- } else {
- pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
- break;
- }
- case TSROW_HAS_VAL | TSROW_HAS_NULL:
- b = GET_BIT1(pb, iCol - 1);
- if (b == 0) {
- goto _return_null;
- } else {
- pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
- break;
- }
- case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
- b = GET_BIT2(pb, iCol - 1);
- if (b == 0) {
- goto _return_none;
- } else if (b == 1) {
- goto _return_null;
- } else {
- pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
- break;
- }
- default:
- ASSERT(0);
- }
-
- ASSERT(pf);
-
- p = pf + pTColumn->offset;
- if (IS_VAR_DATA_TYPE(pTColumn->type)) {
- pv = pf + pTSchema->flen;
- p = pv + *(VarDataOffsetT *)p;
- }
- tGetValue(p, &value, pTColumn->type);
- goto _return_value;
- } else {
- STSKVRow *pRowK = (STSKVRow *)pRow->pData;
- int16_t lidx = 0;
- int16_t ridx = pRowK->nCols - 1;
- uint8_t *p;
- int16_t midx;
- uint32_t n;
- int16_t cid;
-
- ASSERT(pRowK->nCols > 0);
-
- if (pRow->flags & TSROW_KV_SMALL) {
- p = pRow->pData + sizeof(STSKVRow) + sizeof(uint8_t) * pRowK->nCols;
- } else if (pRow->flags & TSROW_KV_MID) {
- p = pRow->pData + sizeof(STSKVRow) + sizeof(uint16_t) * pRowK->nCols;
- } else if (pRow->flags & TSROW_KV_BIG) {
- p = pRow->pData + sizeof(STSKVRow) + sizeof(uint32_t) * pRowK->nCols;
+ if (pRow->flag & KV_FLG_LIT) {
+ pv = pIdx->idx + pIdx->nCol;
+ } else if (pRow->flag & KV_FLG_MID) {
+ pv = pIdx->idx + (pIdx->nCol << 1);
} else {
- ASSERT(0);
+ pv = pIdx->idx + (pIdx->nCol << 2);
}
- while (lidx <= ridx) {
- midx = (lidx + ridx) / 2;
- if (pRow->flags & TSROW_KV_SMALL) {
- n = ((uint8_t *)pRowK->idx)[midx];
- } else if (pRow->flags & TSROW_KV_MID) {
- n = ((uint16_t *)pRowK->idx)[midx];
+ int16_t lidx = 0;
+ int16_t ridx = pIdx->nCol - 1;
+ while (lidx <= ridx) {
+ int16_t mid = (lidx + ridx) >> 1;
+ uint8_t *pData = NULL;
+ if (pRow->flag & KV_FLG_LIT) {
+ pData = pv + ((uint8_t *)pIdx->idx)[mid];
+ } else if (pRow->flag & KV_FLG_MID) {
+ pData = pv + ((uint16_t *)pIdx->idx)[mid];
} else {
- n = ((uint32_t *)pRowK->idx)[midx];
+ pData = pv + ((uint32_t *)pIdx->idx)[mid];
}
- n += tGetI16v(p + n, &cid);
+ int16_t cid;
+ pData += tGetI16v(pData, &cid);
if (TABS(cid) == pTColumn->colId) {
if (cid < 0) {
- goto _return_null;
+ *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
} else {
- n += tGetValue(p + n, &value, pTColumn->type);
- goto _return_value;
- }
+ pColVal->cid = pTColumn->colId;
+ pColVal->type = pTColumn->type;
+ pColVal->flag = CV_FLAG_VALUE;
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ pData += tGetU32v(pData, &pColVal->value.nData);
+ if (pColVal->value.nData > 0) {
+ pColVal->value.pData = pData;
+ } else {
+ pColVal->value.pData = NULL;
+ }
+ } else {
+ memcpy(&pColVal->value.val, pData, pTColumn->bytes);
+ }
+ }
return;
- } else if (TABS(cid) > pTColumn->colId) {
- ridx = midx - 1;
+ } else if (TABS(cid) < pTColumn->colId) {
+ lidx = mid + 1;
} else {
- lidx = midx + 1;
+ ridx = mid - 1;
}
}
- // not found, return NONE
- goto _return_none;
- }
+ *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
+ } else { // Tuple Row
+ uint8_t *pf = NULL;
+ uint8_t *pv = NULL;
+ uint8_t bv = ROW_BIT_VALUE;
-_return_none:
- *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
- return;
+ switch (pRow->flag) {
+ case HAS_VALUE:
+ pf = pRow->data;
+ pv = pf + pTSchema->flen;
+ break;
+ case (HAS_NULL | HAS_NONE):
+ bv = GET_BIT1(pRow->data, iCol - 1);
+ break;
+ case (HAS_VALUE | HAS_NONE):
+ bv = GET_BIT1(pRow->data, iCol - 1);
+ if (bv) bv++;
+ pf = pRow->data + BIT1_SIZE(pTSchema->numOfCols - 1);
+ pv = pf + pTSchema->flen;
+ break;
+ case (HAS_VALUE | HAS_NULL):
+ bv = GET_BIT1(pRow->data, iCol - 1);
+ bv++;
+ pf = pRow->data + BIT1_SIZE(pTSchema->numOfCols - 1);
+ pv = pf + pTSchema->flen;
+ break;
+ case (HAS_VALUE | HAS_NULL | HAS_NONE):
+ bv = GET_BIT2(pRow->data, iCol - 1);
+ pf = pRow->data + BIT2_SIZE(pTSchema->numOfCols - 1);
+ pv = pf + pTSchema->flen;
+ break;
+ default:
+ break;
+ }
-_return_null:
- *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
- return;
+ if (bv == ROW_BIT_NONE) {
+ *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
+ return;
+ } else if (bv == ROW_BIT_NULL) {
+ *pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
+ return;
+ }
-_return_value:
- *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, value);
- return;
+ pColVal->cid = pTColumn->colId;
+ pColVal->type = pTColumn->type;
+ pColVal->flag = CV_FLAG_VALUE;
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ uint8_t *pData = pv + *(int32_t *)(pf + pTColumn->offset);
+ pData += tGetU32v(pData, &pColVal->value.nData);
+ if (pColVal->value.nData) {
+ pColVal->value.pData = pData;
+ } else {
+ pColVal->value.pData = NULL;
+ }
+ } else {
+ memcpy(&pColVal->value.val, pv + pTColumn->offset, pTColumn->bytes);
+ }
+ }
}
-int32_t tTSRowToArray(STSRow2 *pRow, STSchema *pTSchema, SArray **ppArray) {
- int32_t code = 0;
+// SRowIter ========================================
+struct SRowIter {
+ SRow *pRow;
+ STSchema *pTSchema;
+
+ int32_t iTColumn;
+ union {
+ struct { // kv
+ int32_t iCol;
+ SKVIdx *pIdx;
+ };
+ struct { // tuple
+ uint8_t *pb;
+ uint8_t *pf;
+ };
+ uint8_t *pv;
+ };
+
SColVal cv;
+};
- (*ppArray) = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
- if (*ppArray == NULL) {
+int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter) {
+ ASSERT(pRow->sver == pTSchema->version);
+
+ int32_t code = 0;
+
+ SRowIter *pIter = taosMemoryCalloc(1, sizeof(*pIter));
+ if (pIter == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
- for (int32_t iColumn = 0; iColumn < pTSchema->numOfCols; iColumn++) {
- tTSRowGet(pRow, pTSchema, iColumn, &cv);
- taosArrayPush(*ppArray, &cv);
- }
+ pIter->pRow = pRow;
+ pIter->pTSchema = pTSchema;
+ pIter->iTColumn = 0;
+
+ if (pRow->flag == HAS_NONE || pRow->flag == HAS_NULL) goto _exit;
+ if (pRow->flag & 0xf0) {
+ pIter->iCol = 0;
+ pIter->pIdx = (SKVIdx *)pRow->data;
+ if (pRow->flag & KV_FLG_LIT) {
+ pIter->pv = pIter->pIdx->idx + pIter->pIdx->nCol;
+ } else if (pRow->flag & KV_FLG_MID) {
+ pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 1);
+ } else {
+ pIter->pv = pIter->pIdx->idx + (pIter->pIdx->nCol << 2);
+ }
+ } else {
+ switch (pRow->flag) {
+ case (HAS_NULL | HAS_NONE):
+ pIter->pb = pRow->data;
+ break;
+ case HAS_VALUE:
+ pIter->pf = pRow->data;
+ pIter->pv = pIter->pf + pTSchema->flen;
+ break;
+ case (HAS_VALUE | HAS_NONE):
+ case (HAS_VALUE | HAS_NULL):
+ pIter->pb = pRow->data;
+ pIter->pf = pRow->data + BIT1_SIZE(pTSchema->numOfCols - 1);
+ pIter->pv = pIter->pf + pTSchema->flen;
+ break;
+ case (HAS_VALUE | HAS_NULL | HAS_NONE):
+ pIter->pb = pRow->data;
+ pIter->pf = pRow->data + BIT2_SIZE(pTSchema->numOfCols - 1);
+ pIter->pv = pIter->pf + pTSchema->flen;
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
_exit:
+ if (code) {
+ *ppIter = NULL;
+ if (pIter) taosMemoryFree(pIter);
+ } else {
+ *ppIter = pIter;
+ }
return code;
}
-#endif
-int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow) {
- int32_t n = 0;
- TSROW_LEN(pRow, n);
- if (p) {
- memcpy(p, pRow, n);
+void tRowIterClose(SRowIter **ppIter) {
+ SRowIter *pIter = *ppIter;
+ if (pIter) {
+ taosMemoryFree(pIter);
}
-
- return n;
+ *ppIter = NULL;
}
-int32_t tGetTSRow(uint8_t *p, STSRow2 **ppRow) {
- int32_t n = 0;
+SColVal *tRowIterNext(SRowIter *pIter) {
+ if (pIter->iTColumn >= pIter->pTSchema->numOfCols) {
+ return NULL;
+ }
- *ppRow = (STSRow2 *)p;
- TSROW_LEN(*ppRow, n);
+ STColumn *pTColumn = pIter->pTSchema->columns + pIter->iTColumn;
- return n;
-}
+ // timestamp
+ if (0 == pIter->iTColumn) {
+ pIter->cv.cid = pTColumn->colId;
+ pIter->cv.type = pTColumn->type;
+ pIter->cv.flag = CV_FLAG_VALUE;
+ memcpy(&pIter->cv.value.val, &pIter->pRow->ts, sizeof(TSKEY));
+ goto _exit;
+ }
-// STSchema ========================================
-int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t ncols, STSchema **ppTSchema) {
- *ppTSchema = (STSchema *)taosMemoryMalloc(sizeof(STSchema) + sizeof(STColumn) * ncols);
- if (*ppTSchema == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
+ if (pIter->pRow->flag == HAS_NONE) {
+ pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
+ goto _exit;
+ }
+
+ if (pIter->pRow->flag == HAS_NULL) {
+ pIter->cv = COL_VAL_NULL(pTColumn->type, pTColumn->colId);
+ goto _exit;
}
- (*ppTSchema)->numOfCols = ncols;
- (*ppTSchema)->version = sver;
- (*ppTSchema)->flen = 0;
- (*ppTSchema)->vlen = 0;
- (*ppTSchema)->tlen = 0;
+ if (pIter->pRow->flag & 0xf0) { // KV
+ if (pIter->iCol < pIter->pIdx->nCol) {
+ uint8_t *pData;
- for (int32_t iCol = 0; iCol < ncols; iCol++) {
- SSchema *pColumn = &pSchema[iCol];
- STColumn *pTColumn = &((*ppTSchema)->columns[iCol]);
+ if (pIter->pRow->flag & KV_FLG_LIT) {
+ pData = pIter->pv + ((uint8_t *)pIter->pIdx->idx)[pIter->iCol];
+ } else if (pIter->pRow->flag & KV_FLG_MID) {
+ pData = pIter->pv + ((uint16_t *)pIter->pIdx->idx)[pIter->iCol];
+ } else {
+ pData = pIter->pv + ((uint32_t *)pIter->pIdx->idx)[pIter->iCol];
+ }
+
+ int16_t cid;
+ pData += tGetI16v(pData, &cid);
- pTColumn->colId = pColumn->colId;
- pTColumn->type = pColumn->type;
- pTColumn->flags = pColumn->flags;
- pTColumn->bytes = pColumn->bytes;
- pTColumn->offset = (*ppTSchema)->flen;
+ if (TABS(cid) == pTColumn->colId) {
+ if (cid < 0) {
+ pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
+ } else {
+ pIter->cv.cid = pTColumn->colId;
+ pIter->cv.type = pTColumn->type;
+ pIter->cv.flag = CV_FLAG_VALUE;
- // skip first column
- if (iCol) {
- (*ppTSchema)->flen += TYPE_BYTES[pColumn->type];
- if (IS_VAR_DATA_TYPE(pColumn->type)) {
- (*ppTSchema)->vlen += (pColumn->bytes + 5);
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ pData += tGetU32v(pData, &pIter->cv.value.nData);
+ if (pIter->cv.value.nData > 0) {
+ pIter->cv.value.pData = pData;
+ } else {
+ pIter->cv.value.pData = NULL;
+ }
+ } else {
+ memcpy(&pIter->cv.value.val, pData, pTColumn->bytes);
+ }
+ }
+
+ pIter->iCol++;
+ goto _exit;
+ } else if (TABS(cid) > pTColumn->colId) {
+ pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
+ goto _exit;
+ } else {
+ ASSERT(0);
}
+ } else {
+ pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
+ goto _exit;
}
+ } else { // Tuple
+ uint8_t bv = ROW_BIT_VALUE;
+ if (pIter->pb) {
+ switch (pIter->pRow->flag) {
+ case (HAS_NULL | HAS_NONE):
+ bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
+ break;
+ case (HAS_VALUE | HAS_NONE):
+ bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1);
+ if (bv) bv++;
+ break;
+ case (HAS_VALUE | HAS_NULL):
+ bv = GET_BIT1(pIter->pb, pIter->iTColumn - 1) + 1;
+ break;
+ case (HAS_VALUE | HAS_NULL | HAS_NONE):
+ bv = GET_BIT2(pIter->pb, pIter->iTColumn - 1);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+
+ if (bv == ROW_BIT_NONE) {
+ pIter->cv = COL_VAL_NONE(pTColumn->colId, pTColumn->type);
+ goto _exit;
+ } else if (bv == ROW_BIT_NULL) {
+ pIter->cv = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
+ goto _exit;
+ }
+ }
+
+ pIter->cv.cid = pTColumn->colId;
+ pIter->cv.type = pTColumn->type;
+ pIter->cv.flag = CV_FLAG_VALUE;
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ uint8_t *pData = pIter->pv + *(int32_t *)(pIter->pf + pTColumn->offset);
+ pData += tGetU32v(pData, &pIter->cv.value.nData);
+ if (pIter->cv.value.nData > 0) {
+ pIter->cv.value.pData = pData;
+ } else {
+ pIter->cv.value.pData = NULL;
+ }
+ } else {
+ memcpy(&pIter->cv.value.val, pIter->pv + pTColumn->offset, pTColumn->bytes);
+ }
+ goto _exit;
}
- return 0;
+_exit:
+ pIter->iTColumn++;
+ return &pIter->cv;
}
-void tTSchemaDestroy(STSchema *pTSchema) {
- if (pTSchema) taosMemoryFree(pTSchema);
-}
+// STSchema ========================================
// STag ========================================
static int tTagValCmprFn(const void *p1, const void *p2) {
@@ -1042,7 +1108,6 @@ void tdResetTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version) {
pBuilder->nCols = 0;
pBuilder->tlen = 0;
pBuilder->flen = 0;
- pBuilder->vlen = 0;
pBuilder->version = version;
}
@@ -1061,24 +1126,21 @@ int32_t tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int8_t flags, c
pCol->colId = colId;
pCol->flags = flags;
if (pBuilder->nCols == 0) {
- pCol->offset = 0;
+ pCol->offset = -1;
} else {
- STColumn *pTCol = &(pBuilder->columns[pBuilder->nCols - 1]);
- pCol->offset = pTCol->offset + TYPE_BYTES[pTCol->type];
+ pCol->offset = pBuilder->flen;
+ pBuilder->flen += TYPE_BYTES[type];
}
if (IS_VAR_DATA_TYPE(type)) {
pCol->bytes = bytes;
pBuilder->tlen += (TYPE_BYTES[type] + bytes);
- pBuilder->vlen += bytes - sizeof(VarDataLenT);
} else {
pCol->bytes = TYPE_BYTES[type];
pBuilder->tlen += TYPE_BYTES[type];
- pBuilder->vlen += TYPE_BYTES[type];
}
pBuilder->nCols++;
- pBuilder->flen += TYPE_BYTES[type];
ASSERT(pCol->offset < pBuilder->flen);
@@ -1097,7 +1159,6 @@ STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder) {
pSchema->numOfCols = pBuilder->nCols;
pSchema->tlen = pBuilder->tlen;
pSchema->flen = pBuilder->flen;
- pSchema->vlen = pBuilder->vlen;
#ifdef TD_SUPPORT_BITMAP
pSchema->tlen += (int)TD_BITMAP_BYTES(pSchema->numOfCols);
@@ -1110,6 +1171,43 @@ STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder) {
#endif
+STSchema *tBuildTSchema(SSchema *aSchema, int32_t numOfCols, int32_t version) {
+ STSchema *pTSchema = taosMemoryCalloc(1, sizeof(STSchema) + sizeof(STColumn) * numOfCols);
+ if (pTSchema == NULL) return NULL;
+
+ pTSchema->numOfCols = numOfCols;
+ pTSchema->version = version;
+
+ // timestamp column
+ ASSERT(aSchema[0].type == TSDB_DATA_TYPE_TIMESTAMP);
+ ASSERT(aSchema[0].colId == PRIMARYKEY_TIMESTAMP_COL_ID);
+ pTSchema->columns[0].colId = aSchema[0].colId;
+ pTSchema->columns[0].type = aSchema[0].type;
+ pTSchema->columns[0].flags = aSchema[0].flags;
+ pTSchema->columns[0].bytes = aSchema[0].bytes;
+ pTSchema->columns[0].offset = -1;
+
+ // other columns
+ for (int32_t iCol = 1; iCol < numOfCols; iCol++) {
+ SSchema *pSchema = &aSchema[iCol];
+ STColumn *pTColumn = &pTSchema->columns[iCol];
+
+ pTColumn->colId = pSchema->colId;
+ pTColumn->type = pSchema->type;
+ pTColumn->flags = pSchema->flags;
+ pTColumn->bytes = pSchema->bytes;
+ pTColumn->offset = pTSchema->flen;
+
+ pTSchema->flen += TYPE_BYTES[pTColumn->type];
+ }
+
+ return pTSchema;
+}
+
+void tDestroyTSchema(STSchema *pTSchema) {
+ if (pTSchema) taosMemoryFree(pTSchema);
+}
+
// SColData ========================================
void tColDataDestroy(void *ph) {
SColData *pColData = (SColData *)ph;
@@ -1496,7 +1594,7 @@ static FORCE_INLINE void tColDataGetValue4(SColData *pColData, int32_t iVal, SCo
}
value.pData = pColData->pData + pColData->aOffset[iVal];
} else {
- tGetValue(pColData->pData + tDataTypes[pColData->type].bytes * iVal, &value, pColData->type);
+ memcpy(&value.val, pColData->pData + tDataTypes[pColData->type].bytes * iVal, tDataTypes[pColData->type].bytes);
}
*pColVal = COL_VAL_VALUE(pColData->cid, pColData->type, value);
}
diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c
index f2d8b9aa7c3460c035db7dfcee82f76eb62749d5..7e9b28939bc84094f2f091ad59869b889e3cd632 100644
--- a/source/common/src/tglobal.c
+++ b/source/common/src/tglobal.c
@@ -15,11 +15,10 @@
#define _DEFAULT_SOURCE
#include "tglobal.h"
-#include "tcompare.h"
#include "tconfig.h"
-#include "tdatablock.h"
#include "tgrant.h"
#include "tlog.h"
+#include "tmisce.h"
GRANT_CFG_DECLARE;
@@ -56,6 +55,11 @@ int32_t tsNumOfQnodeFetchThreads = 1;
int32_t tsNumOfSnodeStreamThreads = 4;
int32_t tsNumOfSnodeWriteThreads = 1;
+// sync raft
+int32_t tsElectInterval = 25 * 1000;
+int32_t tsHeartbeatInterval = 1000;
+int32_t tsHeartbeatTimeout = 20 * 1000;
+
// monitor
bool tsEnableMonitor = true;
int32_t tsMonitorInterval = 30;
@@ -75,7 +79,8 @@ 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.
// true means that the name and order of cols in each line are the same(only for influx protocol)
-bool tsSmlDataFormat = false;
+bool tsSmlDataFormat = false;
+int32_t tsSmlBatchSize = 10000;
// query
int32_t tsQueryPolicy = 1;
@@ -87,6 +92,10 @@ bool tsQueryPlannerTrace = false;
int32_t tsQueryNodeChunkSize = 32 * 1024;
bool tsQueryUseNodeAllocator = true;
bool tsKeepColumnName = false;
+int32_t tsRedirectPeriod = 10;
+int32_t tsRedirectFactor = 2;
+int32_t tsRedirectMaxPeriod = 1000;
+int32_t tsMaxRetryWaitTime = 10000;
/*
* denote if the server needs to compress response message at the application layer to client, including query rsp,
@@ -120,6 +129,9 @@ int32_t tsMinIntervalTime = 1;
// maximum memory allowed to be allocated for a single csv load (in MB)
int32_t tsMaxMemUsedByInsert = 1024;
+float tsSelectivityRatio = 1.0;
+int32_t tsTagFilterResCacheSize = 1024 * 10;
+
// the maximum allowed query buffer size during query processing for each data node.
// -1 no limit (default)
// 0 no query allowed, queries are disabled
@@ -160,6 +172,7 @@ int64_t tsWalFsyncDataSizeLimit = (100 * 1024 * 1024L);
// internal
int32_t tsTransPullupInterval = 2;
int32_t tsMqRebalanceInterval = 2;
+int32_t tsStreamCheckpointTickInterval = 1;
int32_t tsTtlUnit = 86400;
int32_t tsTtlPushInterval = 86400;
int32_t tsGrantHBInterval = 60;
@@ -190,9 +203,7 @@ int32_t taosSetTfsCfg(SConfig *pCfg) {
int32_t taosSetTfsCfg(SConfig *pCfg);
#endif
-struct SConfig *taosGetCfg() {
- return tsCfg;
-}
+struct SConfig *taosGetCfg() { return tsCfg; }
static int32_t taosLoadCfg(SConfig *pCfg, const char **envCmd, const char *inputCfgDir, const char *envFile,
char *apolloUrl) {
@@ -300,12 +311,17 @@ 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, "smlBatchSize", tsSmlBatchSize, 1, INT32_MAX, true) != 0) return -1;
if (cfgAddInt32(pCfg, "maxMemUsedByInsert", tsMaxMemUsedByInsert, 1, INT32_MAX, true) != 0) return -1;
if (cfgAddInt32(pCfg, "rpcRetryLimit", tsRpcRetryLimit, 1, 100000, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "rpcRetryInterval", tsRpcRetryInterval, 1, 100000, 0) != 0) return -1;
+ if (cfgAddInt32(pCfg, "maxRetryWaitTime", tsMaxRetryWaitTime, 0, 86400000, 0) != 0) return -1;
tsNumOfTaskQueueThreads = tsNumOfCores / 2;
tsNumOfTaskQueueThreads = TMAX(tsNumOfTaskQueueThreads, 4);
+ if (tsNumOfTaskQueueThreads >= 10) {
+ tsNumOfTaskQueueThreads = 10;
+ }
if (cfgAddInt32(pCfg, "numOfTaskQueueThreads", tsNumOfTaskQueueThreads, 4, 1024, 0) != 0) return -1;
return 0;
@@ -317,8 +333,16 @@ static int32_t taosAddSystemCfg(SConfig *pCfg) {
if (cfgAddTimezone(pCfg, "timezone", tsTimezoneStr) != 0) return -1;
if (cfgAddLocale(pCfg, "locale", tsLocale) != 0) return -1;
if (cfgAddCharset(pCfg, "charset", tsCharset) != 0) return -1;
+ if (cfgAddBool(pCfg, "assert", 1, 1) != 0) return -1;
if (cfgAddBool(pCfg, "enableCoreFile", 1, 1) != 0) return -1;
- if (cfgAddFloat(pCfg, "numOfCores", tsNumOfCores, 0, 100000, 1) != 0) return -1;
+ if (cfgAddFloat(pCfg, "numOfCores", tsNumOfCores, 1, 100000, 1) != 0) return -1;
+
+ if (cfgAddBool(pCfg, "SSE42", tsSSE42Enable, 0) != 0) return -1;
+ if (cfgAddBool(pCfg, "AVX", tsAVXEnable, 0) != 0) return -1;
+ if (cfgAddBool(pCfg, "AVX2", tsAVX2Enable, 0) != 0) return -1;
+ if (cfgAddBool(pCfg, "FMA", tsFMAEnable, 0) != 0) return -1;
+ if (cfgAddBool(pCfg, "SIMD-Supported", tsSIMDEnable, 0) != 0) return -1;
+
if (cfgAddInt64(pCfg, "openMax", tsOpenMax, 0, INT64_MAX, 1) != 0) return -1;
if (cfgAddInt64(pCfg, "streamMax", tsStreamMax, 0, INT64_MAX, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "pageSizeKB", tsPageSizeKB, 0, INT64_MAX, 1) != 0) return -1;
@@ -384,7 +408,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
tsNumOfQnodeQueryThreads = tsNumOfCores * 2;
tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 4);
- if (cfgAddInt32(pCfg, "numOfQnodeQueryThreads", tsNumOfQnodeQueryThreads, 1, 1024, 0) != 0) return -1;
+ if (cfgAddInt32(pCfg, "numOfQnodeQueryThreads", tsNumOfQnodeQueryThreads, 4, 1024, 0) != 0) return -1;
// tsNumOfQnodeFetchThreads = tsNumOfCores / 2;
// tsNumOfQnodeFetchThreads = TMAX(tsNumOfQnodeFetchThreads, 4);
@@ -403,6 +427,10 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
if (cfgAddInt64(pCfg, "rpcQueueMemoryAllowed", tsRpcQueueMemoryAllowed, TSDB_MAX_MSG_SIZE * 10L, INT64_MAX, 0) != 0)
return -1;
+ if (cfgAddInt32(pCfg, "syncElectInterval", tsElectInterval, 10, 1000 * 60 * 24 * 2, 0) != 0) return -1;
+ if (cfgAddInt32(pCfg, "syncHeartbeatInterval", tsHeartbeatInterval, 10, 1000 * 60 * 24 * 2, 0) != 0) return -1;
+ if (cfgAddInt32(pCfg, "syncHeartbeatTimeout", tsHeartbeatTimeout, 10, 1000 * 60 * 24 * 2, 0) != 0) return -1;
+
if (cfgAddBool(pCfg, "monitor", tsEnableMonitor, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "monitorInterval", tsMonitorInterval, 1, 200000, 0) != 0) return -1;
if (cfgAddString(pCfg, "monitorFqdn", tsMonitorFqdn, 0) != 0) return -1;
@@ -631,6 +659,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
tstrncpy(tsSmlTagName, cfgGetItem(pCfg, "smlTagName")->str, TSDB_COL_NAME_LEN);
tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval;
+ tsSmlBatchSize = cfgGetItem(pCfg, "smlBatchSize")->i32;
tsMaxMemUsedByInsert = cfgGetItem(pCfg, "maxMemUsedByInsert")->i32;
tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32;
@@ -647,6 +676,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
tsRpcRetryLimit = cfgGetItem(pCfg, "rpcRetryLimit")->i32;
tsRpcRetryInterval = cfgGetItem(pCfg, "rpcRetryInterval")->i32;
+ tsMaxRetryWaitTime = cfgGetItem(pCfg, "maxRetryWaitTime")->i32;
return 0;
}
@@ -664,6 +694,8 @@ static void taosSetSystemCfg(SConfig *pCfg) {
bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval;
taosSetCoreDump(enableCore);
+ tsAssert = cfgGetItem(pCfg, "assert")->bval;
+
// todo
tsVersion = 30000000;
}
@@ -706,6 +738,10 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
tstrncpy(tsTelemServer, cfgGetItem(pCfg, "telemetryServer")->str, TSDB_FQDN_LEN);
tsTelemPort = (uint16_t)cfgGetItem(pCfg, "telemetryPort")->i32;
+ tsElectInterval = cfgGetItem(pCfg, "syncElectInterval")->i32;
+ tsHeartbeatInterval = cfgGetItem(pCfg, "syncHeartbeatInterval")->i32;
+ tsHeartbeatTimeout = cfgGetItem(pCfg, "syncHeartbeatTimeout")->i32;
+
tsTransPullupInterval = cfgGetItem(pCfg, "transPullupInterval")->i32;
tsMqRebalanceInterval = cfgGetItem(pCfg, "mqRebalanceInterval")->i32;
tsTtlUnit = cfgGetItem(pCfg, "ttlUnit")->i32;
@@ -715,6 +751,10 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
tsWalFsyncDataSizeLimit = cfgGetItem(pCfg, "walFsyncDataSizeLimit")->i64;
+ tsElectInterval = cfgGetItem(pCfg, "syncElectInterval")->i32;
+ tsHeartbeatInterval = cfgGetItem(pCfg, "syncHeartbeatInterval")->i32;
+ tsHeartbeatTimeout = cfgGetItem(pCfg, "syncHeartbeatTimeout")->i32;
+
tsStartUdfd = cfgGetItem(pCfg, "udf")->bval;
tstrncpy(tsUdfdResFuncs, cfgGetItem(pCfg, "udfdResFuncs")->str, sizeof(tsUdfdResFuncs));
tstrncpy(tsUdfdLdLibPath, cfgGetItem(pCfg, "udfdLdLibPath")->str, sizeof(tsUdfdLdLibPath));
@@ -751,6 +791,8 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
case 'a': {
if (strcasecmp("asyncLog", name) == 0) {
tsAsyncLog = cfgGetItem(pCfg, "asyncLog")->bval;
+ } else if (strcasecmp("assert", name) == 0) {
+ tsAssert = cfgGetItem(pCfg, "assert")->bval;
}
break;
}
@@ -862,6 +904,8 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
tsMaxNumOfDistinctResults = cfgGetItem(pCfg, "maxNumOfDistinctRes")->i32;
} else if (strcasecmp("maxMemUsedByInsert", name) == 0) {
tsMaxMemUsedByInsert = cfgGetItem(pCfg, "maxMemUsedByInsert")->i32;
+ } else if (strcasecmp("maxRetryWaitTime", name) == 0) {
+ tsMaxRetryWaitTime = cfgGetItem(pCfg, "maxRetryWaitTime")->i32;
}
break;
}
@@ -1001,6 +1045,8 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
tstrncpy(tsSmlTagName, cfgGetItem(pCfg, "smlTagName")->str, TSDB_COL_NAME_LEN);
} else if (strcasecmp("smlDataFormat", name) == 0) {
tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval;
+ } else if (strcasecmp("smlBatchSize", name) == 0) {
+ tsSmlBatchSize = cfgGetItem(pCfg, "smlBatchSize")->i32;
} else if (strcasecmp("shellActivityTimer", name) == 0) {
tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32;
} else if (strcasecmp("supportVnodes", name) == 0) {
diff --git a/source/common/src/tmisce.c b/source/common/src/tmisce.c
index dfaebc99f682301ce788a343e50331b9a6be93a7..dfb1917fcfbeddf5814a6689bba8864be44c180e 100644
--- a/source/common/src/tmisce.c
+++ b/source/common/src/tmisce.c
@@ -14,7 +14,7 @@
*/
#define _DEFAULT_SOURCE
-#include "tdatablock.h"
+#include "tmisce.h"
#include "tglobal.h"
#include "tlog.h"
#include "tname.h"
diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c
index 35900638dd9f3b1c03f13744ce1ceb0f48a11129..95625e8d9360946fbcf1432f804ec7841e006dfc 100644
--- a/source/common/src/tmsg.c
+++ b/source/common/src/tmsg.c
@@ -28,6 +28,8 @@
#undef TD_MSG_SEG_CODE_
#include "tmsgdef.h"
+#include "tlog.h"
+
int32_t tInitSubmitMsgIter(const SSubmitReq *pMsg, SSubmitMsgIter *pIter) {
if (pMsg == NULL) {
terrno = TSDB_CODE_TDB_SUBMIT_MSG_MSSED_UP;
@@ -551,6 +553,8 @@ int32_t tSerializeSMCreateStbReq(void *buf, int32_t bufLen, SMCreateStbReq *pReq
if (pReq->ast2Len > 0) {
if (tEncodeBinary(&encoder, pReq->pAst2, pReq->ast2Len) < 0) return -1;
}
+ if (tEncodeI64(&encoder, pReq->deleteMark1) < 0) return -1;
+ if (tEncodeI64(&encoder, pReq->deleteMark2) < 0) return -1;
tEndEncode(&encoder);
@@ -644,6 +648,9 @@ int32_t tDeserializeSMCreateStbReq(void *buf, int32_t bufLen, SMCreateStbReq *pR
if (tDecodeCStrTo(&decoder, pReq->pAst2) < 0) return -1;
}
+ if (tDecodeI64(&decoder, &pReq->deleteMark1) < 0) return -1;
+ if (tDecodeI64(&decoder, &pReq->deleteMark2) < 0) return -1;
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
return 0;
@@ -822,6 +829,7 @@ int32_t tSerializeSMCreateSmaReq(void *buf, int32_t bufLen, SMCreateSmaReq *pReq
if (pReq->astLen > 0) {
if (tEncodeBinary(&encoder, pReq->ast, pReq->astLen) < 0) return -1;
}
+ if (tEncodeI64(&encoder, pReq->deleteMark) < 0) return -1;
tEndEncode(&encoder);
int32_t tlen = encoder.pos;
@@ -870,7 +878,7 @@ int32_t tDeserializeSMCreateSmaReq(void *buf, int32_t bufLen, SMCreateSmaReq *pR
if (pReq->ast == NULL) return -1;
if (tDecodeCStrTo(&decoder, pReq->ast) < 0) return -1;
}
-
+ if (tDecodeI64(&decoder, &pReq->deleteMark) < 0) return -1;
tEndDecode(&decoder);
tDecoderClear(&decoder);
return 0;
@@ -992,15 +1000,20 @@ int32_t tSerializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) {
if (tEncodeI32(&encoder, vlen) < 0) return -1;
for (int32_t i = 0; i < vlen; ++i) {
SVnodeLoad *pload = taosArrayGet(pReq->pVloads, i);
+ int64_t reserved = 0;
if (tEncodeI32(&encoder, pload->vgId) < 0) return -1;
if (tEncodeI8(&encoder, pload->syncState) < 0) return -1;
if (tEncodeI8(&encoder, pload->syncRestore) < 0) return -1;
+ if (tEncodeI8(&encoder, pload->syncCanRead) < 0) return -1;
if (tEncodeI64(&encoder, pload->cacheUsage) < 0) return -1;
if (tEncodeI64(&encoder, pload->numOfTables) < 0) return -1;
if (tEncodeI64(&encoder, pload->numOfTimeSeries) < 0) return -1;
if (tEncodeI64(&encoder, pload->totalStorage) < 0) return -1;
if (tEncodeI64(&encoder, pload->compStorage) < 0) return -1;
if (tEncodeI64(&encoder, pload->pointsWritten) < 0) return -1;
+ if (tEncodeI64(&encoder, reserved) < 0) return -1;
+ if (tEncodeI64(&encoder, reserved) < 0) return -1;
+ if (tEncodeI64(&encoder, reserved) < 0) return -1;
}
// mnode loads
@@ -1065,15 +1078,20 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) {
for (int32_t i = 0; i < vlen; ++i) {
SVnodeLoad vload = {0};
+ int64_t reserved = 0;
if (tDecodeI32(&decoder, &vload.vgId) < 0) return -1;
if (tDecodeI8(&decoder, &vload.syncState) < 0) return -1;
if (tDecodeI8(&decoder, &vload.syncRestore) < 0) return -1;
+ if (tDecodeI8(&decoder, &vload.syncCanRead) < 0) return -1;
if (tDecodeI64(&decoder, &vload.cacheUsage) < 0) return -1;
if (tDecodeI64(&decoder, &vload.numOfTables) < 0) return -1;
if (tDecodeI64(&decoder, &vload.numOfTimeSeries) < 0) return -1;
if (tDecodeI64(&decoder, &vload.totalStorage) < 0) return -1;
if (tDecodeI64(&decoder, &vload.compStorage) < 0) return -1;
if (tDecodeI64(&decoder, &vload.pointsWritten) < 0) return -1;
+ if (tDecodeI64(&decoder, &reserved) < 0) return -1;
+ if (tDecodeI64(&decoder, &reserved) < 0) return -1;
+ if (tDecodeI64(&decoder, &reserved) < 0) return -1;
if (taosArrayPush(pReq->pVloads, &vload) == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
@@ -1288,7 +1306,7 @@ int32_t tSerializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq)
if (tEncodeI8(&encoder, pReq->enable) < 0) return -1;
if (tEncodeCStr(&encoder, pReq->user) < 0) return -1;
if (tEncodeCStr(&encoder, pReq->pass) < 0) return -1;
- if (tEncodeCStr(&encoder, pReq->dbname) < 0) return -1;
+ if (tEncodeCStr(&encoder, pReq->objname) < 0) return -1;
tEndEncode(&encoder);
int32_t tlen = encoder.pos;
@@ -1307,7 +1325,7 @@ int32_t tDeserializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq
if (tDecodeI8(&decoder, &pReq->enable) < 0) return -1;
if (tDecodeCStrTo(&decoder, pReq->user) < 0) return -1;
if (tDecodeCStrTo(&decoder, pReq->pass) < 0) return -1;
- if (tDecodeCStrTo(&decoder, pReq->dbname) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pReq->objname) < 0) return -1;
tEndDecode(&decoder);
tDecoderClear(&decoder);
@@ -2537,24 +2555,22 @@ int32_t tDeserializeSUseDbRspImp(SDecoder *pDecoder, SUseDbRsp *pRsp) {
if (tDecodeI16(pDecoder, &pRsp->hashSuffix) < 0) return -1;
if (tDecodeI8(pDecoder, &pRsp->hashMethod) < 0) return -1;
- if (pRsp->vgNum <= 0) {
- return 0;
- }
-
- pRsp->pVgroupInfos = taosArrayInit(pRsp->vgNum, sizeof(SVgroupInfo));
- if (pRsp->pVgroupInfos == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
+ if (pRsp->vgNum > 0) {
+ pRsp->pVgroupInfos = taosArrayInit(pRsp->vgNum, sizeof(SVgroupInfo));
+ if (pRsp->pVgroupInfos == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
- for (int32_t i = 0; i < pRsp->vgNum; ++i) {
- SVgroupInfo vgInfo = {0};
- if (tDecodeI32(pDecoder, &vgInfo.vgId) < 0) return -1;
- if (tDecodeU32(pDecoder, &vgInfo.hashBegin) < 0) return -1;
- if (tDecodeU32(pDecoder, &vgInfo.hashEnd) < 0) return -1;
- if (tDecodeSEpSet(pDecoder, &vgInfo.epSet) < 0) return -1;
- if (tDecodeI32(pDecoder, &vgInfo.numOfTable) < 0) return -1;
- taosArrayPush(pRsp->pVgroupInfos, &vgInfo);
+ for (int32_t i = 0; i < pRsp->vgNum; ++i) {
+ SVgroupInfo vgInfo = {0};
+ if (tDecodeI32(pDecoder, &vgInfo.vgId) < 0) return -1;
+ if (tDecodeU32(pDecoder, &vgInfo.hashBegin) < 0) return -1;
+ if (tDecodeU32(pDecoder, &vgInfo.hashEnd) < 0) return -1;
+ if (tDecodeSEpSet(pDecoder, &vgInfo.epSet) < 0) return -1;
+ if (tDecodeI32(pDecoder, &vgInfo.numOfTable) < 0) return -1;
+ taosArrayPush(pRsp->pVgroupInfos, &vgInfo);
+ }
}
if (tDecodeI32(pDecoder, &pRsp->errCode) < 0) return -1;
@@ -3740,6 +3756,31 @@ int32_t tDeserializeSMTimerMsg(void *buf, int32_t bufLen, SMTimerReq *pReq) {
return 0;
}
+int32_t tSerializeSMStreamTickMsg(void *buf, int32_t bufLen, SMStreamTickReq *pReq) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+
+ if (tStartEncode(&encoder) < 0) return -1;
+ if (tEncodeI64(&encoder, pReq->tick) < 0) return -1;
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+ return tlen;
+}
+
+int32_t tDeserializeSMStreamTickMsg(void *buf, int32_t bufLen, SMStreamTickReq *pReq) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+ if (tDecodeI64(&decoder, &pReq->tick) < 0) return -1;
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
int32_t tEncodeSReplica(SEncoder *pEncoder, SReplica *pReplica) {
if (tEncodeI32(pEncoder, pReplica->id) < 0) return -1;
if (tEncodeU16(pEncoder, pReplica->port) < 0) return -1;
@@ -4498,7 +4539,7 @@ int32_t tDeserializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq) {
if (num <= 0) {
pReq->pMsgs = NULL;
tEndDecode(&decoder);
-
+
tDecoderClear(&decoder);
return 0;
}
@@ -4513,7 +4554,7 @@ int32_t tDeserializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq) {
if (tDecodeBinaryAlloc(&decoder, &msg.msg, NULL) < 0) return -1;
if (NULL == taosArrayPush(pReq->pMsgs, &msg)) return -1;
}
-
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
@@ -4555,7 +4596,7 @@ int32_t tDeserializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp) {
if (num <= 0) {
pRsp->pRsps = NULL;
tEndDecode(&decoder);
-
+
tDecoderClear(&decoder);
return 0;
}
@@ -4571,14 +4612,13 @@ int32_t tDeserializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp) {
if (tDecodeBinaryAlloc(&decoder, &msg.msg, NULL) < 0) return -1;
if (NULL == taosArrayPush(pRsp->pRsps, &msg)) return -1;
}
-
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
return 0;
}
-
int32_t tSerializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq) {
SEncoder encoder = {0};
tEncoderInit(&encoder, buf, bufLen);
@@ -4605,7 +4645,7 @@ int32_t tDeserializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq) {
if (tDecodeI64(&decoder, &pReq->consumerId) < 0) return -1;
if (tDecodeI32(&decoder, &pReq->epoch) < 0) return -1;
if (tDecodeCStrTo(&decoder, pReq->cgroup) < 0) return -1;
-
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
@@ -4636,7 +4676,7 @@ int32_t tDeserializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq) {
if (tDecodeI64(&decoder, &pReq->consumerId) < 0) return -1;
if (tDecodeI32(&decoder, &pReq->epoch) < 0) return -1;
-
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
@@ -4666,7 +4706,7 @@ int32_t tSerializeSSubQueryMsg(void *buf, int32_t bufLen, SSubQueryMsg *pReq) {
if (tEncodeU32(&encoder, pReq->sqlLen) < 0) return -1;
if (tEncodeCStrWithLen(&encoder, pReq->sql, pReq->sqlLen) < 0) return -1;
if (tEncodeU32(&encoder, pReq->msgLen) < 0) return -1;
- if (tEncodeBinary(&encoder, (uint8_t*)pReq->msg, pReq->msgLen) < 0) return -1;
+ if (tEncodeBinary(&encoder, (uint8_t *)pReq->msg, pReq->msgLen) < 0) return -1;
tEndEncode(&encoder);
@@ -4706,8 +4746,8 @@ int32_t tDeserializeSSubQueryMsg(void *buf, int32_t bufLen, SSubQueryMsg *pReq)
if (tDecodeU32(&decoder, &pReq->sqlLen) < 0) return -1;
if (tDecodeCStrAlloc(&decoder, &pReq->sql) < 0) return -1;
if (tDecodeU32(&decoder, &pReq->msgLen) < 0) return -1;
- if (tDecodeBinaryAlloc(&decoder, (void**)&pReq->msg, NULL) < 0) return -1;
-
+ if (tDecodeBinaryAlloc(&decoder, (void **)&pReq->msg, NULL) < 0) return -1;
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
@@ -4723,6 +4763,136 @@ void tFreeSSubQueryMsg(SSubQueryMsg *pReq) {
taosMemoryFreeClear(pReq->msg);
}
+int32_t tSerializeSResFetchReq(void *buf, int32_t bufLen, SResFetchReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+ if (buf != NULL) {
+ buf = (char *)buf + headLen;
+ bufLen -= headLen;
+ }
+
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeU64(&encoder, pReq->sId) < 0) return -1;
+ if (tEncodeU64(&encoder, pReq->queryId) < 0) return -1;
+ if (tEncodeU64(&encoder, pReq->taskId) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->execId) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ if (buf != NULL) {
+ SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
+ pHead->vgId = htonl(pReq->header.vgId);
+ pHead->contLen = htonl(tlen + headLen);
+ }
+
+ return tlen + headLen;
+}
+
+int32_t tDeserializeSResFetchReq(void *buf, int32_t bufLen, SResFetchReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+
+ SMsgHead *pHead = buf;
+ pHead->vgId = pReq->header.vgId;
+ pHead->contLen = pReq->header.contLen;
+
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf + headLen, bufLen - headLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeU64(&decoder, &pReq->sId) < 0) return -1;
+ if (tDecodeU64(&decoder, &pReq->queryId) < 0) return -1;
+ if (tDecodeU64(&decoder, &pReq->taskId) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->execId) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+int32_t tSerializeSTqOffsetVal(SEncoder *pEncoder, STqOffsetVal *pOffset) {
+ if (tEncodeI8(pEncoder, pOffset->type) < 0) return -1;
+ if (tEncodeI64(pEncoder, pOffset->uid) < 0) return -1;
+ if (tEncodeI64(pEncoder, pOffset->ts) < 0) return -1;
+
+ return 0;
+}
+
+int32_t tDerializeSTqOffsetVal(SDecoder *pDecoder, STqOffsetVal *pOffset) {
+ if (tDecodeI8(pDecoder, &pOffset->type) < 0) return -1;
+ if (tDecodeI64(pDecoder, &pOffset->uid) < 0) return -1;
+ if (tDecodeI64(pDecoder, &pOffset->ts) < 0) return -1;
+
+ return 0;
+}
+
+int32_t tSerializeSMqPollReq(void *buf, int32_t bufLen, SMqPollReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+ if (buf != NULL) {
+ buf = (char *)buf + headLen;
+ bufLen -= headLen;
+ }
+
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeCStr(&encoder, pReq->subKey) < 0) return -1;
+ if (tEncodeI8(&encoder, pReq->withTbName) < 0) return -1;
+ if (tEncodeI8(&encoder, pReq->useSnapshot) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->epoch) < 0) return -1;
+ if (tEncodeU64(&encoder, pReq->reqId) < 0) return -1;
+ if (tEncodeI64(&encoder, pReq->consumerId) < 0) return -1;
+ if (tEncodeI64(&encoder, pReq->timeout) < 0) return -1;
+ if (tSerializeSTqOffsetVal(&encoder, &pReq->reqOffset) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ if (buf != NULL) {
+ SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
+ pHead->vgId = htonl(pReq->head.vgId);
+ pHead->contLen = htonl(tlen + headLen);
+ }
+
+ return tlen + headLen;
+}
+
+int32_t tDeserializeSMqPollReq(void *buf, int32_t bufLen, SMqPollReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+
+ SMsgHead *pHead = buf;
+ pHead->vgId = pReq->head.vgId;
+ pHead->contLen = pReq->head.contLen;
+
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf + headLen, bufLen - headLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeCStrTo(&decoder, pReq->subKey) < 0) return -1;
+ if (tDecodeI8(&decoder, &pReq->withTbName) < 0) return -1;
+ if (tDecodeI8(&decoder, &pReq->useSnapshot) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->epoch) < 0) return -1;
+ if (tDecodeU64(&decoder, &pReq->reqId) < 0) return -1;
+ if (tDecodeI64(&decoder, &pReq->consumerId) < 0) return -1;
+ if (tDecodeI64(&decoder, &pReq->timeout) < 0) return -1;
+ if (tDerializeSTqOffsetVal(&decoder, &pReq->reqOffset) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
int32_t tSerializeSTaskDropReq(void *buf, int32_t bufLen, STaskDropReq *pReq) {
int32_t headLen = sizeof(SMsgHead);
if (buf != NULL) {
@@ -4771,7 +4941,7 @@ int32_t tDeserializeSTaskDropReq(void *buf, int32_t bufLen, STaskDropReq *pReq)
if (tDecodeU64(&decoder, &pReq->taskId) < 0) return -1;
if (tDecodeI64(&decoder, &pReq->refId) < 0) return -1;
if (tDecodeI32(&decoder, &pReq->execId) < 0) return -1;
-
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
@@ -4808,14 +4978,13 @@ int32_t tDeserializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pR
if (tDecodeI32(&decoder, &pRsp->sversion) < 0) return -1;
if (tDecodeI32(&decoder, &pRsp->tversion) < 0) return -1;
if (tDecodeI64(&decoder, &pRsp->affectedRows) < 0) return -1;
-
+
tEndDecode(&decoder);
tDecoderClear(&decoder);
return 0;
}
-
int32_t tSerializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq) {
int32_t headLen = sizeof(SMsgHead);
if (buf != NULL) {
@@ -6514,13 +6683,15 @@ void tDeleteSTaosxRsp(STaosxRsp *pRsp) {
int32_t tEncodeSSingleDeleteReq(SEncoder *pEncoder, const SSingleDeleteReq *pReq) {
if (tEncodeCStr(pEncoder, pReq->tbname) < 0) return -1;
- if (tEncodeI64(pEncoder, pReq->ts) < 0) return -1;
+ if (tEncodeI64(pEncoder, pReq->startTs) < 0) return -1;
+ if (tEncodeI64(pEncoder, pReq->endTs) < 0) return -1;
return 0;
}
int32_t tDecodeSSingleDeleteReq(SDecoder *pDecoder, SSingleDeleteReq *pReq) {
if (tDecodeCStrTo(pDecoder, pReq->tbname) < 0) return -1;
- if (tDecodeI64(pDecoder, &pReq->ts) < 0) return -1;
+ if (tDecodeI64(pDecoder, &pReq->startTs) < 0) return -1;
+ if (tDecodeI64(pDecoder, &pReq->endTs) < 0) return -1;
return 0;
}
diff --git a/source/common/src/tname.c b/source/common/src/tname.c
index 4d83b6e3d84bfd2ab123efd0720b90ebca18ce81..0d47ef1e7f70c791a32feaa6b4075bd9c625d69f 100644
--- a/source/common/src/tname.c
+++ b/source/common/src/tname.c
@@ -316,6 +316,7 @@ static int compareKv(const void* p1, const void* p2) {
void buildChildTableName(RandTableName* rName) {
SStringBuilder sb = {0};
taosStringBuilderAppendStringLen(&sb, rName->stbFullName, rName->stbFullNameLen);
+ if(sb.buf == NULL) return;
taosArraySort(rName->tags, compareKv);
for (int j = 0; j < taosArrayGetSize(rName->tags); ++j) {
taosStringBuilderAppendChar(&sb, ',');
diff --git a/source/common/src/trow.c b/source/common/src/trow.c
index d39d3c501a4c3df1afe4f1389865bd98906dacbd..ca2c0567439f22bcc77e23ae69065f065a275764 100644
--- a/source/common/src/trow.c
+++ b/source/common/src/trow.c
@@ -15,6 +15,7 @@
#define _DEFAULT_SOURCE
#include "trow.h"
+#include "tlog.h"
const uint8_t tdVTypeByte[2][3] = {{
// 2 bits
@@ -192,7 +193,7 @@ bool tdSTpRowGetVal(STSRow *pRow, col_id_t colId, col_type_t colType, int32_t fl
return true;
}
void *pBitmap = tdGetBitmapAddrTp(pRow, flen);
- tdGetTpRowValOfCol(pVal, pRow, pBitmap, colType, offset - sizeof(TSKEY), colIdx);
+ tdGetTpRowValOfCol(pVal, pRow, pBitmap, colType, offset, colIdx);
return true;
}
@@ -217,7 +218,7 @@ bool tdSTSRowIterFetch(STSRowIter *pIter, col_id_t colId, col_type_t colType, SC
return false;
}
}
- tdSTSRowIterGetTpVal(pIter, pCol->type, pCol->offset - sizeof(TSKEY), pVal);
+ tdSTSRowIterGetTpVal(pIter, pCol->type, pCol->offset, pVal);
++pIter->colIdx;
} else if (TD_IS_KV_ROW(pIter->pRow)) {
return tdSTSRowIterGetKvVal(pIter, colId, &pIter->kvIdx, pVal);
@@ -244,7 +245,7 @@ bool tdSTSRowIterNext(STSRowIter *pIter, SCellVal *pVal) {
}
if (TD_IS_TP_ROW(pIter->pRow)) {
- tdSTSRowIterGetTpVal(pIter, pCol->type, pCol->offset - sizeof(TSKEY), pVal);
+ tdSTSRowIterGetTpVal(pIter, pCol->type, pCol->offset, pVal);
} else if (TD_IS_KV_ROW(pIter->pRow)) {
tdSTSRowIterGetKvVal(pIter, pCol->colId, &pIter->kvIdx, pVal);
} else {
@@ -412,7 +413,9 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow) {
valType = TD_VTYPE_NULL;
} else if (IS_VAR_DATA_TYPE(pTColumn->type)) {
varDataSetLen(varBuf, pColVal->value.nData);
- memcpy(varDataVal(varBuf), pColVal->value.pData, pColVal->value.nData);
+ if (pColVal->value.nData != 0) {
+ memcpy(varDataVal(varBuf), pColVal->value.pData, pColVal->value.nData);
+ }
val = varBuf;
} else {
val = (const void *)&pColVal->value.val;
@@ -467,7 +470,7 @@ bool tdSTSRowGetVal(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCell
#ifdef TD_SUPPORT_BITMAP
colIdx = POINTER_DISTANCE(pCol, pSchema->columns) / sizeof(STColumn);
#endif
- tdGetTpRowValOfCol(pVal, pRow, pIter->pBitmap, pCol->type, pCol->offset - sizeof(TSKEY), colIdx - 1);
+ tdGetTpRowValOfCol(pVal, pRow, pIter->pBitmap, pCol->type, pCol->offset, colIdx - 1);
} else if (TD_IS_KV_ROW(pRow)) {
SKvRowIdx *pIdx = (SKvRowIdx *)taosbsearch(&colId, TD_ROW_COL_IDX(pRow), tdRowGetNCols(pRow), sizeof(SKvRowIdx),
compareKvRowColId, TD_EQ);
@@ -755,11 +758,10 @@ int32_t tdAppendColValToKvRow(SRowBuilder *pBuilder, TDRowValT valType, const vo
int32_t tdAppendColValToTpRow(SRowBuilder *pBuilder, TDRowValT valType, const void *val, bool isCopyVarData,
int8_t colType, int16_t colIdx, int32_t offset) {
- if ((offset < (int32_t)sizeof(TSKEY)) || (colIdx < 1)) {
+ if (colIdx < 1) {
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
- offset -= sizeof(TSKEY);
--colIdx;
#ifdef TD_SUPPORT_BITMAP
@@ -851,7 +853,7 @@ int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) {
memset(pBuilder->pBitmap, TD_VTYPE_NONE_BYTE_II, pBuilder->nBitmaps);
#endif
// the primary TS key is stored separatedly
- len = TD_ROW_HEAD_LEN + pBuilder->flen - sizeof(TSKEY) + pBuilder->nBitmaps;
+ len = TD_ROW_HEAD_LEN + pBuilder->flen + pBuilder->nBitmaps;
TD_ROW_SET_LEN(pBuilder->pBuf, len);
TD_ROW_SET_SVER(pBuilder->pBuf, pBuilder->sver);
break;
@@ -1094,4 +1096,4 @@ void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColV
memcpy(&pColVal->value.val, cv.val, tDataTypes[pTColumn->type].bytes);
}
}
-}
\ No newline at end of file
+}
diff --git a/source/common/src/ttime.c b/source/common/src/ttime.c
index a106a09a69a5a1d7d707c2d40548672c384a2987..ec05ef4c449c3ad3cb917a11feb727030d8ee06d 100644
--- a/source/common/src/ttime.c
+++ b/source/common/src/ttime.c
@@ -23,6 +23,8 @@
#define _DEFAULT_SOURCE
#include "ttime.h"
+#include "tlog.h"
+
/*
* mktime64 - Converts date to seconds.
* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
diff --git a/source/common/src/ttypes.c b/source/common/src/ttypes.c
index 8c5d44b8d58f00281784c9103eee5c9d6d8c6901..7b5d0a8805ed77ac580d5c4c2f02d699338012f7 100644
--- a/source/common/src/ttypes.c
+++ b/source/common/src/ttypes.c
@@ -61,7 +61,7 @@ tDataTypeDescriptor tDataTypes[TSDB_DATA_TYPE_MAX] = {
static float floatMin = -FLT_MAX, floatMax = FLT_MAX;
static double doubleMin = -DBL_MAX, doubleMax = DBL_MAX;
-FORCE_INLINE void *getDataMin(int32_t type, void* value) {
+FORCE_INLINE void *getDataMin(int32_t type, void *value) {
switch (type) {
case TSDB_DATA_TYPE_FLOAT:
*(float *)value = floatMin;
@@ -77,7 +77,7 @@ FORCE_INLINE void *getDataMin(int32_t type, void* value) {
return value;
}
-FORCE_INLINE void *getDataMax(int32_t type, void* value) {
+FORCE_INLINE void *getDataMax(int32_t type, void *value) {
switch (type) {
case TSDB_DATA_TYPE_FLOAT:
*(float *)value = floatMax;
diff --git a/source/dnode/mgmt/exe/dmMain.c b/source/dnode/mgmt/exe/dmMain.c
index 188677656a512be254815709532611013b805745..a8103351b429d2676c2cbaa37bddb2aa17741241 100644
--- a/source/dnode/mgmt/exe/dmMain.c
+++ b/source/dnode/mgmt/exe/dmMain.c
@@ -17,6 +17,7 @@
#include "dmMgmt.h"
#include "mnode.h"
#include "tconfig.h"
+#include "tglobal.h"
// clang-format off
#define DM_APOLLO_URL "The apollo string to use when configuring the server, such as: -a 'jsonFile:./tests/cfg.json', cfg.json text can be '{\"fqdn\":\"td1\"}'."
@@ -45,9 +46,30 @@ static struct {
SArray *pArgs; // SConfigPair
} global = {0};
-static void dmStopDnode(int signum, void *info, void *ctx) { dmStop(); }
+static void dmSetDebugFlag(int32_t signum, void *sigInfo, void *context) { taosSetAllDebugFlag(143, true); }
+static void dmSetAssert(int32_t signum, void *sigInfo, void *context) { tsAssert = 1; }
+
+static void dmStopDnode(int signum, void *sigInfo, void *context) {
+ // taosIgnSignal(SIGUSR1);
+ // taosIgnSignal(SIGUSR2);
+ taosIgnSignal(SIGTERM);
+ taosIgnSignal(SIGHUP);
+ taosIgnSignal(SIGINT);
+ taosIgnSignal(SIGABRT);
+ taosIgnSignal(SIGBREAK);
+
+ dInfo("shut down signal is %d", signum);
+#ifndef WINDOWS
+ dInfo("sender PID:%d cmdline:%s", ((siginfo_t *)sigInfo)->si_pid,
+ taosGetCmdlineByPID(((siginfo_t *)sigInfo)->si_pid));
+#endif
+
+ dmStop();
+}
static void dmSetSignalHandle() {
+ taosSetSignal(SIGUSR1, dmSetDebugFlag);
+ taosSetSignal(SIGUSR2, dmSetAssert);
taosSetSignal(SIGTERM, dmStopDnode);
taosSetSignal(SIGHUP, dmStopDnode);
taosSetSignal(SIGINT, dmStopDnode);
@@ -105,6 +127,19 @@ static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
return 0;
}
+static void dmPrintArgs(int32_t argc, char const *argv[]) {
+ char path[1024] = {0};
+ taosGetCwd(path, sizeof(path));
+
+ char args[1024] = {0};
+ int32_t arglen = snprintf(args, sizeof(args), "%s", argv[0]);
+ for (int32_t i = 1; i < argc; ++i) {
+ arglen = arglen + snprintf(args + arglen, sizeof(args) - arglen, " %s", argv[i]);
+ }
+
+ dInfo("startup path:%s args:%s", path, args);
+}
+
static void dmGenerateGrant() { mndGenerateMachineCode(); }
static void dmPrintVersion() {
@@ -194,6 +229,8 @@ int mainWindows(int argc, char **argv) {
return -1;
}
+ dmPrintArgs(argc, argv);
+
if (taosInitCfg(configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0) != 0) {
dError("failed to start since read config error");
taosCloseLog();
@@ -201,7 +238,12 @@ int mainWindows(int argc, char **argv) {
return -1;
}
- taosConvInit();
+ if (taosConvInit() != 0) {
+ dError("failed to init conv");
+ taosCloseLog();
+ taosCleanupArgs();
+ return -1;
+ }
if (global.dumpConfig) {
dmDumpCfg();
diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
index 8a8561161b0057130c5998bba2abe780c4b842f9..39eeeb32ea24e23acc534a6e4b7ff414fbf91ad8 100644
--- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
+++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
@@ -103,7 +103,12 @@ void dmSendStatusReq(SDnodeMgmt *pMgmt) {
tSerializeSStatusReq(pHead, contLen, &req);
tFreeSStatusReq(&req);
- SRpcMsg rpcMsg = {.pCont = pHead, .contLen = contLen, .msgType = TDMT_MND_STATUS, .info.ahandle = (void *)0x9527};
+ SRpcMsg rpcMsg = {.pCont = pHead,
+ .contLen = contLen,
+ .msgType = TDMT_MND_STATUS,
+ .info.ahandle = (void *)0x9527,
+ .info.refId = 0,
+ .info.noResp = 0};
SRpcMsg rpcRsp = {0};
dTrace("send status req to mnode, dnodeVer:%" PRId64 " statusSeq:%d", req.dnodeVer, req.statusSeq);
@@ -150,7 +155,8 @@ static void dmGetServerRunStatus(SDnodeMgmt *pMgmt, SServerStatusRsp *pStatus) {
SServerStatusRsp statusRsp = {0};
SMonMloadInfo minfo = {0};
(*pMgmt->getMnodeLoadsFp)(&minfo);
- if (minfo.isMnode && minfo.load.syncState == TAOS_SYNC_STATE_ERROR) {
+ if (minfo.isMnode &&
+ (minfo.load.syncState == TAOS_SYNC_STATE_ERROR || minfo.load.syncState == TAOS_SYNC_STATE_OFFLINE)) {
pStatus->statusCode = TSDB_SRV_STATUS_SERVICE_DEGRADED;
snprintf(pStatus->details, sizeof(pStatus->details), "mnode sync state is %s", syncStr(minfo.load.syncState));
return;
@@ -160,7 +166,7 @@ static void dmGetServerRunStatus(SDnodeMgmt *pMgmt, SServerStatusRsp *pStatus) {
(*pMgmt->getVnodeLoadsFp)(&vinfo);
for (int32_t i = 0; i < taosArrayGetSize(vinfo.pVloads); ++i) {
SVnodeLoad *pLoad = taosArrayGet(vinfo.pVloads, i);
- if (pLoad->syncState == TAOS_SYNC_STATE_ERROR) {
+ if (pLoad->syncState == TAOS_SYNC_STATE_ERROR || pLoad->syncState == TAOS_SYNC_STATE_OFFLINE) {
pStatus->statusCode = TSDB_SRV_STATUS_SERVICE_DEGRADED;
snprintf(pStatus->details, sizeof(pStatus->details), "vnode:%d sync state is %s", pLoad->vgId,
syncStr(pLoad->syncState));
diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c
index 07a612bb351e1fe6ed1dc93cb993ebdea42310dc..80c040a5e8f84a8d5d7ea887b8a633f945576e17 100644
--- a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c
+++ b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c
@@ -20,7 +20,9 @@ static void *dmStatusThreadFp(void *param) {
SDnodeMgmt *pMgmt = param;
int64_t lastTime = taosGetTimestampMs();
setThreadName("dnode-status");
-
+
+ const static int16_t TRIM_FREQ = 30;
+ int32_t trimCount = 0;
while (1) {
taosMsleep(200);
if (pMgmt->pData->dropped || pMgmt->pData->stopped) break;
@@ -28,9 +30,13 @@ static void *dmStatusThreadFp(void *param) {
int64_t curTime = taosGetTimestampMs();
float interval = (curTime - lastTime) / 1000.0f;
if (interval >= tsStatusInterval) {
- taosMemoryTrim(0);
dmSendStatusReq(pMgmt);
lastTime = curTime;
+
+ trimCount = (trimCount + 1) % TRIM_FREQ;
+ if (trimCount == 0) {
+ taosMemoryTrim(0);
+ }
}
}
@@ -144,6 +150,7 @@ static void dmProcessMgmtQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
break;
default:
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ dGError("msg:%p, not processed in mgmt queue", pMsg);
break;
}
diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
index d3d92e1bbf1b63b16d93e4c47f6afe63357469a5..857fbcbce5b0416f4c95ebe8829cf63d352563cc 100644
--- a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
+++ b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
@@ -61,7 +61,7 @@ static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
pMsg->info.rsp = NULL;
}
- if (code == TSDB_CODE_RPC_REDIRECT) {
+ if (code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_SYN_RESTORING) {
mndPostProcessQueryMsg(pMsg);
}
@@ -162,11 +162,13 @@ int32_t mmPutMsgToQueue(SMnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
if (pMsg == NULL) return -1;
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
+ pRpc->pCont = NULL;
dTrace("msg:%p, is created and will put into %s queue, type:%s", pMsg, pWorker->name, TMSG_INFO(pRpc->msgType));
int32_t code = mmPutMsgToWorker(pMgmt, pWorker, pMsg);
if (code != 0) {
dTrace("msg:%p, is freed", pMsg);
+ rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
}
return code;
diff --git a/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c b/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c
index edbe9882a43232d48eee63966cc6ea3a3f61536e..3e5ad65db759dbff8ab29b9878885019ee428b48 100644
--- a/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c
+++ b/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c
@@ -61,6 +61,7 @@ int32_t qmPutRpcMsgToQueue(SQnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
if (pMsg == NULL) return -1;
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
+ pRpc->pCont = NULL;
switch (qtype) {
case QUERY_QUEUE:
@@ -74,6 +75,7 @@ int32_t qmPutRpcMsgToQueue(SQnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
return 0;
default:
terrno = TSDB_CODE_INVALID_PARA;
+ rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
return -1;
}
diff --git a/source/dnode/mgmt/mgmt_snode/src/smWorker.c b/source/dnode/mgmt/mgmt_snode/src/smWorker.c
index f6942c81142ec1364e5ecf227750e30a7e2497b4..2e66aeae37427f34359299c17983911029067f15 100644
--- a/source/dnode/mgmt/mgmt_snode/src/smWorker.c
+++ b/source/dnode/mgmt/mgmt_snode/src/smWorker.c
@@ -139,7 +139,7 @@ int32_t smPutMsgToQueue(SSnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
SSnode *pSnode = pMgmt->pSnode;
if (pSnode == NULL) {
- dError("snode: msg:%p failed to put into vnode queue since %s, type:%s qtype:%d", pMsg, terrstr(),
+ dError("msg:%p failed to put into snode queue since %s, type:%s qtype:%d", pMsg, terrstr(),
TMSG_INFO(pMsg->msgType), qtype);
taosFreeQitem(pMsg);
rpcFreeCont(pRpc->pCont);
@@ -151,6 +151,7 @@ int32_t smPutMsgToQueue(SSnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
pHead->contLen = htonl(pHead->contLen);
pHead->vgId = SNODE_HANDLE;
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
+ pRpc->pCont = NULL;
switch (qtype) {
case STREAM_QUEUE:
@@ -160,7 +161,8 @@ int32_t smPutMsgToQueue(SSnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
smPutNodeMsgToWriteQueue(pMgmt, pMsg);
break;
default:
- ASSERT(0);
+ ASSERTS(0, "msg:%p failed to put into snode queue since %s, type:%s qtype:%d", pMsg, terrstr(),
+ TMSG_INFO(pMsg->msgType), qtype);
}
return 0;
}
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
index e15d7ac3dfa122f4204a4cd8301920ba1fba2cd1..bc4677285808e3d8fd76d9f8d65da7e3ab7249f6 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
@@ -216,7 +216,7 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
dDebug("vgId:%d, already exist", req.vgId);
tFreeSCreateVnodeReq(&req);
vmReleaseVnode(pMgmt, pVnode);
- terrno = TSDB_CODE_NODE_ALREADY_DEPLOYED;
+ terrno = TSDB_CODE_VND_ALREADY_EXIST;
code = terrno;
return 0;
}
@@ -307,7 +307,7 @@ int32_t vmProcessAlterVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, vgId);
if (pVnode == NULL) {
dError("vgId:%d, failed to alter replica since %s", vgId, terrstr());
- terrno = TSDB_CODE_NODE_NOT_DEPLOYED;
+ terrno = TSDB_CODE_VND_NOT_EXIST;
return -1;
}
@@ -369,7 +369,7 @@ int32_t vmProcessDropVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, vgId);
if (pVnode == NULL) {
dDebug("vgId:%d, failed to drop since %s", vgId, terrstr());
- terrno = TSDB_CODE_NODE_NOT_DEPLOYED;
+ terrno = TSDB_CODE_VND_NOT_EXIST;
return -1;
}
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
index 4aa07cad98533645b00fb17c9d249920e390fe65..08ea880b97fa6add105839f2e28f19bcc064e816 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
@@ -246,12 +246,12 @@ int32_t vmPutRpcMsgToQueue(SVnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
pHead->contLen = htonl(pHead->contLen);
pHead->vgId = htonl(pHead->vgId);
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
+ pRpc->pCont = NULL;
int32_t code = vmPutMsgToQueue(pMgmt, pMsg, qtype);
if (code != 0) {
dTrace("msg:%p, is freed", pMsg);
rpcFreeCont(pMsg->pCont);
- pRpc->pCont = NULL;
taosFreeQitem(pMsg);
}
diff --git a/source/dnode/mgmt/node_mgmt/src/dmEnv.c b/source/dnode/mgmt/node_mgmt/src/dmEnv.c
index 421d723202b0f7fb9824cab2fa0a568f4cf38e69..e3bda5a3f01355f33bdf758e0a14824162c50a2b 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmEnv.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmEnv.c
@@ -152,7 +152,19 @@ static int32_t dmProcessCreateNodeReq(EDndNodeType ntype, SRpcMsg *pMsg) {
SMgmtWrapper *pWrapper = dmAcquireWrapper(pDnode, ntype);
if (pWrapper != NULL) {
dmReleaseWrapper(pWrapper);
- terrno = TSDB_CODE_NODE_ALREADY_DEPLOYED;
+ switch (ntype) {
+ case MNODE:
+ terrno = TSDB_CODE_MNODE_ALREADY_DEPLOYED;
+ break;
+ case QNODE:
+ terrno = TSDB_CODE_QNODE_ALREADY_DEPLOYED;
+ break;
+ case SNODE:
+ terrno = TSDB_CODE_SNODE_ALREADY_DEPLOYED;
+ break;
+ default:
+ terrno = TSDB_CODE_APP_ERROR;
+ }
dError("failed to create node since %s", terrstr());
return -1;
}
@@ -191,7 +203,20 @@ static int32_t dmProcessDropNodeReq(EDndNodeType ntype, SRpcMsg *pMsg) {
SMgmtWrapper *pWrapper = dmAcquireWrapper(pDnode, ntype);
if (pWrapper == NULL) {
- terrno = TSDB_CODE_NODE_NOT_DEPLOYED;
+ switch (ntype) {
+ case MNODE:
+ terrno = TSDB_CODE_MNODE_NOT_DEPLOYED;
+ break;
+ case QNODE:
+ terrno = TSDB_CODE_QNODE_NOT_DEPLOYED;
+ break;
+ case SNODE:
+ terrno = TSDB_CODE_SNODE_NOT_DEPLOYED;
+ break;
+ default:
+ terrno = TSDB_CODE_APP_ERROR;
+ }
+
dError("failed to drop node since %s", terrstr());
return -1;
}
diff --git a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c
index 2c9020b668550a914cdd7e235ad2c5242af36057..02a268afda28698aba56148eacb8b205f12e0af2 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c
@@ -189,7 +189,6 @@ SMgmtWrapper *dmAcquireWrapper(SDnode *pDnode, EDndNodeType ntype) {
int32_t refCount = atomic_add_fetch_32(&pWrapper->refCount, 1);
// dTrace("node:%s, is acquired, ref:%d", pWrapper->name, refCount);
} else {
- terrno = TSDB_CODE_NODE_NOT_DEPLOYED;
pRetWrapper = NULL;
}
taosThreadRwlockUnlock(&pWrapper->lock);
@@ -205,7 +204,20 @@ int32_t dmMarkWrapper(SMgmtWrapper *pWrapper) {
int32_t refCount = atomic_add_fetch_32(&pWrapper->refCount, 1);
// dTrace("node:%s, is marked, ref:%d", pWrapper->name, refCount);
} else {
- terrno = TSDB_CODE_NODE_NOT_DEPLOYED;
+ switch (pWrapper->ntype) {
+ case MNODE:
+ terrno = TSDB_CODE_MNODE_NOT_FOUND;
+ break;
+ case QNODE:
+ terrno = TSDB_CODE_QNODE_NOT_FOUND;
+ break;
+ case SNODE:
+ terrno = TSDB_CODE_SNODE_NOT_FOUND;
+ break;
+ default:
+ terrno = TSDB_CODE_APP_IS_STOPPING;
+ break;
+ }
code = -1;
}
taosThreadRwlockUnlock(&pWrapper->lock);
diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c
index 5546d762f437a2afeb43f57e0cb30d13f6561319..99f8bd002a5944ec1f541c18ec523efab41e977e 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c
@@ -33,36 +33,26 @@ static inline void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg) {
}
}
-static inline void dmSendRedirectRsp(SRpcMsg *pMsg, const SEpSet *pNewEpSet) {
- pMsg->info.hasEpSet = 1;
- SRpcMsg rsp = {.code = TSDB_CODE_RPC_REDIRECT, .info = pMsg->info, .msgType = pMsg->msgType};
- int32_t contLen = tSerializeSEpSet(NULL, 0, pNewEpSet);
-
- rsp.pCont = rpcMallocCont(contLen);
- if (rsp.pCont == NULL) {
- pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
- } else {
- tSerializeSEpSet(rsp.pCont, contLen, pNewEpSet);
- rsp.contLen = contLen;
- }
- dmSendRsp(&rsp);
- rpcFreeCont(pMsg->pCont);
- pMsg->pCont = NULL;
-}
-
int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
+ const STraceId *trace = &pMsg->info.traceId;
+
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pMsg->msgType)];
if (msgFp == NULL) {
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ dGError("msg:%p, not processed since no handler", pMsg);
return -1;
}
- const STraceId *trace = &pMsg->info.traceId;
dGTrace("msg:%p, will be processed by %s", pMsg, pWrapper->name);
pMsg->info.wrapper = pWrapper;
return (*msgFp)(pWrapper->pMgmt, pMsg);
}
+static bool dmFailFastFp(tmsg_t msgType) {
+ // add more msg type later
+ return msgType == TDMT_SYNC_HEARTBEAT || msgType == TDMT_SYNC_APPEND_ENTRIES;
+}
+
static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
SDnodeTrans *pTrans = &pDnode->trans;
int32_t code = -1;
@@ -99,18 +89,23 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
dmProcessServerStartupStatus(pDnode, pRpc);
return;
} else {
- terrno = TSDB_CODE_APP_NOT_READY;
+ if (pDnode->status == DND_STAT_INIT) {
+ terrno = TSDB_CODE_APP_IS_STARTING;
+ } else {
+ terrno = TSDB_CODE_APP_IS_STOPPING;
+ }
goto _OVER;
}
}
- if (IsReq(pRpc) && pRpc->pCont == NULL) {
+ if (pRpc->pCont == NULL && (IsReq(pRpc) || pRpc->contLen != 0)) {
dGError("msg:%p, type:%s pCont is NULL", pRpc, TMSG_INFO(pRpc->msgType));
terrno = TSDB_CODE_INVALID_MSG_LEN;
goto _OVER;
}
if (pHandle->defaultNtype == NODE_END) {
+ dGError("msg:%p, type:%s not processed since no handle", pRpc, TMSG_INFO(pRpc->msgType));
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
goto _OVER;
}
@@ -165,8 +160,7 @@ _OVER:
if (IsReq(pRpc)) {
SRpcMsg rsp = {.code = code, .info = pRpc->info};
- if ((code == TSDB_CODE_NODE_NOT_DEPLOYED || code == TSDB_CODE_APP_NOT_READY) && pRpc->msgType > TDMT_MND_MSG &&
- pRpc->msgType < TDMT_VND_MSG) {
+ if (code == TSDB_CODE_MNODE_NOT_FOUND) {
dmBuildMnodeRedirectRsp(pDnode, &rsp);
}
@@ -219,7 +213,11 @@ static inline int32_t dmSendReq(const SEpSet *pEpSet, SRpcMsg *pMsg) {
if (pDnode->status != DND_STAT_RUNNING && pMsg->msgType < TDMT_SYNC_MSG) {
rpcFreeCont(pMsg->pCont);
pMsg->pCont = NULL;
- terrno = TSDB_CODE_NODE_OFFLINE;
+ if (pDnode->status == DND_STAT_INIT) {
+ terrno = TSDB_CODE_APP_IS_STARTING;
+ } else {
+ terrno = TSDB_CODE_APP_IS_STOPPING;
+ }
dError("failed to send rpc msg:%s since %s, handle:%p", TMSG_INFO(pMsg->msgType), terrstr(), pMsg->info.handle);
return -1;
} else {
@@ -233,8 +231,9 @@ static inline void dmRegisterBrokenLinkArg(SRpcMsg *pMsg) { rpcRegisterBrokenLin
static inline void dmReleaseHandle(SRpcHandleInfo *pHandle, int8_t type) { rpcReleaseHandle(pHandle, type); }
static bool rpcRfp(int32_t code, tmsg_t msgType) {
- if (code == TSDB_CODE_RPC_REDIRECT || code == TSDB_CODE_RPC_NETWORK_UNAVAIL || code == TSDB_CODE_NODE_NOT_DEPLOYED ||
- code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_APP_NOT_READY || code == TSDB_CODE_RPC_BROKEN_LINK) {
+ if (code == TSDB_CODE_RPC_NETWORK_UNAVAIL || code == TSDB_CODE_RPC_BROKEN_LINK || code == TSDB_CODE_MNODE_NOT_FOUND ||
+ code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_SYN_RESTORING || code == TSDB_CODE_VND_STOPPED ||
+ code == TSDB_CODE_APP_IS_STARTING || code == TSDB_CODE_APP_IS_STOPPING) {
if (msgType == TDMT_SCH_QUERY || msgType == TDMT_SCH_MERGE_QUERY || msgType == TDMT_SCH_FETCH ||
msgType == TDMT_SCH_MERGE_FETCH) {
return false;
@@ -250,7 +249,7 @@ int32_t dmInitClient(SDnode *pDnode) {
SRpcInit rpcInit = {0};
rpcInit.label = "DND-C";
- rpcInit.numOfThreads = 4;
+ rpcInit.numOfThreads = tsNumOfRpcThreads;
rpcInit.cfp = (RpcCfp)dmProcessRpcMsg;
rpcInit.sessions = 1024;
rpcInit.connType = TAOS_CONN_CLIENT;
@@ -258,8 +257,17 @@ int32_t dmInitClient(SDnode *pDnode) {
rpcInit.parent = pDnode;
rpcInit.rfp = rpcRfp;
rpcInit.compressSize = tsCompressMsgSize;
+
rpcInit.retryLimit = tsRpcRetryLimit;
rpcInit.retryInterval = tsRpcRetryInterval;
+ rpcInit.retryMinInterval = tsRedirectPeriod;
+ rpcInit.retryStepFactor = tsRedirectFactor;
+ rpcInit.retryMaxInterval = tsRedirectMaxPeriod;
+ rpcInit.retryMaxTimouet = tsMaxRetryWaitTime;
+
+ rpcInit.failFastInterval = 1000; // interval threshold(ms)
+ rpcInit.failFastThreshold = 3; // failed threshold
+ rpcInit.ffp = dmFailFastFp;
pTrans->clientRpc = rpcOpen(&rpcInit);
if (pTrans->clientRpc == NULL) {
@@ -293,6 +301,7 @@ int32_t dmInitServer(SDnode *pDnode) {
rpcInit.connType = TAOS_CONN_SERVER;
rpcInit.idleTime = tsShellActivityTimer * 1000;
rpcInit.parent = pDnode;
+ rpcInit.compressSize = tsCompressMsgSize;
pTrans->serverRpc = rpcOpen(&rpcInit);
if (pTrans->serverRpc == NULL) {
@@ -318,7 +327,6 @@ SMsgCb dmGetMsgcb(SDnode *pDnode) {
.clientRpc = pDnode->trans.clientRpc,
.sendReqFp = dmSendReq,
.sendRspFp = dmSendRsp,
- .sendRedirectRspFp = dmSendRedirectRsp,
.registerBrokenLinkArgFp = dmRegisterBrokenLinkArg,
.releaseHandleFp = dmReleaseHandle,
.reportStartupFp = dmReportStartup,
diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h
index 8719e988e7acd44548708a83f9e846d981170712..2124b387ec926a3add0c5efe3a51f43bdf9ae47c 100644
--- a/source/dnode/mgmt/node_util/inc/dmUtil.h
+++ b/source/dnode/mgmt/node_util/inc/dmUtil.h
@@ -39,7 +39,7 @@
#include "sync.h"
#include "wal.h"
-#include "libs/function/function.h"
+#include "libs/function/tudf.h"
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/dnode/mgmt/node_util/src/dmEps.c b/source/dnode/mgmt/node_util/src/dmEps.c
index 7fe7d448270385c01bf0612942f608b0a662a948..2ced9a350d8d95f1d30371317b30795fdcdec4c1 100644
--- a/source/dnode/mgmt/node_util/src/dmEps.c
+++ b/source/dnode/mgmt/node_util/src/dmEps.c
@@ -15,6 +15,7 @@
#define _DEFAULT_SOURCE
#include "dmUtil.h"
+#include "tmisce.h"
static void dmPrintEps(SDnodeData *pData);
static bool dmIsEpChanged(SDnodeData *pData, int32_t dnodeId, const char *ep);
@@ -247,7 +248,7 @@ void dmUpdateEps(SDnodeData *pData, SArray *eps) {
static void dmResetEps(SDnodeData *pData, SArray *dnodeEps) {
if (pData->dnodeEps != dnodeEps) {
SArray *tmp = pData->dnodeEps;
- pData->dnodeEps = taosArrayDup(dnodeEps);
+ pData->dnodeEps = taosArrayDup(dnodeEps, NULL);
taosArrayDestroy(tmp);
}
diff --git a/source/dnode/mgmt/test/mnode/dmnode.cpp b/source/dnode/mgmt/test/mnode/dmnode.cpp
index 7b7eb97216d9f443296b56393a273b5ccb01d9e9..28cb376b3789c284daed7bc7b745b00d802c6a29 100644
--- a/source/dnode/mgmt/test/mnode/dmnode.cpp
+++ b/source/dnode/mgmt/test/mnode/dmnode.cpp
@@ -40,7 +40,7 @@ TEST_F(DndTestMnode, 01_Create_Mnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_MNODE_ALREADY_DEPLOYED);
}
{
@@ -57,7 +57,7 @@ TEST_F(DndTestMnode, 01_Create_Mnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_MNODE_ALREADY_DEPLOYED);
}
{
@@ -77,7 +77,7 @@ TEST_F(DndTestMnode, 01_Create_Mnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_MNODE_ALREADY_DEPLOYED);
}
}
@@ -171,7 +171,7 @@ TEST_F(DndTestMnode, 03_Drop_Mnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_MNODE_NOT_DEPLOYED);
}
{
@@ -188,7 +188,7 @@ TEST_F(DndTestMnode, 03_Drop_Mnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_MND_ALTER_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_MNODE_NOT_DEPLOYED);
}
{
diff --git a/source/dnode/mgmt/test/qnode/dqnode.cpp b/source/dnode/mgmt/test/qnode/dqnode.cpp
index a2c6a2c28c81b7ba4ae76bd8e843696d879bf692..3beb57c516cda1c1398514a0213ee35ad9b0d500 100644
--- a/source/dnode/mgmt/test/qnode/dqnode.cpp
+++ b/source/dnode/mgmt/test/qnode/dqnode.cpp
@@ -62,7 +62,7 @@ TEST_F(DndTestQnode, 01_Create_Qnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_QNODE_ALREADY_DEPLOYED);
}
test.Restart();
@@ -77,7 +77,7 @@ TEST_F(DndTestQnode, 01_Create_Qnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_QNODE_ALREADY_DEPLOYED);
}
}
@@ -120,7 +120,7 @@ TEST_F(DndTestQnode, 02_Drop_Qnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_QNODE_NOT_DEPLOYED);
}
test.Restart();
@@ -135,7 +135,7 @@ TEST_F(DndTestQnode, 02_Drop_Qnode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_QNODE_NOT_DEPLOYED);
}
{
diff --git a/source/dnode/mgmt/test/snode/dsnode.cpp b/source/dnode/mgmt/test/snode/dsnode.cpp
index e3ad65d8316fdb42e44d632e3fcfb20483377e53..30d6a348139731ff9e255b21c2bb64a38b0c5500 100644
--- a/source/dnode/mgmt/test/snode/dsnode.cpp
+++ b/source/dnode/mgmt/test/snode/dsnode.cpp
@@ -62,7 +62,7 @@ TEST_F(DndTestSnode, 01_Create_Snode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_SNODE_ALREADY_DEPLOYED);
}
test.Restart();
@@ -77,7 +77,7 @@ TEST_F(DndTestSnode, 01_Create_Snode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_SNODE_ALREADY_DEPLOYED);
}
}
@@ -120,7 +120,7 @@ TEST_F(DndTestSnode, 01_Drop_Snode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_SNODE_NOT_DEPLOYED);
}
test.Restart();
@@ -135,7 +135,7 @@ TEST_F(DndTestSnode, 01_Drop_Snode) {
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_SNODE_NOT_DEPLOYED);
}
{
diff --git a/source/dnode/mgmt/test/sut/src/client.cpp b/source/dnode/mgmt/test/sut/src/client.cpp
index 6b4c23c0de9e8374a8c7399c7c401c103aad8b64..a27a511651795fc864a24bef6db534793e74649d 100644
--- a/source/dnode/mgmt/test/sut/src/client.cpp
+++ b/source/dnode/mgmt/test/sut/src/client.cpp
@@ -15,6 +15,7 @@
#include "sut.h"
#include "tdatablock.h"
+#include "tmisce.h"
static void processClientRsp(void* parent, SRpcMsg* pRsp, SEpSet* pEpSet) {
TestClient* client = (TestClient*)parent;
diff --git a/source/dnode/mgmt/test/vnode/vnode.cpp b/source/dnode/mgmt/test/vnode/vnode.cpp
index 8a8e3322891c60d067941cd886b8b6498c8346b1..24e7affd887fd6b5f18320b205f9c9b0f65a3c28 100644
--- a/source/dnode/mgmt/test/vnode/vnode.cpp
+++ b/source/dnode/mgmt/test/vnode/vnode.cpp
@@ -63,7 +63,7 @@ TEST_F(DndTestVnode, 01_Create_Vnode) {
ASSERT_EQ(pRsp->code, 0);
test.Restart();
} else {
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_VND_ALREADY_EXIST);
}
}
}
@@ -285,7 +285,7 @@ TEST_F(DndTestVnode, 06_Drop_Vnode) {
ASSERT_EQ(pRsp->code, 0);
test.Restart();
} else {
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_VND_NOT_EXIST);
}
}
}
\ No newline at end of file
diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h
index 04ac5aba49dcc1622c81201c88524a7b1eed8591..3c42f7b832ef5d3c106c1886a2609677b17767bf 100644
--- a/source/dnode/mnode/impl/inc/mndDef.h
+++ b/source/dnode/mnode/impl/inc/mndDef.h
@@ -71,6 +71,9 @@ typedef enum {
MND_OPER_READ_DB,
MND_OPER_READ_OR_WRITE_DB,
MND_OPER_SHOW_VARIBALES,
+ MND_OPER_SUBSCRIBE,
+ MND_OPER_CREATE_TOPIC,
+ MND_OPER_DROP_TOPIC,
} EOperType;
typedef enum {
@@ -273,6 +276,7 @@ typedef struct {
int32_t authVersion;
SHashObj* readDbs;
SHashObj* writeDbs;
+ SHashObj* topics;
SRWLatch lock;
} SUserObj;
@@ -328,6 +332,7 @@ typedef struct {
int32_t dnodeId;
ESyncState syncState;
bool syncRestore;
+ bool syncCanRead;
} SVnodeGid;
typedef struct {
@@ -468,6 +473,7 @@ void* tDecodeSMqOffsetObj(void* buf, SMqOffsetObj* pOffset);
typedef struct {
char name[TSDB_TOPIC_FNAME_LEN];
char db[TSDB_DB_FNAME_LEN];
+ char createUser[TSDB_USER_LEN];
int64_t createTime;
int64_t updateTime;
int64_t uid;
@@ -635,10 +641,15 @@ typedef struct {
SArray* tasks; // SArray>
SSchemaWrapper outputSchema;
SSchemaWrapper tagSchema;
+
+ // 3.0.20
+ int64_t checkpointFreq; // ms
+ int64_t currentTick; // do not serialize
+ int64_t deleteMark;
} SStreamObj;
int32_t tEncodeSStreamObj(SEncoder* pEncoder, const SStreamObj* pObj);
-int32_t tDecodeSStreamObj(SDecoder* pDecoder, SStreamObj* pObj);
+int32_t tDecodeSStreamObj(SDecoder* pDecoder, SStreamObj* pObj, int32_t sver);
void tFreeStreamObj(SStreamObj* pObj);
typedef struct {
@@ -648,15 +659,6 @@ typedef struct {
SArray* childInfo; // SArray
} SStreamCheckpointObj;
-#if 0
-typedef struct {
- int64_t uid;
- int64_t streamId;
- int8_t status;
- int8_t stage;
-} SStreamRecoverObj;
-#endif
-
#ifdef __cplusplus
}
#endif
diff --git a/source/dnode/mnode/impl/inc/mndPrivilege.h b/source/dnode/mnode/impl/inc/mndPrivilege.h
index dc88b25f51adbbbd1e813401645b51a4e3ba0089..dfde2f671e516d79ec9198b3f386f8d0ba2cbb62 100644
--- a/source/dnode/mnode/impl/inc/mndPrivilege.h
+++ b/source/dnode/mnode/impl/inc/mndPrivilege.h
@@ -28,6 +28,8 @@ void mndCleanupPrivilege(SMnode *pMnode);
int32_t mndCheckOperPrivilege(SMnode *pMnode, const char *user, EOperType operType);
int32_t mndCheckDbPrivilege(SMnode *pMnode, const char *user, EOperType operType, SDbObj *pDb);
int32_t mndCheckDbPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname);
+int32_t mndCheckTopicPrivilege(SMnode *pMnode, const char *user, EOperType operType, SMqTopicObj *pTopic);
+int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *topicName);
int32_t mndCheckShowPrivilege(SMnode *pMnode, const char *user, EShowType showType, const char *dbname);
int32_t mndCheckAlterUserPrivilege(SUserObj *pOperUser, SUserObj *pUser, SAlterUserReq *pAlter);
int32_t mndSetUserAuthRsp(SMnode *pMnode, SUserObj *pUser, SGetUserAuthRsp *pRsp);
diff --git a/source/dnode/mnode/impl/inc/mndScheduler.h b/source/dnode/mnode/impl/inc/mndScheduler.h
index db81d8843e5415b4bf11fd33a013fb700f5914bc..23085c53eed7ef6234da38f146f962ea96d9fdde 100644
--- a/source/dnode/mnode/impl/inc/mndScheduler.h
+++ b/source/dnode/mnode/impl/inc/mndScheduler.h
@@ -28,7 +28,7 @@ void mndCleanupScheduler(SMnode* pMnode);
int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscribeObj* pSub);
int32_t mndConvertRsmaTask(char** pDst, int32_t* pDstLen, const char* ast, int64_t uid, int8_t triggerType,
- int64_t watermark);
+ int64_t watermark, int64_t deleteMark);
int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream);
diff --git a/source/dnode/mnode/impl/inc/mndTopic.h b/source/dnode/mnode/impl/inc/mndTopic.h
index 9f516904ce816a6c7999d44ed003d064f36e95c5..8cd669c769a399282ba1137ca8d24eeace039237 100644
--- a/source/dnode/mnode/impl/inc/mndTopic.h
+++ b/source/dnode/mnode/impl/inc/mndTopic.h
@@ -25,7 +25,7 @@ extern "C" {
int32_t mndInitTopic(SMnode *pMnode);
void mndCleanupTopic(SMnode *pMnode);
-SMqTopicObj *mndAcquireTopic(SMnode *pMnode, char *topicName);
+SMqTopicObj *mndAcquireTopic(SMnode *pMnode, const char *topicName);
void mndReleaseTopic(SMnode *pMnode, SMqTopicObj *pTopic);
SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic);
diff --git a/source/dnode/mnode/impl/inc/mndUser.h b/source/dnode/mnode/impl/inc/mndUser.h
index 970d1db7dbc2ff9a92f201aabb940fdeea1f22e4..cf7deba397556f8df3550067057a03f6ca374a2a 100644
--- a/source/dnode/mnode/impl/inc/mndUser.h
+++ b/source/dnode/mnode/impl/inc/mndUser.h
@@ -31,6 +31,7 @@ void mndReleaseUser(SMnode *pMnode, SUserObj *pUser);
// for trans test
SSdbRaw *mndUserActionEncode(SUserObj *pUser);
SHashObj *mndDupDbHash(SHashObj *pOld);
+SHashObj *mndDupTopicHash(SHashObj *pOld);
int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_t numOfUses, void **ppRsp,
int32_t *pRspLen);
diff --git a/source/dnode/mnode/impl/inc/mndVgroup.h b/source/dnode/mnode/impl/inc/mndVgroup.h
index 94469899fc080c52f5dd767ccd43448fd3f5038a..765d4fd33da9fa52266a89e8fc57d247c6494a96 100644
--- a/source/dnode/mnode/impl/inc/mndVgroup.h
+++ b/source/dnode/mnode/impl/inc/mndVgroup.h
@@ -36,8 +36,6 @@ int64_t mndGetVgroupMemory(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup);
SArray *mndBuildDnodesArray(SMnode *, int32_t exceptDnodeId);
int32_t mndAllocSmaVgroup(SMnode *, SDbObj *pDb, SVgObj *pVgroup);
int32_t mndAllocVgroup(SMnode *, SDbObj *pDb, SVgObj **ppVgroups);
-int32_t mndAddVnodeToVgroup(SMnode *, SVgObj *pVgroup, SArray *pArray);
-int32_t mndRemoveVnodeFromVgroup(SMnode *, SVgObj *pVgroup, SArray *pArray, SVnodeGid *pDelVgid);
int32_t mndAddCreateVnodeAction(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid);
int32_t mndAddAlterVnodeConfirmAction(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup);
int32_t mndAddAlterVnodeAction(SMnode *, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, tmsg_t msgType);
diff --git a/source/dnode/mnode/impl/src/mndAcct.c b/source/dnode/mnode/impl/src/mndAcct.c
index ffa5dc6d0bdb1ce6589bf3f73dbe22f9d0d455b8..148e21b507cdfe49ce6bab50fe4d9d233d9172f2 100644
--- a/source/dnode/mnode/impl/src/mndAcct.c
+++ b/source/dnode/mnode/impl/src/mndAcct.c
@@ -147,6 +147,8 @@ _OVER:
static SSdbRow *mndAcctActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SAcctObj *pAcct = NULL;
+ SSdbRow *pRow = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -156,10 +158,10 @@ static SSdbRow *mndAcctActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SAcctObj));
+ pRow = sdbAllocRow(sizeof(SAcctObj));
if (pRow == NULL) goto _OVER;
- SAcctObj *pAcct = sdbGetRowObj(pRow);
+ pAcct = sdbGetRowObj(pRow);
if (pAcct == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -186,7 +188,7 @@ static SSdbRow *mndAcctActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("acct:%s, failed to decode from raw:%p since %s", pAcct->acct, pRaw, terrstr());
+ mError("acct:%s, failed to decode from raw:%p since %s", pAcct == NULL ? "null" : pAcct->acct, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -218,7 +220,7 @@ static int32_t mndProcessCreateAcctReq(SRpcMsg *pReq) {
return -1;
}
- terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ terrno = TSDB_CODE_OPS_NOT_SUPPORT;
mError("failed to process create acct request since %s", terrstr());
return -1;
}
@@ -228,7 +230,7 @@ static int32_t mndProcessAlterAcctReq(SRpcMsg *pReq) {
return -1;
}
- terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ terrno = TSDB_CODE_OPS_NOT_SUPPORT;
mError("failed to process create acct request since %s", terrstr());
return -1;
}
@@ -238,7 +240,7 @@ static int32_t mndProcessDropAcctReq(SRpcMsg *pReq) {
return -1;
}
- terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ terrno = TSDB_CODE_OPS_NOT_SUPPORT;
mError("failed to process create acct request since %s", terrstr());
return -1;
}
\ No newline at end of file
diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c
index 348c8f4cb857da63f4ec3976004046b909e96eee..ca03207d2b95bab562c48a02ca383d67bba7349d 100644
--- a/source/dnode/mnode/impl/src/mndCluster.c
+++ b/source/dnode/mnode/impl/src/mndCluster.c
@@ -157,6 +157,8 @@ _OVER:
static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SClusterObj *pCluster = NULL;
+ SSdbRow *pRow = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -166,10 +168,10 @@ static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SClusterObj));
+ pRow = sdbAllocRow(sizeof(SClusterObj));
if (pRow == NULL) goto _OVER;
- SClusterObj *pCluster = sdbGetRowObj(pRow);
+ pCluster = sdbGetRowObj(pRow);
if (pCluster == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -184,7 +186,8 @@ static SSdbRow *mndClusterActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("cluster:%" PRId64 ", failed to decode from raw:%p since %s", pCluster->id, pRaw, terrstr());
+ mError("cluster:%" PRId64 ", failed to decode from raw:%p since %s", pCluster == NULL ? 0 : pCluster->id, pRaw,
+ terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c
index 300251d64d0626859fdb5a79fc7df81bcb016ca4..8e2b17a9631d8794b71b798289af2edbf0c4e80c 100644
--- a/source/dnode/mnode/impl/src/mndConsumer.c
+++ b/source/dnode/mnode/impl/src/mndConsumer.c
@@ -324,15 +324,15 @@ static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg) {
}
static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) {
- SMnode *pMnode = pMsg->info.node;
- SMqHbReq req = {0};
+ SMnode *pMnode = pMsg->info.node;
+ SMqHbReq req = {0};
if (tDeserializeSMqHbReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- int64_t consumerId = req.consumerId;
+ int64_t consumerId = req.consumerId;
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId);
if (pConsumer == NULL) {
mError("consumer %" PRId64 " not exist", consumerId);
@@ -363,17 +363,17 @@ static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) {
}
static int32_t mndProcessAskEpReq(SRpcMsg *pMsg) {
- SMnode *pMnode = pMsg->info.node;
- SMqAskEpReq req = {0};
- SMqAskEpRsp rsp = {0};
+ SMnode *pMnode = pMsg->info.node;
+ SMqAskEpReq req = {0};
+ SMqAskEpRsp rsp = {0};
if (tDeserializeSMqAskEpReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- int64_t consumerId = req.consumerId;
- int32_t epoch = req.epoch;
+ int64_t consumerId = req.consumerId;
+ int32_t epoch = req.epoch;
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId);
if (pConsumer == NULL) {
@@ -457,6 +457,8 @@ static int32_t mndProcessAskEpReq(SRpcMsg *pMsg) {
if (topicEp.vgs == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
taosRUnLockLatch(&pConsumer->lock);
+ taosRUnLockLatch(&pSub->lock);
+ mndReleaseSubscribe(pMnode, pSub);
goto FAIL;
}
@@ -536,7 +538,7 @@ static int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) {
int32_t code = -1;
SArray *newSub = subscribe.topicNames;
- taosArraySortString(newSub, taosArrayCompareString);
+ taosArraySort(newSub, taosArrayCompareString);
taosArrayRemoveDuplicateP(newSub, taosArrayCompareString, taosMemoryFree);
int32_t newTopicNum = taosArrayGetSize(newSub);
@@ -552,7 +554,16 @@ static int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) {
goto SUBSCRIBE_OVER;
}
+ // check topic only
+#if 0
if (mndCheckDbPrivilegeByName(pMnode, pMsg->info.conn.user, MND_OPER_READ_DB, pTopic->db) != 0) {
+ mndReleaseTopic(pMnode, pTopic);
+ goto SUBSCRIBE_OVER;
+ }
+#endif
+
+ if (mndCheckTopicPrivilege(pMnode, pMsg->info.conn.user, MND_OPER_SUBSCRIBE, pTopic) != 0) {
+ mndReleaseTopic(pMnode, pTopic);
goto SUBSCRIBE_OVER;
}
@@ -710,7 +721,9 @@ CM_ENCODE_OVER:
SSdbRow *mndConsumerActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
- void *buf = NULL;
+ SSdbRow *pRow = NULL;
+ SMqConsumerObj *pConsumer = NULL;
+ void *buf = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto CM_DECODE_OVER;
@@ -720,10 +733,10 @@ SSdbRow *mndConsumerActionDecode(SSdbRaw *pRaw) {
goto CM_DECODE_OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SMqConsumerObj));
+ pRow = sdbAllocRow(sizeof(SMqConsumerObj));
if (pRow == NULL) goto CM_DECODE_OVER;
- SMqConsumerObj *pConsumer = sdbGetRowObj(pRow);
+ pConsumer = sdbGetRowObj(pRow);
if (pConsumer == NULL) goto CM_DECODE_OVER;
int32_t dataPos = 0;
@@ -743,7 +756,8 @@ SSdbRow *mndConsumerActionDecode(SSdbRaw *pRaw) {
CM_DECODE_OVER:
taosMemoryFreeClear(buf);
if (terrno != TSDB_CODE_SUCCESS) {
- mError("consumer:%" PRId64 ", failed to decode from raw:%p since %s", pConsumer->consumerId, pRaw, terrstr());
+ mError("consumer:%" PRId64 ", failed to decode from raw:%p since %s", pConsumer == NULL ? 0 : pConsumer->consumerId,
+ pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -848,7 +862,8 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
// add to current topic
taosArrayPush(pOldConsumer->currentTopics, &addedTopic);
- taosArraySortString(pOldConsumer->currentTopics, taosArrayCompareString);
+ taosArraySort(pOldConsumer->currentTopics, taosArrayCompareString);
+
// set status
if (taosArrayGetSize(pOldConsumer->rebNewTopics) == 0 && taosArrayGetSize(pOldConsumer->rebRemovedTopics) == 0) {
if (pOldConsumer->status == MQ_CONSUMER_STATUS__MODIFY ||
diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c
index 78d84c9c257beeb52f423b535629f6de106a6c53..43155124c11fef5cede04eb2c17987d99ed80e5c 100644
--- a/source/dnode/mnode/impl/src/mndDb.c
+++ b/source/dnode/mnode/impl/src/mndDb.c
@@ -147,6 +147,8 @@ _OVER:
static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SDbObj *pDb = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -156,10 +158,10 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SDbObj));
+ pRow = sdbAllocRow(sizeof(SDbObj));
if (pRow == NULL) goto _OVER;
- SDbObj *pDb = sdbGetRowObj(pRow);
+ pDb = sdbGetRowObj(pRow);
if (pDb == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -219,12 +221,12 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
SDB_GET_RESERVE(pRaw, dataPos, DB_RESERVE_SIZE, _OVER)
taosInitRWLatch(&pDb->lock);
- if (pDb->cfg.tsdbPageSize <= TSDB_MIN_TSDB_PAGESIZE) {
+ if (pDb->cfg.tsdbPageSize != TSDB_MIN_TSDB_PAGESIZE) {
mInfo("db:%s, tsdbPageSize set from %d to default %d", pDb->name, pDb->cfg.tsdbPageSize,
TSDB_DEFAULT_TSDB_PAGESIZE);
}
- if (pDb->cfg.sstTrigger <= TSDB_MIN_STT_TRIGGER) {
+ if (pDb->cfg.sstTrigger != TSDB_MIN_STT_TRIGGER) {
mInfo("db:%s, sstTrigger set from %d to default %d", pDb->name, pDb->cfg.sstTrigger, TSDB_DEFAULT_SST_TRIGGER);
}
@@ -232,7 +234,7 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("db:%s, failed to decode from raw:%p since %s", pDb->name, pRaw, terrstr());
+ mError("db:%s, failed to decode from raw:%p since %s", pDb == NULL ? "null" : pDb->name, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -810,7 +812,7 @@ static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
memcpy(&dbObj, pDb, sizeof(SDbObj));
if (dbObj.cfg.pRetensions != NULL) {
- dbObj.cfg.pRetensions = taosArrayDup(pDb->cfg.pRetensions);
+ dbObj.cfg.pRetensions = taosArrayDup(pDb->cfg.pRetensions, NULL);
if (dbObj.cfg.pRetensions == NULL) goto _OVER;
}
@@ -823,7 +825,13 @@ static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
dbObj.cfgVersion++;
dbObj.updateTime = taosGetTimestampMs();
code = mndAlterDb(pMnode, pReq, pDb, &dbObj);
- if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
+
+ if (dbObj.cfg.replications != pDb->cfg.replications) {
+ // return quickly, operation executed asynchronously
+ mInfo("db:%s, alter db replica from %d to %d", pDb->name, pDb->cfg.replications, dbObj.cfg.replications);
+ } else {
+ if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
+ }
_OVER:
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
diff --git a/source/dnode/mnode/impl/src/mndDef.c b/source/dnode/mnode/impl/src/mndDef.c
index 143131bac84c984e8f3133cf2a01e74391b8f128..b5c2fb05b3adb3f3e7d0c3ce19f3da055fabdb3c 100644
--- a/source/dnode/mnode/impl/src/mndDef.c
+++ b/source/dnode/mnode/impl/src/mndDef.c
@@ -76,11 +76,14 @@ int32_t tEncodeSStreamObj(SEncoder *pEncoder, const SStreamObj *pObj) {
if (tEncodeSSchemaWrapper(pEncoder, &pObj->outputSchema) < 0) return -1;
+ // 3.0.20
+ if (tEncodeI64(pEncoder, pObj->checkpointFreq) < 0) return -1;
+
tEndEncode(pEncoder);
return pEncoder->pos;
}
-int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj) {
+int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj, int32_t sver) {
if (tStartDecode(pDecoder) < 0) return -1;
if (tDecodeCStrTo(pDecoder, pObj->name) < 0) return -1;
@@ -139,6 +142,10 @@ int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj) {
if (tDecodeSSchemaWrapper(pDecoder, &pObj->outputSchema) < 0) return -1;
+ // 3.0.20
+ if (sver >= 2) {
+ if (tDecodeI64(pDecoder, &pObj->checkpointFreq) < 0) return -1;
+ }
tEndDecode(pDecoder);
return 0;
}
@@ -361,7 +368,7 @@ SMqConsumerEp *tCloneSMqConsumerEp(const SMqConsumerEp *pConsumerEpOld) {
SMqConsumerEp *pConsumerEpNew = taosMemoryMalloc(sizeof(SMqConsumerEp));
if (pConsumerEpNew == NULL) return NULL;
pConsumerEpNew->consumerId = pConsumerEpOld->consumerId;
- pConsumerEpNew->vgs = taosArrayDeepCopy(pConsumerEpOld->vgs, (FCopy)tCloneSMqVgEp);
+ pConsumerEpNew->vgs = taosArrayDup(pConsumerEpOld->vgs, (__array_item_dup_fn_t)tCloneSMqVgEp);
return pConsumerEpNew;
}
@@ -440,11 +447,11 @@ SMqSubscribeObj *tCloneSubscribeObj(const SMqSubscribeObj *pSub) {
pConsumerEp = (SMqConsumerEp *)pIter;
SMqConsumerEp newEp = {
.consumerId = pConsumerEp->consumerId,
- .vgs = taosArrayDeepCopy(pConsumerEp->vgs, (FCopy)tCloneSMqVgEp),
+ .vgs = taosArrayDup(pConsumerEp->vgs, (__array_item_dup_fn_t)tCloneSMqVgEp),
};
taosHashPut(pSubNew->consumerHash, &newEp.consumerId, sizeof(int64_t), &newEp, sizeof(SMqConsumerEp));
}
- pSubNew->unassignedVgs = taosArrayDeepCopy(pSub->unassignedVgs, (FCopy)tCloneSMqVgEp);
+ pSubNew->unassignedVgs = taosArrayDup(pSub->unassignedVgs, (__array_item_dup_fn_t)tCloneSMqVgEp);
memcpy(pSubNew->dbName, pSub->dbName, TSDB_DB_FNAME_LEN);
return pSubNew;
}
@@ -516,7 +523,7 @@ SMqSubActionLogEntry *tCloneSMqSubActionLogEntry(SMqSubActionLogEntry *pEntry) {
SMqSubActionLogEntry *pEntryNew = taosMemoryMalloc(sizeof(SMqSubActionLogEntry));
if (pEntryNew == NULL) return NULL;
pEntryNew->epoch = pEntry->epoch;
- pEntryNew->consumers = taosArrayDeepCopy(pEntry->consumers, (FCopy)tCloneSMqConsumerEp);
+ pEntryNew->consumers = taosArrayDup(pEntry->consumers, (__array_item_dup_fn_t)tCloneSMqConsumerEp);
return pEntryNew;
}
@@ -541,7 +548,7 @@ SMqSubActionLogObj *tCloneSMqSubActionLogObj(SMqSubActionLogObj *pLog) {
SMqSubActionLogObj *pLogNew = taosMemoryMalloc(sizeof(SMqSubActionLogObj));
if (pLogNew == NULL) return pLogNew;
memcpy(pLogNew->key, pLog->key, TSDB_SUBSCRIBE_KEY_LEN);
- pLogNew->logs = taosArrayDeepCopy(pLog->logs, (FCopy)tCloneSMqConsumerEp);
+ pLogNew->logs = taosArrayDup(pLog->logs, (__array_item_dup_fn_t)tCloneSMqConsumerEp);
return pLogNew;
}
diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c
index 521f924fad89eb3a169044e6dce27b41a5487770..0538d701018b3362a03944b05db909faef3e57cf 100644
--- a/source/dnode/mnode/impl/src/mndDnode.c
+++ b/source/dnode/mnode/impl/src/mndDnode.c
@@ -24,6 +24,7 @@
#include "mndTrans.h"
#include "mndUser.h"
#include "mndVgroup.h"
+#include "tmisce.h"
#define TSDB_DNODE_VER_NUMBER 1
#define TSDB_DNODE_RESERVE_SIZE 64
@@ -153,8 +154,9 @@ _OVER:
}
static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) {
- SSdbRow *pRow = NULL;
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SDnodeObj *pDnode = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -165,7 +167,8 @@ static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) {
pRow = sdbAllocRow(sizeof(SDnodeObj));
if (pRow == NULL) goto _OVER;
- SDnodeObj *pDnode = sdbGetRowObj(pRow);
+
+ pDnode = sdbGetRowObj(pRow);
if (pDnode == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -180,7 +183,7 @@ static SSdbRow *mndDnodeActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("dnode:%d, failed to decode from raw:%p since %s", pDnode->id, pRaw, terrstr());
+ mError("dnode:%d, failed to decode from raw:%p since %s", pDnode == NULL ? 0 : pDnode->id, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -374,14 +377,18 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
}
bool roleChanged = false;
for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
- if (pVgroup->vnodeGid[vg].dnodeId == statusReq.dnodeId) {
- if (pVgroup->vnodeGid[vg].syncState != pVload->syncState ||
- pVgroup->vnodeGid[vg].syncRestore != pVload->syncRestore) {
- mInfo("vgId:%d, state changed by status msg, old state:%s restored:%d new state:%s restored:%d",
- pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore,
- syncStr(pVload->syncState), pVload->syncRestore);
- pVgroup->vnodeGid[vg].syncState = pVload->syncState;
- pVgroup->vnodeGid[vg].syncRestore = pVload->syncRestore;
+ SVnodeGid *pGid = &pVgroup->vnodeGid[vg];
+ if (pGid->dnodeId == statusReq.dnodeId) {
+ if (pGid->syncState != pVload->syncState || pGid->syncRestore != pVload->syncRestore ||
+ pGid->syncCanRead != pVload->syncCanRead) {
+ mInfo(
+ "vgId:%d, state changed by status msg, old state:%s restored:%d canRead:%d new state:%s restored:%d "
+ "canRead:%d, dnode:%d",
+ pVgroup->vgId, syncStr(pGid->syncState), pGid->syncRestore, pGid->syncCanRead,
+ syncStr(pVload->syncState), pVload->syncRestore, pVload->syncCanRead, pDnode->id);
+ pGid->syncState = pVload->syncState;
+ pGid->syncRestore = pVload->syncRestore;
+ pGid->syncCanRead = pVload->syncCanRead;
roleChanged = true;
}
break;
@@ -780,7 +787,7 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
int32_t numOfVnodes = mndGetVnodesNum(pMnode, pDnode->id);
if ((numOfVnodes > 0 || pMObj != NULL || pSObj != NULL || pQObj != NULL) && !dropReq.force) {
if (!mndIsDnodeOnline(pDnode, taosGetTimestampMs())) {
- terrno = TSDB_CODE_NODE_OFFLINE;
+ terrno = TSDB_CODE_DNODE_OFFLINE;
mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, terrstr(),
numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
goto _OVER;
diff --git a/source/dnode/mnode/impl/src/mndFunc.c b/source/dnode/mnode/impl/src/mndFunc.c
index c9b22fad3aa71e5881a821a4b1f84464f8d120c4..31f31a15baf31813aeb071ff933ff5263d5976f8 100644
--- a/source/dnode/mnode/impl/src/mndFunc.c
+++ b/source/dnode/mnode/impl/src/mndFunc.c
@@ -101,6 +101,8 @@ _OVER:
static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SFuncObj *pFunc = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -110,10 +112,10 @@ static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SFuncObj));
+ pRow = sdbAllocRow(sizeof(SFuncObj));
if (pRow == NULL) goto _OVER;
- SFuncObj *pFunc = sdbGetRowObj(pRow);
+ pFunc = sdbGetRowObj(pRow);
if (pFunc == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -148,7 +150,7 @@ static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("func:%s, failed to decode from raw:%p since %s", pFunc->name, pRaw, terrstr());
+ mError("func:%s, failed to decode from raw:%p since %s", pFunc == NULL ? "null" : pFunc->name, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
diff --git a/source/dnode/mnode/impl/src/mndInfoSchema.c b/source/dnode/mnode/impl/src/mndInfoSchema.c
index 09172115f8502e392c1d37ae1d256761afb02126..82294ac7bf1d499d93bff63b6dbdea07577ba730 100644
--- a/source/dnode/mnode/impl/src/mndInfoSchema.c
+++ b/source/dnode/mnode/impl/src/mndInfoSchema.c
@@ -71,7 +71,7 @@ static int32_t mndInsInitMeta(SHashObj *hash) {
int32_t mndBuildInsTableSchema(SMnode *pMnode, const char *dbFName, const char *tbName, bool sysinfo,
STableMetaRsp *pRsp) {
if (NULL == pMnode->infosMeta) {
- terrno = TSDB_CODE_APP_NOT_READY;
+ terrno = TSDB_CODE_APP_ERROR;
return -1;
}
@@ -97,7 +97,7 @@ int32_t mndBuildInsTableSchema(SMnode *pMnode, const char *dbFName, const char *
int32_t mndBuildInsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
if (NULL == pMnode->infosMeta) {
- terrno = TSDB_CODE_APP_NOT_READY;
+ terrno = TSDB_CODE_APP_ERROR;
return -1;
}
diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c
index b5ddd6f279a04ed5c06ebf7e5f68efef06c5e1d4..eb6742a5642761dd5bd736e1be9a9dc72a2c4ac8 100644
--- a/source/dnode/mnode/impl/src/mndMain.c
+++ b/source/dnode/mnode/impl/src/mndMain.c
@@ -45,7 +45,7 @@ static inline int32_t mndAcquireRpc(SMnode *pMnode) {
int32_t code = 0;
taosThreadRwlockRdlock(&pMnode->lock);
if (pMnode->stopped) {
- terrno = TSDB_CODE_APP_NOT_READY;
+ terrno = TSDB_CODE_APP_IS_STOPPING;
code = -1;
} else if (!mndIsLeader(pMnode)) {
code = -1;
@@ -85,6 +85,21 @@ static void *mndBuildTimerMsg(int32_t *pContLen) {
return pReq;
}
+static void *mndBuildCheckpointTickMsg(int32_t *pContLen, int64_t sec) {
+ SMStreamTickReq timerReq = {
+ .tick = sec,
+ };
+
+ int32_t contLen = tSerializeSMStreamTickMsg(NULL, 0, &timerReq);
+ if (contLen <= 0) return NULL;
+ void *pReq = rpcMallocCont(contLen);
+ if (pReq == NULL) return NULL;
+
+ tSerializeSMStreamTickMsg(pReq, contLen, &timerReq);
+ *pContLen = contLen;
+ return pReq;
+}
+
static void mndPullupTrans(SMnode *pMnode) {
int32_t contLen = 0;
void *pReq = mndBuildTimerMsg(&contLen);
@@ -105,7 +120,24 @@ static void mndCalMqRebalance(SMnode *pMnode) {
int32_t contLen = 0;
void *pReq = mndBuildTimerMsg(&contLen);
if (pReq != NULL) {
- SRpcMsg rpcMsg = {.msgType = TDMT_MND_TMQ_TIMER, .pCont = pReq, .contLen = contLen};
+ SRpcMsg rpcMsg = {
+ .msgType = TDMT_MND_TMQ_TIMER,
+ .pCont = pReq,
+ .contLen = contLen,
+ };
+ tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
+ }
+}
+
+static void mndStreamCheckpointTick(SMnode *pMnode, int64_t sec) {
+ int32_t contLen = 0;
+ void *pReq = mndBuildCheckpointTickMsg(&contLen, sec);
+ if (pReq != NULL) {
+ SRpcMsg rpcMsg = {
+ .msgType = TDMT_MND_STREAM_CHECKPOINT_TIMER,
+ .pCont = pReq,
+ .contLen = contLen,
+ };
tmsgPutToQueue(&pMnode->msgCb, READ_QUEUE, &rpcMsg);
}
}
@@ -150,12 +182,16 @@ static void mndSetVgroupOffline(SMnode *pMnode, int32_t dnodeId, int64_t curMs)
bool roleChanged = false;
for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
- if (pVgroup->vnodeGid[vg].dnodeId == dnodeId) {
- if (pVgroup->vnodeGid[vg].syncState != TAOS_SYNC_STATE_ERROR) {
- mInfo("vgId:%d, state changed by offline check, old state:%s restored:%d new state:error restored:0",
- pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore);
- pVgroup->vnodeGid[vg].syncState = TAOS_SYNC_STATE_ERROR;
- pVgroup->vnodeGid[vg].syncRestore = 0;
+ SVnodeGid *pGid = &pVgroup->vnodeGid[vg];
+ if (pGid->dnodeId == dnodeId) {
+ if (pGid->syncState != TAOS_SYNC_STATE_OFFLINE) {
+ mInfo(
+ "vgId:%d, state changed by offline check, old state:%s restored:%d canRead:%d new state:error restored:0 "
+ "canRead:0",
+ pVgroup->vgId, syncStr(pGid->syncState), pGid->syncRestore, pGid->syncCanRead);
+ pGid->syncState = TAOS_SYNC_STATE_OFFLINE;
+ pGid->syncRestore = 0;
+ pGid->syncCanRead = 0;
roleChanged = true;
}
break;
@@ -220,6 +256,12 @@ static void *mndThreadFp(void *param) {
mndCalMqRebalance(pMnode);
}
+#if 0
+ if (sec % tsStreamCheckpointTickInterval == 0) {
+ mndStreamCheckpointTick(pMnode, sec);
+ }
+#endif
+
if (sec % tsTelemInterval == (TMIN(60, (tsTelemInterval - 1)))) {
mndPullupTelem(pMnode);
}
@@ -491,6 +533,16 @@ void mndPreClose(SMnode *pMnode) {
if (pMnode != NULL) {
syncLeaderTransfer(pMnode->syncMgmt.sync);
syncPreStop(pMnode->syncMgmt.sync);
+#if 0
+ while (syncSnapshotRecving(pMnode->syncMgmt.sync)) {
+ mInfo("vgId:1, snapshot is recving");
+ taosMsleep(300);
+ }
+ while (syncSnapshotSending(pMnode->syncMgmt.sync)) {
+ mInfo("vgId:1, snapshot is sending");
+ taosMsleep(300);
+ }
+#endif
}
}
@@ -547,11 +599,45 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
pMsg->msgType == TDMT_SCH_FETCH || pMsg->msgType == TDMT_SCH_MERGE_FETCH || pMsg->msgType == TDMT_SCH_DROP_TASK) {
return 0;
}
- if (mndAcquireRpc(pMsg->info.node) == 0) return 0;
- SMnode *pMnode = pMsg->info.node;
+ SMnode *pMnode = pMsg->info.node;
+ taosThreadRwlockRdlock(&pMnode->lock);
+ if (pMnode->stopped) {
+ taosThreadRwlockUnlock(&pMnode->lock);
+ terrno = TSDB_CODE_APP_IS_STOPPING;
+ return -1;
+ }
+
+ terrno = 0;
SSyncState state = syncGetState(pMnode->syncMgmt.sync);
+ if (terrno != 0) {
+ taosThreadRwlockUnlock(&pMnode->lock);
+ return -1;
+ }
+
+ if (state.state != TAOS_SYNC_STATE_LEADER) {
+ taosThreadRwlockUnlock(&pMnode->lock);
+ terrno = TSDB_CODE_SYN_NOT_LEADER;
+ goto _OVER;
+ }
+
+ if (!state.restored || !pMnode->restored) {
+ taosThreadRwlockUnlock(&pMnode->lock);
+ terrno = TSDB_CODE_SYN_RESTORING;
+ goto _OVER;
+ }
+
+#if 1
+ atomic_add_fetch_32(&pMnode->rpcRef, 1);
+#else
+ int32_t ref = atomic_add_fetch_32(&pMnode->rpcRef, 1);
+ mTrace("mnode rpc is acquired, ref:%d", ref);
+#endif
+
+ taosThreadRwlockUnlock(&pMnode->lock);
+ return 0;
+_OVER:
if (pMsg->msgType == TDMT_MND_TMQ_TIMER || pMsg->msgType == TDMT_MND_TELEM_TIMER ||
pMsg->msgType == TDMT_MND_TRANS_TIMER || pMsg->msgType == TDMT_MND_TTL_TIMER ||
pMsg->msgType == TDMT_MND_UPTIME_TIMER) {
@@ -564,42 +650,26 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
SEpSet epSet = {0};
mndGetMnodeEpSet(pMnode, &epSet);
- mDebug(
+ mGDebug(
"msg:%p, type:%s failed to process since %s, mnode restored:%d stopped:%d, sync restored:%d "
"role:%s, redirect numOfEps:%d inUse:%d",
pMsg, TMSG_INFO(pMsg->msgType), terrstr(), pMnode->restored, pMnode->stopped, state.restored,
syncStr(state.restored), epSet.numOfEps, epSet.inUse);
- if (epSet.numOfEps > 0) {
- for (int32_t i = 0; i < epSet.numOfEps; ++i) {
- mDebug("mnode index:%d, ep:%s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port);
- }
+ if (epSet.numOfEps <= 0) return -1;
- int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
- pMsg->info.rsp = rpcMallocCont(contLen);
- if (pMsg->info.rsp != NULL) {
- tSerializeSEpSet(pMsg->info.rsp, contLen, &epSet);
- pMsg->info.hasEpSet = 1;
- pMsg->info.rspLen = contLen;
- terrno = TSDB_CODE_RPC_REDIRECT;
- } else {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- }
- } else {
- terrno = TSDB_CODE_APP_NOT_READY;
+ for (int32_t i = 0; i < epSet.numOfEps; ++i) {
+ mDebug("mnode index:%d, ep:%s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port);
}
- return -1;
-}
-
-static int32_t mndCheckMsgContent(SRpcMsg *pMsg) {
- if (!IsReq(pMsg)) return 0;
- if (pMsg->contLen != 0 && pMsg->pCont != NULL) return 0;
+ int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
+ pMsg->info.rsp = rpcMallocCont(contLen);
+ if (pMsg->info.rsp != NULL) {
+ tSerializeSEpSet(pMsg->info.rsp, contLen, &epSet);
+ pMsg->info.hasEpSet = 1;
+ pMsg->info.rspLen = contLen;
+ }
- const STraceId *trace = &pMsg->info.traceId;
- mGError("msg:%p, failed to check msg, cont:%p contLen:%d, app:%p type:%s", pMsg, pMsg->pCont, pMsg->contLen,
- pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
- terrno = TSDB_CODE_INVALID_MSG_LEN;
return -1;
}
@@ -614,7 +684,6 @@ int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
return -1;
}
- if (mndCheckMsgContent(pMsg) != 0) return -1;
if (mndCheckMnodeState(pMsg) != 0) return -1;
mGTrace("msg:%p, start to process in mnode, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
@@ -747,7 +816,7 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr
tstrncpy(desc.status, "ready", sizeof(desc.status));
pClusterInfo->vgroups_alive++;
}
- if (pVgid->syncState != TAOS_SYNC_STATE_ERROR) {
+ if (pVgid->syncState != TAOS_SYNC_STATE_ERROR && pVgid->syncState != TAOS_SYNC_STATE_OFFLINE) {
pClusterInfo->vnodes_alive++;
}
pClusterInfo->vnodes_total++;
@@ -803,12 +872,12 @@ void mndSetRestored(SMnode *pMnode, bool restored) {
taosThreadRwlockWrlock(&pMnode->lock);
pMnode->restored = true;
taosThreadRwlockUnlock(&pMnode->lock);
- mTrace("mnode set restored:%d", restored);
+ mInfo("mnode set restored:%d", restored);
} else {
taosThreadRwlockWrlock(&pMnode->lock);
pMnode->restored = false;
taosThreadRwlockUnlock(&pMnode->lock);
- mTrace("mnode set restored:%d", restored);
+ mInfo("mnode set restored:%d", restored);
while (1) {
if (pMnode->rpcRef <= 0) break;
taosMsleep(3);
@@ -822,7 +891,7 @@ void mndSetStop(SMnode *pMnode) {
taosThreadRwlockWrlock(&pMnode->lock);
pMnode->stopped = true;
taosThreadRwlockUnlock(&pMnode->lock);
- mTrace("mnode set stopped");
+ mInfo("mnode set stopped");
}
bool mndGetStop(SMnode *pMnode) { return pMnode->stopped; }
diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c
index 563b3cd3cf6859440a5f12f9826729a4a89102f8..9c847c11380f703a92b56f713c71b3a9c4e5f23a 100644
--- a/source/dnode/mnode/impl/src/mndMnode.c
+++ b/source/dnode/mnode/impl/src/mndMnode.c
@@ -20,7 +20,7 @@
#include "mndShow.h"
#include "mndSync.h"
#include "mndTrans.h"
-#include "mndUser.h"
+#include "tmisce.h"
#define MNODE_VER_NUMBER 1
#define MNODE_RESERVE_SIZE 64
@@ -142,6 +142,8 @@ _OVER:
static SSdbRow *mndMnodeActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SMnodeObj *pObj = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) return NULL;
@@ -151,10 +153,10 @@ static SSdbRow *mndMnodeActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SMnodeObj));
+ pRow = sdbAllocRow(sizeof(SMnodeObj));
if (pRow == NULL) goto _OVER;
- SMnodeObj *pObj = sdbGetRowObj(pRow);
+ pObj = sdbGetRowObj(pRow);
if (pObj == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -167,7 +169,7 @@ static SSdbRow *mndMnodeActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("mnode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr());
+ mError("mnode:%d, failed to decode from raw:%p since %s", pObj == NULL ? 0 : pObj->id, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -185,7 +187,7 @@ static int32_t mndMnodeActionInsert(SSdb *pSdb, SMnodeObj *pObj) {
return -1;
}
- pObj->syncState = TAOS_SYNC_STATE_ERROR;
+ pObj->syncState = TAOS_SYNC_STATE_OFFLINE;
mndReloadSyncConfig(pSdb->pMnode);
return 0;
}
@@ -290,7 +292,7 @@ static int32_t mndBuildCreateMnodeRedoAction(STrans *pTrans, SDCreateMnodeReq *p
.pCont = pReq,
.contLen = contLen,
.msgType = TDMT_DND_CREATE_MNODE,
- .acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED,
+ .acceptableCode = TSDB_CODE_MNODE_ALREADY_DEPLOYED,
};
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
@@ -331,7 +333,7 @@ static int32_t mndBuildDropMnodeRedoAction(STrans *pTrans, SDDropMnodeReq *pDrop
.pCont = pReq,
.contLen = contLen,
.msgType = TDMT_DND_DROP_MNODE,
- .acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED,
+ .acceptableCode = TSDB_CODE_MNODE_NOT_DEPLOYED,
};
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
@@ -438,7 +440,7 @@ static int32_t mndProcessCreateMnodeReq(SRpcMsg *pReq) {
}
if (!mndIsDnodeOnline(pDnode, taosGetTimestampMs())) {
- terrno = TSDB_CODE_NODE_OFFLINE;
+ terrno = TSDB_CODE_DNODE_OFFLINE;
goto _OVER;
}
@@ -488,7 +490,7 @@ static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnode
if (totalMnodes == 2) {
if (force) {
mError("cant't force drop dnode, since a mnode on it and replica is 2");
- terrno = TSDB_CODE_NODE_OFFLINE;
+ terrno = TSDB_CODE_DNODE_OFFLINE;
return -1;
}
mInfo("vgId:1, has %d mnodes, exec redo log first", totalMnodes);
@@ -572,7 +574,7 @@ static int32_t mndProcessDropMnodeReq(SRpcMsg *pReq) {
}
if (!mndIsDnodeOnline(pObj->pDnode, taosGetTimestampMs())) {
- terrno = TSDB_CODE_NODE_OFFLINE;
+ terrno = TSDB_CODE_DNODE_OFFLINE;
goto _OVER;
}
diff --git a/source/dnode/mnode/impl/src/mndPerfSchema.c b/source/dnode/mnode/impl/src/mndPerfSchema.c
index e874c1a53e6d5e0aaffe4891fb25dca3b6a11d07..cf463304a1059a1cb1689bd02cc9d6fc21417ad5 100644
--- a/source/dnode/mnode/impl/src/mndPerfSchema.c
+++ b/source/dnode/mnode/impl/src/mndPerfSchema.c
@@ -68,7 +68,7 @@ int32_t mndPerfsInitMeta(SHashObj *hash) {
int32_t mndBuildPerfsTableSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp) {
if (NULL == pMnode->perfsMeta) {
- terrno = TSDB_CODE_APP_NOT_READY;
+ terrno = TSDB_CODE_APP_ERROR;
return -1;
}
@@ -94,7 +94,7 @@ int32_t mndBuildPerfsTableSchema(SMnode *pMnode, const char *dbFName, const char
int32_t mndBuildPerfsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
if (NULL == pMnode->perfsMeta) {
- terrno = TSDB_CODE_APP_NOT_READY;
+ terrno = TSDB_CODE_APP_ERROR;
return -1;
}
diff --git a/source/dnode/mnode/impl/src/mndPrivilege.c b/source/dnode/mnode/impl/src/mndPrivilege.c
index 151a2a64042bfab4cdbc5be38ef30b11680750a5..ccb4140b83bc6bcc58eacdd52b357fc19ed3455b 100644
--- a/source/dnode/mnode/impl/src/mndPrivilege.c
+++ b/source/dnode/mnode/impl/src/mndPrivilege.c
@@ -28,6 +28,10 @@ int32_t mndCheckDbPrivilege(SMnode *pMnode, const char *user, EOperType operType
int32_t mndCheckDbPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *dbname) {
return 0;
}
+int32_t mndCheckTopicPrivilege(SMnode *pMnode, const char *user, EOperType operType, SMqTopicObj *pTopic) { return 0; }
+int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType operType, const char *topicName) {
+ return 0;
+}
int32_t mndSetUserAuthRsp(SMnode *pMnode, SUserObj *pUser, SGetUserAuthRsp *pRsp) {
memcpy(pRsp->user, pUser->user, TSDB_USER_LEN);
pRsp->superAuth = 1;
diff --git a/source/dnode/mnode/impl/src/mndProfile.c b/source/dnode/mnode/impl/src/mndProfile.c
index d42b66455f2be95c160e9d39d8ea84a3cc10ac0a..fe76ba31d7f4e879ba950a4f9b79e36632202b59 100644
--- a/source/dnode/mnode/impl/src/mndProfile.c
+++ b/source/dnode/mnode/impl/src/mndProfile.c
@@ -542,7 +542,7 @@ static int32_t mndProcessQueryHeartBeat(SMnode *pMnode, SRpcMsg *pMsg, SClientHb
}
default:
mError("invalid kv key:%d", kv->key);
- hbRsp.status = TSDB_CODE_MND_APP_ERROR;
+ hbRsp.status = TSDB_CODE_APP_ERROR;
break;
}
diff --git a/source/dnode/mnode/impl/src/mndQnode.c b/source/dnode/mnode/impl/src/mndQnode.c
index 434e6fbc52d9754cbc6fac929a94965fe8e3a63d..28a5dee2dbd6a5590e057318efcd76fdd2a7f6a9 100644
--- a/source/dnode/mnode/impl/src/mndQnode.c
+++ b/source/dnode/mnode/impl/src/mndQnode.c
@@ -100,6 +100,8 @@ _OVER:
static SSdbRow *mndQnodeActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SQnodeObj *pObj = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -109,10 +111,10 @@ static SSdbRow *mndQnodeActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SQnodeObj));
+ pRow = sdbAllocRow(sizeof(SQnodeObj));
if (pRow == NULL) goto _OVER;
- SQnodeObj *pObj = sdbGetRowObj(pRow);
+ pObj = sdbGetRowObj(pRow);
if (pObj == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -125,7 +127,7 @@ static SSdbRow *mndQnodeActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("qnode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr());
+ mError("qnode:%d, failed to decode from raw:%p since %s", pObj == NULL ? 0 : pObj->id, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -203,7 +205,7 @@ static int32_t mndSetCreateQnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, S
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_CREATE_QNODE;
- action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_QNODE_ALREADY_DEPLOYED;
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
@@ -230,7 +232,7 @@ static int32_t mndSetCreateQnodeUndoActions(STrans *pTrans, SDnodeObj *pDnode, S
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_DROP_QNODE;
- action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_QNODE_NOT_DEPLOYED;
if (mndTransAppendUndoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
@@ -343,7 +345,7 @@ static int32_t mndSetDropQnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SQn
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_DROP_QNODE;
- action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_QNODE_NOT_DEPLOYED;
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
diff --git a/source/dnode/mnode/impl/src/mndScheduler.c b/source/dnode/mnode/impl/src/mndScheduler.c
index e1886511b714fa0a92b1b03d998730e606fa5042..af1a29def08eae42072fffc889cd494a95dea239 100644
--- a/source/dnode/mnode/impl/src/mndScheduler.c
+++ b/source/dnode/mnode/impl/src/mndScheduler.c
@@ -42,7 +42,7 @@ static int32_t mndAddTaskToTaskSet(SArray* pArray, SStreamTask* pTask) {
}
int32_t mndConvertRsmaTask(char** pDst, int32_t* pDstLen, const char* ast, int64_t uid, int8_t triggerType,
- int64_t watermark) {
+ int64_t watermark, int64_t deleteMark) {
SNode* pAst = NULL;
SQueryPlan* pPlan = NULL;
terrno = TSDB_CODE_SUCCESS;
@@ -64,6 +64,7 @@ int32_t mndConvertRsmaTask(char** pDst, int32_t* pDstLen, const char* ast, int64
.rSmaQuery = true,
.triggerType = triggerType,
.watermark = watermark,
+ .deleteMark = deleteMark,
};
if (qCreateQueryPlan(&cxt, &pPlan, NULL) < 0) {
@@ -224,7 +225,7 @@ int32_t mndAddShuffleSinkTasksToStream(SMnode* pMnode, SStreamObj* pStream) {
ASSERT(taosArrayGetSize(pStream->tasks) == 1);
while (1) {
- SVgObj* pVgroup;
+ SVgObj* pVgroup = NULL;
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
if (pIter == NULL) break;
if (!mndVgroupInDb(pVgroup, pStream->targetDbUid)) {
@@ -258,6 +259,7 @@ int32_t mndAddShuffleSinkTasksToStream(SMnode* pMnode, SStreamObj* pStream) {
pTask->tbSink.pSchemaWrapper = tCloneSSchemaWrapper(&pStream->outputSchema);
ASSERT(pTask->tbSink.pSchemaWrapper);
}
+ sdbRelease(pSdb, pVgroup);
}
return 0;
}
@@ -316,9 +318,9 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
bool externalTargetDB = strcmp(pStream->sourceDb, pStream->targetDb) != 0;
SDbObj* pDbObj = mndAcquireDb(pMnode, pStream->targetDb);
ASSERT(pDbObj != NULL);
- sdbRelease(pSdb, pDbObj);
bool multiTarget = pDbObj->cfg.numOfVgroups > 1;
+ sdbRelease(pSdb, pDbObj);
if (planTotLevel == 2 || externalTargetDB || multiTarget || pStream->fixedSinkVgId) {
/*if (true) {*/
@@ -382,6 +384,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
qDestroyQueryPlan(pPlan);
return -1;
}
+ sdbRelease(pSdb, pVgroup);
} else {
if (mndAssignTaskToSnode(pMnode, pInnerTask, plan, pSnode) < 0) {
sdbRelease(pSdb, pSnode);
@@ -396,6 +399,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
qDestroyQueryPlan(pPlan);
return -1;
}
+ sdbRelease(pSdb, pVgroup);
}
}
@@ -448,7 +452,6 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
SStreamChildEpInfo* pEpInfo = taosMemoryMalloc(sizeof(SStreamChildEpInfo));
if (pEpInfo == NULL) {
- ASSERT(0);
terrno = TSDB_CODE_OUT_OF_MEMORY;
sdbRelease(pSdb, pVgroup);
qDestroyQueryPlan(pPlan);
@@ -459,6 +462,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
pEpInfo->nodeId = pTask->nodeId;
pEpInfo->taskId = pTask->taskId;
taosArrayPush(pInnerTask->childEpInfo, &pEpInfo);
+ sdbRelease(pSdb, pVgroup);
}
}
@@ -582,6 +586,8 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib
} else {
pVgEp->qmsg = strdup("");
}
+
+ sdbRelease(pSdb, pVgroup);
}
ASSERT(pSub->unassignedVgs->size > 0);
diff --git a/source/dnode/mnode/impl/src/mndShow.c b/source/dnode/mnode/impl/src/mndShow.c
index 20c2ebb0a4789ff74832c3bc029f6dd6f4241612..6a7e2aaa51b2f7603c186ac75529e231561f442a 100644
--- a/source/dnode/mnode/impl/src/mndShow.c
+++ b/source/dnode/mnode/impl/src/mndShow.c
@@ -108,6 +108,8 @@ static int32_t convertToRetrieveType(char *name, int32_t len) {
type = TSDB_MGMT_TABLE_APPS;
} else if (strncasecmp(name, TSDB_INS_TABLE_STREAM_TASKS, len) == 0) {
type = TSDB_MGMT_TABLE_STREAM_TASKS;
+ } else if (strncasecmp(name, TSDB_INS_TABLE_USER_PRIVILEGES, len) == 0) {
+ type = TSDB_MGMT_TABLE_PRIVILEGES;
} else {
// ASSERT(0);
}
@@ -196,9 +198,9 @@ static int32_t mndProcessRetrieveSysTableReq(SRpcMsg *pReq) {
}
if (retrieveReq.showId == 0) {
- STableMetaRsp *pMeta = (STableMetaRsp *)taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb));
+ STableMetaRsp *pMeta = taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb));
if (pMeta == NULL) {
- pMeta = (STableMetaRsp *)taosHashGet(pMnode->perfsMeta, retrieveReq.tb, strlen(retrieveReq.tb));
+ pMeta = taosHashGet(pMnode->perfsMeta, retrieveReq.tb, strlen(retrieveReq.tb));
if (pMeta == NULL) {
terrno = TSDB_CODE_MND_INVALID_SYS_TABLENAME;
mError("failed to process show-retrieve req:%p since %s", pShow, terrstr());
diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c
index 698c07d9bc95b0866b49f87b42a8de0e7b8e3dfb..e6a6e6ae5b326cf956052ac470b9c8db6a3a0ab4 100644
--- a/source/dnode/mnode/impl/src/mndSma.c
+++ b/source/dnode/mnode/impl/src/mndSma.c
@@ -132,6 +132,8 @@ _OVER:
static SSdbRow *mndSmaActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SSmaObj *pSma = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -141,10 +143,10 @@ static SSdbRow *mndSmaActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SSmaObj));
+ pRow = sdbAllocRow(sizeof(SSmaObj));
if (pRow == NULL) goto _OVER;
- SSmaObj *pSma = sdbGetRowObj(pRow);
+ pSma = sdbGetRowObj(pRow);
if (pSma == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -200,7 +202,7 @@ static SSdbRow *mndSmaActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("sma:%s, failed to decode from raw:%p since %s", pSma->name, pRaw, terrstr());
+ mError("sma:%s, failed to decode from raw:%p since %s", pSma == NULL ? "null" : pSma->name, pRaw, terrstr());
taosMemoryFreeClear(pSma->expr);
taosMemoryFreeClear(pSma->tagsFilter);
taosMemoryFreeClear(pSma->sql);
@@ -461,7 +463,7 @@ static int32_t mndSetCreateSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans,
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_CREATE_VNODE;
- action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_VND_ALREADY_EXIST;
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
@@ -532,6 +534,7 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
streamObj.sql = strdup(pCreate->sql);
streamObj.smaId = smaObj.uid;
streamObj.watermark = pCreate->watermark;
+ streamObj.deleteMark = pCreate->deleteMark;
streamObj.fillHistory = STREAM_FILL_HISTORY_ON;
streamObj.trigger = STREAM_TRIGGER_WINDOW_CLOSE;
streamObj.triggerParam = pCreate->maxDelay;
@@ -572,6 +575,7 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
.streamQuery = true,
.triggerType = streamObj.trigger,
.watermark = streamObj.watermark,
+ .deleteMark = streamObj.deleteMark,
};
if (qCreateQueryPlan(&cxt, &pPlan, NULL) < 0) {
@@ -778,7 +782,7 @@ static int32_t mndSetDropSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans, SD
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_DROP_VNODE;
- action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_VND_NOT_EXIST;
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
diff --git a/source/dnode/mnode/impl/src/mndSnode.c b/source/dnode/mnode/impl/src/mndSnode.c
index 7753e5b1279b310fb97955c61343c9ce3cca681e..e6a253bcc08c35d28bf7e74bf5d2804573e134db 100644
--- a/source/dnode/mnode/impl/src/mndSnode.c
+++ b/source/dnode/mnode/impl/src/mndSnode.c
@@ -105,6 +105,8 @@ _OVER:
static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SSnodeObj *pObj = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -114,10 +116,10 @@ static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SSnodeObj));
+ pRow = sdbAllocRow(sizeof(SSnodeObj));
if (pRow == NULL) goto _OVER;
- SSnodeObj *pObj = sdbGetRowObj(pRow);
+ pObj = sdbGetRowObj(pRow);
if (pObj == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -130,7 +132,7 @@ static SSdbRow *mndSnodeActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("snode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr());
+ mError("snode:%d, failed to decode from raw:%p since %s", pObj == NULL ? 0 : pObj->id, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -208,7 +210,7 @@ static int32_t mndSetCreateSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, S
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_CREATE_SNODE;
- action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_SNODE_ALREADY_DEPLOYED;
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
@@ -235,7 +237,7 @@ static int32_t mndSetCreateSnodeUndoActions(STrans *pTrans, SDnodeObj *pDnode, S
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_DROP_SNODE;
- action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_SNODE_NOT_DEPLOYED;
if (mndTransAppendUndoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
@@ -350,7 +352,7 @@ static int32_t mndSetDropSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SSn
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_DROP_SNODE;
- action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_SNODE_NOT_DEPLOYED;
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c
index cee0b84672a6d8e5c57c6718f1f665b2ab82e934..c611cfb6e1d8adf8c5ae1f0c6f9bb3d2071bb472 100644
--- a/source/dnode/mnode/impl/src/mndStb.c
+++ b/source/dnode/mnode/impl/src/mndStb.c
@@ -162,6 +162,8 @@ _OVER:
static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SStbObj *pStb = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -171,10 +173,10 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SStbObj));
+ pRow = sdbAllocRow(sizeof(SStbObj));
if (pRow == NULL) goto _OVER;
- SStbObj *pStb = sdbGetRowObj(pRow);
+ pStb = sdbGetRowObj(pRow);
if (pStb == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -254,10 +256,12 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("stb:%s, failed to decode from raw:%p since %s", pStb->name, pRaw, terrstr());
- taosMemoryFreeClear(pStb->pColumns);
- taosMemoryFreeClear(pStb->pTags);
- taosMemoryFreeClear(pStb->comment);
+ mError("stb:%s, failed to decode from raw:%p since %s", pStb == NULL ? "null" : pStb->name, pRaw, terrstr());
+ if (pStb != NULL) {
+ taosMemoryFreeClear(pStb->pColumns);
+ taosMemoryFreeClear(pStb->pTags);
+ taosMemoryFreeClear(pStb->comment);
+ }
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -446,13 +450,15 @@ static void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pSt
req.rsmaParam.watermark[1] = pStb->watermark[1];
if (pStb->ast1Len > 0) {
if (mndConvertRsmaTask(&req.rsmaParam.qmsg[0], &req.rsmaParam.qmsgLen[0], pStb->pAst1, pStb->uid,
- STREAM_TRIGGER_WINDOW_CLOSE, req.rsmaParam.watermark[0]) < 0) {
+ STREAM_TRIGGER_WINDOW_CLOSE, req.rsmaParam.watermark[0],
+ req.rsmaParam.deleteMark[0]) < 0) {
goto _err;
}
}
if (pStb->ast2Len > 0) {
if (mndConvertRsmaTask(&req.rsmaParam.qmsg[1], &req.rsmaParam.qmsgLen[1], pStb->pAst2, pStb->uid,
- STREAM_TRIGGER_WINDOW_CLOSE, req.rsmaParam.watermark[1]) < 0) {
+ STREAM_TRIGGER_WINDOW_CLOSE, req.rsmaParam.watermark[1],
+ req.rsmaParam.deleteMark[1]) < 0) {
goto _err;
}
}
@@ -1187,11 +1193,11 @@ static int32_t mndCheckAlterColForTopic(SMnode *pMnode, const char *stbFullName,
goto NEXT;
}
if (pCol->colId > 0 && pCol->colId == colId) {
- sdbRelease(pSdb, pTopic);
- nodesDestroyNode(pAst);
- nodesDestroyList(pNodeList);
terrno = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TOPIC;
mError("topic:%s, check colId:%d conflicted", pTopic->name, pCol->colId);
+ nodesDestroyNode(pAst);
+ nodesDestroyList(pNodeList);
+ sdbRelease(pSdb, pTopic);
return -1;
}
mInfo("topic:%s, check colId:%d passed", pTopic->name, pCol->colId);
@@ -1230,11 +1236,11 @@ static int32_t mndCheckAlterColForStream(SMnode *pMnode, const char *stbFullName
goto NEXT;
}
if (pCol->colId > 0 && pCol->colId == colId) {
- sdbRelease(pSdb, pStream);
- nodesDestroyNode(pAst);
- nodesDestroyList(pNodeList);
terrno = TSDB_CODE_MND_STREAM_MUST_BE_DELETED;
mError("stream:%s, check colId:%d conflicted", pStream->name, pCol->colId);
+ nodesDestroyNode(pAst);
+ nodesDestroyList(pNodeList);
+ sdbRelease(pSdb, pStream);
return -1;
}
mInfo("stream:%s, check colId:%d passed", pStream->name, pCol->colId);
@@ -1279,11 +1285,11 @@ static int32_t mndCheckAlterColForTSma(SMnode *pMnode, const char *stbFullName,
goto NEXT;
}
if ((pCol->colId) > 0 && (pCol->colId == colId)) {
- sdbRelease(pSdb, pSma);
- nodesDestroyNode(pAst);
- nodesDestroyList(pNodeList);
terrno = TSDB_CODE_MND_FIELD_CONFLICT_WITH_TSMA;
mError("tsma:%s, check colId:%d conflicted", pSma->name, pCol->colId);
+ nodesDestroyNode(pAst);
+ nodesDestroyList(pNodeList);
+ sdbRelease(pSdb, pSma);
return -1;
}
mInfo("tsma:%s, check colId:%d passed", pSma->name, pCol->colId);
@@ -1684,7 +1690,7 @@ static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName,
}
if (pStb->numOfFuncs > 0) {
- pRsp->pFuncs = taosArrayDup(pStb->pFuncs);
+ pRsp->pFuncs = taosArrayDup(pStb->pFuncs, NULL);
}
taosRUnLockLatch(&pStb->lock);
diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c
index 62247f2c2a36592ef0983be69b8188a8f6980176..7ee688d220931e3a0bf70e93b99a000e0852b5e1 100644
--- a/source/dnode/mnode/impl/src/mndStream.c
+++ b/source/dnode/mnode/impl/src/mndStream.c
@@ -28,7 +28,7 @@
#include "parser.h"
#include "tname.h"
-#define MND_STREAM_VER_NUMBER 1
+#define MND_STREAM_VER_NUMBER 2
#define MND_STREAM_RESERVE_SIZE 64
static int32_t mndStreamActionInsert(SSdb *pSdb, SStreamObj *pStream);
@@ -36,6 +36,8 @@ static int32_t mndStreamActionDelete(SSdb *pSdb, SStreamObj *pStream);
static int32_t mndStreamActionUpdate(SSdb *pSdb, SStreamObj *pStream, SStreamObj *pNewStream);
static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq);
static int32_t mndProcessDropStreamReq(SRpcMsg *pReq);
+static int32_t mndProcessStreamCheckpointTmr(SRpcMsg *pReq);
+static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq);
/*static int32_t mndProcessRecoverStreamReq(SRpcMsg *pReq);*/
static int32_t mndProcessStreamMetaReq(SRpcMsg *pReq);
static int32_t mndGetStreamMeta(SRpcMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta);
@@ -62,6 +64,10 @@ int32_t mndInitStream(SMnode *pMnode) {
mndSetMsgHandle(pMnode, TDMT_STREAM_TASK_DEPLOY_RSP, mndTransProcessRsp);
mndSetMsgHandle(pMnode, TDMT_STREAM_TASK_DROP_RSP, mndTransProcessRsp);
+ mndSetMsgHandle(pMnode, TDMT_MND_STREAM_CHECKPOINT_TIMER, mndProcessStreamCheckpointTmr);
+ mndSetMsgHandle(pMnode, TDMT_MND_STREAM_BEGIN_CHECKPOINT, mndProcessStreamDoCheckpoint);
+ mndSetMsgHandle(pMnode, TDMT_STREAM_TASK_REPORT_CHECKPOINT, mndTransProcessRsp);
+
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STREAMS, mndRetrieveStream);
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STREAMS, mndCancelGetNextStream);
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STREAM_TASKS, mndRetrieveStreamTask);
@@ -120,21 +126,22 @@ STREAM_ENCODE_OVER:
SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
- void *buf = NULL;
+ SSdbRow *pRow = NULL;
+ SStreamObj *pStream = NULL;
+ void *buf = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto STREAM_DECODE_OVER;
- if (sver != MND_STREAM_VER_NUMBER) {
+ if (sver != 1 && sver != 2) {
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
goto STREAM_DECODE_OVER;
}
- int32_t size = sizeof(SStreamObj);
- SSdbRow *pRow = sdbAllocRow(size);
+ pRow = sdbAllocRow(sizeof(SStreamObj));
if (pRow == NULL) goto STREAM_DECODE_OVER;
- SStreamObj *pStream = sdbGetRowObj(pRow);
+ pStream = sdbGetRowObj(pRow);
if (pStream == NULL) goto STREAM_DECODE_OVER;
int32_t tlen;
@@ -146,7 +153,7 @@ SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) {
SDecoder decoder;
tDecoderInit(&decoder, buf, tlen + 1);
- if (tDecodeSStreamObj(&decoder, pStream) < 0) {
+ if (tDecodeSStreamObj(&decoder, pStream, sver) < 0) {
tDecoderClear(&decoder);
goto STREAM_DECODE_OVER;
}
@@ -157,7 +164,7 @@ SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) {
STREAM_DECODE_OVER:
taosMemoryFreeClear(buf);
if (terrno != TSDB_CODE_SUCCESS) {
- mError("stream:%s, failed to decode from raw:%p since %s", pStream->name, pRaw, terrstr());
+ mError("stream:%s, failed to decode from raw:%p since %s", pStream == NULL ? "null" : pStream->name, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -525,6 +532,7 @@ static int32_t mndCreateStbForStream(SMnode *pMnode, STrans *pTrans, const SStre
tFreeSMCreateStbReq(&createReq);
mndFreeStb(&stbObj);
+ mndReleaseStb(pMnode, pStb);
mndReleaseDb(pMnode, pDb);
return 0;
@@ -678,93 +686,183 @@ _OVER:
tFreeStreamObj(&streamObj);
return code;
}
-
-static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) {
+static int32_t mndProcessStreamCheckpointTmr(SRpcMsg *pReq) {
SMnode *pMnode = pReq->info.node;
+ SSdb *pSdb = pMnode->pSdb;
+ void *pIter = NULL;
SStreamObj *pStream = NULL;
- /*SDbObj *pDb = NULL;*/
- /*SUserObj *pUser = NULL;*/
- SMDropStreamReq dropReq = {0};
- if (tDeserializeSMDropStreamReq(pReq->pCont, pReq->contLen, &dropReq) < 0) {
- ASSERT(0);
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
+ // iterate all stream obj
+ while (1) {
+ pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
+ if (pIter == NULL) break;
+ // incr tick
+ int64_t currentTick = atomic_add_fetch_64(&pStream->currentTick, 1);
+ // if >= checkpointFreq, build msg TDMT_MND_STREAM_BEGIN_CHECKPOINT, put into write q
+ if (currentTick >= pStream->checkpointFreq) {
+ atomic_store_64(&pStream->currentTick, 0);
+ SMStreamDoCheckpointMsg *pMsg = rpcMallocCont(sizeof(SMStreamDoCheckpointMsg));
+
+ pMsg->streamId = pStream->uid;
+ pMsg->checkpointId = tGenIdPI64();
+ memcpy(pMsg->streamName, pStream->name, TSDB_STREAM_FNAME_LEN);
+
+ SRpcMsg rpcMsg = {
+ .msgType = TDMT_MND_STREAM_BEGIN_CHECKPOINT,
+ .pCont = pMsg,
+ .contLen = sizeof(SMStreamDoCheckpointMsg),
+ };
+
+ tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg);
+ }
}
- pStream = mndAcquireStream(pMnode, dropReq.name);
+ return 0;
+}
- if (pStream == NULL) {
- if (dropReq.igNotExists) {
- mInfo("stream:%s, not exist, ignore not exist is set", dropReq.name);
- sdbRelease(pMnode->pSdb, pStream);
- return 0;
- } else {
- terrno = TSDB_CODE_MND_STREAM_NOT_EXIST;
- return -1;
- }
- }
+static int32_t mndBuildStreamCheckpointSourceReq(void **pBuf, int32_t *pLen, const SStreamTask *pTask,
+ SMStreamDoCheckpointMsg *pMsg) {
+ SStreamCheckpointSourceReq req = {0};
+ req.checkpointId = pMsg->checkpointId;
+ req.nodeId = pTask->nodeId;
+ req.expireTime = -1;
+ req.streamId = pTask->streamId;
+ req.taskId = pTask->taskId;
- if (mndCheckDbPrivilegeByName(pMnode, pReq->info.conn.user, MND_OPER_WRITE_DB, pStream->targetDb) != 0) {
+ int32_t code;
+ int32_t blen;
+
+ tEncodeSize(tEncodeSStreamCheckpointSourceReq, &req, blen, code);
+ if (code < 0) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stream");
- mndTransSetDbName(pTrans, pStream->sourceDb, pStream->targetDb);
- if (pTrans == NULL) {
- mError("stream:%s, failed to drop since %s", dropReq.name, terrstr());
- sdbRelease(pMnode->pSdb, pStream);
+ int32_t tlen = sizeof(SMsgHead) + blen;
+
+ void *buf = taosMemoryMalloc(tlen);
+ if (buf == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- mInfo("trans:%d, used to drop stream:%s", pTrans->id, dropReq.name);
- // drop all tasks
- if (mndDropStreamTasks(pMnode, pTrans, pStream) < 0) {
- mError("stream:%s, failed to drop task since %s", dropReq.name, terrstr());
- sdbRelease(pMnode->pSdb, pStream);
- mndTransDrop(pTrans);
+ void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
+ SEncoder encoder;
+ tEncoderInit(&encoder, abuf, tlen);
+ tEncodeSStreamCheckpointSourceReq(&encoder, &req);
+
+ SMsgHead *pMsgHead = (SMsgHead *)buf;
+ pMsgHead->contLen = htonl(tlen);
+ pMsgHead->vgId = htonl(pTask->nodeId);
+
+ tEncoderClear(&encoder);
+
+ *pBuf = buf;
+ *pLen = tlen;
+
+ return 0;
+}
+
+static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) {
+ SMnode *pMnode = pReq->info.node;
+ SSdb *pSdb = pMnode->pSdb;
+
+ SMStreamDoCheckpointMsg *pMsg = (SMStreamDoCheckpointMsg *)pReq->pCont;
+
+ SStreamObj *pStream = mndAcquireStream(pMnode, pMsg->streamName);
+
+ if (pStream == NULL || pStream->uid != pMsg->streamId) {
+ mError("start checkpointing failed since stream %s not found", pMsg->streamName);
return -1;
}
- // drop stream
- if (mndPersistDropStreamLog(pMnode, pTrans, pStream) < 0) {
- sdbRelease(pMnode->pSdb, pStream);
- mndTransDrop(pTrans);
- return -1;
+ // build new transaction:
+ STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "stream-checkpoint");
+ if (pTrans == NULL) return -1;
+ mndTransSetDbName(pTrans, pStream->sourceDb, pStream->targetDb);
+ taosRLockLatch(&pStream->lock);
+ // 1. redo action: broadcast checkpoint source msg for all source vg
+ int32_t totLevel = taosArrayGetSize(pStream->tasks);
+ for (int32_t i = 0; i < totLevel; i++) {
+ SArray *pLevel = taosArrayGetP(pStream->tasks, i);
+ SStreamTask *pTask = taosArrayGetP(pLevel, 0);
+ if (pTask->taskLevel == TASK_LEVEL__SOURCE) {
+ int32_t sz = taosArrayGetSize(pLevel);
+ for (int32_t j = 0; j < sz; j++) {
+ SStreamTask *pTask = taosArrayGetP(pLevel, j);
+ ASSERT(pTask->nodeId > 0);
+ SVgObj *pVgObj = mndAcquireVgroup(pMnode, pTask->nodeId);
+ if (pVgObj == NULL) {
+ ASSERT(0);
+ taosRUnLockLatch(&pStream->lock);
+ mndReleaseStream(pMnode, pStream);
+ mndTransDrop(pTrans);
+ return -1;
+ }
+
+ void *buf;
+ int32_t tlen;
+ if (mndBuildStreamCheckpointSourceReq(&buf, &tlen, pTask, pMsg) < 0) {
+ taosRUnLockLatch(&pStream->lock);
+ mndReleaseStream(pMnode, pStream);
+ mndTransDrop(pTrans);
+ return -1;
+ }
+
+ STransAction action = {0};
+ action.epSet = mndGetVgroupEpset(pMnode, pVgObj);
+ action.pCont = buf;
+ action.contLen = tlen;
+ action.msgType = TDMT_VND_STREAM_CHECK_POINT_SOURCE;
+
+ mndReleaseVgroup(pMnode, pVgObj);
+
+ if (mndTransAppendRedoAction(pTrans, &action) != 0) {
+ taosMemoryFree(buf);
+ taosRUnLockLatch(&pStream->lock);
+ mndReleaseStream(pMnode, pStream);
+ mndTransDrop(pTrans);
+ return -1;
+ }
+ }
+ }
}
+ // 2. reset tick
+ atomic_store_64(&pStream->currentTick, 0);
+ // 3. commit log: stream checkpoint info
+ taosRUnLockLatch(&pStream->lock);
if (mndTransPrepare(pMnode, pTrans) != 0) {
- mError("trans:%d, failed to prepare drop stream trans since %s", pTrans->id, terrstr());
- sdbRelease(pMnode->pSdb, pStream);
+ mError("failed to prepare trans rebalance since %s", terrstr());
mndTransDrop(pTrans);
+ mndReleaseStream(pMnode, pStream);
return -1;
}
- sdbRelease(pMnode->pSdb, pStream);
+ mndReleaseStream(pMnode, pStream);
mndTransDrop(pTrans);
- return TSDB_CODE_ACTION_IN_PROGRESS;
+ return 0;
}
-#if 0
-static int32_t mndProcessRecoverStreamReq(SRpcMsg *pReq) {
+static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) {
SMnode *pMnode = pReq->info.node;
SStreamObj *pStream = NULL;
/*SDbObj *pDb = NULL;*/
/*SUserObj *pUser = NULL;*/
- SMRecoverStreamReq recoverReq = {0};
- if (tDeserializeSMRecoverStreamReq(pReq->pCont, pReq->contLen, &recoverReq) < 0) {
+ SMDropStreamReq dropReq = {0};
+ if (tDeserializeSMDropStreamReq(pReq->pCont, pReq->contLen, &dropReq) < 0) {
ASSERT(0);
terrno = TSDB_CODE_INVALID_MSG;
return -1;
}
- pStream = mndAcquireStream(pMnode, recoverReq.name);
+ pStream = mndAcquireStream(pMnode, dropReq.name);
if (pStream == NULL) {
- if (recoverReq.igNotExists) {
- mInfo("stream:%s, not exist, ignore not exist is set", recoverReq.name);
+ if (dropReq.igNotExists) {
+ mInfo("stream:%s, not exist, ignore not exist is set", dropReq.name);
sdbRelease(pMnode->pSdb, pStream);
return 0;
} else {
@@ -777,39 +875,42 @@ static int32_t mndProcessRecoverStreamReq(SRpcMsg *pReq) {
return -1;
}
- STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, pReq);
+ STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB_INSIDE, pReq, "drop-stream");
+ mndTransSetDbName(pTrans, pStream->sourceDb, pStream->targetDb);
if (pTrans == NULL) {
- mError("stream:%s, failed to recover since %s", recoverReq.name, terrstr());
+ mError("stream:%s, failed to drop since %s", dropReq.name, terrstr());
sdbRelease(pMnode->pSdb, pStream);
return -1;
}
- mInfo("trans:%d, used to drop stream:%s", pTrans->id, recoverReq.name);
+ mInfo("trans:%d, used to drop stream:%s", pTrans->id, dropReq.name);
- // broadcast to recover all tasks
- if (mndRecoverStreamTasks(pMnode, pTrans, pStream) < 0) {
- mError("stream:%s, failed to recover task since %s", recoverReq.name, terrstr());
+ // drop all tasks
+ if (mndDropStreamTasks(pMnode, pTrans, pStream) < 0) {
+ mError("stream:%s, failed to drop task since %s", dropReq.name, terrstr());
sdbRelease(pMnode->pSdb, pStream);
+ mndTransDrop(pTrans);
return -1;
}
- // update stream status
- if (mndSetStreamRecover(pMnode, pTrans, pStream) < 0) {
+ // drop stream
+ if (mndPersistDropStreamLog(pMnode, pTrans, pStream) < 0) {
sdbRelease(pMnode->pSdb, pStream);
+ mndTransDrop(pTrans);
return -1;
}
if (mndTransPrepare(pMnode, pTrans) != 0) {
- mError("trans:%d, failed to prepare recover stream trans since %s", pTrans->id, terrstr());
+ mError("trans:%d, failed to prepare drop stream trans since %s", pTrans->id, terrstr());
sdbRelease(pMnode->pSdb, pStream);
mndTransDrop(pTrans);
return -1;
}
sdbRelease(pMnode->pSdb, pStream);
+ mndTransDrop(pTrans);
return TSDB_CODE_ACTION_IN_PROGRESS;
}
-#endif
int32_t mndDropStreamByDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
SSdb *pSdb = pMnode->pSdb;
@@ -845,13 +946,6 @@ int32_t mndDropStreamByDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
}
}
-#if 0
- if (mndSetDropOffsetStreamLogs(pMnode, pTrans, pStream) < 0) {
- sdbRelease(pSdb, pStream);
- goto END;
- }
-#endif
-
sdbRelease(pSdb, pStream);
}
diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c
index 58c89d76aa41542d4138ed4b638333edc74ef947..55e073a8a4a4e10df6410d5e77dd975b1bde3535 100644
--- a/source/dnode/mnode/impl/src/mndSubscribe.c
+++ b/source/dnode/mnode/impl/src/mndSubscribe.c
@@ -440,9 +440,9 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
}
static int32_t mndPersistRebResult(SMnode *pMnode, SRpcMsg *pMsg, const SMqRebOutputObj *pOutput) {
- STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pMsg, "persist-reb");
- mndTransSetDbName(pTrans, pOutput->pSub->dbName, NULL);
+ STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pMsg, "tmq-reb");
if (pTrans == NULL) return -1;
+ mndTransSetDbName(pTrans, pOutput->pSub->dbName, NULL);
// make txn:
// 1. redo action: action to all vg
@@ -523,28 +523,6 @@ static int32_t mndPersistRebResult(SMnode *pMnode, SRpcMsg *pMsg, const SMqRebOu
tDeleteSMqConsumerObj(pConsumerNew);
taosMemoryFree(pConsumerNew);
}
-#if 0
- if (consumerNum) {
- char topic[TSDB_TOPIC_FNAME_LEN];
- char cgroup[TSDB_CGROUP_LEN];
- mndSplitSubscribeKey(pOutput->pSub->key, topic, cgroup, true);
- SMqTopicObj *pTopic = mndAcquireTopic(pMnode, topic);
- if (pTopic) {
- // TODO make topic complete
- SMqTopicObj topicObj = {0};
- memcpy(&topicObj, pTopic, sizeof(SMqTopicObj));
- topicObj.refConsumerCnt = pTopic->refConsumerCnt - consumerNum;
- // TODO is that correct?
- pTopic->refConsumerCnt = topicObj.refConsumerCnt;
- mInfo("subscribe topic %s unref %d consumer cgroup %s, refcnt %d", pTopic->name, consumerNum, cgroup,
- topicObj.refConsumerCnt);
- if (mndSetTopicCommitLogs(pMnode, pTrans, &topicObj) != 0) {
- ASSERT(0);
- goto REB_FAIL;
- }
- }
- }
-#endif
// 4. TODO commit log: modification log
@@ -743,7 +721,9 @@ SUB_ENCODE_OVER:
static SSdbRow *mndSubActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
- void *buf = NULL;
+ SSdbRow *pRow = NULL;
+ SMqSubscribeObj *pSub = NULL;
+ void *buf = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto SUB_DECODE_OVER;
@@ -753,11 +733,10 @@ static SSdbRow *mndSubActionDecode(SSdbRaw *pRaw) {
goto SUB_DECODE_OVER;
}
- int32_t size = sizeof(SMqSubscribeObj);
- SSdbRow *pRow = sdbAllocRow(size);
+ pRow = sdbAllocRow(sizeof(SMqSubscribeObj));
if (pRow == NULL) goto SUB_DECODE_OVER;
- SMqSubscribeObj *pSub = sdbGetRowObj(pRow);
+ pSub = sdbGetRowObj(pRow);
if (pSub == NULL) goto SUB_DECODE_OVER;
int32_t dataPos = 0;
@@ -777,11 +756,12 @@ static SSdbRow *mndSubActionDecode(SSdbRaw *pRaw) {
SUB_DECODE_OVER:
taosMemoryFreeClear(buf);
if (terrno != TSDB_CODE_SUCCESS) {
- mError("subscribe:%s, failed to decode from raw:%p since %s", pSub->key, pRaw, terrstr());
+ mError("subscribe:%s, failed to decode from raw:%p since %s", pSub == NULL ? "null" : pSub->key, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
+ mTrace("subscribe:%s, decode from raw:%p, row:%p", pSub->key, pRaw, pSub);
return pRow;
}
@@ -928,6 +908,7 @@ int32_t mndDropSubByTopic(SMnode *pMnode, STrans *pTrans, const char *topicName)
action.msgType = TDMT_VND_TMQ_DELETE_SUB;
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
+ sdbRelease(pSdb, pSub);
return -1;
}
}
@@ -936,6 +917,8 @@ int32_t mndDropSubByTopic(SMnode *pMnode, STrans *pTrans, const char *topicName)
sdbRelease(pSdb, pSub);
goto END;
}
+
+ sdbRelease(pSdb, pSub);
}
code = 0;
diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c
index 4dd7e070b331f5eded04dd69f08d9e6a971d9048..10b1e3649680c9eed8bec2607203b08bbe241b2b 100644
--- a/source/dnode/mnode/impl/src/mndSync.c
+++ b/source/dnode/mnode/impl/src/mndSync.c
@@ -72,15 +72,11 @@ static int32_t mndSyncSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) {
return code;
}
-void mndSyncCommitMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
+int32_t mndProcessWriteMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
SMnode *pMnode = pFsm->data;
SSyncMgmt *pMgmt = &pMnode->syncMgmt;
SSdbRaw *pRaw = pMsg->pCont;
- // delete msg handle
- SRpcMsg rpcMsg = {0};
- rpcMsg.info = pMsg->info;
-
int32_t transId = sdbGetIdFromRaw(pMnode->pSdb, pRaw);
pMgmt->errCode = pMeta->code;
mInfo("trans:%d, is proposed, saved:%d code:0x%x, apply index:%" PRId64 " term:%" PRIu64 " config:%" PRId64
@@ -118,6 +114,21 @@ void mndSyncCommitMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMet
mError("trans:%d, not found while execute in mnode since %s", transId, terrstr());
}
}
+
+ return 0;
+}
+
+int32_t mndSyncCommitMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
+ int32_t code = 0;
+ if (!syncUtilUserCommit(pMsg->msgType)) {
+ goto _out;
+ }
+ code = mndProcessWriteMsg(pFsm, pMsg, pMeta);
+
+_out:
+ rpcFreeCont(pMsg->pCont);
+ pMsg->pCont = NULL;
+ return code;
}
int32_t mndSyncGetSnapshot(const SSyncFSM *pFsm, SSnapshot *pSnapshot, void *pReaderParam, void **ppReader) {
@@ -138,9 +149,13 @@ void mndRestoreFinish(const SSyncFSM *pFsm) {
SMnode *pMnode = pFsm->data;
if (!pMnode->deploy) {
- mInfo("vgId:1, sync restore finished, and will handle outstanding transactions");
- mndTransPullup(pMnode);
- mndSetRestored(pMnode, true);
+ if (!pMnode->restored) {
+ mInfo("vgId:1, sync restore finished, and will handle outstanding transactions");
+ mndTransPullup(pMnode);
+ mndSetRestored(pMnode, true);
+ } else {
+ mInfo("vgId:1, sync restore finished, repeat call");
+ }
} else {
mInfo("vgId:1, sync restore finished");
}
@@ -316,7 +331,7 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) {
if (pMgmt->transId != 0) {
mError("trans:%d, can't be proposed since trans:%d already waiting for confirm", transId, pMgmt->transId);
taosWUnLockLatch(&pMgmt->lock);
- terrno = TSDB_CODE_APP_NOT_READY;
+ terrno = TSDB_CODE_MND_LAST_TRANS_NOT_FINISHED;
return -1;
}
@@ -337,13 +352,11 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) {
sdbSetApplyInfo(pMnode->pSdb, req.info.conn.applyIndex, req.info.conn.applyTerm, SYNC_INDEX_INVALID);
code = 0;
} else {
- mInfo("trans:%d, failed to proposed since %s", transId, terrstr());
+ mError("trans:%d, failed to proposed since %s", transId, terrstr());
taosWLockLatch(&pMgmt->lock);
pMgmt->transId = 0;
taosWUnLockLatch(&pMgmt->lock);
- if (terrno == TSDB_CODE_SYN_NOT_LEADER) {
- terrno = TSDB_CODE_APP_NOT_READY;
- } else {
+ if (terrno == 0) {
terrno = TSDB_CODE_APP_ERROR;
}
}
@@ -361,7 +374,10 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) {
void mndSyncStart(SMnode *pMnode) {
SSyncMgmt *pMgmt = &pMnode->syncMgmt;
- syncStart(pMgmt->sync);
+ if (syncStart(pMgmt->sync) < 0) {
+ mError("vgId:1, failed to start sync, id:%" PRId64, pMgmt->sync);
+ return;
+ }
mInfo("vgId:1, sync started, id:%" PRId64, pMgmt->sync);
}
@@ -376,20 +392,23 @@ void mndSyncStop(SMnode *pMnode) {
}
bool mndIsLeader(SMnode *pMnode) {
+ terrno = 0;
SSyncState state = syncGetState(pMnode->syncMgmt.sync);
- if (state.state != TAOS_SYNC_STATE_LEADER || !state.restored) {
- if (state.state != TAOS_SYNC_STATE_LEADER) {
- terrno = TSDB_CODE_SYN_NOT_LEADER;
- } else {
- terrno = TSDB_CODE_APP_NOT_READY;
- }
- mDebug("vgId:1, mnode not ready, state:%s, restore:%d", syncStr(state.state), state.restored);
+ if (terrno != 0) {
+ mDebug("vgId:1, mnode is stopping");
+ return false;
+ }
+
+ if (state.state != TAOS_SYNC_STATE_LEADER) {
+ terrno = TSDB_CODE_SYN_NOT_LEADER;
+ mDebug("vgId:1, mnode not leader, state:%s", syncStr(state.state));
return false;
}
- if (!mndGetRestored(pMnode)) {
- terrno = TSDB_CODE_APP_NOT_READY;
+ if (!state.restored || !pMnode->restored) {
+ terrno = TSDB_CODE_SYN_RESTORING;
+ mDebug("vgId:1, mnode not restored:%d:%d", state.restored, pMnode->restored);
return false;
}
diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c
index 522036afa22354409261ed94f49457cea73756b0..e271eedd17be41291102bb889470ba87d7160c05 100644
--- a/source/dnode/mnode/impl/src/mndTopic.c
+++ b/source/dnode/mnode/impl/src/mndTopic.c
@@ -28,7 +28,7 @@
#include "parser.h"
#include "tname.h"
-#define MND_TOPIC_VER_NUMBER 1
+#define MND_TOPIC_VER_NUMBER 2
#define MND_TOPIC_RESERVE_SIZE 64
static int32_t mndTopicActionInsert(SSdb *pSdb, SMqTopicObj *pTopic);
@@ -93,6 +93,7 @@ SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic) {
int32_t dataPos = 0;
SDB_SET_BINARY(pRaw, dataPos, pTopic->name, TSDB_TOPIC_FNAME_LEN, TOPIC_ENCODE_OVER);
SDB_SET_BINARY(pRaw, dataPos, pTopic->db, TSDB_DB_FNAME_LEN, TOPIC_ENCODE_OVER);
+ SDB_SET_BINARY(pRaw, dataPos, pTopic->createUser, TSDB_USER_LEN, TOPIC_ENCODE_OVER);
SDB_SET_INT64(pRaw, dataPos, pTopic->createTime, TOPIC_ENCODE_OVER);
SDB_SET_INT64(pRaw, dataPos, pTopic->updateTime, TOPIC_ENCODE_OVER);
SDB_SET_INT64(pRaw, dataPos, pTopic->uid, TOPIC_ENCODE_OVER);
@@ -152,27 +153,31 @@ TOPIC_ENCODE_OVER:
SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SMqTopicObj *pTopic = NULL;
+ void *buf = NULL;
- void *buf = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto TOPIC_DECODE_OVER;
- if (sver != MND_TOPIC_VER_NUMBER) {
+ if (sver != 1 && sver != 2) {
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
goto TOPIC_DECODE_OVER;
}
- int32_t size = sizeof(SMqTopicObj);
- SSdbRow *pRow = sdbAllocRow(size);
+ pRow = sdbAllocRow(sizeof(SMqTopicObj));
if (pRow == NULL) goto TOPIC_DECODE_OVER;
- SMqTopicObj *pTopic = sdbGetRowObj(pRow);
+ pTopic = sdbGetRowObj(pRow);
if (pTopic == NULL) goto TOPIC_DECODE_OVER;
int32_t len;
int32_t dataPos = 0;
SDB_GET_BINARY(pRaw, dataPos, pTopic->name, TSDB_TOPIC_FNAME_LEN, TOPIC_DECODE_OVER);
SDB_GET_BINARY(pRaw, dataPos, pTopic->db, TSDB_DB_FNAME_LEN, TOPIC_DECODE_OVER);
+ if (sver >= 2) {
+ SDB_GET_BINARY(pRaw, dataPos, pTopic->createUser, TSDB_USER_LEN, TOPIC_DECODE_OVER);
+ }
SDB_GET_INT64(pRaw, dataPos, &pTopic->createTime, TOPIC_DECODE_OVER);
SDB_GET_INT64(pRaw, dataPos, &pTopic->updateTime, TOPIC_DECODE_OVER);
SDB_GET_INT64(pRaw, dataPos, &pTopic->uid, TOPIC_DECODE_OVER);
@@ -251,7 +256,7 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
TOPIC_DECODE_OVER:
taosMemoryFreeClear(buf);
if (terrno != TSDB_CODE_SUCCESS) {
- mError("topic:%s, failed to decode from raw:%p since %s", pTopic->name, pRaw, terrstr());
+ mError("topic:%s, failed to decode from raw:%p since %s", pTopic == NULL ? "null" : pTopic->name, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -288,7 +293,7 @@ static int32_t mndTopicActionUpdate(SSdb *pSdb, SMqTopicObj *pOldTopic, SMqTopic
return 0;
}
-SMqTopicObj *mndAcquireTopic(SMnode *pMnode, char *topicName) {
+SMqTopicObj *mndAcquireTopic(SMnode *pMnode, const char *topicName) {
SSdb *pSdb = pMnode->pSdb;
SMqTopicObj *pTopic = sdbAcquire(pSdb, SDB_TOPIC, topicName);
if (pTopic == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
@@ -357,11 +362,18 @@ static int32_t extractTopicTbInfo(SNode *pAst, SMqTopicObj *pTopic) {
return 0;
}
-static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq *pCreate, SDbObj *pDb) {
+static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq *pCreate, SDbObj *pDb,
+ const char *userName) {
mInfo("topic:%s to create", pCreate->name);
SMqTopicObj topicObj = {0};
tstrncpy(topicObj.name, pCreate->name, TSDB_TOPIC_FNAME_LEN);
tstrncpy(topicObj.db, pDb->name, TSDB_DB_FNAME_LEN);
+ tstrncpy(topicObj.createUser, userName, TSDB_USER_LEN);
+
+ if (mndCheckTopicPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_TOPIC, &topicObj) != 0) {
+ return -1;
+ }
+
topicObj.createTime = taosGetTimestampMs();
topicObj.updateTime = topicObj.createTime;
topicObj.uid = mndGenerateUid(pCreate->name, strlen(pCreate->name));
@@ -434,6 +446,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq *
return -1;
}
topicObj.stbUid = pStb->uid;
+ mndReleaseStb(pMnode, pStb);
}
/*} else if (pCreate->subType == TOPIC_SUB_TYPE__DB) {*/
/*topicObj.ast = NULL;*/
@@ -512,6 +525,8 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq *
mndTransDrop(pTrans);
return -1;
}
+
+ sdbRelease(pSdb, pVgroup);
}
}
@@ -570,11 +585,7 @@ static int32_t mndProcessCreateTopicReq(SRpcMsg *pReq) {
goto _OVER;
}
- if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_DB, pDb) != 0) {
- goto _OVER;
- }
-
- code = mndCreateTopic(pMnode, pReq, &createTopicReq, pDb);
+ code = mndCreateTopic(pMnode, pReq, &createTopicReq, pDb, pReq->info.conn.user);
if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
_OVER:
@@ -630,6 +641,11 @@ static int32_t mndProcessDropTopicReq(SRpcMsg *pReq) {
}
}
+ if (mndCheckTopicPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_TOPIC, pTopic) != 0) {
+ mndReleaseTopic(pMnode, pTopic);
+ return -1;
+ }
+
void *pIter = NULL;
SMqConsumerObj *pConsumer;
while (1) {
@@ -689,10 +705,6 @@ static int32_t mndProcessDropTopicReq(SRpcMsg *pReq) {
}
#endif
- if (mndCheckDbPrivilegeByName(pMnode, pReq->info.conn.user, MND_OPER_READ_DB, pTopic->db) != 0) {
- return -1;
- }
-
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "drop-topic");
mndTransSetDbName(pTrans, pTopic->db, NULL);
if (pTrans == NULL) {
diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c
index 27c58dfba163acbae22caa68cd3e6be7c492984c..4b11884050752a17e57d2a73b237de3bf02eddc1 100644
--- a/source/dnode/mnode/impl/src/mndTrans.c
+++ b/source/dnode/mnode/impl/src/mndTrans.c
@@ -918,10 +918,13 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
sendRsp = true;
}
} else {
- if (pTrans->stage == TRN_STAGE_REDO_ACTION && ((code == TSDB_CODE_APP_NOT_READY && pTrans->failedTimes > 60) ||
- (code != TSDB_CODE_APP_NOT_READY && pTrans->failedTimes > 6))) {
+ if (pTrans->stage == TRN_STAGE_REDO_ACTION) {
+ if (code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_SYN_RESTORING || code == TSDB_CODE_APP_IS_STARTING) {
+ if (pTrans->failedTimes > 60) sendRsp = true;
+ } else {
+ if (pTrans->failedTimes > 6) sendRsp = true;
+ }
if (code == 0) code = TSDB_CODE_MND_TRANS_UNKNOW_ERROR;
- sendRsp = true;
}
}
@@ -942,7 +945,7 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
code = TSDB_CODE_MND_TRANS_NETWORK_UNAVAILL;
}
if (i != 0 && code == 0) {
- code = TSDB_CODE_RPC_REDIRECT;
+ code = TSDB_CODE_MNODE_NOT_FOUND;
}
mInfo("trans:%d, client:%d send rsp, code:0x%x stage:%s app:%p", pTrans->id, i, code, mndTransStr(pTrans->stage),
pInfo->ahandle);
@@ -1039,8 +1042,8 @@ static void mndTransResetAction(SMnode *pMnode, STrans *pTrans, STransAction *pA
pAction->rawWritten = 0;
pAction->msgSent = 0;
pAction->msgReceived = 0;
- if (pAction->errCode == TSDB_CODE_RPC_REDIRECT || pAction->errCode == TSDB_CODE_SYN_NEW_CONFIG_ERROR ||
- pAction->errCode == TSDB_CODE_SYN_INTERNAL_ERROR || pAction->errCode == TSDB_CODE_SYN_NOT_LEADER) {
+ if (pAction->errCode == TSDB_CODE_SYN_NEW_CONFIG_ERROR || pAction->errCode == TSDB_CODE_SYN_INTERNAL_ERROR ||
+ pAction->errCode == TSDB_CODE_SYN_NOT_LEADER) {
pAction->epSet.inUse = (pAction->epSet.inUse + 1) % pAction->epSet.numOfEps;
mInfo("trans:%d, %s:%d execute status is reset and set epset inuse:%d", pTrans->id, mndTransStr(pAction->stage),
pAction->id, pAction->epSet.inUse);
diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c
index 9f4b9fc2de36950267e6727bc7c031c27d3b3603..806ba0c98eee7237ea37c82a10b6eb4f5d6ea958 100644
--- a/source/dnode/mnode/impl/src/mndUser.c
+++ b/source/dnode/mnode/impl/src/mndUser.c
@@ -18,10 +18,11 @@
#include "mndDb.h"
#include "mndPrivilege.h"
#include "mndShow.h"
+#include "mndTopic.h"
#include "mndTrans.h"
#include "tbase64.h"
-#define USER_VER_NUMBER 1
+#define USER_VER_NUMBER 2
#define USER_RESERVE_SIZE 64
static int32_t mndCreateDefaultUsers(SMnode *pMnode);
@@ -36,6 +37,8 @@ static int32_t mndProcessDropUserReq(SRpcMsg *pReq);
static int32_t mndProcessGetUserAuthReq(SRpcMsg *pReq);
static int32_t mndRetrieveUsers(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
static void mndCancelGetNextUser(SMnode *pMnode, void *pIter);
+static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
+static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter);
int32_t mndInitUser(SMnode *pMnode) {
SSdbTable table = {
@@ -56,6 +59,8 @@ int32_t mndInitUser(SMnode *pMnode) {
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_USER, mndRetrieveUsers);
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_USER, mndCancelGetNextUser);
+ mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_PRIVILEGES, mndRetrievePrivileges);
+ mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_PRIVILEGES, mndCancelGetNextPrivileges);
return sdbSetTable(pMnode->pSdb, table);
}
@@ -119,7 +124,9 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) {
int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
- int32_t size = sizeof(SUserObj) + USER_RESERVE_SIZE + (numOfReadDbs + numOfWriteDbs) * TSDB_DB_FNAME_LEN;
+ int32_t numOfTopics = taosHashGetSize(pUser->topics);
+ int32_t size = sizeof(SUserObj) + USER_RESERVE_SIZE + (numOfReadDbs + numOfWriteDbs) * TSDB_DB_FNAME_LEN +
+ numOfTopics * TSDB_TOPIC_FNAME_LEN;
SSdbRaw *pRaw = sdbAllocRaw(SDB_USER, USER_VER_NUMBER, size);
if (pRaw == NULL) goto _OVER;
@@ -137,6 +144,7 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) {
SDB_SET_INT32(pRaw, dataPos, pUser->authVersion, _OVER)
SDB_SET_INT32(pRaw, dataPos, numOfReadDbs, _OVER)
SDB_SET_INT32(pRaw, dataPos, numOfWriteDbs, _OVER)
+ SDB_SET_INT32(pRaw, dataPos, numOfTopics, _OVER)
char *db = taosHashIterate(pUser->readDbs, NULL);
while (db != NULL) {
@@ -150,6 +158,12 @@ SSdbRaw *mndUserActionEncode(SUserObj *pUser) {
db = taosHashIterate(pUser->writeDbs, db);
}
+ char *topic = taosHashIterate(pUser->topics, NULL);
+ while (topic != NULL) {
+ SDB_SET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER);
+ topic = taosHashIterate(pUser->topics, topic);
+ }
+
SDB_SET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
SDB_SET_DATALEN(pRaw, dataPos, _OVER)
@@ -168,19 +182,21 @@ _OVER:
static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SUserObj *pUser = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
- if (sver != USER_VER_NUMBER) {
+ if (sver != 1 && sver != 2) {
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SUserObj));
+ pRow = sdbAllocRow(sizeof(SUserObj));
if (pRow == NULL) goto _OVER;
- SUserObj *pUser = sdbGetRowObj(pRow);
+ pUser = sdbGetRowObj(pRow);
if (pUser == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -197,12 +213,18 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
int32_t numOfReadDbs = 0;
int32_t numOfWriteDbs = 0;
+ int32_t numOfTopics = 0;
SDB_GET_INT32(pRaw, dataPos, &numOfReadDbs, _OVER)
SDB_GET_INT32(pRaw, dataPos, &numOfWriteDbs, _OVER)
+ if (sver >= 2) {
+ SDB_GET_INT32(pRaw, dataPos, &numOfTopics, _OVER)
+ }
+
pUser->readDbs = taosHashInit(numOfReadDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
pUser->writeDbs =
taosHashInit(numOfWriteDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
- if (pUser->readDbs == NULL || pUser->writeDbs == NULL) goto _OVER;
+ pUser->topics = taosHashInit(numOfTopics, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
+ if (pUser->readDbs == NULL || pUser->writeDbs == NULL || pUser->topics == NULL) goto _OVER;
for (int32_t i = 0; i < numOfReadDbs; ++i) {
char db[TSDB_DB_FNAME_LEN] = {0};
@@ -218,6 +240,15 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
taosHashPut(pUser->writeDbs, db, len, db, TSDB_DB_FNAME_LEN);
}
+ if (sver >= 2) {
+ for (int32_t i = 0; i < numOfTopics; ++i) {
+ char topic[TSDB_TOPIC_FNAME_LEN] = {0};
+ SDB_GET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER)
+ int32_t len = strlen(topic) + 1;
+ taosHashPut(pUser->topics, topic, len, topic, TSDB_TOPIC_FNAME_LEN);
+ }
+ }
+
SDB_GET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
taosInitRWLatch(&pUser->lock);
@@ -225,9 +256,12 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("user:%s, failed to decode from raw:%p since %s", pUser->user, pRaw, terrstr());
- taosHashCleanup(pUser->readDbs);
- taosHashCleanup(pUser->writeDbs);
+ mError("user:%s, failed to decode from raw:%p since %s", pUser == NULL ? "null" : pUser->user, pRaw, terrstr());
+ if (pUser != NULL) {
+ taosHashCleanup(pUser->readDbs);
+ taosHashCleanup(pUser->writeDbs);
+ taosHashCleanup(pUser->topics);
+ }
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -255,8 +289,10 @@ static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) {
mTrace("user:%s, perform delete action, row:%p", pUser->user, pUser);
taosHashCleanup(pUser->readDbs);
taosHashCleanup(pUser->writeDbs);
+ taosHashCleanup(pUser->topics);
pUser->readDbs = NULL;
pUser->writeDbs = NULL;
+ pUser->topics = NULL;
return 0;
}
@@ -270,6 +306,7 @@ static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew) {
memcpy(pOld->pass, pNew->pass, TSDB_PASSWORD_LEN);
TSWAP(pOld->readDbs, pNew->readDbs);
TSWAP(pOld->writeDbs, pNew->writeDbs);
+ TSWAP(pOld->topics, pNew->topics);
taosWUnLockLatch(&pOld->lock);
return 0;
@@ -409,7 +446,7 @@ static int32_t mndAlterUser(SMnode *pMnode, SUserObj *pOld, SUserObj *pNew, SRpc
return 0;
}
-SHashObj *mndDupDbHash(SHashObj *pOld) {
+SHashObj *mndDupObjHash(SHashObj *pOld, int32_t dataLen) {
SHashObj *pNew =
taosHashInit(taosHashGetSize(pOld), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
if (pNew == NULL) {
@@ -420,7 +457,7 @@ SHashObj *mndDupDbHash(SHashObj *pOld) {
char *db = taosHashIterate(pOld, NULL);
while (db != NULL) {
int32_t len = strlen(db) + 1;
- if (taosHashPut(pNew, db, len, db, TSDB_DB_FNAME_LEN) != 0) {
+ if (taosHashPut(pNew, db, len, db, dataLen) != 0) {
taosHashCancelIterate(pOld, db);
taosHashCleanup(pNew);
terrno = TSDB_CODE_OUT_OF_MEMORY;
@@ -432,6 +469,10 @@ SHashObj *mndDupDbHash(SHashObj *pOld) {
return pNew;
}
+SHashObj *mndDupDbHash(SHashObj *pOld) { return mndDupObjHash(pOld, TSDB_DB_FNAME_LEN); }
+
+SHashObj *mndDupTopicHash(SHashObj *pOld) { return mndDupObjHash(pOld, TSDB_TOPIC_FNAME_LEN); }
+
static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
SMnode *pMnode = pReq->info.node;
SSdb *pSdb = pMnode->pSdb;
@@ -482,9 +523,10 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
taosRLockLatch(&pUser->lock);
newUser.readDbs = mndDupDbHash(pUser->readDbs);
newUser.writeDbs = mndDupDbHash(pUser->writeDbs);
+ newUser.topics = mndDupTopicHash(pUser->topics);
taosRUnLockLatch(&pUser->lock);
- if (newUser.readDbs == NULL || newUser.writeDbs == NULL) {
+ if (newUser.readDbs == NULL || newUser.writeDbs == NULL || newUser.topics == NULL) {
goto _OVER;
}
@@ -507,14 +549,14 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
}
if (alterReq.alterType == TSDB_ALTER_USER_ADD_READ_DB || alterReq.alterType == TSDB_ALTER_USER_ADD_ALL_DB) {
- if (strcmp(alterReq.dbname, "1.*") != 0) {
- int32_t len = strlen(alterReq.dbname) + 1;
- SDbObj *pDb = mndAcquireDb(pMnode, alterReq.dbname);
+ if (strcmp(alterReq.objname, "1.*") != 0) {
+ int32_t len = strlen(alterReq.objname) + 1;
+ SDbObj *pDb = mndAcquireDb(pMnode, alterReq.objname);
if (pDb == NULL) {
mndReleaseDb(pMnode, pDb);
goto _OVER;
}
- if (taosHashPut(newUser.readDbs, alterReq.dbname, len, alterReq.dbname, TSDB_DB_FNAME_LEN) != 0) {
+ if (taosHashPut(newUser.readDbs, alterReq.objname, len, alterReq.objname, TSDB_DB_FNAME_LEN) != 0) {
mndReleaseDb(pMnode, pDb);
goto _OVER;
}
@@ -531,14 +573,14 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
}
if (alterReq.alterType == TSDB_ALTER_USER_ADD_WRITE_DB || alterReq.alterType == TSDB_ALTER_USER_ADD_ALL_DB) {
- if (strcmp(alterReq.dbname, "1.*") != 0) {
- int32_t len = strlen(alterReq.dbname) + 1;
- SDbObj *pDb = mndAcquireDb(pMnode, alterReq.dbname);
+ if (strcmp(alterReq.objname, "1.*") != 0) {
+ int32_t len = strlen(alterReq.objname) + 1;
+ SDbObj *pDb = mndAcquireDb(pMnode, alterReq.objname);
if (pDb == NULL) {
mndReleaseDb(pMnode, pDb);
goto _OVER;
}
- if (taosHashPut(newUser.writeDbs, alterReq.dbname, len, alterReq.dbname, TSDB_DB_FNAME_LEN) != 0) {
+ if (taosHashPut(newUser.writeDbs, alterReq.objname, len, alterReq.objname, TSDB_DB_FNAME_LEN) != 0) {
mndReleaseDb(pMnode, pDb);
goto _OVER;
}
@@ -555,33 +597,53 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
}
if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_READ_DB || alterReq.alterType == TSDB_ALTER_USER_REMOVE_ALL_DB) {
- if (strcmp(alterReq.dbname, "1.*") != 0) {
- int32_t len = strlen(alterReq.dbname) + 1;
- SDbObj *pDb = mndAcquireDb(pMnode, alterReq.dbname);
+ if (strcmp(alterReq.objname, "1.*") != 0) {
+ int32_t len = strlen(alterReq.objname) + 1;
+ SDbObj *pDb = mndAcquireDb(pMnode, alterReq.objname);
if (pDb == NULL) {
mndReleaseDb(pMnode, pDb);
goto _OVER;
}
- taosHashRemove(newUser.readDbs, alterReq.dbname, len);
+ taosHashRemove(newUser.readDbs, alterReq.objname, len);
} else {
taosHashClear(newUser.readDbs);
}
}
if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_WRITE_DB || alterReq.alterType == TSDB_ALTER_USER_REMOVE_ALL_DB) {
- if (strcmp(alterReq.dbname, "1.*") != 0) {
- int32_t len = strlen(alterReq.dbname) + 1;
- SDbObj *pDb = mndAcquireDb(pMnode, alterReq.dbname);
+ if (strcmp(alterReq.objname, "1.*") != 0) {
+ int32_t len = strlen(alterReq.objname) + 1;
+ SDbObj *pDb = mndAcquireDb(pMnode, alterReq.objname);
if (pDb == NULL) {
mndReleaseDb(pMnode, pDb);
goto _OVER;
}
- taosHashRemove(newUser.writeDbs, alterReq.dbname, len);
+ taosHashRemove(newUser.writeDbs, alterReq.objname, len);
} else {
taosHashClear(newUser.writeDbs);
}
}
+ if (alterReq.alterType == TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC) {
+ int32_t len = strlen(alterReq.objname) + 1;
+ SMqTopicObj *pTopic = mndAcquireTopic(pMnode, alterReq.objname);
+ if (pTopic == NULL) {
+ mndReleaseTopic(pMnode, pTopic);
+ goto _OVER;
+ }
+ taosHashPut(newUser.topics, pTopic->name, len, pTopic->name, TSDB_TOPIC_FNAME_LEN);
+ }
+
+ if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC) {
+ int32_t len = strlen(alterReq.objname) + 1;
+ SMqTopicObj *pTopic = mndAcquireTopic(pMnode, alterReq.objname);
+ if (pTopic == NULL) {
+ mndReleaseTopic(pMnode, pTopic);
+ goto _OVER;
+ }
+ taosHashRemove(newUser.topics, alterReq.objname, len);
+ }
+
code = mndAlterUser(pMnode, pUser, &newUser, pReq);
if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
@@ -594,6 +656,7 @@ _OVER:
mndReleaseUser(pMnode, pUser);
taosHashCleanup(newUser.writeDbs);
taosHashCleanup(newUser.readDbs);
+ taosHashCleanup(newUser.topics);
return code;
}
@@ -756,6 +819,128 @@ static void mndCancelGetNextUser(SMnode *pMnode, void *pIter) {
sdbCancelFetch(pSdb, pIter);
}
+static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
+ SMnode *pMnode = pReq->info.node;
+ SSdb *pSdb = pMnode->pSdb;
+ int32_t numOfRows = 0;
+ SUserObj *pUser = NULL;
+ int32_t cols = 0;
+ char *pWrite;
+
+ while (numOfRows < rows) {
+ pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser);
+ if (pShow->pIter == NULL) break;
+
+ int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
+ int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
+ int32_t numOfTopics = taosHashGetSize(pUser->topics);
+ if (numOfRows + numOfReadDbs + numOfWriteDbs + numOfTopics >= rows) break;
+
+ if (pUser->superUser) {
+ cols = 0;
+ SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
+ colDataAppend(pColInfo, numOfRows, (const char *)userName, false);
+
+ char privilege[20] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(privilege, "all", pShow->pMeta->pSchemas[cols].bytes);
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)privilege, false);
+
+ char objName[20] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(objName, "all", pShow->pMeta->pSchemas[cols].bytes);
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)objName, false);
+
+ numOfRows++;
+ }
+
+ char *db = taosHashIterate(pUser->readDbs, NULL);
+ while (db != NULL) {
+ cols = 0;
+ SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
+ colDataAppend(pColInfo, numOfRows, (const char *)userName, false);
+
+ char privilege[20] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(privilege, "read", pShow->pMeta->pSchemas[cols].bytes);
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)privilege, false);
+
+ SName name = {0};
+ char objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
+ tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB);
+ tNameGetDbName(&name, varDataVal(objName));
+ varDataSetLen(objName, strlen(varDataVal(objName)));
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)objName, false);
+
+ numOfRows++;
+ db = taosHashIterate(pUser->readDbs, db);
+ }
+
+ db = taosHashIterate(pUser->writeDbs, NULL);
+ while (db != NULL) {
+ cols = 0;
+ SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
+ colDataAppend(pColInfo, numOfRows, (const char *)userName, false);
+
+ char privilege[20] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(privilege, "write", pShow->pMeta->pSchemas[cols].bytes);
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)privilege, false);
+
+ SName name = {0};
+ char objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
+ tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB);
+ tNameGetDbName(&name, varDataVal(objName));
+ varDataSetLen(objName, strlen(varDataVal(objName)));
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)objName, false);
+
+ numOfRows++;
+ db = taosHashIterate(pUser->writeDbs, db);
+ }
+
+ char *topic = taosHashIterate(pUser->topics, NULL);
+ while (topic != NULL) {
+ cols = 0;
+ SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
+ colDataAppend(pColInfo, numOfRows, (const char *)userName, false);
+
+ char privilege[20] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(privilege, "subscribe", pShow->pMeta->pSchemas[cols].bytes);
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)privilege, false);
+
+ char topicName[TSDB_TOPIC_NAME_LEN + VARSTR_HEADER_SIZE + 5] = {0};
+ tstrncpy(varDataVal(topicName), mndGetDbStr(topic), TSDB_TOPIC_NAME_LEN - 2);
+ varDataSetLen(topicName, strlen(varDataVal(topicName)));
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)topicName, false);
+
+ numOfRows++;
+ topic = taosHashIterate(pUser->topics, topic);
+ }
+
+ sdbRelease(pSdb, pUser);
+ }
+
+ pShow->numOfRows += numOfRows;
+ return numOfRows;
+}
+
+static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter) {
+ SSdb *pSdb = pMnode->pSdb;
+ sdbCancelFetch(pSdb, pIter);
+}
+
int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_t numOfUses, void **ppRsp,
int32_t *pRspLen) {
SUserAuthBatchRsp batchRsp = {0};
diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c
index 7901093315bc8671a51805913c54d2950f862b82..4a6f0d14daa177205ea7f6c528fc7a4bfbaed324 100644
--- a/source/dnode/mnode/impl/src/mndVgroup.c
+++ b/source/dnode/mnode/impl/src/mndVgroup.c
@@ -22,6 +22,7 @@
#include "mndShow.h"
#include "mndTrans.h"
#include "mndUser.h"
+#include "tmisce.h"
#define VGROUP_VER_NUMBER 1
#define VGROUP_RESERVE_SIZE 64
@@ -112,6 +113,8 @@ _OVER:
SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
+ SSdbRow *pRow = NULL;
+ SVgObj *pVgroup = NULL;
int8_t sver = 0;
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
@@ -121,10 +124,10 @@ SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) {
goto _OVER;
}
- SSdbRow *pRow = sdbAllocRow(sizeof(SVgObj));
+ pRow = sdbAllocRow(sizeof(SVgObj));
if (pRow == NULL) goto _OVER;
- SVgObj *pVgroup = sdbGetRowObj(pRow);
+ pVgroup = sdbGetRowObj(pRow);
if (pVgroup == NULL) goto _OVER;
int32_t dataPos = 0;
@@ -151,7 +154,7 @@ SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) {
_OVER:
if (terrno != 0) {
- mError("vgId:%d, failed to decode from raw:%p since %s", pVgroup->vgId, pRaw, terrstr());
+ mError("vgId:%d, failed to decode from raw:%p since %s", pVgroup == NULL ? 0 : pVgroup->vgId, pRaw, terrstr());
taosMemoryFreeClear(pRow);
return NULL;
}
@@ -178,6 +181,23 @@ static int32_t mndVgroupActionUpdate(SSdb *pSdb, SVgObj *pOld, SVgObj *pNew) {
pOld->hashEnd = pNew->hashEnd;
pOld->replica = pNew->replica;
pOld->isTsma = pNew->isTsma;
+ for (int32_t i = 0; i < pNew->replica; ++i) {
+ SVnodeGid *pNewGid = &pNew->vnodeGid[i];
+ for (int32_t j = 0; j < pOld->replica; ++j) {
+ SVnodeGid *pOldGid = &pOld->vnodeGid[j];
+ if (pNewGid->dnodeId == pOldGid->dnodeId) {
+ pNewGid->syncState = pOldGid->syncState;
+ pNewGid->syncRestore = pOldGid->syncRestore;
+ pNewGid->syncCanRead = pOldGid->syncCanRead;
+ }
+ }
+ }
+ pNew->numOfTables = pOld->numOfTables;
+ pNew->numOfTimeSeries = pOld->numOfTimeSeries;
+ pNew->totalStorage = pOld->totalStorage;
+ pNew->compStorage = pOld->compStorage;
+ pNew->pointsWritten = pOld->pointsWritten;
+ pNew->compact = pOld->compact;
memcpy(pOld->vnodeGid, pNew->vnodeGid, TSDB_MAX_REPLICA * sizeof(SVnodeGid));
return 0;
}
@@ -256,7 +276,7 @@ void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVg
}
if (createReq.selfIndex == -1) {
- terrno = TSDB_CODE_MND_APP_ERROR;
+ terrno = TSDB_CODE_APP_ERROR;
return NULL;
}
@@ -356,7 +376,7 @@ static void *mndBuildAlterVnodeReplicaReq(SMnode *pMnode, SDbObj *pDb, SVgObj *p
}
if (alterReq.selfIndex == -1) {
- terrno = TSDB_CODE_MND_APP_ERROR;
+ terrno = TSDB_CODE_APP_ERROR;
return NULL;
}
@@ -487,7 +507,7 @@ static int32_t mndGetAvailableDnode(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup
for (int32_t v = 0; v < pVgroup->replica; ++v) {
SVnodeGid *pVgid = &pVgroup->vnodeGid[v];
SDnodeObj *pDnode = taosArrayGet(pArray, v);
- if (pDnode == NULL || pDnode->numOfVnodes > pDnode->numOfSupportVnodes) {
+ if (pDnode == NULL || pDnode->numOfVnodes >= pDnode->numOfSupportVnodes) {
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
return -1;
}
@@ -658,24 +678,38 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->numOfTables, false);
- // default 3 replica
- for (int32_t i = 0; i < 3; ++i) {
+ // default 3 replica, add 1 replica if move vnode
+ for (int32_t i = 0; i < 4; ++i) {
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
if (i < pVgroup->replica) {
- colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->vnodeGid[i].dnodeId, false);
+ int16_t dnodeId = (int16_t)pVgroup->vnodeGid[i].dnodeId;
+ colDataAppend(pColInfo, numOfRows, (const char *)&dnodeId, false);
+ bool exist = false;
bool online = false;
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgroup->vnodeGid[i].dnodeId);
if (pDnode != NULL) {
+ exist = true;
online = mndIsDnodeOnline(pDnode, curMs);
mndReleaseDnode(pMnode, pDnode);
}
char buf1[20] = {0};
char role[20] = "offline";
- if (online) {
- bool show = (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER && !pVgroup->vnodeGid[i].syncRestore);
- snprintf(role, sizeof(role), "%s%s", syncStr(pVgroup->vnodeGid[i].syncState), show ? "*" : "");
+ if (!exist) {
+ strcpy(role, "dropping");
+ } else if (online) {
+ char *star = "";
+ if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER) {
+ if (!pVgroup->vnodeGid[i].syncRestore && !pVgroup->vnodeGid[i].syncCanRead) {
+ star = "**";
+ } else if (!pVgroup->vnodeGid[i].syncRestore && pVgroup->vnodeGid[i].syncCanRead) {
+ star = "*";
+ } else {
+ }
+ }
+ snprintf(role, sizeof(role), "%s%s", syncStr(pVgroup->vnodeGid[i].syncState), star);
+ } else {
}
STR_WITH_MAXSIZE_TO_VARSTR(buf1, role, pShow->pMeta->pSchemas[cols].bytes);
@@ -689,16 +723,8 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
}
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
- colDataAppendNULL(pColInfo, numOfRows);
-
- pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
- colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->cacheUsage, false);
-
- pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
- colDataAppendNULL(pColInfo, numOfRows);
-
- pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
- colDataAppendNULL(pColInfo, numOfRows);
+ int32_t cacheUsage = (int32_t)pVgroup->cacheUsage;
+ colDataAppend(pColInfo, numOfRows, (const char *)&cacheUsage, false);
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->isTsma, false);
@@ -845,7 +871,7 @@ static void mndCancelGetNextVnode(SMnode *pMnode, void *pIter) {
sdbCancelFetch(pSdb, pIter);
}
-int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
+static int32_t mndAddVnodeToVgroup(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SArray *pArray) {
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
SDnodeObj *pDnode = taosArrayGet(pArray, i);
@@ -865,7 +891,7 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
}
if (used) continue;
- if (pDnode == NULL || pDnode->numOfVnodes > pDnode->numOfSupportVnodes) {
+ if (pDnode == NULL || pDnode->numOfVnodes >= pDnode->numOfSupportVnodes) {
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
return -1;
}
@@ -881,12 +907,21 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
}
pVgid->dnodeId = pDnode->id;
- pVgid->syncState = TAOS_SYNC_STATE_ERROR;
+ pVgid->syncState = TAOS_SYNC_STATE_OFFLINE;
mInfo("db:%s, vgId:%d, vn:%d is added, memory:%" PRId64 ", dnode:%d avail:%" PRId64 " used:%" PRId64,
pVgroup->dbName, pVgroup->vgId, pVgroup->replica, vgMem, pVgid->dnodeId, pDnode->memAvail, pDnode->memUsed);
pVgroup->replica++;
pDnode->numOfVnodes++;
+
+ SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
+ if (pVgRaw == NULL) return -1;
+ if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) {
+ sdbFreeRaw(pVgRaw);
+ return -1;
+ }
+ (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY);
+
return 0;
}
@@ -895,7 +930,8 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
return -1;
}
-int32_t mndRemoveVnodeFromVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray, SVnodeGid *pDelVgid) {
+static int32_t mndRemoveVnodeFromVgroup(SMnode *pMnode, STrans *pTrans, SVgObj *pVgroup, SArray *pArray,
+ SVnodeGid *pDelVgid) {
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
SDnodeObj *pDnode = taosArrayGet(pArray, i);
@@ -935,6 +971,15 @@ _OVER:
SVnodeGid *pVgid = &pVgroup->vnodeGid[vn];
mInfo("db:%s, vgId:%d, vn:%d dnode:%d is reserved", pVgroup->dbName, pVgroup->vgId, vn, pVgid->dnodeId);
}
+
+ SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
+ if (pVgRaw == NULL) return -1;
+ if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) {
+ sdbFreeRaw(pVgRaw);
+ return -1;
+ }
+ (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY);
+
return 0;
}
@@ -953,7 +998,7 @@ int32_t mndAddCreateVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVg
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_CREATE_VNODE;
- action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_VND_ALREADY_EXIST;
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
taosMemoryFree(pReq);
@@ -1053,7 +1098,7 @@ int32_t mndAddDropVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgOb
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_DROP_VNODE;
- action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_VND_NOT_EXIST;
if (isRedo) {
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
@@ -1081,38 +1126,84 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb,
}
if (!force) {
- mInfo("vgId:%d, will add 1 vnode", pVgroup->vgId);
- if (mndAddVnodeToVgroup(pMnode, &newVg, pArray) != 0) return -1;
- if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVg, &newVg.vnodeGid[newVg.replica - 1]) != 0) return -1;
- for (int32_t i = 0; i < newVg.replica - 1; ++i) {
- if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg, newVg.vnodeGid[i].dnodeId) != 0) return -1;
- }
- if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg) != 0) return -1;
+ if (newVg.replica == 1) {
+ mInfo("vgId:%d, will add 1 vnode, replca:1", pVgroup->vgId);
+ if (mndAddVnodeToVgroup(pMnode, pTrans, &newVg, pArray) != 0) return -1;
+ for (int32_t i = 0; i < newVg.replica - 1; ++i) {
+ if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg, newVg.vnodeGid[i].dnodeId) != 0) return -1;
+ }
+ if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVg, &newVg.vnodeGid[newVg.replica - 1]) != 0) return -1;
+ if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg) != 0) return -1;
+
+ mInfo("vgId:%d, will remove 1 vnode, replca:2", pVgroup->vgId);
+ newVg.replica--;
+ SVnodeGid del = newVg.vnodeGid[vnIndex];
+ newVg.vnodeGid[vnIndex] = newVg.vnodeGid[newVg.replica];
+ memset(&newVg.vnodeGid[newVg.replica], 0, sizeof(SVnodeGid));
+ {
+ SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
+ if (pRaw == NULL) return -1;
+ if (mndTransAppendRedolog(pTrans, pRaw) != 0) {
+ sdbFreeRaw(pRaw);
+ return -1;
+ }
+ (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
+ }
- mInfo("vgId:%d, will remove 1 vnode", pVgroup->vgId);
- newVg.replica--;
- SVnodeGid del = newVg.vnodeGid[vnIndex];
- newVg.vnodeGid[vnIndex] = newVg.vnodeGid[newVg.replica];
- memset(&newVg.vnodeGid[newVg.replica], 0, sizeof(SVnodeGid));
- if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg, &del, true) != 0) return -1;
- for (int32_t i = 0; i < newVg.replica; ++i) {
- if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg, newVg.vnodeGid[i].dnodeId) != 0) return -1;
+ if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg, &del, true) != 0) return -1;
+ for (int32_t i = 0; i < newVg.replica; ++i) {
+ if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg, newVg.vnodeGid[i].dnodeId) != 0) return -1;
+ }
+ if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg) != 0) return -1;
+ } else { // new replica == 3
+ mInfo("vgId:%d, will add 1 vnode, replca:3", pVgroup->vgId);
+ if (mndAddVnodeToVgroup(pMnode, pTrans, &newVg, pArray) != 0) return -1;
+ mInfo("vgId:%d, will remove 1 vnode, replca:4", pVgroup->vgId);
+ newVg.replica--;
+ SVnodeGid del = newVg.vnodeGid[vnIndex];
+ newVg.vnodeGid[vnIndex] = newVg.vnodeGid[newVg.replica];
+ memset(&newVg.vnodeGid[newVg.replica], 0, sizeof(SVnodeGid));
+ {
+ SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
+ if (pRaw == NULL) return -1;
+ if (mndTransAppendRedolog(pTrans, pRaw) != 0) {
+ sdbFreeRaw(pRaw);
+ return -1;
+ }
+ (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
+ }
+
+ if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg, &del, true) != 0) return -1;
+ for (int32_t i = 0; i < newVg.replica; ++i) {
+ if (i == vnIndex) continue;
+ if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg, newVg.vnodeGid[i].dnodeId) != 0) return -1;
+ }
+ if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVg, &newVg.vnodeGid[vnIndex]) != 0) return -1;
+ if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg) != 0) return -1;
}
- if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg) != 0) return -1;
} else {
mInfo("vgId:%d, will add 1 vnode and force remove 1 vnode", pVgroup->vgId);
- if (mndAddVnodeToVgroup(pMnode, &newVg, pArray) != 0) return -1;
+ if (mndAddVnodeToVgroup(pMnode, pTrans, &newVg, pArray) != 0) return -1;
newVg.replica--;
SVnodeGid del = newVg.vnodeGid[vnIndex];
newVg.vnodeGid[vnIndex] = newVg.vnodeGid[newVg.replica];
memset(&newVg.vnodeGid[newVg.replica], 0, sizeof(SVnodeGid));
+ {
+ SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
+ if (pRaw == NULL) return -1;
+ if (mndTransAppendRedolog(pTrans, pRaw) != 0) {
+ sdbFreeRaw(pRaw);
+ return -1;
+ }
+ (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
+ }
- if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVg, &newVg.vnodeGid[vnIndex]) != 0) return -1;
for (int32_t i = 0; i < newVg.replica; ++i) {
if (i != vnIndex) {
if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg, newVg.vnodeGid[i].dnodeId) != 0) return -1;
}
}
+ if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVg, &newVg.vnodeGid[vnIndex]) != 0) return -1;
if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg) != 0) return -1;
if (newVg.replica == 1) {
@@ -1122,16 +1213,12 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb,
{
SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
- if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) return -1;
- (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
- pRaw = NULL;
- }
-
- {
- SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
- if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) return -1;
+ if (pRaw == NULL) return -1;
+ if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
+ sdbFreeRaw(pRaw);
+ return -1;
+ }
(void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
- pRaw = NULL;
}
mInfo("vgId:%d, vgroup info after move, replica:%d", newVg.vgId, newVg.replica);
@@ -1187,12 +1274,20 @@ static int32_t mndAddIncVgroupReplicaToTrans(SMnode *pMnode, STrans *pTrans, SDb
SVnodeGid *pGid = &pVgroup->vnodeGid[pVgroup->replica];
pVgroup->replica++;
pGid->dnodeId = newDnodeId;
- pGid->syncState = TAOS_SYNC_STATE_ERROR;
+ pGid->syncState = TAOS_SYNC_STATE_OFFLINE;
+
+ SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
+ if (pVgRaw == NULL) return -1;
+ if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) {
+ sdbFreeRaw(pVgRaw);
+ return -1;
+ }
+ (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY);
- if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pGid) != 0) return -1;
for (int32_t i = 0; i < pVgroup->replica - 1; ++i) {
if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, pVgroup, pVgroup->vnodeGid[i].dnodeId) != 0) return -1;
}
+ if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pGid) != 0) return -1;
if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, pVgroup) != 0) return -1;
return 0;
@@ -1218,6 +1313,14 @@ static int32_t mndAddDecVgroupReplicaFromTrans(SMnode *pMnode, STrans *pTrans, S
memcpy(pGid, &pVgroup->vnodeGid[pVgroup->replica], sizeof(SVnodeGid));
memset(&pVgroup->vnodeGid[pVgroup->replica], 0, sizeof(SVnodeGid));
+ SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
+ if (pVgRaw == NULL) return -1;
+ if (mndTransAppendRedolog(pTrans, pVgRaw) != 0) {
+ sdbFreeRaw(pVgRaw);
+ return -1;
+ }
+ (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY);
+
if (mndAddDropVnodeAction(pMnode, pTrans, pDb, pVgroup, &delGid, true) != 0) return -1;
for (int32_t i = 0; i < pVgroup->replica; ++i) {
if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, pVgroup, pVgroup->vnodeGid[i].dnodeId) != 0) return -1;
@@ -1230,9 +1333,8 @@ static int32_t mndAddDecVgroupReplicaFromTrans(SMnode *pMnode, STrans *pTrans, S
static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj *pVgroup, SDnodeObj *pNew1,
SDnodeObj *pOld1, SDnodeObj *pNew2, SDnodeObj *pOld2, SDnodeObj *pNew3,
SDnodeObj *pOld3) {
- int32_t code = -1;
- SSdbRaw *pRaw = NULL;
- STrans *pTrans = NULL;
+ int32_t code = -1;
+ STrans *pTrans = NULL;
pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq, "red-vgroup");
if (pTrans == NULL) goto _OVER;
@@ -1313,17 +1415,13 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb,
}
{
- pRaw = mndVgroupActionEncode(&newVg);
- if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) goto _OVER;
- (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
- pRaw = NULL;
- }
-
- {
- pRaw = mndVgroupActionEncode(&newVg);
- if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER;
+ SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
+ if (pRaw == NULL) return -1;
+ if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
+ sdbFreeRaw(pRaw);
+ return -1;
+ }
(void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
- pRaw = NULL;
}
mInfo("vgId:%d, vgroup info after redistribute, replica:%d", newVg.vgId, newVg.replica);
@@ -1336,7 +1434,6 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb,
_OVER:
mndTransDrop(pTrans);
- sdbFreeRaw(pRaw);
mndReleaseDb(pMnode, pDb);
return code;
}
@@ -1587,12 +1684,17 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb
mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId,
pVgroup->vnodeGid[0].dnodeId);
- if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) return -1;
- if (mndAddVnodeToVgroup(pMnode, &newVgroup, pArray) != 0) return -1;
- if (mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &newVgroup.vnodeGid[1]) != 0) return -1;
+ if (mndAddVnodeToVgroup(pMnode, pTrans, &newVgroup, pArray) != 0) return -1;
if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[0].dnodeId) != 0)
return -1;
+ if (mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &newVgroup.vnodeGid[1]) != 0) return -1;
if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1;
+
+ if (mndAddVnodeToVgroup(pMnode, pTrans, &newVgroup, pArray) != 0) return -1;
+ if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[0].dnodeId) != 0)
+ return -1;
+ if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[1].dnodeId) != 0)
+ return -1;
if (mndAddCreateVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &newVgroup.vnodeGid[2]) != 0) return -1;
if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1;
} else if (newVgroup.replica == 3 && pNewDb->cfg.replications == 1) {
@@ -1601,10 +1703,15 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb
SVnodeGid del1 = {0};
SVnodeGid del2 = {0};
- if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del1) != 0) return -1;
- if (mndRemoveVnodeFromVgroup(pMnode, &newVgroup, pArray, &del2) != 0) return -1;
+ if (mndRemoveVnodeFromVgroup(pMnode, pTrans, &newVgroup, pArray, &del1) != 0) return -1;
if (mndAddDropVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &del1, true) != 0) return -1;
+ if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[0].dnodeId) != 0)
+ return -1;
+ if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[1].dnodeId) != 0)
+ return -1;
if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pNewDb, &newVgroup) != 0) return -1;
+
+ if (mndRemoveVnodeFromVgroup(pMnode, pTrans, &newVgroup, pArray, &del2) != 0) return -1;
if (mndAddDropVnodeAction(pMnode, pTrans, pNewDb, &newVgroup, &del2, true) != 0) return -1;
if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pNewDb, &newVgroup, newVgroup.vnodeGid[0].dnodeId) != 0)
return -1;
@@ -1613,16 +1720,6 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb
return -1;
}
- {
- 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;
@@ -1641,10 +1738,9 @@ static int32_t mndAddAdjustVnodeHashRangeAction(SMnode *pMnode, STrans *pTrans,
}
static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj *pVgroup) {
- int32_t code = -1;
- SSdbRaw *pRaw = NULL;
- STrans *pTrans = NULL;
- SArray *pArray = mndBuildDnodesArray(pMnode, 0);
+ int32_t code = -1;
+ STrans *pTrans = NULL;
+ SArray *pArray = mndBuildDnodesArray(pMnode, 0);
pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, pReq, "split-vgroup");
if (pTrans == NULL) goto _OVER;
@@ -1660,16 +1756,16 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj
}
if (newVg1.replica == 1) {
- if (mndAddVnodeToVgroup(pMnode, &newVg1, pArray) != 0) goto _OVER;
- if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVg1, &newVg1.vnodeGid[1]) != 0) goto _OVER;
+ if (mndAddVnodeToVgroup(pMnode, pTrans, &newVg1, pArray) != 0) goto _OVER;
if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg1, newVg1.vnodeGid[0].dnodeId) != 0) goto _OVER;
+ if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVg1, &newVg1.vnodeGid[1]) != 0) goto _OVER;
if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg1) != 0) goto _OVER;
} else if (newVg1.replica == 3) {
SVnodeGid del1 = {0};
- if (mndRemoveVnodeFromVgroup(pMnode, &newVg1, pArray, &del1) != 0) goto _OVER;
+ if (mndRemoveVnodeFromVgroup(pMnode, pTrans, &newVg1, pArray, &del1) != 0) goto _OVER;
+ if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg1, &del1, true) != 0) goto _OVER;
if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg1, newVg1.vnodeGid[0].dnodeId) != 0) goto _OVER;
if (mndAddAlterVnodeReplicaAction(pMnode, pTrans, pDb, &newVg1, newVg1.vnodeGid[1].dnodeId) != 0) goto _OVER;
- if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg1, &del1, true) != 0) goto _OVER;
if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg1) != 0) goto _OVER;
} else {
goto _OVER;
@@ -1711,17 +1807,23 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj
#endif
{
- pRaw = mndVgroupActionEncode(&newVg1);
- if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER;
+ SSdbRaw *pRaw = mndVgroupActionEncode(&newVg1);
+ if (pRaw == NULL) return -1;
+ if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
+ sdbFreeRaw(pRaw);
+ return -1;
+ }
(void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
- pRaw = NULL;
}
{
- pRaw = mndVgroupActionEncode(&newVg2);
- if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER;
+ SSdbRaw *pRaw = mndVgroupActionEncode(&newVg2);
+ if (pRaw == NULL) return -1;
+ if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
+ sdbFreeRaw(pRaw);
+ return -1;
+ }
(void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
- pRaw = NULL;
}
mInfo("vgId:%d, vgroup info after adjust hash, replica:%d hashBegin:%u hashEnd:%u vnode:0 dnode:%d", newVg1.vgId,
@@ -1741,7 +1843,6 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj
_OVER:
taosArrayDestroy(pArray);
mndTransDrop(pTrans);
- sdbFreeRaw(pRaw);
return code;
}
@@ -1786,16 +1887,8 @@ static int32_t mndSetBalanceVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SD
{
SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
- if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) {
- sdbFreeRaw(pRaw);
- return -1;
- }
- (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY);
- }
-
- {
- SSdbRaw *pRaw = mndVgroupActionEncode(&newVg);
- if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) {
+ if (pRaw == NULL) return -1;
+ if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
sdbFreeRaw(pRaw);
return -1;
}
diff --git a/source/dnode/mnode/impl/test/acct/acct.cpp b/source/dnode/mnode/impl/test/acct/acct.cpp
index 46a9a465ebe631665fa753c6de17569160a158d1..1f59a7fcca52497f9b95562eb3611df09ff31079 100644
--- a/source/dnode/mnode/impl/test/acct/acct.cpp
+++ b/source/dnode/mnode/impl/test/acct/acct.cpp
@@ -32,7 +32,7 @@ TEST_F(MndTestAcct, 01_Create_Acct) {
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_ACCT, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_MSG_NOT_PROCESSED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_OPS_NOT_SUPPORT);
}
TEST_F(MndTestAcct, 02_Alter_Acct) {
@@ -42,7 +42,7 @@ TEST_F(MndTestAcct, 02_Alter_Acct) {
SRpcMsg* pRsp = test.SendReq(TDMT_MND_ALTER_ACCT, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_MSG_NOT_PROCESSED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_OPS_NOT_SUPPORT);
}
TEST_F(MndTestAcct, 03_Drop_Acct) {
@@ -52,5 +52,5 @@ TEST_F(MndTestAcct, 03_Drop_Acct) {
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_ACCT, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_MSG_NOT_PROCESSED);
+ ASSERT_EQ(pRsp->code, TSDB_CODE_OPS_NOT_SUPPORT);
}
diff --git a/source/dnode/mnode/impl/test/trans/trans2.cpp b/source/dnode/mnode/impl/test/trans/trans2.cpp
index 60be7cfbc03f2e19b1f8fd6f821eef08a7d56ee0..89c2b6931a321adf551516a685286149a7b003b9 100644
--- a/source/dnode/mnode/impl/test/trans/trans2.cpp
+++ b/source/dnode/mnode/impl/test/trans/trans2.cpp
@@ -173,7 +173,7 @@ class MndTestTrans2 : public ::testing::Test {
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_CREATE_MNODE;
- action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_MNODE_ALREADY_DEPLOYED;
mndTransAppendRedoAction(pTrans, &action);
}
@@ -190,7 +190,7 @@ class MndTestTrans2 : public ::testing::Test {
action.pCont = pReq;
action.contLen = contLen;
action.msgType = TDMT_DND_CREATE_MNODE;
- action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
+ action.acceptableCode = TSDB_CODE_MNODE_ALREADY_DEPLOYED;
mndTransAppendUndoAction(pTrans, &action);
}
diff --git a/source/dnode/mnode/sdb/src/sdbFile.c b/source/dnode/mnode/sdb/src/sdbFile.c
index 6558a98aaadbedca659268ff7b05f00243145450..318a746bb074425f0d086a9a99ce529bc0fbefa7 100644
--- a/source/dnode/mnode/sdb/src/sdbFile.c
+++ b/source/dnode/mnode/sdb/src/sdbFile.c
@@ -415,7 +415,7 @@ static int32_t sdbWriteFileImp(SSdb *pSdb) {
break;
}
} else {
- code = TSDB_CODE_SDB_APP_ERROR;
+ code = TSDB_CODE_APP_ERROR;
taosHashCancelIterate(hash, ppRow);
break;
}
diff --git a/source/dnode/mnode/sdb/src/sdbHash.c b/source/dnode/mnode/sdb/src/sdbHash.c
index c44b659ef589ed930fd9d92fb153fe3712311dca..32b34ea3a3b01193b0b23a2a2b4d80d938417a18 100644
--- a/source/dnode/mnode/sdb/src/sdbHash.c
+++ b/source/dnode/mnode/sdb/src/sdbHash.c
@@ -108,7 +108,7 @@ static SHashObj *sdbGetHash(SSdb *pSdb, int32_t type) {
SHashObj *hash = pSdb->hashObjs[type];
if (hash == NULL) {
- terrno = TSDB_CODE_SDB_APP_ERROR;
+ terrno = TSDB_CODE_APP_ERROR;
return NULL;
}
@@ -302,7 +302,7 @@ void *sdbAcquire(SSdb *pSdb, ESdbType type, const void *pKey) {
terrno = TSDB_CODE_SDB_OBJ_DROPPING;
break;
default:
- terrno = TSDB_CODE_SDB_APP_ERROR;
+ terrno = TSDB_CODE_APP_ERROR;
break;
}
diff --git a/source/dnode/snode/src/snode.c b/source/dnode/snode/src/snode.c
index aa55204ae5ed8c511684ca10b5eeb2067be5bad5..b133226ed39bb5c20ed96b56d95881d009e1e872 100644
--- a/source/dnode/snode/src/snode.c
+++ b/source/dnode/snode/src/snode.c
@@ -168,7 +168,7 @@ int32_t sndProcessTaskDeployReq(SSnode *pSnode, char *msg, int32_t msgLen) {
int32_t sndProcessTaskDropReq(SSnode *pSnode, char *msg, int32_t msgLen) {
SVDropStreamTaskReq *pReq = (SVDropStreamTaskReq *)msg;
- streamMetaRemoveTask1(pSnode->pMeta, pReq->taskId);
+ streamMetaRemoveTask(pSnode->pMeta, pReq->taskId);
return 0;
}
diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h
index 27084700b0b3b3a01bdfdf5064094fcd2a484c54..99260ffefdd2a30c857c7e8675849246039936fc 100644
--- a/source/dnode/vnode/inc/vnode.h
+++ b/source/dnode/vnode/inc/vnode.h
@@ -99,15 +99,31 @@ void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags);
void metaReaderReleaseLock(SMetaReader *pReader);
void metaReaderClear(SMetaReader *pReader);
int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
+int32_t metaGetTableEntryByUidCache(SMetaReader *pReader, tb_uid_t uid);
int metaGetTableEntryByName(SMetaReader *pReader, const char *name);
int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags);
int32_t metaGetTableTagsByUids(SMeta *pMeta, int64_t suid, SArray *uidList, SHashObj *tags);
int32_t metaReadNext(SMetaReader *pReader);
const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal);
int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName);
-int metaGetTableUidByName(void *meta, char *tbName, int64_t *uid);
-int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType);
-bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid);
+
+int metaGetTableSzNameByUid(void *meta, uint64_t uid, char *tbName);
+int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid);
+int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType);
+bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid);
+int32_t metaGetCachedTableUidList(SMeta *pMeta, tb_uid_t suid, const uint8_t *key, int32_t keyLen, SArray *pList,
+ bool *acquired);
+int32_t metaUidFilterCachePut(SMeta *pMeta, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
+ int32_t payloadLen, double selectivityRatio);
+int32_t metaUidCacheClear(SMeta *pMeta, uint64_t suid);
+tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
+int64_t metaGetTbNum(SMeta *pMeta);
+int64_t metaGetNtbNum(SMeta *pMeta);
+typedef struct {
+ int64_t uid;
+ int64_t ctbNum;
+} SMetaStbStats;
+int32_t metaGetStbStats(SMeta *pMeta, int64_t uid, SMetaStbStats *pInfo);
typedef struct SMetaFltParam {
tb_uid_t suid;
@@ -153,20 +169,19 @@ typedef struct STsdbReader STsdbReader;
int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int32_t num);
int32_t tsdbReaderOpen(SVnode *pVnode, SQueryTableDataCond *pCond, void *pTableList, int32_t numOfTables,
- STsdbReader **ppReader, const char *idstr);
-
-void tsdbReaderClose(STsdbReader *pReader);
-bool tsdbNextDataBlock(STsdbReader *pReader);
-bool tsdbTableNextDataBlock(STsdbReader *pReader, uint64_t uid);
-void tsdbRetrieveDataBlockInfo(const STsdbReader *pReader, int32_t *rows, uint64_t *uid, STimeWindow *pWindow);
-int32_t tsdbRetrieveDatablockSMA(STsdbReader *pReader, SColumnDataAgg ***pBlockStatis, bool *allHave);
-SArray *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
-int32_t tsdbReaderReset(STsdbReader *pReader, SQueryTableDataCond *pCond);
-int32_t tsdbGetFileBlocksDistInfo(STsdbReader *pReader, STableBlockDistInfo *pTableBlockInfo);
-int64_t tsdbGetNumOfRowsInMemTable(STsdbReader *pHandle);
-void *tsdbGetIdx(SMeta *pMeta);
-void *tsdbGetIvtIdx(SMeta *pMeta);
-uint64_t getReaderMaxVersion(STsdbReader *pReader);
+ SSDataBlock *pResBlock, STsdbReader **ppReader, const char *idstr);
+
+void tsdbReaderClose(STsdbReader *pReader);
+bool tsdbNextDataBlock(STsdbReader *pReader);
+void tsdbRetrieveDataBlockInfo(const STsdbReader *pReader, int32_t *rows, uint64_t *uid, STimeWindow *pWindow);
+int32_t tsdbRetrieveDatablockSMA(STsdbReader *pReader, SSDataBlock* pDataBlock, bool *allHave);
+SSDataBlock *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
+int32_t tsdbReaderReset(STsdbReader *pReader, SQueryTableDataCond *pCond);
+int32_t tsdbGetFileBlocksDistInfo(STsdbReader *pReader, STableBlockDistInfo *pTableBlockInfo);
+int64_t tsdbGetNumOfRowsInMemTable(STsdbReader *pHandle);
+void *tsdbGetIdx(SMeta *pMeta);
+void *tsdbGetIvtIdx(SMeta *pMeta);
+uint64_t getReaderMaxVersion(STsdbReader *pReader);
int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, void *pTableIdList, int32_t numOfTables, int32_t numOfCols,
uint64_t suid, void **pReader);
diff --git a/source/dnode/vnode/src/inc/meta.h b/source/dnode/vnode/src/inc/meta.h
index 2ceae91f7ccf64a24b331d53db3e6a75b49ba367..3999aa0b7f22a53197413048eca7842e6fe5e57d 100644
--- a/source/dnode/vnode/src/inc/meta.h
+++ b/source/dnode/vnode/src/inc/meta.h
@@ -70,7 +70,8 @@ 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);
-void metaUpdateStbStats(SMeta *pMeta, int64_t uid, int64_t delta);
+void metaUpdateStbStats(SMeta* pMeta, int64_t uid, int64_t delta);
+int32_t metaUidFilterCacheGet(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, LRUHandle** pHandle);
struct SMeta {
TdThreadRwlock lock;
@@ -78,7 +79,7 @@ struct SMeta {
char* path;
SVnode* pVnode;
TDB* pEnv;
- TXN txn;
+ TXN* txn;
TTB* pTbDb;
TTB* pSkmDb;
TTB* pUidIdx;
diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h
index c6e2842c321b1025445c4070f94fe3d6e9a05ae5..7fb962e3a7b300bde16b89af2dbb14c9e05dc6ad 100644
--- a/source/dnode/vnode/src/inc/tsdb.h
+++ b/source/dnode/vnode/src/inc/tsdb.h
@@ -56,7 +56,7 @@ typedef struct SDataFWriter SDataFWriter;
typedef struct SDataFReader SDataFReader;
typedef struct SDelFWriter SDelFWriter;
typedef struct SDelFReader SDelFReader;
-typedef struct SRowIter SRowIter;
+typedef struct STSDBRowIter STSDBRowIter;
typedef struct STsdbFS STsdbFS;
typedef struct SRowMerger SRowMerger;
typedef struct STsdbReadSnap STsdbReadSnap;
@@ -111,9 +111,9 @@ static FORCE_INLINE int64_t tsdbLogicToFileSize(int64_t lSize, int32_t szPage) {
void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
// int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow);
int32_t tsdbRowCmprFn(const void *p1, const void *p2);
-// SRowIter
-void tRowIterInit(SRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema);
-SColVal *tRowIterNext(SRowIter *pIter);
+// STSDBRowIter
+void tsdbRowIterInit(STSDBRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema);
+SColVal *tsdbRowIterNext(STSDBRowIter *pIter);
// SRowMerger
int32_t tRowMergerInit2(SRowMerger *pMerger, STSchema *pResTSchema, TSDBROW *pRow, STSchema *pTSchema);
int32_t tRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema);
@@ -185,6 +185,8 @@ int32_t tMapDataSearch(SMapData *pMapData, void *pSearchItem, int32_t (*tGetItem
int32_t (*tItemCmprFn)(const void *, const void *), void *pItem);
int32_t tPutMapData(uint8_t *p, SMapData *pMapData);
int32_t tGetMapData(uint8_t *p, SMapData *pMapData);
+int32_t tMapDataToArray(SMapData *pMapData, int32_t itemSize, int32_t (*tGetItemFn)(uint8_t *, void *),
+ SArray **ppArray);
// other
int32_t tsdbKeyFid(TSKEY key, int32_t minutes, int8_t precision);
void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey);
@@ -562,7 +564,7 @@ struct SDFileSet {
SSttFile *aSttF[TSDB_MAX_STT_TRIGGER];
};
-struct SRowIter {
+struct STSDBRowIter {
TSDBROW *pRow;
STSchema *pTSchema;
SColVal colVal;
diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h
index 83f375c9868976253c1092f798e42619e2fe3c1b..28797c536166d554aaa99f1d4866e76e85564971 100644
--- a/source/dnode/vnode/src/inc/vnd.h
+++ b/source/dnode/vnode/src/inc/vnd.h
@@ -77,7 +77,7 @@ void vnodeBufPoolReset(SVBufPool* pPool);
// vnodeQuery.c
int32_t vnodeQueryOpen(SVnode* pVnode);
-void vnodeQueryPreClose(SVnode *pVnode);
+void vnodeQueryPreClose(SVnode* pVnode);
void vnodeQueryClose(SVnode* pVnode);
int32_t vnodeGetTableMeta(SVnode* pVnode, SRpcMsg* pMsg, bool direct);
int vnodeGetTableCfg(SVnode* pVnode, SRpcMsg* pMsg, bool direct);
@@ -86,7 +86,6 @@ int32_t vnodeGetBatchMeta(SVnode* pVnode, SRpcMsg* pMsg);
// vnodeCommit.c
int32_t vnodeBegin(SVnode* pVnode);
int32_t vnodeShouldCommit(SVnode* pVnode);
-int32_t vnodeCommit(SVnode* pVnode);
void vnodeRollback(SVnode* pVnode);
int32_t vnodeSaveInfo(const char* dir, const SVnodeInfo* pCfg);
int32_t vnodeCommitInfo(const char* dir, const SVnodeInfo* pInfo);
@@ -97,10 +96,10 @@ bool vnodeShouldRollback(SVnode* pVnode);
// vnodeSync.c
int32_t vnodeSyncOpen(SVnode* pVnode, char* path);
-void vnodeSyncStart(SVnode* pVnode);
+int32_t vnodeSyncStart(SVnode* pVnode);
void vnodeSyncPreClose(SVnode* pVnode);
void vnodeSyncClose(SVnode* pVnode);
-void vnodeRedirectRpcMsg(SVnode* pVnode, SRpcMsg* pMsg);
+void vnodeRedirectRpcMsg(SVnode* pVnode, SRpcMsg* pMsg, int32_t code);
bool vnodeIsLeader(SVnode* pVnode);
bool vnodeIsRoleLeader(SVnode* pVnode);
diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h
index ac9fabf05248fc4bf58f4e271ca161681f327eca..8cf212cb1d084c20870ccfd13d6d2168f4cc9250 100644
--- a/source/dnode/vnode/src/inc/vnodeInt.h
+++ b/source/dnode/vnode/src/inc/vnodeInt.h
@@ -75,6 +75,7 @@ typedef struct SStreamStateWriter SStreamStateWriter;
typedef struct SRSmaSnapReader SRSmaSnapReader;
typedef struct SRSmaSnapWriter SRSmaSnapWriter;
typedef struct SSnapDataHdr SSnapDataHdr;
+typedef struct SCommitInfo SCommitInfo;
#define VNODE_META_DIR "meta"
#define VNODE_TSDB_DIR "tsdb"
@@ -100,8 +101,9 @@ typedef struct STbUidStore STbUidStore;
int metaOpen(SVnode* pVnode, SMeta** ppMeta, int8_t rollback);
int metaClose(SMeta* pMeta);
int metaBegin(SMeta* pMeta, int8_t fromSys);
-int metaCommit(SMeta* pMeta);
-int metaFinishCommit(SMeta* pMeta);
+TXN* metaGetTxn(SMeta* pMeta);
+int metaCommit(SMeta* pMeta, TXN* txn);
+int metaFinishCommit(SMeta* pMeta, TXN* txn);
int metaPrepareAsyncCommit(SMeta* pMeta);
int metaCreateSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
@@ -116,8 +118,6 @@ int32_t metaGetTbTSchemaEx(SMeta* pMeta, tb_uid_t suid, tb_uid_t uid, in
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, int lock);
void metaCloseCtbCursor(SMCtbCursor* pCtbCur, int lock);
@@ -142,19 +142,14 @@ typedef struct SMetaInfo {
int64_t version;
int32_t skmVer;
} 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);
+int32_t metaGetInfo(SMeta* pMeta, int64_t uid, SMetaInfo* pInfo, SMetaReader* pReader);
// tsdb
int tsdbOpen(SVnode* pVnode, STsdb** ppTsdb, const char* dir, STsdbKeepCfg* pKeepCfg, int8_t rollback);
int tsdbClose(STsdb** pTsdb);
int32_t tsdbBegin(STsdb* pTsdb);
-int32_t tsdbCommit(STsdb* pTsdb);
+int32_t tsdbPrepareCommit(STsdb* pTsdb);
+int32_t tsdbCommit(STsdb* pTsdb, SCommitInfo* pInfo);
int32_t tsdbFinishCommit(STsdb* pTsdb);
int32_t tsdbRollbackCommit(STsdb* pTsdb);
int32_t tsdbDoRetention(STsdb* pTsdb, int64_t now);
@@ -211,8 +206,8 @@ int32_t smaBegin(SSma* pSma);
int32_t smaSyncPreCommit(SSma* pSma);
int32_t smaSyncCommit(SSma* pSma);
int32_t smaSyncPostCommit(SSma* pSma);
-int32_t smaPreCommit(SSma* pSma);
-int32_t smaCommit(SSma* pSma);
+int32_t smaPrepareAsyncCommit(SSma* pSma);
+int32_t smaCommit(SSma* pSma, SCommitInfo* pInfo);
int32_t smaFinishCommit(SSma* pSma);
int32_t smaPostCommit(SSma* pSma);
int32_t smaDoRetention(SSma* pSma, int64_t now);
@@ -414,6 +409,12 @@ struct SSnapDataHdr {
uint8_t data[];
};
+struct SCommitInfo {
+ SVnodeInfo info;
+ SVnode* pVnode;
+ TXN* txn;
+};
+
#ifdef __cplusplus
}
#endif
diff --git a/source/dnode/vnode/src/meta/metaCache.c b/source/dnode/vnode/src/meta/metaCache.c
index 356aa78c220eb0c3d7c755c1913131a26990e2f5..37dcec4f85a973c10e14f513245d3fa59287d3c7 100644
--- a/source/dnode/vnode/src/meta/metaCache.c
+++ b/source/dnode/vnode/src/meta/metaCache.c
@@ -31,6 +31,12 @@ typedef struct SMetaStbStatsEntry {
SMetaStbStats info;
} SMetaStbStatsEntry;
+typedef struct STagFilterResEntry {
+ uint64_t suid; // uid for super table
+ SList list; // the linked list of md5 digest, extracted from the serialized tag query condition
+ uint32_t qTimes; // queried times for current super table
+} STagFilterResEntry;
+
struct SMetaCache {
// child, normal, super, table entry cache
struct SEntryCache {
@@ -47,6 +53,11 @@ struct SMetaCache {
} sStbStatsCache;
// query cache
+ struct STagFilterResCache {
+ SHashObj* pTableEntry;
+ SLRUCache* pUidResCache;
+ uint64_t keyBuf[3];
+ } sTagFilterResCache;
};
static void entryCacheClose(SMeta* pMeta) {
@@ -79,6 +90,12 @@ static void statsCacheClose(SMeta* pMeta) {
}
}
+static void freeCacheEntryFp(void* param) {
+ STagFilterResEntry** p = param;
+ tdListEmpty(&(*p)->list);
+ taosMemoryFreeClear(*p);
+}
+
int32_t metaCacheOpen(SMeta* pMeta) {
int32_t code = 0;
SMetaCache* pCache = NULL;
@@ -109,9 +126,21 @@ int32_t metaCacheOpen(SMeta* pMeta) {
goto _err2;
}
- pMeta->pCache = pCache;
+ pCache->sTagFilterResCache.pUidResCache = taosLRUCacheInit(5 * 1024 * 1024, -1, 0.5);
+ if (pCache->sTagFilterResCache.pUidResCache == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _err2;
+ }
-_exit:
+ pCache->sTagFilterResCache.pTableEntry =
+ taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), false, HASH_NO_LOCK);
+ if (pCache->sTagFilterResCache.pTableEntry == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _err2;
+ }
+
+ taosHashSetFreeFp(pCache->sTagFilterResCache.pTableEntry, freeCacheEntryFp);
+ pMeta->pCache = pCache;
return code;
_err2:
@@ -119,7 +148,6 @@ _err2:
_err:
taosMemoryFree(pCache);
-
metaError("vgId:%d, meta open cache failed since %s", TD_VID(pMeta->pVnode), tstrerror(code));
return code;
}
@@ -128,6 +156,9 @@ void metaCacheClose(SMeta* pMeta) {
if (pMeta->pCache) {
entryCacheClose(pMeta);
statsCacheClose(pMeta);
+
+ taosHashCleanup(pMeta->pCache->sTagFilterResCache.pTableEntry);
+ taosLRUCacheCleanup(pMeta->pCache->sTagFilterResCache.pUidResCache);
taosMemoryFree(pMeta->pCache);
pMeta->pCache = NULL;
}
@@ -388,3 +419,148 @@ int32_t metaStatsCacheGet(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo) {
return code;
}
+
+int32_t metaGetCachedTableUidList(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray* pList1,
+ bool* acquireRes) {
+ uint64_t* pBuf = pMeta->pCache->sTagFilterResCache.keyBuf;
+
+ // generate the composed key for LRU cache
+ SLRUCache* pCache = pMeta->pCache->sTagFilterResCache.pUidResCache;
+
+ pBuf[0] = suid;
+ memcpy(&pBuf[1], pKey, keyLen);
+
+ int32_t len = keyLen + sizeof(uint64_t);
+ LRUHandle* pHandle = taosLRUCacheLookup(pCache, pBuf, len);
+ if (pHandle == NULL) {
+ *acquireRes = 0;
+ return TSDB_CODE_SUCCESS;
+ } else { // do some book mark work after acquiring the filter result from cache
+ STagFilterResEntry** pEntry = taosHashGet(pMeta->pCache->sTagFilterResCache.pTableEntry, &suid, sizeof(uint64_t));
+ ASSERT(pEntry != NULL);
+ *acquireRes = 1;
+
+ const char* p = taosLRUCacheValue(pMeta->pCache->sTagFilterResCache.pUidResCache, pHandle);
+ int32_t size = *(int32_t*)p;
+ taosArrayAddBatch(pList1, p + sizeof(int32_t), size);
+
+ (*pEntry)->qTimes += 1;
+ taosLRUCacheRelease(pCache, pHandle, false);
+
+ // check if scanning all items are necessary or not
+ if ((*pEntry)->qTimes >= 5000 && TD_DLIST_NELES(&(*pEntry)->list) > 10) {
+ SArray* pList = taosArrayInit(64, POINTER_BYTES);
+
+ SListIter iter = {0};
+ tdListInitIter(&(*pEntry)->list, &iter, TD_LIST_FORWARD);
+
+ SListNode* pNode = NULL;
+ while ((pNode = tdListNext(&iter)) != NULL) {
+ memcpy(&pBuf[1], pNode->data, keyLen);
+
+ // check whether it is existed in LRU cache, and remove it from linked list if not.
+ LRUHandle* pRes = taosLRUCacheLookup(pCache, pBuf, len);
+ if (pRes == NULL) { // remove the item in the linked list
+ taosArrayPush(pList, &pNode);
+ } else {
+ taosLRUCacheRelease(pCache, pRes, false);
+ }
+ }
+
+ // remove the keys, of which query uid lists have been replaced already.
+ size_t s = taosArrayGetSize(pList);
+ for (int32_t i = 0; i < s; ++i) {
+ SListNode** p1 = taosArrayGet(pList, i);
+ tdListPopNode(&(*pEntry)->list, *p1);
+ taosMemoryFree(*p1);
+ }
+
+ (*pEntry)->qTimes = 0; // reset the query times
+
+ taosArrayDestroy(pList);
+ }
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+static void freePayload(const void* key, size_t keyLen, void* value) {
+ if (value == NULL) {
+ return;
+ }
+ taosMemoryFree(value);
+}
+
+// check both the payload size and selectivity ratio
+int32_t metaUidFilterCachePut(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
+ int32_t payloadLen, double selectivityRatio) {
+ if (selectivityRatio > tsSelectivityRatio) {
+ metaDebug("vgId:%d, suid:%" PRIu64
+ " failed to add to uid list cache, due to selectivity ratio %.2f less than threshold %.2f",
+ TD_VID(pMeta->pVnode), suid, selectivityRatio, tsSelectivityRatio);
+ taosMemoryFree(pPayload);
+ return TSDB_CODE_SUCCESS;
+ }
+
+ if (payloadLen > tsTagFilterResCacheSize) {
+ metaDebug("vgId:%d, suid:%" PRIu64
+ " failed to add to uid list cache, due to payload length %d greater than threshold %d",
+ TD_VID(pMeta->pVnode), suid, payloadLen, tsTagFilterResCacheSize);
+ taosMemoryFree(pPayload);
+ return TSDB_CODE_SUCCESS;
+ }
+
+ SLRUCache* pCache = pMeta->pCache->sTagFilterResCache.pUidResCache;
+ SHashObj* pTableEntry = pMeta->pCache->sTagFilterResCache.pTableEntry;
+
+ STagFilterResEntry** pEntry = taosHashGet(pTableEntry, &suid, sizeof(uint64_t));
+ if (pEntry == NULL) {
+ STagFilterResEntry* p = taosMemoryMalloc(sizeof(STagFilterResEntry));
+ p->qTimes = 0;
+ tdListInit(&p->list, keyLen);
+ taosHashPut(pTableEntry, &suid, sizeof(uint64_t), &p, POINTER_BYTES);
+ tdListAppend(&p->list, pKey);
+ } else {
+ tdListAppend(&(*pEntry)->list, pKey);
+ }
+
+ uint64_t* pBuf = pMeta->pCache->sTagFilterResCache.keyBuf;
+ pBuf[0] = suid;
+
+ memcpy(&pBuf[1], pKey, keyLen);
+ ASSERT(sizeof(uint64_t) + keyLen == 24);
+
+ // add to cache.
+ taosLRUCacheInsert(pCache, pBuf, sizeof(uint64_t) + keyLen, pPayload, payloadLen, freePayload, NULL,
+ TAOS_LRU_PRIORITY_LOW);
+ metaDebug("vgId:%d, suid:%" PRIu64 " list cache added into cache, total:%d, tables:%d", TD_VID(pMeta->pVnode), suid,
+ (int32_t)taosLRUCacheGetUsage(pCache), taosHashGetSize(pTableEntry));
+
+ return TSDB_CODE_SUCCESS;
+}
+
+// remove the lru cache that are expired due to the tags value update, or creating, or dropping, of child tables
+int32_t metaUidCacheClear(SMeta* pMeta, uint64_t suid) {
+ STagFilterResEntry** pEntry = taosHashGet(pMeta->pCache->sTagFilterResCache.pTableEntry, &suid, sizeof(uint64_t));
+ if (pEntry == NULL || listNEles(&(*pEntry)->list) == 0) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ int32_t keyLen = sizeof(uint64_t) * 3;
+ uint64_t p[3] = {0};
+ p[0] = suid;
+
+ SListIter iter = {0};
+ tdListInitIter(&(*pEntry)->list, &iter, TD_LIST_FORWARD);
+
+ SListNode* pNode = NULL;
+ while ((pNode = tdListNext(&iter)) != NULL) {
+ memcpy(&p[1], pNode->data, 16);
+ taosLRUCacheErase(pMeta->pCache->sTagFilterResCache.pUidResCache, p, keyLen);
+ }
+
+ (*pEntry)->qTimes = 0;
+ tdListEmpty(&(*pEntry)->list);
+
+ return TSDB_CODE_SUCCESS;
+}
diff --git a/source/dnode/vnode/src/meta/metaCommit.c b/source/dnode/vnode/src/meta/metaCommit.c
index 0be0c3e40798ec953a529d433b7294d564ceee84..5eb27679bb71c26d081b4de22afa1c84bad7b1c9 100644
--- a/source/dnode/vnode/src/meta/metaCommit.c
+++ b/source/dnode/vnode/src/meta/metaCommit.c
@@ -20,12 +20,19 @@ static FORCE_INLINE void metaFree(void *pPool, void *p) { vnodeBufPoolFree((SVB
// begin a meta txn
int metaBegin(SMeta *pMeta, int8_t fromSys) {
+ void *(*xMalloc)(void *, size_t);
+ void (*xFree)(void *, void *);
+ void *xArg = NULL;
+
if (fromSys) {
- tdbTxnOpen(&pMeta->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED);
+ xMalloc = tdbDefaultMalloc;
+ xFree = tdbDefaultFree;
} else {
- tdbTxnOpen(&pMeta->txn, 0, metaMalloc, metaFree, pMeta->pVnode->inUse, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED);
+ xMalloc = metaMalloc;
+ xFree = metaFree;
+ xArg = pMeta->pVnode->inUse;
}
- if (tdbBegin(pMeta->pEnv, &pMeta->txn) < 0) {
+ if (tdbBegin(pMeta->pEnv, &pMeta->txn, xMalloc, xFree, xArg, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
return -1;
}
@@ -33,9 +40,16 @@ int metaBegin(SMeta *pMeta, int8_t fromSys) {
}
// commit the meta txn
-int metaCommit(SMeta *pMeta) { return tdbCommit(pMeta->pEnv, &pMeta->txn); }
-int metaFinishCommit(SMeta *pMeta) { return tdbPostCommit(pMeta->pEnv, &pMeta->txn); }
-int metaPrepareAsyncCommit(SMeta *pMeta) { return tdbPrepareAsyncCommit(pMeta->pEnv, &pMeta->txn); }
+TXN *metaGetTxn(SMeta *pMeta) { return pMeta->txn; }
+int metaCommit(SMeta *pMeta, TXN *txn) { return tdbCommit(pMeta->pEnv, txn); }
+int metaFinishCommit(SMeta *pMeta, TXN *txn) { return tdbPostCommit(pMeta->pEnv, txn); }
+int metaPrepareAsyncCommit(SMeta *pMeta) {
+ // return tdbPrepareAsyncCommit(pMeta->pEnv, pMeta->txn);
+ int code = 0;
+ code = tdbCommit(pMeta->pEnv, pMeta->txn);
+
+ return code;
+}
// abort the meta txn
-int metaAbort(SMeta *pMeta) { return tdbAbort(pMeta->pEnv, &pMeta->txn); }
+int metaAbort(SMeta *pMeta) { return tdbAbort(pMeta->pEnv, pMeta->txn); }
diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c
index 620022c06de5fd675b6ef55c10840874243d33b1..cfdb4ab8d1d18aee42ef0528d64d72581c25630d 100644
--- a/source/dnode/vnode/src/meta/metaQuery.c
+++ b/source/dnode/vnode/src/meta/metaQuery.c
@@ -152,7 +152,7 @@ bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid) {
}
int metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid) {
- SMeta *pMeta = pReader->pMeta;
+ SMeta *pMeta = pReader->pMeta;
int64_t version1;
// query uid.idx
@@ -165,6 +165,18 @@ int metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid) {
return metaGetTableEntryByVersion(pReader, version1, uid);
}
+int metaGetTableEntryByUidCache(SMetaReader *pReader, tb_uid_t uid) {
+ SMeta *pMeta = pReader->pMeta;
+
+ SMetaInfo info;
+ if (metaGetInfo(pMeta, uid, &info, pReader) == TSDB_CODE_NOT_FOUND) {
+ terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
+ return -1;
+ }
+
+ return metaGetTableEntryByVersion(pReader, info.version, uid);
+}
+
int metaGetTableEntryByName(SMetaReader *pReader, const char *name) {
SMeta *pMeta = pReader->pMeta;
tb_uid_t uid;
@@ -211,7 +223,24 @@ int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName) {
return 0;
}
-int metaGetTableUidByName(void *meta, char *tbName, int64_t *uid) {
+
+int metaGetTableSzNameByUid(void *meta, uint64_t uid, char *tbName) {
+ int code = 0;
+ SMetaReader mr = {0};
+ metaReaderInit(&mr, (SMeta *)meta, 0);
+ code = metaGetTableEntryByUid(&mr, uid);
+ if (code < 0) {
+ metaReaderClear(&mr);
+ return -1;
+ }
+ strncpy(tbName, mr.me.name, TSDB_TABLE_NAME_LEN);
+ metaReaderClear(&mr);
+
+ return 0;
+}
+
+
+int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid) {
int code = 0;
SMetaReader mr = {0};
metaReaderInit(&mr, (SMeta *)meta, 0);
@@ -614,7 +643,7 @@ int32_t metaGetTbTSchemaEx(SMeta *pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sv
SSkmDbKey skmDbKey;
if (sver <= 0) {
SMetaInfo info;
- if (metaGetInfo(pMeta, suid ? suid : uid, &info) == 0) {
+ if (metaGetInfo(pMeta, suid ? suid : uid, &info, NULL) == 0) {
sver = info.skmVer;
} else {
TBC *pSkmDbC = NULL;
@@ -727,6 +756,10 @@ int64_t metaGetTimeSeriesNum(SMeta *pMeta) {
return pMeta->pVnode->config.vndStats.numOfTimeSeries + pMeta->pVnode->config.vndStats.numOfNTimeSeries;
}
+int64_t metaGetNtbNum(SMeta *pMeta) {
+ return pMeta->pVnode->config.vndStats.numOfNTables;
+}
+
typedef struct {
SMeta *pMeta;
TBC *pCur;
@@ -1126,8 +1159,8 @@ int32_t metaFilterTableName(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) {
valid = tdbTbcGet(pCursor->pCur, (const void **)pEntryKey, &nEntryKey, (const void **)&pEntryVal, &nEntryVal);
if (valid < 0) break;
- char *pTableKey = (char *)pEntryKey;
- int32_t cmp = (*param->filterFunc)(pTableKey, pName, pCursor->type);
+ char *pTableKey = (char *)pEntryKey;
+ cmp = (*param->filterFunc)(pTableKey, pName, pCursor->type);
if (cmp == 0) {
tb_uid_t tuid = *(tb_uid_t *)pEntryVal;
taosArrayPush(pUids, &tuid);
@@ -1379,10 +1412,11 @@ int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj
int32_t metaCacheGet(SMeta *pMeta, int64_t uid, SMetaInfo *pInfo);
-int32_t metaGetInfo(SMeta *pMeta, int64_t uid, SMetaInfo *pInfo) {
+int32_t metaGetInfo(SMeta *pMeta, int64_t uid, SMetaInfo *pInfo, SMetaReader *pReader) {
int32_t code = 0;
void *pData = NULL;
int nData = 0;
+ int lock = 0;
metaRLock(pMeta);
@@ -1407,11 +1441,22 @@ int32_t metaGetInfo(SMeta *pMeta, int64_t uid, SMetaInfo *pInfo) {
pInfo->version = ((SUidIdxVal *)pData)->version;
pInfo->skmVer = ((SUidIdxVal *)pData)->skmVer;
+ if (pReader != NULL) {
+ lock = !(pReader->flags & META_READER_NOLOCK);
+ if (lock) {
+ metaULock(pReader->pMeta);
+ // metaReaderReleaseLock(pReader);
+ }
+ }
// upsert the cache
metaWLock(pMeta);
metaCacheUpsert(pMeta, pInfo);
metaULock(pMeta);
+ if (lock) {
+ metaRLock(pReader->pMeta);
+ }
+
_exit:
tdbFree(pData);
return code;
diff --git a/source/dnode/vnode/src/meta/metaSma.c b/source/dnode/vnode/src/meta/metaSma.c
index 3ada7d1814b241081e52dc5e7ac8e104288ee3ad..8d5821e28bfa2c33a5582e34bc32127970af6320 100644
--- a/source/dnode/vnode/src/meta/metaSma.c
+++ b/source/dnode/vnode/src/meta/metaSma.c
@@ -36,7 +36,7 @@ int32_t metaCreateTSma(SMeta *pMeta, int64_t version, SSmaCfg *pCfg) {
// validate req
// save smaIndex
metaReaderInit(&mr, pMeta, 0);
- if (metaGetTableEntryByUid(&mr, pCfg->indexUid) == 0) {
+ if (metaGetTableEntryByUidCache(&mr, pCfg->indexUid) == 0) {
#if 1
terrno = TSDB_CODE_TSMA_ALREADY_EXIST;
metaReaderClear(&mr);
@@ -117,7 +117,7 @@ static int metaSaveSmaToDB(SMeta *pMeta, const SMetaEntry *pME) {
tEncoderClear(&coder);
// write to table.db
- if (tdbTbInsert(pMeta->pTbDb, pKey, kLen, pVal, vLen, &pMeta->txn) < 0) {
+ if (tdbTbInsert(pMeta->pTbDb, pKey, kLen, pVal, vLen, pMeta->txn) < 0) {
goto _err;
}
@@ -131,17 +131,17 @@ _err:
static int metaUpdateUidIdx(SMeta *pMeta, const SMetaEntry *pME) {
SUidIdxVal uidIdxVal = {.suid = pME->smaEntry.tsma->indexUid, .version = pME->version, .skmVer = 0};
- return tdbTbInsert(pMeta->pUidIdx, &pME->uid, sizeof(tb_uid_t), &uidIdxVal, sizeof(uidIdxVal), &pMeta->txn);
+ return tdbTbInsert(pMeta->pUidIdx, &pME->uid, sizeof(tb_uid_t), &uidIdxVal, sizeof(uidIdxVal), pMeta->txn);
}
static int metaUpdateNameIdx(SMeta *pMeta, const SMetaEntry *pME) {
- return tdbTbInsert(pMeta->pNameIdx, pME->name, strlen(pME->name) + 1, &pME->uid, sizeof(tb_uid_t), &pMeta->txn);
+ return tdbTbInsert(pMeta->pNameIdx, pME->name, strlen(pME->name) + 1, &pME->uid, sizeof(tb_uid_t), pMeta->txn);
}
static int metaUpdateSmaIdx(SMeta *pMeta, const SMetaEntry *pME) {
SSmaIdxKey smaIdxKey = {.uid = pME->smaEntry.tsma->tableUid, .smaUid = pME->smaEntry.tsma->indexUid};
- return tdbTbInsert(pMeta->pSmaIdx, &smaIdxKey, sizeof(smaIdxKey), NULL, 0, &pMeta->txn);
+ return tdbTbInsert(pMeta->pSmaIdx, &smaIdxKey, sizeof(smaIdxKey), NULL, 0, pMeta->txn);
}
static int metaHandleSmaEntry(SMeta *pMeta, const SMetaEntry *pME) {
diff --git a/source/dnode/vnode/src/meta/metaSnapshot.c b/source/dnode/vnode/src/meta/metaSnapshot.c
index 5c5b49ece57bd2a2a9b787c356108fc108cee4a4..6a4dcf6ead7a49f0e4d21b0d1016633fb42d17f4 100644
--- a/source/dnode/vnode/src/meta/metaSnapshot.c
+++ b/source/dnode/vnode/src/meta/metaSnapshot.c
@@ -163,9 +163,9 @@ int32_t metaSnapWriterClose(SMetaSnapWriter** ppWriter, int8_t rollback) {
if (rollback) {
ASSERT(0);
} else {
- code = metaCommit(pWriter->pMeta);
+ code = metaCommit(pWriter->pMeta, pWriter->pMeta->txn);
if (code) goto _err;
- code = metaFinishCommit(pWriter->pMeta);
+ code = metaFinishCommit(pWriter->pMeta, pWriter->pMeta->txn);
if (code) goto _err;
}
taosMemoryFree(pWriter);
diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c
index 8250d68ae1da8aa93571db4975fa9f36d74c5222..722a93137c256be4e91338c72f1fcd89521ce310 100644
--- a/source/dnode/vnode/src/meta/metaTable.c
+++ b/source/dnode/vnode/src/meta/metaTable.c
@@ -207,7 +207,7 @@ int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
tb_uid_t uid = *(tb_uid_t *)pData;
tdbFree(pData);
SMetaInfo info;
- metaGetInfo(pMeta, uid, &info);
+ metaGetInfo(pMeta, uid, &info, NULL);
if (info.uid == info.suid) {
return 0;
} else {
@@ -261,7 +261,7 @@ int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq, SArray *tb
// drop all child tables
TBC *pCtbIdxc = NULL;
- tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL);
rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = pReq->suid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c);
if (rc < 0) {
tdbTbcClose(pCtbIdxc);
@@ -295,10 +295,10 @@ int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq, SArray *tb
_drop_super_table:
tdbTbGet(pMeta->pUidIdx, &pReq->suid, sizeof(tb_uid_t), &pData, &nData);
tdbTbDelete(pMeta->pTbDb, &(STbDbKey){.version = ((SUidIdxVal *)pData)[0].version, .uid = pReq->suid},
- sizeof(STbDbKey), &pMeta->txn);
- tdbTbDelete(pMeta->pNameIdx, pReq->name, strlen(pReq->name) + 1, &pMeta->txn);
- tdbTbDelete(pMeta->pUidIdx, &pReq->suid, sizeof(tb_uid_t), &pMeta->txn);
- tdbTbDelete(pMeta->pSuidIdx, &pReq->suid, sizeof(tb_uid_t), &pMeta->txn);
+ sizeof(STbDbKey), pMeta->txn);
+ tdbTbDelete(pMeta->pNameIdx, pReq->name, strlen(pReq->name) + 1, pMeta->txn);
+ tdbTbDelete(pMeta->pUidIdx, &pReq->suid, sizeof(tb_uid_t), pMeta->txn);
+ tdbTbDelete(pMeta->pSuidIdx, &pReq->suid, sizeof(tb_uid_t), pMeta->txn);
metaULock(pMeta);
@@ -321,7 +321,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
int32_t ret;
int32_t c = -2;
- tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL);
ret = tdbTbcMoveTo(pUidIdxc, &pReq->suid, sizeof(tb_uid_t), &c);
if (ret < 0 || c) {
tdbTbcClose(pUidIdxc);
@@ -340,7 +340,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
oversion = ((SUidIdxVal *)pData)[0].version;
- tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL);
ret = tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = pReq->suid, .version = oversion}), sizeof(STbDbKey), &c);
ASSERT(ret == 0 && c == 0);
@@ -458,6 +458,7 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq, STableMe
metaWLock(pMeta);
metaUpdateStbStats(pMeta, me.ctbEntry.suid, 1);
+ metaUidCacheClear(pMeta, me.ctbEntry.suid);
metaULock(pMeta);
} else {
me.ntbEntry.ctime = pReq->ctime;
@@ -548,8 +549,8 @@ int metaTtlDropTable(SMeta *pMeta, int64_t ttl, SArray *tbUids) {
}
static void metaBuildTtlIdxKey(STtlIdxKey *ttlKey, const SMetaEntry *pME) {
- int64_t ttlDays;
- int64_t ctime;
+ int64_t ttlDays = 0;
+ int64_t ctime = 0;
if (pME->type == TSDB_CHILD_TABLE) {
ctime = pME->ctbEntry.ctime;
ttlDays = pME->ctbEntry.ttlDays;
@@ -594,7 +595,7 @@ static int metaDeleteTtlIdx(SMeta *pMeta, const SMetaEntry *pME) {
STtlIdxKey ttlKey = {0};
metaBuildTtlIdxKey(&ttlKey, pME);
if (ttlKey.dtime == 0) return 0;
- return tdbTbDelete(pMeta->pTtlIdx, &ttlKey, sizeof(ttlKey), &pMeta->txn);
+ return tdbTbDelete(pMeta->pTtlIdx, &ttlKey, sizeof(ttlKey), pMeta->txn);
}
static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
@@ -656,7 +657,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
if (metaCreateTagIdxKey(e.ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type, uid,
&pTagIdxKey, &nTagIdxKey) == 0) {
- tdbTbDelete(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, &pMeta->txn);
+ tdbTbDelete(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, pMeta->txn);
}
metaDestroyTagIdxKey(pTagIdxKey);
}
@@ -666,9 +667,9 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
}
}
- tdbTbDelete(pMeta->pTbDb, &(STbDbKey){.version = version, .uid = uid}, sizeof(STbDbKey), &pMeta->txn);
- tdbTbDelete(pMeta->pNameIdx, e.name, strlen(e.name) + 1, &pMeta->txn);
- tdbTbDelete(pMeta->pUidIdx, &uid, sizeof(uid), &pMeta->txn);
+ tdbTbDelete(pMeta->pTbDb, &(STbDbKey){.version = version, .uid = uid}, sizeof(STbDbKey), pMeta->txn);
+ tdbTbDelete(pMeta->pNameIdx, e.name, strlen(e.name) + 1, pMeta->txn);
+ tdbTbDelete(pMeta->pUidIdx, &uid, sizeof(uid), pMeta->txn);
if (e.type == TSDB_CHILD_TABLE || e.type == TSDB_NORMAL_TABLE) metaDeleteCtimeIdx(pMeta, &e);
if (e.type == TSDB_NORMAL_TABLE) metaDeleteNcolIdx(pMeta, &e);
@@ -676,21 +677,23 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
if (e.type != TSDB_SUPER_TABLE) metaDeleteTtlIdx(pMeta, &e);
if (e.type == TSDB_CHILD_TABLE) {
- tdbTbDelete(pMeta->pCtbIdx, &(SCtbIdxKey){.suid = e.ctbEntry.suid, .uid = uid}, sizeof(SCtbIdxKey), &pMeta->txn);
+ tdbTbDelete(pMeta->pCtbIdx, &(SCtbIdxKey){.suid = e.ctbEntry.suid, .uid = uid}, sizeof(SCtbIdxKey), pMeta->txn);
--pMeta->pVnode->config.vndStats.numOfCTables;
metaUpdateStbStats(pMeta, e.ctbEntry.suid, -1);
+ metaUidCacheClear(pMeta, e.ctbEntry.suid);
} else if (e.type == TSDB_NORMAL_TABLE) {
// drop schema.db (todo)
--pMeta->pVnode->config.vndStats.numOfNTables;
pMeta->pVnode->config.vndStats.numOfNTimeSeries -= e.ntbEntry.schemaRow.nCols - 1;
} else if (e.type == TSDB_SUPER_TABLE) {
- tdbTbDelete(pMeta->pSuidIdx, &e.uid, sizeof(tb_uid_t), &pMeta->txn);
+ tdbTbDelete(pMeta->pSuidIdx, &e.uid, sizeof(tb_uid_t), pMeta->txn);
// drop schema.db (todo)
metaStatsCacheDrop(pMeta, uid);
+ metaUidCacheClear(pMeta, uid);
--pMeta->pVnode->config.vndStats.numOfSTables;
}
@@ -707,7 +710,7 @@ int metaUpdateCtimeIdx(SMeta *pMeta, const SMetaEntry *pME) {
if (metaBuildCtimeIdxKey(&ctimeKey, pME) < 0) {
return 0;
}
- return tdbTbInsert(pMeta->pCtimeIdx, &ctimeKey, sizeof(ctimeKey), NULL, 0, &pMeta->txn);
+ return tdbTbInsert(pMeta->pCtimeIdx, &ctimeKey, sizeof(ctimeKey), NULL, 0, pMeta->txn);
}
int metaDeleteCtimeIdx(SMeta *pMeta, const SMetaEntry *pME) {
@@ -715,14 +718,14 @@ int metaDeleteCtimeIdx(SMeta *pMeta, const SMetaEntry *pME) {
if (metaBuildCtimeIdxKey(&ctimeKey, pME) < 0) {
return 0;
}
- return tdbTbDelete(pMeta->pCtimeIdx, &ctimeKey, sizeof(ctimeKey), &pMeta->txn);
+ return tdbTbDelete(pMeta->pCtimeIdx, &ctimeKey, sizeof(ctimeKey), pMeta->txn);
}
int metaUpdateNcolIdx(SMeta *pMeta, const SMetaEntry *pME) {
SNcolIdxKey ncolKey = {0};
if (metaBuildNColIdxKey(&ncolKey, pME) < 0) {
return 0;
}
- return tdbTbInsert(pMeta->pNcolIdx, &ncolKey, sizeof(ncolKey), NULL, 0, &pMeta->txn);
+ return tdbTbInsert(pMeta->pNcolIdx, &ncolKey, sizeof(ncolKey), NULL, 0, pMeta->txn);
}
int metaDeleteNcolIdx(SMeta *pMeta, const SMetaEntry *pME) {
@@ -730,7 +733,7 @@ int metaDeleteNcolIdx(SMeta *pMeta, const SMetaEntry *pME) {
if (metaBuildNColIdxKey(&ncolKey, pME) < 0) {
return 0;
}
- return tdbTbDelete(pMeta->pNcolIdx, &ncolKey, sizeof(ncolKey), &pMeta->txn);
+ return tdbTbDelete(pMeta->pNcolIdx, &ncolKey, sizeof(ncolKey), pMeta->txn);
}
static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq, STableMetaRsp *pMetaRsp) {
@@ -765,7 +768,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
// search uid index
TBC *pUidIdxc = NULL;
- tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL);
tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c);
ASSERT(c == 0);
@@ -775,7 +778,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
// search table.db
TBC *pTbDbc = NULL;
- tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL);
tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c);
ASSERT(c == 0);
tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
@@ -956,7 +959,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
// search uid index
TBC *pUidIdxc = NULL;
- tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL);
tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c);
ASSERT(c == 0);
@@ -969,7 +972,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
SDecoder dc2 = {0};
/* get ctbEntry */
- tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL);
tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c);
ASSERT(c == 0);
tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
@@ -981,6 +984,11 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
/* get stbEntry*/
tdbTbGet(pMeta->pUidIdx, &ctbEntry.ctbEntry.suid, sizeof(tb_uid_t), &pVal, &nVal);
+ if (!pVal) {
+ terrno = TSDB_CODE_INVALID_MSG;
+ goto _err;
+ }
+
tdbTbGet(pMeta->pTbDb, &((STbDbKey){.uid = ctbEntry.ctbEntry.suid, .version = ((SUidIdxVal *)pVal)[0].version}),
sizeof(STbDbKey), (void **)&stbEntry.pBuf, &nVal);
tdbFree(pVal);
@@ -1067,7 +1075,9 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
ASSERT(ctbEntry.ctbEntry.pTags);
SCtbIdxKey ctbIdxKey = {.suid = ctbEntry.ctbEntry.suid, .uid = uid};
tdbTbUpsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), ctbEntry.ctbEntry.pTags,
- ((STag *)(ctbEntry.ctbEntry.pTags))->len, &pMeta->txn);
+ ((STag *)(ctbEntry.ctbEntry.pTags))->len, pMeta->txn);
+
+ metaUidCacheClear(pMeta, ctbEntry.ctbEntry.suid);
metaULock(pMeta);
@@ -1115,7 +1125,7 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p
// search uid index
TBC *pUidIdxc = NULL;
- tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL);
tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c);
ASSERT(c == 0);
@@ -1125,7 +1135,7 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p
// search table.db
TBC *pTbDbc = NULL;
- tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn);
+ tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL);
tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c);
ASSERT(c == 0);
tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData);
@@ -1232,7 +1242,7 @@ static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME) {
tEncoderClear(&coder);
// write to table.db
- if (tdbTbInsert(pMeta->pTbDb, pKey, kLen, pVal, vLen, &pMeta->txn) < 0) {
+ if (tdbTbInsert(pMeta->pTbDb, pKey, kLen, pVal, vLen, pMeta->txn) < 0) {
goto _err;
}
@@ -1255,29 +1265,29 @@ static int metaUpdateUidIdx(SMeta *pMeta, const SMetaEntry *pME) {
SUidIdxVal uidIdxVal = {.suid = info.suid, .version = info.version, .skmVer = info.skmVer};
- return tdbTbUpsert(pMeta->pUidIdx, &pME->uid, sizeof(tb_uid_t), &uidIdxVal, sizeof(uidIdxVal), &pMeta->txn);
+ return tdbTbUpsert(pMeta->pUidIdx, &pME->uid, sizeof(tb_uid_t), &uidIdxVal, sizeof(uidIdxVal), pMeta->txn);
}
static int metaUpdateSuidIdx(SMeta *pMeta, const SMetaEntry *pME) {
- return tdbTbInsert(pMeta->pSuidIdx, &pME->uid, sizeof(tb_uid_t), NULL, 0, &pMeta->txn);
+ return tdbTbInsert(pMeta->pSuidIdx, &pME->uid, sizeof(tb_uid_t), NULL, 0, pMeta->txn);
}
static int metaUpdateNameIdx(SMeta *pMeta, const SMetaEntry *pME) {
- return tdbTbInsert(pMeta->pNameIdx, pME->name, strlen(pME->name) + 1, &pME->uid, sizeof(tb_uid_t), &pMeta->txn);
+ return tdbTbInsert(pMeta->pNameIdx, pME->name, strlen(pME->name) + 1, &pME->uid, sizeof(tb_uid_t), pMeta->txn);
}
static int metaUpdateTtlIdx(SMeta *pMeta, const SMetaEntry *pME) {
STtlIdxKey ttlKey = {0};
metaBuildTtlIdxKey(&ttlKey, pME);
if (ttlKey.dtime == 0) return 0;
- return tdbTbInsert(pMeta->pTtlIdx, &ttlKey, sizeof(ttlKey), NULL, 0, &pMeta->txn);
+ return tdbTbInsert(pMeta->pTtlIdx, &ttlKey, sizeof(ttlKey), NULL, 0, pMeta->txn);
}
static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME) {
SCtbIdxKey ctbIdxKey = {.suid = pME->ctbEntry.suid, .uid = pME->uid};
return tdbTbInsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), pME->ctbEntry.pTags,
- ((STag *)(pME->ctbEntry.pTags))->len, &pMeta->txn);
+ ((STag *)(pME->ctbEntry.pTags))->len, pMeta->txn);
}
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
@@ -1343,6 +1353,10 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
goto end;
}
+ if (stbEntry.stbEntry.schemaTag.pSchema == NULL) {
+ goto end;
+ }
+
pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
STagVal tagVal = {.cid = pTagColumn->colId};
@@ -1369,7 +1383,7 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
ret = -1;
goto end;
}
- tdbTbUpsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, &pMeta->txn);
+ tdbTbUpsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, pMeta->txn);
}
end:
metaDestroyTagIdxKey(pTagIdxKey);
@@ -1416,7 +1430,7 @@ static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
tEncoderInit(&coder, pVal, vLen);
tEncodeSSchemaWrapper(&coder, pSW);
- if (tdbTbInsert(pMeta->pSkmDb, &skmDbKey, sizeof(skmDbKey), pVal, vLen, &pMeta->txn) < 0) {
+ if (tdbTbInsert(pMeta->pSkmDb, &skmDbKey, sizeof(skmDbKey), pVal, vLen, pMeta->txn) < 0) {
rcode = -1;
goto _exit;
}
diff --git a/source/dnode/vnode/src/sma/smaCommit.c b/source/dnode/vnode/src/sma/smaCommit.c
index a79ae35d79f2725d0765cd5bcee9108b178c57f0..9748963722cb5dac2f0a83bc89fad9a04987cf28 100644
--- a/source/dnode/vnode/src/sma/smaCommit.c
+++ b/source/dnode/vnode/src/sma/smaCommit.c
@@ -23,7 +23,7 @@ static int32_t tdProcessRSmaSyncCommitImpl(SSma *pSma);
static int32_t tdProcessRSmaSyncPostCommitImpl(SSma *pSma);
#endif
static int32_t tdProcessRSmaAsyncPreCommitImpl(SSma *pSma);
-static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma);
+static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma, SCommitInfo *pInfo);
static int32_t tdProcessRSmaAsyncPostCommitImpl(SSma *pSma);
static int32_t tdUpdateQTaskInfoFiles(SSma *pSma, SRSmaStat *pRSmaStat);
@@ -59,7 +59,7 @@ int32_t smaSyncPostCommit(SSma *pSma) { return tdProcessRSmaSyncPostCommitImpl(p
* @param pSma
* @return int32_t
*/
-int32_t smaPreCommit(SSma *pSma) { return tdProcessRSmaAsyncPreCommitImpl(pSma); }
+int32_t smaPrepareAsyncCommit(SSma *pSma) { return tdProcessRSmaAsyncPreCommitImpl(pSma); }
/**
* @brief async commit, only applicable to Rollup SMA
@@ -67,7 +67,7 @@ int32_t smaPreCommit(SSma *pSma) { return tdProcessRSmaAsyncPreCommitImpl(pSma);
* @param pSma
* @return int32_t
*/
-int32_t smaCommit(SSma *pSma) { return tdProcessRSmaAsyncCommitImpl(pSma); }
+int32_t smaCommit(SSma *pSma, SCommitInfo *pInfo) { return tdProcessRSmaAsyncCommitImpl(pSma, pInfo); }
/**
* @brief async commit, only applicable to Rollup SMA
@@ -127,8 +127,8 @@ _exit:
}
int32_t smaFinishCommit(SSma *pSma) {
- int32_t code = 0;
- SVnode *pVnode = pSma->pVnode;
+ int32_t code = 0;
+ SVnode *pVnode = pSma->pVnode;
if (VND_RSMA1(pVnode) && (code = tsdbFinishCommit(VND_RSMA1(pVnode))) < 0) {
smaError("vgId:%d, failed to finish commit tsdb rsma1 since %s", TD_VID(pVnode), tstrerror(code));
@@ -378,6 +378,11 @@ static int32_t tdProcessRSmaAsyncPreCommitImpl(SSma *pSma) {
taosWUnLockLatch(SMA_ENV_LOCK(pEnv));
#endif
+ // all rsma results are written completely
+ STsdb *pTsdb = NULL;
+ if ((pTsdb = VND_RSMA1(pSma->pVnode))) tsdbPrepareCommit(pTsdb);
+ if ((pTsdb = VND_RSMA2(pSma->pVnode))) tsdbPrepareCommit(pTsdb);
+
return TSDB_CODE_SUCCESS;
}
@@ -387,9 +392,9 @@ static int32_t tdProcessRSmaAsyncPreCommitImpl(SSma *pSma) {
* @param pSma
* @return int32_t
*/
-static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma) {
- int32_t code = 0;
- SVnode *pVnode = pSma->pVnode;
+static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma, SCommitInfo *pInfo) {
+ int32_t code = 0;
+ SVnode *pVnode = pSma->pVnode;
#if 0
SRSmaStat *pRSmaStat = (SRSmaStat *)SMA_ENV_STAT(pSmaEnv);
@@ -399,11 +404,11 @@ static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma) {
}
#endif
- if ((code = tsdbCommit(VND_RSMA1(pVnode))) < 0) {
+ if ((code = tsdbCommit(VND_RSMA1(pVnode), pInfo)) < 0) {
smaError("vgId:%d, failed to commit tsdb rsma1 since %s", TD_VID(pVnode), tstrerror(code));
goto _exit;
}
- if ((code = tsdbCommit(VND_RSMA2(pVnode))) < 0) {
+ if ((code = tsdbCommit(VND_RSMA2(pVnode), pInfo)) < 0) {
smaError("vgId:%d, failed to commit tsdb rsma2 since %s", TD_VID(pVnode), tstrerror(code));
goto _exit;
}
diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c
index 03532eb6d409221c2fa138df419af1dd4a2620d9..6bd2ae3435349dfc3ab81838424cccc06ec4811e 100644
--- a/source/dnode/vnode/src/sma/smaRollup.c
+++ b/source/dnode/vnode/src/sma/smaRollup.c
@@ -660,6 +660,13 @@ _end:
return code;
}
+static void tdBlockDataDestroy(SArray *pBlockArr) {
+ for (int32_t i = 0; i < taosArrayGetSize(pBlockArr); ++i) {
+ blockDataDestroy(taosArrayGetP(pBlockArr, i));
+ }
+ taosArrayDestroy(pBlockArr);
+}
+
static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSmaInfoItem *pItem, STSchema *pTSchema,
int64_t suid) {
SArray *pResList = taosArrayInit(1, POINTER_BYTES);
@@ -701,38 +708,44 @@ static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSma
#endif
for (int32_t i = 0; i < taosArrayGetSize(pResList); ++i) {
SSDataBlock *output = taosArrayGetP(pResList, i);
- smaDebug("result block, uid:%"PRIu64", groupid:%"PRIu64", rows:%d", output->info.uid, output->info.groupId,
- output->info.rows);
+ smaDebug("result block, uid:%" PRIu64 ", groupid:%" PRIu64 ", rows:%d", output->info.id.uid, output->info.id.groupId,
+ output->info.rows);
- STsdb *sinkTsdb = (pItem->level == TSDB_RETENTION_L1 ? pSma->pRSmaTsdb[0] : pSma->pRSmaTsdb[1]);
- SSubmitReq *pReq = NULL;
+ STsdb *sinkTsdb = (pItem->level == TSDB_RETENTION_L1 ? pSma->pRSmaTsdb[0] : pSma->pRSmaTsdb[1]);
+ SSubmitReq *pReq = NULL;
// TODO: the schema update should be handled later(TD-17965)
if (buildSubmitReqFromDataBlock(&pReq, output, pTSchema, SMA_VID(pSma), suid) < 0) {
- smaError("vgId:%d, build submit req for rsma table suid:%" PRIu64 ", uid:%"PRIu64", level %" PRIi8 " failed since %s", SMA_VID(pSma),
- suid, output->info.groupId, pItem->level, terrstr());
+ smaError("vgId:%d, build submit req for rsma table suid:%" PRIu64 ", uid:%" PRIu64 ", level %" PRIi8
+ " failed since %s",
+ SMA_VID(pSma), suid, output->info.id.groupId, pItem->level, terrstr());
goto _err;
}
if (pReq && tdProcessSubmitReq(sinkTsdb, output->info.version, pReq) < 0) {
taosMemoryFreeClear(pReq);
- smaError("vgId:%d, process submit req for rsma suid:%"PRIu64", uid:%" PRIu64 " level %" PRIi8 " failed since %s",
- SMA_VID(pSma), suid, output->info.groupId, pItem->level, terrstr());
+ smaError("vgId:%d, process submit req for rsma suid:%" PRIu64 ", uid:%" PRIu64 " level %" PRIi8
+ " failed since %s",
+ SMA_VID(pSma), suid, output->info.id.groupId, pItem->level, terrstr());
goto _err;
}
- smaDebug("vgId:%d, process submit req for rsma suid:%" PRIu64 ",uid:%"PRIu64", level %" PRIi8 " ver %" PRIi64 " len %" PRIu32,
- SMA_VID(pSma), suid, output->info.groupId, pItem->level, output->info.version, htonl(pReq->header.contLen));
+ smaDebug("vgId:%d, process submit req for rsma suid:%" PRIu64 ",uid:%" PRIu64 ", level %" PRIi8 " ver %" PRIi64
+ " len %" PRIu32,
+ SMA_VID(pSma), suid, output->info.id.groupId, pItem->level, output->info.version,
+ htonl(pReq->header.contLen));
taosMemoryFreeClear(pReq);
}
}
taosArrayDestroy(pResList);
+ qCleanExecTaskBlockBuf(taskInfo);
return TSDB_CODE_SUCCESS;
_err:
taosArrayDestroy(pResList);
+ qCleanExecTaskBlockBuf(taskInfo);
return TSDB_CODE_FAILED;
}
@@ -820,8 +833,7 @@ static int32_t tdRsmaPrintSubmitReq(SSma *pSma, SSubmitReq *pReq) {
static int32_t tdExecuteRSmaImpl(SSma *pSma, const void *pMsg, int32_t msgSize, int32_t inputType, SRSmaInfo *pInfo,
ERsmaExecType type, int8_t level) {
int32_t idx = level - 1;
-
- void *qTaskInfo = (type == RSMA_EXEC_COMMIT) ? RSMA_INFO_IQTASK(pInfo, idx) : RSMA_INFO_QTASK(pInfo, idx);
+ void *qTaskInfo = (type == RSMA_EXEC_COMMIT) ? RSMA_INFO_IQTASK(pInfo, idx) : RSMA_INFO_QTASK(pInfo, idx);
if (!qTaskInfo) {
smaDebug("vgId:%d, no qTaskInfo to execute rsma %" PRIi8 " task for suid:%" PRIu64, SMA_VID(pSma), level,
pInfo->suid);
@@ -911,7 +923,7 @@ static int32_t tdRSmaInfoClone(SSma *pSma, SRSmaInfo *pInfo) {
SMetaReader mr = {0};
metaReaderInit(&mr, SMA_META(pSma), 0);
smaDebug("vgId:%d, rsma clone qTaskInfo for suid:%" PRIi64, SMA_VID(pSma), pInfo->suid);
- if (metaGetTableEntryByUid(&mr, pInfo->suid) < 0) {
+ if (metaGetTableEntryByUidCache(&mr, pInfo->suid) < 0) {
smaError("vgId:%d, rsma clone, failed to get table meta for %" PRIi64 " since %s", SMA_VID(pSma), pInfo->suid,
terrstr());
goto _err;
@@ -1115,7 +1127,7 @@ static int32_t tdRSmaRestoreQTaskInfoInit(SSma *pSma, int64_t *nTables) {
for (int64_t i = 0; i < arrSize; ++i) {
tb_uid_t suid = *(tb_uid_t *)taosArrayGet(suidList, i);
smaDebug("vgId:%d, rsma restore, suid is %" PRIi64, TD_VID(pVnode), suid);
- if (metaGetTableEntryByUid(&mr, suid) < 0) {
+ if (metaGetTableEntryByUidCache(&mr, suid) < 0) {
smaError("vgId:%d, rsma restore, failed to get table meta for %" PRIi64 " since %s", TD_VID(pVnode), suid,
terrstr());
goto _err;
diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c
index 5e35e34b87bd83b23ed0428e2aab0f661c38ad0f..389c8013f9ca92dbc5d24443898aa4c28a5fe479 100644
--- a/source/dnode/vnode/src/tq/tq.c
+++ b/source/dnode/vnode/src/tq/tq.c
@@ -75,7 +75,7 @@ static void tqPushEntryFree(void* data) {
STQ* tqOpen(const char* path, SVnode* pVnode) {
STQ* pTq = taosMemoryCalloc(1, sizeof(STQ));
if (pTq == NULL) {
- terrno = TSDB_CODE_TQ_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
pTq->path = strdup(path);
@@ -379,7 +379,6 @@ int32_t tqProcessOffsetCommitReq(STQ* pTq, int64_t version, char* msg, int32_t m
STqHandle* pHandle = taosHashGet(pTq->pHandle, offset.subKey, strlen(offset.subKey));
if (pHandle) {
if (walRefVer(pHandle->pRef, offset.val.version) < 0) {
- ASSERT(0);
return -1;
}
}
@@ -458,20 +457,26 @@ static int32_t tqInitTaosxRsp(STaosxRsp* pRsp, const SMqPollReq* pReq) {
}
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
- SMqPollReq* pReq = pMsg->pCont;
- int64_t consumerId = pReq->consumerId;
- int32_t reqEpoch = pReq->epoch;
+ SMqPollReq req = {0};
int32_t code = 0;
- STqOffsetVal reqOffset = pReq->reqOffset;
STqOffsetVal fetchOffsetNew;
SWalCkHead* pCkHead = NULL;
+ if (tDeserializeSMqPollReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
+ tqError("tDeserializeSMqPollReq %d failed", pMsg->contLen);
+ return -1;
+ }
+
+ int64_t consumerId = req.consumerId;
+ int32_t reqEpoch = req.epoch;
+ STqOffsetVal reqOffset = req.reqOffset;
+
// 1.find handle
- STqHandle* pHandle = taosHashGet(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
+ STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
/*ASSERT(pHandle);*/
if (pHandle == NULL) {
tqError("tmq poll: no consumer handle for consumer:%" PRId64 ", in vgId:%d, subkey %s", consumerId,
- TD_VID(pTq->pVnode), pReq->subKey);
+ TD_VID(pTq->pVnode), req.subKey);
return -1;
}
@@ -479,7 +484,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
if (pHandle->consumerId != consumerId) {
tqError("tmq poll: consumer handle mismatch for consumer:%" PRId64
", in vgId:%d, subkey %s, handle consumer id %" PRId64,
- consumerId, TD_VID(pTq->pVnode), pReq->subKey, pHandle->consumerId);
+ consumerId, TD_VID(pTq->pVnode), req.subKey, pHandle->consumerId);
terrno = TSDB_CODE_TMQ_CONSUMER_MISMATCH;
return -1;
}
@@ -493,13 +498,13 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
char buf[80];
tFormatOffset(buf, 80, &reqOffset);
tqDebug("tmq poll: consumer %" PRId64 " (epoch %d), subkey %s, recv poll req in vg %d, req offset %s", consumerId,
- pReq->epoch, pHandle->subKey, TD_VID(pTq->pVnode), buf);
+ req.epoch, pHandle->subKey, TD_VID(pTq->pVnode), buf);
// 2.reset offset if needed
if (reqOffset.type > 0) {
fetchOffsetNew = reqOffset;
} else {
- STqOffset* pOffset = tqOffsetRead(pTq->pOffsetStore, pReq->subKey);
+ STqOffset* pOffset = tqOffsetRead(pTq->pOffsetStore, req.subKey);
if (pOffset != NULL) {
fetchOffsetNew = pOffset->val;
char formatBuf[80];
@@ -508,7 +513,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
TD_VID(pTq->pVnode), formatBuf);
} else {
if (reqOffset.type == TMQ_OFFSET__RESET_EARLIEAST) {
- if (pReq->useSnapshot) {
+ if (req.useSnapshot) {
if (pHandle->fetchMeta) {
tqOffsetResetToMeta(&fetchOffsetNew, 0);
} else {
@@ -520,21 +525,21 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
} else if (reqOffset.type == TMQ_OFFSET__RESET_LATEST) {
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
SMqDataRsp dataRsp = {0};
- tqInitDataRsp(&dataRsp, pReq, pHandle->execHandle.subType);
+ tqInitDataRsp(&dataRsp, &req, pHandle->execHandle.subType);
tqOffsetResetToLog(&dataRsp.rspOffset, walGetLastVer(pTq->pVnode->pWal));
tqDebug("tmq poll: consumer %" PRId64 ", subkey %s, vg %d, offset reset to %" PRId64, consumerId,
pHandle->subKey, TD_VID(pTq->pVnode), dataRsp.rspOffset.version);
- if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
+ if (tqSendDataRsp(pTq, pMsg, &req, &dataRsp) < 0) {
code = -1;
}
tDeleteSMqDataRsp(&dataRsp);
return code;
} else {
STaosxRsp taosxRsp = {0};
- tqInitTaosxRsp(&taosxRsp, pReq);
+ tqInitTaosxRsp(&taosxRsp, &req);
tqOffsetResetToLog(&taosxRsp.rspOffset, walGetLastVer(pTq->pVnode->pWal));
- if (tqSendTaosxRsp(pTq, pMsg, pReq, &taosxRsp) < 0) {
+ if (tqSendTaosxRsp(pTq, pMsg, &req, &taosxRsp) < 0) {
code = -1;
}
tDeleteSTaosxRsp(&taosxRsp);
@@ -543,7 +548,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
} else if (reqOffset.type == TMQ_OFFSET__RESET_NONE) {
tqError("tmq poll: subkey %s, no offset committed for consumer %" PRId64
" in vg %d, subkey %s, reset none failed",
- pHandle->subKey, consumerId, TD_VID(pTq->pVnode), pReq->subKey);
+ pHandle->subKey, consumerId, TD_VID(pTq->pVnode), req.subKey);
terrno = TSDB_CODE_TQ_NO_COMMITTED_OFFSET;
return -1;
}
@@ -552,7 +557,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
SMqDataRsp dataRsp = {0};
- tqInitDataRsp(&dataRsp, pReq, pHandle->execHandle.subType);
+ tqInitDataRsp(&dataRsp, &req, pHandle->execHandle.subType);
// lock
taosWLockLatch(&pTq->pushLock);
tqScanData(pTq, pHandle, &dataRsp, &fetchOffsetNew);
@@ -580,7 +585,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
#endif
taosWUnLockLatch(&pTq->pushLock);
- if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
+ if (tqSendDataRsp(pTq, pMsg, &req, &dataRsp) < 0) {
code = -1;
}
@@ -599,13 +604,13 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
SMqMetaRsp metaRsp = {0};
STaosxRsp taosxRsp = {0};
- tqInitTaosxRsp(&taosxRsp, pReq);
+ tqInitTaosxRsp(&taosxRsp, &req);
if (fetchOffsetNew.type != TMQ_OFFSET__LOG) {
tqScanTaosx(pTq, pHandle, &taosxRsp, &metaRsp, &fetchOffsetNew);
if (metaRsp.metaRspLen > 0) {
- if (tqSendMetaPollRsp(pTq, pMsg, pReq, &metaRsp) < 0) {
+ if (tqSendMetaPollRsp(pTq, pMsg, &req, &metaRsp) < 0) {
code = -1;
}
tqDebug("tmq poll: consumer %" PRId64 ", subkey %s, vg %d, send meta offset type:%d,uid:%" PRId64
@@ -618,7 +623,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
}
if (taosxRsp.blockNum > 0) {
- if (tqSendTaosxRsp(pTq, pMsg, pReq, &taosxRsp) < 0) {
+ if (tqSendTaosxRsp(pTq, pMsg, &req, &taosxRsp) < 0) {
code = -1;
}
tDeleteSTaosxRsp(&taosxRsp);
@@ -648,13 +653,13 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
if (consumerEpoch > reqEpoch) {
tqWarn("tmq poll: consumer %" PRId64 " (epoch %d), subkey %s, vg %d offset %" PRId64
", found new consumer epoch %d, discard req epoch %d",
- consumerId, pReq->epoch, pHandle->subKey, TD_VID(pTq->pVnode), fetchVer, consumerEpoch, reqEpoch);
+ consumerId, req.epoch, pHandle->subKey, TD_VID(pTq->pVnode), fetchVer, consumerEpoch, reqEpoch);
break;
}
if (tqFetchLog(pTq, pHandle, &fetchVer, &pCkHead) < 0) {
tqOffsetResetToLog(&taosxRsp.rspOffset, fetchVer);
- if (tqSendTaosxRsp(pTq, pMsg, pReq, &taosxRsp) < 0) {
+ if (tqSendTaosxRsp(pTq, pMsg, &req, &taosxRsp) < 0) {
code = -1;
}
tDeleteSTaosxRsp(&taosxRsp);
@@ -665,7 +670,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
SWalCont* pHead = &pCkHead->head;
tqDebug("tmq poll: consumer:%" PRId64 ", (epoch %d) iter log, vgId:%d offset %" PRId64 " msgType %d", consumerId,
- pReq->epoch, TD_VID(pTq->pVnode), fetchVer, pHead->msgType);
+ req.epoch, TD_VID(pTq->pVnode), fetchVer, pHead->msgType);
if (pHead->msgType == TDMT_VND_SUBMIT) {
SSubmitReq* pCont = (SSubmitReq*)&pHead->body;
@@ -674,7 +679,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
}
if (taosxRsp.blockNum > 0 /* threshold */) {
tqOffsetResetToLog(&taosxRsp.rspOffset, fetchVer);
- if (tqSendTaosxRsp(pTq, pMsg, pReq, &taosxRsp) < 0) {
+ if (tqSendTaosxRsp(pTq, pMsg, &req, &taosxRsp) < 0) {
code = -1;
}
tDeleteSTaosxRsp(&taosxRsp);
@@ -692,7 +697,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
metaRsp.resMsgType = pHead->msgType;
metaRsp.metaRspLen = pHead->bodyLen;
metaRsp.metaRsp = pHead->body;
- if (tqSendMetaPollRsp(pTq, pMsg, pReq, &metaRsp) < 0) {
+ if (tqSendMetaPollRsp(pTq, pMsg, &req, &metaRsp) < 0) {
code = -1;
taosMemoryFreeClear(pCkHead);
tDeleteSTaosxRsp(&taosxRsp);
@@ -720,9 +725,15 @@ int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t version, char* msg, int32_t msgL
}
taosWUnLockLatch(&pTq->pushLock);
- code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
- if (code != 0) {
- tqError("cannot process tq delete req %s, since no such handle", pReq->subKey);
+ STqHandle* pHandle = taosHashGet(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
+ if (pHandle) {
+ if (pHandle->pRef) {
+ walCloseRef(pTq->pVnode->pWal, pHandle->pRef->refId);
+ }
+ code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
+ if (code != 0) {
+ tqError("cannot process tq delete req %s, since no such handle", pReq->subKey);
+ }
}
code = tqOffsetDelete(pTq->pOffsetStore, pReq->subKey);
@@ -731,7 +742,7 @@ int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t version, char* msg, int32_t msgL
}
if (tqMetaDeleteHandle(pTq, pReq->subKey) < 0) {
- ASSERT(0);
+ tqError("cannot process tq delete req %s, since no such offset in tdb", pReq->subKey);
}
return 0;
}
@@ -1122,7 +1133,7 @@ int32_t tqProcessTaskRecover1Req(STQ* pTq, SRpcMsg* pMsg) {
SRpcMsg rpcMsg = {
.code = 0,
.contLen = len,
- .msgType = TDMT_VND_STREAM_RECOVER_STEP2,
+ .msgType = TDMT_VND_STREAM_RECOVER_BLOCKING_STAGE,
.pCont = serializedReq,
};
@@ -1269,6 +1280,7 @@ int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) {
if (streamTaskInput(pTask, (SStreamQueueItem*)pRefBlock) < 0) {
qError("stream task input del failed, task id %d", pTask->taskId);
+ atomic_sub_fetch_32(pRef, 1);
taosFreeQitem(pRefBlock);
continue;
}
@@ -1286,7 +1298,7 @@ int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) {
int32_t ref = atomic_sub_fetch_32(pRef, 1);
ASSERT(ref >= 0);
if (ref == 0) {
- taosMemoryFree(pDelBlock);
+ blockDataDestroy(pDelBlock);
taosMemoryFree(pRef);
}
@@ -1419,7 +1431,7 @@ int32_t tqProcessTaskDispatchRsp(STQ* pTq, SRpcMsg* pMsg) {
int32_t tqProcessTaskDropReq(STQ* pTq, int64_t version, char* msg, int32_t msgLen) {
SVDropStreamTaskReq* pReq = (SVDropStreamTaskReq*)msg;
- streamMetaRemoveTask1(pTq->pStreamMeta, pReq->taskId);
+ streamMetaRemoveTask(pTq->pStreamMeta, pReq->taskId);
return 0;
}
diff --git a/source/dnode/vnode/src/tq/tqExec.c b/source/dnode/vnode/src/tq/tqExec.c
index 3887f72740491701744b3fb9753e128e2d074428..093186ebbb188841bf0fa012be4dd59f8d0b5a1b 100644
--- a/source/dnode/vnode/src/tq/tqExec.c
+++ b/source/dnode/vnode/src/tq/tqExec.c
@@ -25,7 +25,7 @@ int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t
pRetrieve->precision = precision;
pRetrieve->compressed = 0;
pRetrieve->completed = 1;
- pRetrieve->numOfRows = htonl(pBlock->info.rows);
+ pRetrieve->numOfRows = htobe64((int64_t)pBlock->info.rows);
int32_t actualLen = blockEncode(pBlock, pRetrieve->data, numOfCols);
actualLen += sizeof(SRetrieveTableRsp);
@@ -48,7 +48,7 @@ static int32_t tqAddTbNameToRsp(const STQ* pTq, int64_t uid, SMqDataRsp* pRsp, i
SMetaReader mr = {0};
metaReaderInit(&mr, pTq->pVnode->pMeta, 0);
// TODO add reference to gurantee success
- if (metaGetTableEntryByUid(&mr, uid) < 0) {
+ if (metaGetTableEntryByUidCache(&mr, uid) < 0) {
metaReaderClear(&mr);
return -1;
}
@@ -299,7 +299,7 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SSubmitReq* pReq, STaosxRsp
taosArrayDestroyP(pSchemas, (FDelete)tDeleteSSchemaWrapper);
pBlocks = taosArrayInit(0, sizeof(SSDataBlock));
pSchemas = taosArrayInit(0, sizeof(void*));
- return -1;
+ continue;
}
}
if (pHandle->fetchMeta) {
diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c
index a15d19fbe19ee20db9c178c4fa18e1a1c2fbc956..f476f58b565943f5cdd1e8c99233e37a9f1fdf24 100644
--- a/source/dnode/vnode/src/tq/tqMeta.c
+++ b/source/dnode/vnode/src/tq/tqMeta.c
@@ -108,24 +108,22 @@ int32_t tqMetaClose(STQ* pTq) {
}
int32_t tqMetaSaveCheckInfo(STQ* pTq, const char* key, const void* value, int32_t vLen) {
- TXN txn;
- if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
- return -1;
- }
+ TXN* txn;
- if (tdbBegin(pTq->pMetaDB, &txn) < 0) {
+ if (tdbBegin(pTq->pMetaDB, &txn, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
+ 0) {
return -1;
}
- if (tdbTbUpsert(pTq->pCheckStore, key, strlen(key), value, vLen, &txn) < 0) {
+ if (tdbTbUpsert(pTq->pCheckStore, key, strlen(key), value, vLen, txn) < 0) {
return -1;
}
- if (tdbCommit(pTq->pMetaDB, &txn) < 0) {
+ if (tdbCommit(pTq->pMetaDB, txn) < 0) {
return -1;
}
- if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
+ if (tdbPostCommit(pTq->pMetaDB, txn) < 0) {
return -1;
}
@@ -133,25 +131,22 @@ int32_t tqMetaSaveCheckInfo(STQ* pTq, const char* key, const void* value, int32_
}
int32_t tqMetaDeleteCheckInfo(STQ* pTq, const char* key) {
- TXN txn;
+ TXN* txn;
- if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
+ if (tdbBegin(pTq->pMetaDB, &txn, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
+ 0) {
ASSERT(0);
}
- if (tdbBegin(pTq->pMetaDB, &txn) < 0) {
- ASSERT(0);
- }
-
- if (tdbTbDelete(pTq->pCheckStore, key, (int)strlen(key), &txn) < 0) {
+ if (tdbTbDelete(pTq->pCheckStore, key, (int)strlen(key), txn) < 0) {
/*ASSERT(0);*/
}
- if (tdbCommit(pTq->pMetaDB, &txn) < 0) {
+ if (tdbCommit(pTq->pMetaDB, txn) < 0) {
ASSERT(0);
}
- if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
+ if (tdbPostCommit(pTq->pMetaDB, txn) < 0) {
ASSERT(0);
}
@@ -219,25 +214,22 @@ int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
ASSERT(0);
}
- TXN txn;
-
- if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
- ASSERT(0);
- }
+ TXN* txn;
- if (tdbBegin(pTq->pMetaDB, &txn) < 0) {
+ if (tdbBegin(pTq->pMetaDB, &txn, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
+ 0) {
ASSERT(0);
}
- if (tdbTbUpsert(pTq->pExecStore, key, (int)strlen(key), buf, vlen, &txn) < 0) {
+ if (tdbTbUpsert(pTq->pExecStore, key, (int)strlen(key), buf, vlen, txn) < 0) {
ASSERT(0);
}
- if (tdbCommit(pTq->pMetaDB, &txn) < 0) {
+ if (tdbCommit(pTq->pMetaDB, txn) < 0) {
ASSERT(0);
}
- if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
+ if (tdbPostCommit(pTq->pMetaDB, txn) < 0) {
ASSERT(0);
}
@@ -247,25 +239,22 @@ int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
}
int32_t tqMetaDeleteHandle(STQ* pTq, const char* key) {
- TXN txn;
-
- if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
- ASSERT(0);
- }
+ TXN* txn;
- if (tdbBegin(pTq->pMetaDB, &txn) < 0) {
+ if (tdbBegin(pTq->pMetaDB, &txn, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
+ 0) {
ASSERT(0);
}
- if (tdbTbDelete(pTq->pExecStore, key, (int)strlen(key), &txn) < 0) {
+ if (tdbTbDelete(pTq->pExecStore, key, (int)strlen(key), txn) < 0) {
/*ASSERT(0);*/
}
- if (tdbCommit(pTq->pMetaDB, &txn) < 0) {
+ if (tdbCommit(pTq->pMetaDB, txn) < 0) {
ASSERT(0);
}
- if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
+ if (tdbPostCommit(pTq->pMetaDB, txn) < 0) {
ASSERT(0);
}
@@ -291,6 +280,7 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
STqHandle handle;
tDecoderInit(&decoder, (uint8_t*)pVal, vLen);
tDecodeSTqHandle(&decoder, &handle);
+ tDecoderClear(&decoder);
handle.pRef = walOpenRef(pTq->pVnode->pWal);
if (handle.pRef == NULL) {
@@ -345,6 +335,8 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
}
+ tdbFree(pKey);
+ tdbFree(pVal);
tdbTbcClose(pCur);
return 0;
}
diff --git a/source/dnode/vnode/src/tq/tqOffset.c b/source/dnode/vnode/src/tq/tqOffset.c
index a7f816bb1be2dfec3f848d01081ad90a91106e3d..dd56c165fddf97aae724cebf062c07a63e27f1c7 100644
--- a/source/dnode/vnode/src/tq/tqOffset.c
+++ b/source/dnode/vnode/src/tq/tqOffset.c
@@ -61,6 +61,7 @@ int32_t tqOffsetRestoreFromFile(STqOffsetStore* pStore, const char* fname) {
ASSERT(0);
// TODO
}
+ taosMemoryFree(memBuf);
}
taosCloseFile(&pFile);
diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c
index afb7ac39de8ff5e6582c96ef627371646571dfe4..c3a4cefc66bdfc3c7e6e38a5d8cd1f92c6bd42bf 100644
--- a/source/dnode/vnode/src/tq/tqRead.c
+++ b/source/dnode/vnode/src/tq/tqRead.c
@@ -530,7 +530,7 @@ int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, STqReader* pReader) {
tInitSubmitBlkIter(&pReader->msgIter, pReader->pBlock, &pReader->blkIter);
- pBlock->info.uid = pReader->msgIter.uid;
+ pBlock->info.id.uid = pReader->msgIter.uid;
pBlock->info.rows = pReader->msgIter.numOfRows;
pBlock->info.version = pReader->pMsg->version;
@@ -649,7 +649,7 @@ int32_t tqRetrieveTaosxBlock(STqReader* pReader, SArray* blocks, SArray* schemas
}
SSDataBlock* pBlock = taosArrayGetLast(blocks);
- pBlock->info.uid = pReader->msgIter.uid;
+ pBlock->info.id.uid = pReader->msgIter.uid;
pBlock->info.rows = 0;
pBlock->info.version = pReader->pMsg->version;
@@ -766,7 +766,7 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
for (int32_t i = 0; i < taosArrayGetSize(tbUidList); ++i) {
uint64_t* id = (uint64_t*)taosArrayGet(tbUidList, i);
- int32_t code = metaGetTableEntryByUid(&mr, *id);
+ int32_t code = metaGetTableEntryByUidCache(&mr, *id);
if (code != TSDB_CODE_SUCCESS) {
qError("failed to get table meta, uid:%" PRIu64 " code:%s", *id, tstrerror(terrno));
continue;
diff --git a/source/dnode/vnode/src/tq/tqSink.c b/source/dnode/vnode/src/tq/tqSink.c
index 30cde5d475fcc02c65c9b535b4b6986857c8324e..5907be576a67441f12c4045ba33243b751451fd4 100644
--- a/source/dnode/vnode/src/tq/tqSink.c
+++ b/source/dnode/vnode/src/tq/tqSink.c
@@ -21,14 +21,16 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
SBatchDeleteReq* deleteReq) {
ASSERT(pDataBlock->info.type == STREAM_DELETE_RESULT);
int32_t totRow = pDataBlock->info.rows;
- SColumnInfoData* pTsCol = taosArrayGet(pDataBlock->pDataBlock, START_TS_COLUMN_INDEX);
+ SColumnInfoData* pStartTsCol = taosArrayGet(pDataBlock->pDataBlock, START_TS_COLUMN_INDEX);
+ SColumnInfoData* pEndTsCol = taosArrayGet(pDataBlock->pDataBlock, END_TS_COLUMN_INDEX);
SColumnInfoData* pGidCol = taosArrayGet(pDataBlock->pDataBlock, GROUPID_COLUMN_INDEX);
SColumnInfoData* pTbNameCol = taosArrayGet(pDataBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX);
tqDebug("stream delete msg: row %d", totRow);
for (int32_t row = 0; row < totRow; row++) {
- int64_t ts = *(int64_t*)colDataGetData(pTsCol, row);
+ int64_t startTs = *(int64_t*)colDataGetData(pStartTsCol, row);
+ int64_t endTs = *(int64_t*)colDataGetData(pEndTsCol, row);
int64_t groupId = *(int64_t*)colDataGetData(pGidCol, row);
char* name;
void* varTbName = NULL;
@@ -42,8 +44,8 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
} else {
name = buildCtbNameByGroupId(stbFullName, groupId);
}
- tqDebug("stream delete msg: vgId:%d, groupId :%" PRId64 ", name: %s, ts:%" PRId64, pVnode->config.vgId, groupId,
- name, ts);
+ tqDebug("stream delete msg: vgId:%d, groupId :%" PRId64 ", name: %s, start ts:%" PRId64 "end ts:%" PRId64,
+ pVnode->config.vgId, groupId, name, startTs, endTs);
#if 0
SMetaReader mr = {0};
metaReaderInit(&mr, pVnode->pMeta, 0);
@@ -59,7 +61,8 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
taosMemoryFree(name);
#endif
SSingleDeleteReq req = {
- .ts = ts,
+ .startTs = startTs,
+ .endTs = endTs,
};
strncpy(req.tbname, name, TSDB_TABLE_NAME_LEN);
taosMemoryFree(name);
@@ -103,7 +106,7 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem
// STagVal tagVal = {
// .cid = pTagSchemaWrapper->pSchema[j].colId,
// .type = pTagSchemaWrapper->pSchema[j].type,
- // .i64 = (int64_t)pDataBlock->info.groupId,
+ // .i64 = (int64_t)pDataBlock->info.id.groupId,
// };
// taosArrayPush(tagArray, &tagVal);
// taosArrayPush(tagName, pTagSchemaWrapper->pSchema[j].name);
@@ -134,7 +137,7 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem
STagVal tagVal = {
.cid = taosArrayGetSize(pDataBlock->pDataBlock) + 1,
.type = TSDB_DATA_TYPE_UBIGINT,
- .i64 = (int64_t)pDataBlock->info.groupId,
+ .i64 = (int64_t)pDataBlock->info.id.groupId,
};
taosArrayPush(tagArray, &tagVal);
createTbReq.ctb.tagNum = taosArrayGetSize(tagArray);
@@ -161,7 +164,7 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem
if (pDataBlock->info.parTbName[0]) {
createTbReq.name = strdup(pDataBlock->info.parTbName);
} else {
- createTbReq.name = buildCtbNameByGroupId(stbFullName, pDataBlock->info.groupId);
+ createTbReq.name = buildCtbNameByGroupId(stbFullName, pDataBlock->info.id.groupId);
}
// save schema len
@@ -358,7 +361,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
if (pDataBlock->info.parTbName[0]) {
ctbName = strdup(pDataBlock->info.parTbName);
} else {
- ctbName = buildCtbNameByGroupId(stbFullName, pDataBlock->info.groupId);
+ ctbName = buildCtbNameByGroupId(stbFullName, pDataBlock->info.id.groupId);
}
int32_t schemaLen = 0;
@@ -390,7 +393,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
STagVal tagVal = {
.cid = taosArrayGetSize(pDataBlock->pDataBlock) + 1,
.type = TSDB_DATA_TYPE_UBIGINT,
- .i64 = (int64_t)pDataBlock->info.groupId,
+ .i64 = (int64_t)pDataBlock->info.id.groupId,
};
taosArrayPush(tagArray, &tagVal);
createTbReq.ctb.tagNum = taosArrayGetSize(tagArray);
diff --git a/source/dnode/vnode/src/tq/tqSnapshot.c b/source/dnode/vnode/src/tq/tqSnapshot.c
index b68763867efcf9a8e7c13ec43bfb827df75b5959..d811d943ed9c45f30e64ac717a93e88587ed3fcc 100644
--- a/source/dnode/vnode/src/tq/tqSnapshot.c
+++ b/source/dnode/vnode/src/tq/tqSnapshot.c
@@ -129,7 +129,7 @@ struct STqSnapWriter {
STQ* pTq;
int64_t sver;
int64_t ever;
- TXN txn;
+ TXN* txn;
};
int32_t tqSnapWriterOpen(STQ* pTq, int64_t sver, int64_t ever, STqSnapWriter** ppWriter) {
@@ -146,8 +146,10 @@ int32_t tqSnapWriterOpen(STQ* pTq, int64_t sver, int64_t ever, STqSnapWriter** p
pWriter->sver = sver;
pWriter->ever = ever;
- if (tdbTxnOpen(&pWriter->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
- ASSERT(0);
+ if (tdbBegin(pTq->pMetaDB, &pWriter->txn, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
+ code = -1;
+ taosMemoryFree(pWriter);
+ goto _err;
}
*ppWriter = pWriter;
@@ -165,11 +167,11 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
STQ* pTq = pWriter->pTq;
if (rollback) {
- tdbAbort(pWriter->pTq->pMetaDB, &pWriter->txn);
+ tdbAbort(pWriter->pTq->pMetaDB, pWriter->txn);
} else {
- code = tdbCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
+ code = tdbCommit(pWriter->pTq->pMetaDB, pWriter->txn);
if (code) goto _err;
- code = tdbPostCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
+ code = tdbPostCommit(pWriter->pTq->pMetaDB, pWriter->txn);
if (code) goto _err;
}
diff --git a/source/dnode/vnode/src/tq/tqStreamStateSnap.c b/source/dnode/vnode/src/tq/tqStreamStateSnap.c
index 08d5931bc3250895d2f2eea5b9c164e54ae4c127..b1f00bdf7446789fa3c572ff366bd20319db10ec 100644
--- a/source/dnode/vnode/src/tq/tqStreamStateSnap.c
+++ b/source/dnode/vnode/src/tq/tqStreamStateSnap.c
@@ -129,7 +129,7 @@ struct STqSnapWriter {
STQ* pTq;
int64_t sver;
int64_t ever;
- TXN txn;
+ TXN* txn;
};
int32_t tqSnapWriterOpen(STQ* pTq, int64_t sver, int64_t ever, STqSnapWriter** ppWriter) {
@@ -146,8 +146,10 @@ int32_t tqSnapWriterOpen(STQ* pTq, int64_t sver, int64_t ever, STqSnapWriter** p
pWriter->sver = sver;
pWriter->ever = ever;
- if (tdbTxnOpen(&pWriter->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
- ASSERT(0);
+ if (tdbBegin(pTq->pMetaDB, &pWriter->txn, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
+ code = -1;
+ taosMemoryFree(pWriter);
+ goto _err;
}
*ppWriter = pWriter;
@@ -165,11 +167,12 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
STQ* pTq = pWriter->pTq;
if (rollback) {
+ tdbAbort(pWriter->pTq->pMetaDB, pWriter->txn);
ASSERT(0);
} else {
- code = tdbCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
+ code = tdbCommit(pWriter->pTq->pMetaDB, pWriter->txn);
if (code) goto _err;
- code = tdbPostCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
+ code = tdbPostCommit(pWriter->pTq->pMetaDB, pWriter->txn);
if (code) goto _err;
}
diff --git a/source/dnode/vnode/src/tq/tqStreamTaskSnap.c b/source/dnode/vnode/src/tq/tqStreamTaskSnap.c
index 31e44a5b6dcd170d801b3aa0481b6dd7ea851f0b..305378bc932f0484c71a9d1c91935a580189488e 100644
--- a/source/dnode/vnode/src/tq/tqStreamTaskSnap.c
+++ b/source/dnode/vnode/src/tq/tqStreamTaskSnap.c
@@ -129,7 +129,7 @@ struct STqSnapWriter {
STQ* pTq;
int64_t sver;
int64_t ever;
- TXN txn;
+ TXN* txn;
};
int32_t tqSnapWriterOpen(STQ* pTq, int64_t sver, int64_t ever, STqSnapWriter** ppWriter) {
@@ -146,8 +146,10 @@ int32_t tqSnapWriterOpen(STQ* pTq, int64_t sver, int64_t ever, STqSnapWriter** p
pWriter->sver = sver;
pWriter->ever = ever;
- if (tdbTxnOpen(&pWriter->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
- ASSERT(0);
+ if (tdbBegin(pTq->pMetaStore, &pWriter->txn, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
+ code = -1;
+ taosMemoryFree(pWriter);
+ goto _err;
}
*ppWriter = pWriter;
@@ -165,11 +167,12 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
STQ* pTq = pWriter->pTq;
if (rollback) {
+ tdbAbort(pWriter->pTq->pMetaStore, pWriter->txn);
ASSERT(0);
} else {
- code = tdbCommit(pWriter->pTq->pMetaStore, &pWriter->txn);
+ code = tdbCommit(pWriter->pTq->pMetaStore, pWriter->txn);
if (code) goto _err;
- code = tdbPostCommit(pWriter->pTq->pMetaStore, &pWriter->txn);
+ code = tdbPostCommit(pWriter->pTq->pMetaStore, pWriter->txn);
if (code) goto _err;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c
index 291a5ab1eb42cf97d6380a81b5c617622c9cecfc..5b09ce5eb6681ae46681a2c45f150cc2d780bb04 100644
--- a/source/dnode/vnode/src/tsdb/tsdbCache.c
+++ b/source/dnode/vnode/src/tsdb/tsdbCache.c
@@ -228,23 +228,23 @@ int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, ST
invalidate = true;
break;
- }
- } else {
- SLastCol lastCol = {.ts = keyTs, .colVal = colVal};
- if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) {
- SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLast, iCol);
- taosMemoryFree(pLastCol->colVal.value.pData);
-
- lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData);
- if (lastCol.colVal.value.pData == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _invalidate;
+ } else { // new inserting key is greater than cached, update cached entry
+ SLastCol lastCol = {.ts = keyTs, .colVal = colVal};
+ if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) {
+ SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLast, iCol);
+ taosMemoryFree(pLastCol->colVal.value.pData);
+
+ lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData);
+ if (lastCol.colVal.value.pData == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _invalidate;
+ }
+ memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData);
}
- memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData);
- }
- taosArraySet(pLast, iCol, &lastCol);
+ taosArraySet(pLast, iCol, &lastCol);
+ }
}
}
}
@@ -253,65 +253,10 @@ int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, ST
taosMemoryFreeClear(pTSchema);
taosLRUCacheRelease(pCache, h, invalidate);
- /*
- cacheRow = (STSRow *)taosLRUCacheValue(pCache, h);
- if (row->ts >= cacheRow->ts) {
- if (row->ts == cacheRow->ts) {
- STSRow *mergedRow = NULL;
- SRowMerger merger = {0};
- STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1);
-
- tRowMergerInit(&merger, &tsdbRowFromTSRow(0, cacheRow), pTSchema);
-
- tRowMerge(&merger, &tsdbRowFromTSRow(1, row));
-
- tRowMergerGetRow(&merger, &mergedRow);
- tRowMergerClear(&merger);
-
- taosMemoryFreeClear(pTSchema);
-
- row = mergedRow;
- dup = false;
- }
-
- if (TD_ROW_LEN(row) <= TD_ROW_LEN(cacheRow)) {
- tdRowCpy(cacheRow, row);
- if (!dup) {
- taosMemoryFree(row);
- }
-
- taosLRUCacheRelease(pCache, h, false);
- } else {
- taosLRUCacheRelease(pCache, h, true);
- // tsdbCacheDeleteLastrow(pCache, uid, TSKEY_MAX);
- if (dup) {
- cacheRow = tdRowDup(row);
- } else {
- cacheRow = row;
- }
- _taos_lru_deleter_t deleter = deleteTableCacheLastrow;
- LRUStatus status = taosLRUCacheInsert(pCache, key, keyLen, cacheRow, TD_ROW_LEN(cacheRow), deleter, NULL,
- TAOS_LRU_PRIORITY_LOW);
- if (status != TAOS_LRU_STATUS_OK) {
- code = -1;
- }
- // tsdbCacheInsertLastrow(pCache, uid, row, dup);
- }
- }*/
- } /*else {
- if (dup) {
- cacheRow = tdRowDup(row);
- } else {
- cacheRow = row;
- }
-
- _taos_lru_deleter_t deleter = deleteTableCacheLastrow;
- LRUStatus status =
- taosLRUCacheInsert(pCache, key, keyLen, cacheRow, TD_ROW_LEN(cacheRow), deleter, NULL, TAOS_LRU_PRIORITY_LOW);
- if (status != TAOS_LRU_STATUS_OK) {
- code = -1;
+ if (invalidate) {
+ taosLRUCacheErase(pCache, key, keyLen);
}
- }*/
+ }
return code;
}
@@ -349,28 +294,28 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb
SColVal colVal = {0};
tTSRowGetVal(row, pTSchema, iCol, &colVal);
- if (!COL_VAL_IS_VALUE(&colVal)) {
+ if (COL_VAL_IS_VALUE(&colVal)) {
if (keyTs == tTsVal1->ts && COL_VAL_IS_VALUE(tColVal)) {
invalidate = true;
break;
- }
- } else {
- SLastCol lastCol = {.ts = keyTs, .colVal = colVal};
- if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) {
- SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLast, iCol);
- taosMemoryFree(pLastCol->colVal.value.pData);
-
- lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData);
- if (lastCol.colVal.value.pData == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _invalidate;
+ } else {
+ SLastCol lastCol = {.ts = keyTs, .colVal = colVal};
+ if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) {
+ SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLast, iCol);
+ taosMemoryFree(pLastCol->colVal.value.pData);
+
+ lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData);
+ if (lastCol.colVal.value.pData == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _invalidate;
+ }
+ memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData);
}
- memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData);
- }
- taosArraySet(pLast, iCol, &lastCol);
+ taosArraySet(pLast, iCol, &lastCol);
+ }
}
}
}
@@ -379,9 +324,9 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb
taosMemoryFreeClear(pTSchema);
taosLRUCacheRelease(pCache, h, invalidate);
-
- // clear last cache anyway, lazy load when get last lookup
- // taosLRUCacheRelease(pCache, h, true);
+ if (invalidate) {
+ taosLRUCacheErase(pCache, key, keyLen);
+ }
}
return code;
@@ -392,7 +337,7 @@ static tb_uid_t getTableSuidByUid(tb_uid_t uid, STsdb *pTsdb) {
SMetaReader mr = {0};
metaReaderInit(&mr, pTsdb->pVnode->pMeta, 0);
- if (metaGetTableEntryByUid(&mr, uid) < 0) {
+ if (metaGetTableEntryByUidCache(&mr, uid) < 0) {
metaReaderClear(&mr); // table not esist
return 0;
}
@@ -1007,12 +952,17 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
SArray *pDelIdxArray = taosArrayInit(32, sizeof(SDelIdx));
code = tsdbReadDelIdx(pDelFReader, pDelIdxArray);
- if (code) goto _err;
+ if (code) {
+ taosArrayDestroy(pDelIdxArray);
+ tsdbDelFReaderClose(&pDelFReader);
+ goto _err;
+ }
SDelIdx *delIdx = taosArraySearch(pDelIdxArray, &(SDelIdx){.suid = suid, .uid = uid}, tCmprDelIdx, TD_EQ);
code = getTableDelSkyline(pMem, pIMem, pDelFReader, delIdx, pIter->pSkyline);
if (code) {
+ taosArrayDestroy(pDelIdxArray);
tsdbDelFReaderClose(&pDelFReader);
goto _err;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c
index 65a46331aa8d4bd62f29f4e0c6c068ef4f95a6cd..8ec59ea95949a4bccda38c7cc2fda25e2f769fb4 100644
--- a/source/dnode/vnode/src/tsdb/tsdbCommit.c
+++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c
@@ -53,6 +53,7 @@ typedef struct {
// --------------
TSKEY nextKey; // reset by each table commit
int32_t commitFid;
+ int32_t expLevel;
TSKEY minKey;
TSKEY maxKey;
// commit file data
@@ -93,7 +94,7 @@ typedef struct {
SArray *aDelData; // SArray
} SCommitter;
-static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter);
+static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter, SCommitInfo *pInfo);
static int32_t tsdbCommitData(SCommitter *pCommitter);
static int32_t tsdbCommitDel(SCommitter *pCommitter);
static int32_t tsdbCommitCache(SCommitter *pCommitter);
@@ -150,18 +151,28 @@ _exit:
return code;
}
-int32_t tsdbCommit(STsdb *pTsdb) {
+int32_t tsdbPrepareCommit(STsdb *pTsdb) {
+ taosThreadRwlockWrlock(&pTsdb->rwLock);
+ ASSERT(pTsdb->imem == NULL);
+ pTsdb->imem = pTsdb->mem;
+ pTsdb->mem = NULL;
+ taosThreadRwlockUnlock(&pTsdb->rwLock);
+
+ return 0;
+}
+
+int32_t tsdbCommit(STsdb *pTsdb, SCommitInfo *pInfo) {
if (!pTsdb) return 0;
int32_t code = 0;
int32_t lino = 0;
SCommitter commith;
- SMemTable *pMemTable = pTsdb->mem;
+ SMemTable *pMemTable = pTsdb->imem;
// check
if (pMemTable->nRow == 0 && pMemTable->nDel == 0) {
taosThreadRwlockWrlock(&pTsdb->rwLock);
- pTsdb->mem = NULL;
+ pTsdb->imem = NULL;
taosThreadRwlockUnlock(&pTsdb->rwLock);
tsdbUnrefMemTable(pMemTable);
@@ -169,7 +180,7 @@ int32_t tsdbCommit(STsdb *pTsdb) {
}
// start commit
- code = tsdbStartCommit(pTsdb, &commith);
+ code = tsdbStartCommit(pTsdb, &commith, pInfo);
TSDB_CHECK_CODE(code, lino, _exit);
// commit impl
@@ -341,7 +352,7 @@ int32_t tsdbUpdateTableSchema(SMeta *pMeta, int64_t suid, int64_t uid, SSkmInfo
pSkmInfo->suid = suid;
pSkmInfo->uid = uid;
- tTSchemaDestroy(pSkmInfo->pTSchema);
+ tDestroyTSchema(pSkmInfo->pTSchema);
code = metaGetTbTSchemaEx(pMeta, suid, uid, -1, &pSkmInfo->pTSchema);
TSDB_CHECK_CODE(code, lino, _exit);
@@ -365,7 +376,7 @@ static int32_t tsdbCommitterUpdateRowSchema(SCommitter *pCommitter, int64_t suid
pCommitter->skmRow.suid = suid;
pCommitter->skmRow.uid = uid;
- tTSchemaDestroy(pCommitter->skmRow.pTSchema);
+ tDestroyTSchema(pCommitter->skmRow.pTSchema);
code = metaGetTbTSchemaEx(pCommitter->pTsdb->pVnode->pMeta, suid, uid, sver, &pCommitter->skmRow.pTSchema);
TSDB_CHECK_CODE(code, lino, _exit);
@@ -493,12 +504,13 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) {
// memory
pCommitter->commitFid = tsdbKeyFid(pCommitter->nextKey, pCommitter->minutes, pCommitter->precision);
+ pCommitter->expLevel = tsdbFidLevel(pCommitter->commitFid, &pCommitter->pTsdb->keepCfg, taosGetTimestampSec());
tsdbFidKeyRange(pCommitter->commitFid, pCommitter->minutes, pCommitter->precision, &pCommitter->minKey,
&pCommitter->maxKey);
#if 0
ASSERT(pCommitter->minKey <= pCommitter->nextKey && pCommitter->maxKey >= pCommitter->nextKey);
#endif
-
+
pCommitter->nextKey = TSKEY_MAX;
// Reader
@@ -546,7 +558,10 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) {
}
} else {
SDiskID did = {0};
- tfsAllocDisk(pTsdb->pVnode->pTfs, 0, &did);
+ if (tfsAllocDisk(pTsdb->pVnode->pTfs, pCommitter->expLevel, &did) < 0) {
+ code = terrno;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
tfsMkdirRecurAt(pTsdb->pVnode->pTfs, pTsdb->path, did);
wSet.diskId = did;
wSet.nSttF = 1;
@@ -623,7 +638,8 @@ int32_t tsdbWriteDataBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SMapDa
_exit:
if (code) {
- tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code));
+ tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino,
+ tstrerror(code));
}
return code;
}
@@ -666,7 +682,8 @@ int32_t tsdbWriteSttBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SArray
_exit:
if (code) {
- tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code));
+ tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino,
+ tstrerror(code));
}
return code;
}
@@ -706,7 +723,8 @@ static int32_t tsdbCommitSttBlk(SDataFWriter *pWriter, SDiskDataBuilder *pBuilde
_exit:
if (code) {
- tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code));
+ tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino,
+ tstrerror(code));
}
return code;
}
@@ -803,26 +821,21 @@ _exit:
}
// ----------------------------------------------------------------------------
-static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) {
+static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter, SCommitInfo *pInfo) {
int32_t code = 0;
int32_t lino = 0;
memset(pCommitter, 0, sizeof(*pCommitter));
- ASSERT(pTsdb->mem && pTsdb->imem == NULL);
-
- taosThreadRwlockWrlock(&pTsdb->rwLock);
- pTsdb->imem = pTsdb->mem;
- pTsdb->mem = NULL;
- taosThreadRwlockUnlock(&pTsdb->rwLock);
+ ASSERT(pTsdb->imem && "last tsdb commit incomplete");
pCommitter->pTsdb = pTsdb;
- pCommitter->commitID = pTsdb->pVnode->state.commitID;
+ pCommitter->commitID = pInfo->info.state.commitID;
pCommitter->minutes = pTsdb->keepCfg.days;
pCommitter->precision = pTsdb->keepCfg.precision;
- pCommitter->minRow = pTsdb->pVnode->config.tsdbCfg.minRows;
- pCommitter->maxRow = pTsdb->pVnode->config.tsdbCfg.maxRows;
- pCommitter->cmprAlg = pTsdb->pVnode->config.tsdbCfg.compression;
- pCommitter->sttTrigger = pTsdb->pVnode->config.sttTrigger;
+ pCommitter->minRow = pInfo->info.config.tsdbCfg.minRows;
+ pCommitter->maxRow = pInfo->info.config.tsdbCfg.maxRows;
+ pCommitter->cmprAlg = pInfo->info.config.tsdbCfg.compression;
+ pCommitter->sttTrigger = pInfo->info.config.sttTrigger;
pCommitter->aTbDataP = tsdbMemTableGetTbDataArray(pTsdb->imem);
if (pCommitter->aTbDataP == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
@@ -919,8 +932,8 @@ static void tsdbCommitDataEnd(SCommitter *pCommitter) {
#else
tBlockDataDestroy(&pCommitter->dWriter.bDatal, 1);
#endif
- tTSchemaDestroy(pCommitter->skmTable.pTSchema);
- tTSchemaDestroy(pCommitter->skmRow.pTSchema);
+ tDestroyTSchema(pCommitter->skmTable.pTSchema);
+ tDestroyTSchema(pCommitter->skmRow.pTSchema);
}
static int32_t tsdbCommitData(SCommitter *pCommitter) {
@@ -1258,7 +1271,7 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk)
}
}
} else {
- ASSERT(0);
+ ASSERT(0 && "dup rows not allowed");
}
if (pBDataW->nRow >= pCommitter->maxRow) {
@@ -1679,4 +1692,4 @@ _exit:
tsdbInfo("vgId:%d, tsdb rollback commit", TD_VID(pTsdb->pVnode));
}
return code;
-}
\ No newline at end of file
+}
diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c
index 9f59707ddc469a3aff34a0f8817393773a63de11..b46a00363817666cdff7bc7756ff204483787c36 100644
--- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c
+++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c
@@ -595,21 +595,21 @@ int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTS
if (pBuilder->bi.minKey > kRow.ts) pBuilder->bi.minKey = kRow.ts;
if (pBuilder->bi.maxKey < kRow.ts) pBuilder->bi.maxKey = kRow.ts;
- SRowIter iter = {0};
- tRowIterInit(&iter, pRow, pTSchema);
+ STSDBRowIter iter = {0};
+ tsdbRowIterInit(&iter, pRow, pTSchema);
- SColVal *pColVal = tRowIterNext(&iter);
+ SColVal *pColVal = tsdbRowIterNext(&iter);
for (int32_t iBuilder = 0; iBuilder < pBuilder->nBuilder; iBuilder++) {
SDiskColBuilder *pDCBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iBuilder);
while (pColVal && pColVal->cid < pDCBuilder->cid) {
- pColVal = tRowIterNext(&iter);
+ pColVal = tsdbRowIterNext(&iter);
}
if (pColVal && pColVal->cid == pDCBuilder->cid) {
code = tDiskColAddVal(pDCBuilder, pColVal);
if (code) return code;
- pColVal = tRowIterNext(&iter);
+ pColVal = tsdbRowIterNext(&iter);
} else {
code = tDiskColAddVal(pDCBuilder, &COL_VAL_NONE(pDCBuilder->cid, pDCBuilder->type));
if (code) return code;
diff --git a/source/dnode/vnode/src/tsdb/tsdbFS.c b/source/dnode/vnode/src/tsdb/tsdbFS.c
index 72d9c4f69ef19908a84e27d9ecfe03b1aa776337..7dc839773f11b6bb823375f35281977e94b74f8b 100644
--- a/source/dnode/vnode/src/tsdb/tsdbFS.c
+++ b/source/dnode/vnode/src/tsdb/tsdbFS.c
@@ -962,6 +962,7 @@ int32_t tsdbFSUpsertFSet(STsdbFS *pFS, SDFileSet *pSet) {
}
}
+ pDFileSet->diskId = pSet->diskId;
goto _exit;
}
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c
index ddf29496077b63c36d69adf35da6438b90e058cc..0a7f59e429142a8a8cdd52627a36ff6c8856acaf 100644
--- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c
+++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c
@@ -104,7 +104,7 @@ int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitMsgIter *pMsgI
tb_uid_t uid = pMsgIter->uid;
SMetaInfo info;
- code = metaGetInfo(pTsdb->pVnode->pMeta, uid, &info);
+ code = metaGetInfo(pTsdb->pVnode->pMeta, uid, &info, NULL);
if (code) {
code = TSDB_CODE_TDB_TABLE_NOT_EXIST;
goto _err;
@@ -114,7 +114,7 @@ int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitMsgIter *pMsgI
goto _err;
}
if (info.suid) {
- metaGetInfo(pTsdb->pVnode->pMeta, info.suid, &info);
+ metaGetInfo(pTsdb->pVnode->pMeta, info.suid, &info, NULL);
}
if (pMsgIter->sversion != info.skmVer) {
tsdbError("vgId:%d, req sver:%d, skmVer:%d suid:%" PRId64 " uid:%" PRId64, TD_VID(pTsdb->pVnode),
@@ -153,7 +153,7 @@ int32_t tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid
// check if table exists
SMetaInfo info;
- code = metaGetInfo(pTsdb->pVnode->pMeta, uid, &info);
+ code = metaGetInfo(pTsdb->pVnode->pMeta, uid, &info, NULL);
if (code) {
code = TSDB_CODE_TDB_TABLE_NOT_EXIST;
goto _err;
diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c
index 4b332c3e85b9daa8dd44095dd68bda74caa45808..58fa24ad41b935397a1bdbba0798441634ceb49c 100644
--- a/source/dnode/vnode/src/tsdb/tsdbRead.c
+++ b/source/dnode/vnode/src/tsdb/tsdbRead.c
@@ -38,7 +38,7 @@ typedef struct {
typedef struct SBlockIndex {
int32_t ordinalIndex;
int64_t inFileOffset;
- STimeWindow window;
+ STimeWindow window; // todo replace it with overlap flag.
} SBlockIndex;
typedef struct STableBlockScanInfo {
@@ -84,8 +84,8 @@ typedef struct SIOCostSummary {
typedef struct SBlockLoadSuppInfo {
SArray* pColAgg;
SColumnDataAgg tsColAgg;
- SColumnDataAgg** plist;
- int16_t* colIds; // column ids for loading file block data
+ int16_t* colId;
+ int16_t* slotId;
int32_t numOfCols;
char** buildBuf; // build string tmp buffer, todo remove it later after all string format being updated.
bool smaValid; // the sma on all queried columns are activated
@@ -158,6 +158,7 @@ struct STsdbReader {
STsdb* pTsdb;
uint64_t suid;
int16_t order;
+ bool freeBlock;
STimeWindow window; // the primary query time window that applies to all queries
SSDataBlock* pResBlock;
int32_t capacity;
@@ -169,7 +170,9 @@ struct STsdbReader {
SIOCostSummary cost;
STSchema* pSchema; // the newest version schema
STSchema* pMemSchema; // the previous schema for in-memory data, to avoid load schema too many times
- SDataFReader* pFileReader;
+ SDataFReader* pFileReader; // the file reader
+ SDelFReader* pDelFReader; // the del file reader
+ SArray* pDelIdx; // del file block index;
SVersionRange verRange;
SBlockInfoBuf blockInfoBuf;
int32_t step;
@@ -211,28 +214,29 @@ static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader);
static int32_t doBuildDataBlock(STsdbReader* pReader);
static TSDBKEY getCurrentKeyInBuf(STableBlockScanInfo* pScanInfo, STsdbReader* pReader);
static bool hasDataInFileBlock(const SBlockData* pBlockData, const SFileBlockDumpInfo* pDumpInfo);
+static void initBlockDumpInfo(STsdbReader* pReader, SDataBlockIter* pBlockIter);
static bool outOfTimeWindow(int64_t ts, STimeWindow* pWindow) { return (ts > pWindow->ekey) || (ts < pWindow->skey); }
-static int32_t setColumnIdSlotList(SBlockLoadSuppInfo* pSupInfo, SSDataBlock* pBlock) {
- size_t numOfCols = blockDataGetNumOfCols(pBlock);
-
+static int32_t setColumnIdSlotList(SBlockLoadSuppInfo* pSupInfo, SColumnInfo* pCols, const int32_t* pSlotIdList, int32_t numOfCols) {
pSupInfo->smaValid = true;
pSupInfo->numOfCols = numOfCols;
- pSupInfo->colIds = taosMemoryMalloc(numOfCols * sizeof(int16_t));
- pSupInfo->buildBuf = taosMemoryCalloc(numOfCols, POINTER_BYTES);
- if (pSupInfo->buildBuf == NULL || pSupInfo->colIds == NULL) {
- taosMemoryFree(pSupInfo->colIds);
- taosMemoryFree(pSupInfo->buildBuf);
+ pSupInfo->colId = taosMemoryMalloc(numOfCols * (sizeof(int16_t)*2 + POINTER_BYTES));
+ if (pSupInfo->colId == NULL) {
+ taosMemoryFree(pSupInfo->colId);
return TSDB_CODE_OUT_OF_MEMORY;
}
+ pSupInfo->slotId = (int16_t*)((char*)pSupInfo->colId + (sizeof(int16_t) * numOfCols));
+ pSupInfo->buildBuf = (char**) ((char*)pSupInfo->slotId + (sizeof(int16_t) * numOfCols));
for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, i);
- pSupInfo->colIds[i] = pCol->info.colId;
+ pSupInfo->colId[i] = pCols[i].colId;
+ pSupInfo->slotId[i] = pSlotIdList[i];
- if (IS_VAR_DATA_TYPE(pCol->info.type)) {
- pSupInfo->buildBuf[i] = taosMemoryMalloc(pCol->info.bytes);
+ if (IS_VAR_DATA_TYPE(pCols[i].type)) {
+ pSupInfo->buildBuf[i] = taosMemoryMalloc(pCols[i].bytes);
+ } else {
+ pSupInfo->buildBuf[i] = NULL;
}
}
@@ -244,7 +248,7 @@ static void updateBlockSMAInfo(STSchema* pSchema, SBlockLoadSuppInfo* pSupInfo)
while(i < pSchema->numOfCols && j < pSupInfo->numOfCols) {
STColumn* pTCol = &pSchema->columns[i];
- if (pTCol->colId == pSupInfo->colIds[j]) {
+ if (pTCol->colId == pSupInfo->colId[j]) {
if (!IS_BSMA_ON(pTCol)) {
pSupInfo->smaValid = false;
return;
@@ -252,7 +256,7 @@ static void updateBlockSMAInfo(STSchema* pSchema, SBlockLoadSuppInfo* pSupInfo)
i += 1;
j += 1;
- } else if (pTCol->colId < pSupInfo->colIds[j]) {
+ } else if (pTCol->colId < pSupInfo->colId[j]) {
// do nothing
i += 1;
} else {
@@ -454,7 +458,7 @@ 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);
+ tCreateLastBlockLoadInfo(pReader->pSchema, &pReader->suppInfo.colId[1], pReader->suppInfo.numOfCols - 1);
if (pLReader->pInfo == NULL) {
tsdbDebug("init fileset iterator failed, code:%s %s", tstrerror(terrno), pReader->idStr);
return terrno;
@@ -551,7 +555,7 @@ static SSDataBlock* createResBlock(SQueryTableDataCond* pCond, int32_t capacity)
}
for (int32_t i = 0; i < pCond->numOfCols; ++i) {
- SColumnInfoData colInfo = {0, {0}};
+ SColumnInfoData colInfo = {0};
colInfo.info = pCond->colList[i];
blockDataAppendColInfo(pResBlock, &colInfo);
}
@@ -566,7 +570,7 @@ static SSDataBlock* createResBlock(SQueryTableDataCond* pCond, int32_t capacity)
}
static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsdbReader** ppReader, int32_t capacity,
- const char* idstr) {
+ SSDataBlock* pResBlock, const char* idstr) {
int32_t code = 0;
int8_t level = 0;
STsdbReader* pReader = (STsdbReader*)taosMemoryCalloc(1, sizeof(*pReader));
@@ -585,6 +589,7 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd
pReader->suid = pCond->suid;
pReader->order = pCond->order;
pReader->capacity = capacity;
+ pReader->pResBlock = pResBlock;
pReader->idStr = (idstr != NULL) ? strdup(idstr) : NULL;
pReader->verRange = getQueryVerRange(pVnode, pCond, level);
pReader->type = pCond->type;
@@ -592,13 +597,22 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd
pReader->blockInfoBuf.numPerBucket = 1000; // 1000 tables per bucket
ASSERT(pCond->numOfCols > 0);
+ if (pReader->pResBlock == NULL) {
+ pReader->freeBlock = true;
+ pReader->pResBlock = createResBlock(pCond, pReader->capacity);
+ if (pReader->pResBlock == NULL) {
+ code = terrno;
+ goto _end;
+ }
+ }
+
+ // todo refactor.
limitOutputBufferSize(pCond, &pReader->capacity);
// allocate buffer in order to load data blocks from file
SBlockLoadSuppInfo* pSup = &pReader->suppInfo;
pSup->pColAgg = taosArrayInit(pCond->numOfCols, sizeof(SColumnDataAgg));
- pSup->plist = taosMemoryCalloc(pCond->numOfCols, POINTER_BYTES);
- if (pSup->pColAgg == NULL || pSup->plist == NULL) {
+ if (pSup->pColAgg == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto _end;
}
@@ -611,13 +625,7 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd
goto _end;
}
- pReader->pResBlock = createResBlock(pCond, pReader->capacity);
- if (pReader->pResBlock == NULL) {
- code = terrno;
- goto _end;
- }
-
- setColumnIdSlotList(&pReader->suppInfo, pReader->pResBlock);
+ setColumnIdSlotList(&pReader->suppInfo, pCond->colList, pCond->pSlotList, pCond->numOfCols);
*ppReader = pReader;
return code;
@@ -709,11 +717,13 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SBlockN
tMapDataReset(&pScanInfo->mapData);
tsdbReadDataBlk(pReader->pFileReader, pBlockIdx, &pScanInfo->mapData);
+ taosArrayEnsureCap(pScanInfo->pBlockList, pScanInfo->mapData.nItem);
sizeInDisk += pScanInfo->mapData.nData;
+
+ SDataBlk block = {0};
for (int32_t j = 0; j < pScanInfo->mapData.nItem; ++j) {
- SDataBlk block = {0};
- tMapDataGetItemByIdx(&pScanInfo->mapData, j, &block, tGetDataBlk);
+ tGetDataBlk(pScanInfo->mapData.pData + pScanInfo->mapData.aOffset[j], &block);
// 1. time range check
if (block.minKey.ts > pReader->window.ekey || block.maxKey.ts < pReader->window.skey) {
@@ -728,8 +738,8 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SBlockN
SBlockIndex bIndex = {.ordinalIndex = j, .inFileOffset = block.aSubBlock->offset};
bIndex.window = (STimeWindow){.skey = block.minKey.ts, .ekey = block.maxKey.ts};
- void* p = taosArrayPush(pScanInfo->pBlockList, &bIndex);
- if (p == NULL) {
+ void* p1 = taosArrayPush(pScanInfo->pBlockList, &bIndex);
+ if (p1 == NULL) {
tMapDataClear(&pScanInfo->mapData);
return TSDB_CODE_OUT_OF_MEMORY;
}
@@ -752,6 +762,7 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SBlockN
numOfTables, pBlockNum->numOfBlocks, numOfQTable, pBlockNum->numOfLastFiles, sizeInDisk / 1000.0, el,
pReader->idStr);
+
pReader->cost.numOfBlocks += total;
pReader->cost.headFileLoadTime += el;
@@ -772,7 +783,10 @@ static void doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int32_
} else {
varDataSetLen(pSup->buildBuf[colIndex], pColVal->value.nData);
ASSERT(pColVal->value.nData <= pColInfoData->info.bytes);
- memcpy(varDataVal(pSup->buildBuf[colIndex]), pColVal->value.pData, pColVal->value.nData);
+ if (pColVal->value.nData > 0) { // pData may be null, if nData is 0
+ memcpy(varDataVal(pSup->buildBuf[colIndex]), pColVal->value.pData, pColVal->value.nData);
+ }
+
colDataAppend(pColInfoData, rowIndex, pSup->buildBuf[colIndex], false);
}
} else {
@@ -1038,17 +1052,16 @@ static void copyNumericCols(const SColData* pData, SFileBlockDumpInfo* pDumpInfo
}
static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo) {
- SReaderStatus* pStatus = &pReader->status;
- SDataBlockIter* pBlockIter = &pStatus->blockIter;
+ SReaderStatus* pStatus = &pReader->status;
+ SDataBlockIter* pBlockIter = &pStatus->blockIter;
+ SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
+ SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
SBlockData* pBlockData = &pStatus->fileBlockData;
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(pBlockIter);
SDataBlk* pBlock = getCurrentBlock(pBlockIter);
SSDataBlock* pResBlock = pReader->pResBlock;
- int32_t numOfOutputCols = blockDataGetNumOfCols(pResBlock);
-
- SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
- SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
+ int32_t numOfOutputCols = pSupInfo->numOfCols;
SColVal cv = {0};
int64_t st = taosGetTimestampUs();
@@ -1084,8 +1097,8 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
int32_t i = 0;
int32_t rowIndex = 0;
- SColumnInfoData* pColData = taosArrayGet(pResBlock->pDataBlock, i);
- if (pColData->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
+ SColumnInfoData* pColData = taosArrayGet(pResBlock->pDataBlock, pSupInfo->slotId[i]);
+ if (pSupInfo->colId[i] == PRIMARYKEY_TIMESTAMP_COL_ID) {
copyPrimaryTsCol(pBlockData, pDumpInfo, pColData, dumpedRows, asc);
i += 1;
}
@@ -1094,12 +1107,13 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
int32_t num = pBlockData->nColData;
while (i < numOfOutputCols && colIndex < num) {
rowIndex = 0;
- pColData = taosArrayGet(pResBlock->pDataBlock, i);
SColData* pData = tBlockDataGetColDataByIdx(pBlockData, colIndex);
- if (pData->cid < pColData->info.colId) {
+ if (pData->cid < pSupInfo->colId[i]) {
colIndex += 1;
- } else if (pData->cid == pColData->info.colId) {
+ } else if (pData->cid == pSupInfo->colId[i]) {
+ pColData = taosArrayGet(pResBlock->pDataBlock, pSupInfo->slotId[i]);
+
if (pData->flag == HAS_NONE || pData->flag == HAS_NULL || pData->flag == (HAS_NULL | HAS_NONE)) {
colDataAppendNNULL(pColData, 0, dumpedRows);
} else {
@@ -1116,6 +1130,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
colIndex += 1;
i += 1;
} else { // the specified column does not exist in file block, fill with null data
+ pColData = taosArrayGet(pResBlock->pDataBlock, pSupInfo->slotId[i]);
colDataAppendNNULL(pColData, 0, dumpedRows);
i += 1;
}
@@ -1123,7 +1138,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
// fill the mis-matched columns with null value
while (i < numOfOutputCols) {
- pColData = taosArrayGet(pResBlock->pDataBlock, i);
+ pColData = taosArrayGet(pResBlock->pDataBlock, pSupInfo->slotId[i]);
colDataAppendNNULL(pColData, 0, dumpedRows);
i += 1;
}
@@ -1161,7 +1176,7 @@ static int32_t doLoadFileBlockData(STsdbReader* pReader, SDataBlockIter* pBlockI
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);
+ tBlockDataInit(pBlockData, &tid, pReader->pSchema, &pReader->suppInfo.colId[1], pReader->suppInfo.numOfCols - 1);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
@@ -1299,7 +1314,7 @@ static int32_t initBlockIterator(STsdbReader* pReader, SDataBlockIter* pBlockIte
char* buf = taosMemoryMalloc(sizeof(SBlockOrderWrapper) * num);
if (buf == NULL) {
cleanupBlockOrderSupporter(&sup);
- return TSDB_CODE_TDB_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
sup.pDataBlockInfo[sup.numOfTables] = (SBlockOrderWrapper*)buf;
@@ -1342,7 +1357,7 @@ static int32_t initBlockIterator(STsdbReader* pReader, SDataBlockIter* pBlockIte
uint8_t ret = tMergeTreeCreate(&pTree, sup.numOfTables, &sup, fileDataBlockOrderCompar);
if (ret != TSDB_CODE_SUCCESS) {
cleanupBlockOrderSupporter(&sup);
- return TSDB_CODE_TDB_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
int32_t numOfTotal = 0;
@@ -1455,6 +1470,7 @@ static int32_t setFileBlockActiveInBlockIter(SDataBlockIter* pBlockIter, int32_t
return TSDB_CODE_SUCCESS;
}
+// todo: this attribute could be acquired during extractin the global ordered block list.
static bool overlapWithNeighborBlock(SDataBlk* pBlock, SBlockIndex* pNeighborBlockIndex, int32_t order) {
// it is the last block in current file, no chance to overlap with neighbor blocks.
if (ASCENDING_TRAVERSE(order)) {
@@ -1619,8 +1635,8 @@ static int32_t buildDataBlockFromBuf(STsdbReader* pReader, STableBlockScanInfo*
int64_t st = taosGetTimestampUs();
int32_t code = buildDataBlockFromBufImpl(pBlockScanInfo, endKey, pReader->capacity, pReader);
- blockDataUpdateTsWindow(pBlock, 0);
- pBlock->info.uid = pBlockScanInfo->uid;
+ blockDataUpdateTsWindow(pBlock, pReader->suppInfo.slotId[0]);
+ pBlock->info.id.uid = pBlockScanInfo->uid;
setComposedBlockFlag(pReader, true);
@@ -2432,7 +2448,8 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
TSDBKEY keyInBuf = getCurrentKeyInBuf(pBlockScanInfo, pReader);
// it is a clean block, load it directly
- if (isCleanFileDataBlock(pReader, pBlockInfo, pBlock, pBlockScanInfo, keyInBuf, pLastBlockReader)) {
+ if (isCleanFileDataBlock(pReader, pBlockInfo, pBlock, pBlockScanInfo, keyInBuf, pLastBlockReader) &&
+ pBlock->nRow <= pReader->capacity) {
if (asc || ((!asc) && (!hasDataInLastBlock(pLastBlockReader)))) {
copyBlockDataToSDataBlock(pReader, pBlockScanInfo);
@@ -2461,8 +2478,39 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
if (pDumpInfo->rowIndex >= pBlock->nRow || pDumpInfo->rowIndex < 0) {
- setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
- break;
+
+ int32_t nextIndex = -1;
+ SBlockIndex bIndex = {0};
+ bool hasNeighbor = getNeighborBlockOfSameTable(pBlockInfo, pBlockScanInfo, &nextIndex, pReader->order, &bIndex);
+ if (!hasNeighbor) { // do nothing
+ setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
+ break;
+ }
+
+ if (overlapWithNeighborBlock(pBlock, &bIndex, pReader->order)) { // load next block
+ SReaderStatus* pStatus = &pReader->status;
+ SDataBlockIter* pBlockIter = &pStatus->blockIter;
+
+ // 1. find the next neighbor block in the scan block list
+ SFileDataBlockInfo fb = {.uid = pBlockInfo->uid, .tbBlockIdx = nextIndex};
+ int32_t neighborIndex = findFileBlockInfoIndex(pBlockIter, &fb);
+
+ // 2. remove it from the scan block list
+ setFileBlockActiveInBlockIter(pBlockIter, neighborIndex, step);
+
+ // 3. load the neighbor block, and set it to be the currently accessed file data block
+ code = doLoadFileBlockData(pReader, pBlockIter, &pStatus->fileBlockData, pBlockInfo->uid);
+ if (code != TSDB_CODE_SUCCESS) {
+ setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
+ break;
+ }
+
+ // 4. check the data values
+ initBlockDumpInfo(pReader, pBlockIter);
+ } else {
+ setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
+ break;
+ }
}
}
}
@@ -2489,8 +2537,8 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
}
_end:
- pResBlock->info.uid = (pBlockScanInfo != NULL) ? pBlockScanInfo->uid : 0;
- blockDataUpdateTsWindow(pResBlock, 0);
+ pResBlock->info.id.uid = (pBlockScanInfo != NULL) ? pBlockScanInfo->uid : 0;
+ blockDataUpdateTsWindow(pResBlock, pReader->suppInfo.slotId[0]);
setComposedBlockFlag(pReader, true);
double el = (taosGetTimestampUs() - st) / 1000.0;
@@ -2501,7 +2549,7 @@ _end:
if (pResBlock->info.rows > 0) {
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
" rows:%d, elapsed time:%.2f ms %s",
- pReader, pResBlock->info.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
+ pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
pResBlock->info.rows, el, pReader->idStr);
}
@@ -2517,41 +2565,18 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader*
}
int32_t code = 0;
- STsdb* pTsdb = pReader->pTsdb;
-
SArray* pDelData = taosArrayInit(4, sizeof(SDelData));
+ ASSERT(pReader->pReadSnap != NULL);
SDelFile* pDelFile = pReader->pReadSnap->fs.pDelFile;
- if (pDelFile) {
- SDelFReader* pDelFReader = NULL;
- code = tsdbDelFReaderOpen(&pDelFReader, pDelFile, pTsdb);
- if (code != TSDB_CODE_SUCCESS) {
- goto _err;
- }
-
- SArray* aDelIdx = taosArrayInit(4, sizeof(SDelIdx));
- if (aDelIdx == NULL) {
- tsdbDelFReaderClose(&pDelFReader);
- goto _err;
- }
-
- code = tsdbReadDelIdx(pDelFReader, aDelIdx);
- if (code != TSDB_CODE_SUCCESS) {
- taosArrayDestroy(aDelIdx);
- tsdbDelFReaderClose(&pDelFReader);
- goto _err;
- }
-
+ if (pDelFile && taosArrayGetSize(pReader->pDelIdx) > 0) {
SDelIdx idx = {.suid = pReader->suid, .uid = pBlockScanInfo->uid};
- SDelIdx* pIdx = taosArraySearch(aDelIdx, &idx, tCmprDelIdx, TD_EQ);
+ SDelIdx* pIdx = taosArraySearch(pReader->pDelIdx, &idx, tCmprDelIdx, TD_EQ);
if (pIdx != NULL) {
- code = tsdbReadDelData(pDelFReader, pIdx, pDelData);
+ code = tsdbReadDelData(pReader->pDelFReader, pIdx, pDelData);
}
- taosArrayDestroy(aDelIdx);
- tsdbDelFReaderClose(&pDelFReader);
-
if (code != TSDB_CODE_SUCCESS) {
goto _err;
}
@@ -2647,6 +2672,30 @@ static int32_t moveToNextFile(STsdbReader* pReader, SBlockNumber* pBlockNum) {
}
taosArrayDestroy(pIndexList);
+
+ if (pReader->pReadSnap != NULL) {
+
+ SDelFile* pDelFile = pReader->pReadSnap->fs.pDelFile;
+ if (pReader->pDelFReader == NULL && pDelFile != NULL) {
+ int32_t code = tsdbDelFReaderOpen(&pReader->pDelFReader, pDelFile, pReader->pTsdb);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+
+ pReader->pDelIdx = taosArrayInit(4, sizeof(SDelIdx));
+ if (pReader->pDelIdx == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ return code;
+ }
+
+ code = tsdbReadDelIdx(pReader->pDelFReader, pReader->pDelIdx);
+ if (code != TSDB_CODE_SUCCESS) {
+ taosArrayDestroy(pReader->pDelIdx);
+ return code;
+ }
+ }
+ }
+
return TSDB_CODE_SUCCESS;
}
@@ -2825,7 +2874,7 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
} else { // whole block is required, return it directly
SDataBlockInfo* pInfo = &pReader->pResBlock->info;
pInfo->rows = pBlock->nRow;
- pInfo->uid = pScanInfo->uid;
+ pInfo->id.uid = pScanInfo->uid;
pInfo->window = (STimeWindow){.skey = pBlock->minKey.ts, .ekey = pBlock->maxKey.ts};
setComposedBlockFlag(pReader, false);
setBlockAllDumped(&pStatus->fBlockDumpInfo, pBlock->maxKey.ts, pReader->order);
@@ -2871,7 +2920,7 @@ static int32_t buildBlockFromBufferSequentially(STsdbReader* pReader) {
}
// set the correct start position in case of the first/last file block, according to the query time window
-static void initBlockDumpInfo(STsdbReader* pReader, SDataBlockIter* pBlockIter) {
+void initBlockDumpInfo(STsdbReader* pReader, SDataBlockIter* pBlockIter) {
SDataBlk* pBlock = getCurrentBlock(pBlockIter);
SReaderStatus* pStatus = &pReader->status;
@@ -3080,7 +3129,7 @@ bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32
return false;
} else if (pKey->ts == last->ts) {
TSDBKEY* prev = taosArrayGet(pDelList, num - 2);
- return (prev->version >= pKey->version);
+ return (prev->version >= pKey->version && prev->version <= pVerRange->maxVer && prev->version >= pVerRange->minVer);
}
} else {
TSDBKEY* pCurrent = taosArrayGet(pDelList, *index);
@@ -3530,8 +3579,7 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR
int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow,
STableBlockScanInfo* pScanInfo) {
- int32_t numOfRows = pBlock->info.rows;
- int32_t numOfCols = (int32_t)taosArrayGetSize(pBlock->pDataBlock);
+ int32_t outputRowIndex = pBlock->info.rows;
int64_t uid = pScanInfo->uid;
SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
@@ -3540,23 +3588,26 @@ int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow*
SColVal colVal = {0};
int32_t i = 0, j = 0;
- SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
- if (pColInfoData->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
- colDataAppend(pColInfoData, numOfRows, (const char*)&pTSRow->ts, false);
+ if (pSupInfo->colId[i]== PRIMARYKEY_TIMESTAMP_COL_ID) {
+ SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, pSupInfo->slotId[i]);
+ ((int64_t*)pColData->pData)[outputRowIndex] = pTSRow->ts;
i += 1;
}
- while (i < numOfCols && j < pSchema->numOfCols) {
- pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
- col_id_t colId = pColInfoData->info.colId;
+ while (i < pSupInfo->numOfCols && j < pSchema->numOfCols) {
+ col_id_t colId = pSupInfo->colId[i];
if (colId == pSchema->columns[j].colId) {
+ SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, pSupInfo->slotId[i]);
+
tTSRowGetVal(pTSRow, pSchema, j, &colVal);
- doCopyColVal(pColInfoData, numOfRows, i, &colVal, pSupInfo);
+ doCopyColVal(pColInfoData, outputRowIndex, i, &colVal, pSupInfo);
i += 1;
j += 1;
} else if (colId < pSchema->columns[j].colId) {
- colDataAppendNULL(pColInfoData, numOfRows);
+ SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, pSupInfo->slotId[i]);
+
+ colDataAppendNULL(pColInfoData, outputRowIndex);
i += 1;
} else if (colId > pSchema->columns[j].colId) {
j += 1;
@@ -3564,9 +3615,9 @@ int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow*
}
// set null value since current column does not exist in the "pSchema"
- while (i < numOfCols) {
- pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
- colDataAppendNULL(pColInfoData, numOfRows);
+ while (i < pSupInfo->numOfCols) {
+ SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, pSupInfo->slotId[i]);
+ colDataAppendNULL(pColInfoData, outputRowIndex);
i += 1;
}
@@ -3581,27 +3632,25 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S
int32_t outputRowIndex = pResBlock->info.rows;
SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
-
- SColumnInfoData* pColData = taosArrayGet(pResBlock->pDataBlock, i);
- if (pColData->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
- colDataAppendInt64(pColData, outputRowIndex, &pBlockData->aTSKEY[rowIndex]);
+ if (pReader->suppInfo.colId[i]== PRIMARYKEY_TIMESTAMP_COL_ID) {
+ SColumnInfoData* pColData = taosArrayGet(pResBlock->pDataBlock, pSupInfo->slotId[i]);
+ ((int64_t*)pColData->pData)[outputRowIndex] = pBlockData->aTSKEY[rowIndex];
i += 1;
}
SColVal cv = {0};
int32_t numOfInputCols = pBlockData->nColData;
- int32_t numOfOutputCols = pResBlock->pDataBlock->size;
+ int32_t numOfOutputCols = pSupInfo->numOfCols;
while (i < numOfOutputCols && j < numOfInputCols) {
- SColumnInfoData* pCol = TARRAY_GET_ELEM(pResBlock->pDataBlock, i);
- SColData* pData = tBlockDataGetColDataByIdx(pBlockData, j);
-
- if (pData->cid < pCol->info.colId) {
+ SColData* pData = tBlockDataGetColDataByIdx(pBlockData, j);
+ if (pData->cid < pSupInfo->colId[i]) {
j += 1;
continue;
}
- if (pData->cid == pCol->info.colId) {
+ SColumnInfoData* pCol = TARRAY_GET_ELEM(pResBlock->pDataBlock, pSupInfo->slotId[i]);
+ if (pData->cid == pSupInfo->colId[i]) {
tColDataGetValue(pData, rowIndex, &cv);
doCopyColVal(pCol, outputRowIndex, i, &cv, pSupInfo);
j += 1;
@@ -3614,7 +3663,7 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S
}
while (i < numOfOutputCols) {
- SColumnInfoData* pCol = taosArrayGet(pResBlock->pDataBlock, i);
+ SColumnInfoData* pCol = taosArrayGet(pResBlock->pDataBlock, pSupInfo->slotId[i]);
colDataAppendNULL(pCol, outputRowIndex);
i += 1;
}
@@ -3713,14 +3762,21 @@ static int32_t doOpenReaderImpl(STsdbReader* pReader) {
// ====================================== EXPOSED APIs ======================================
int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableList, int32_t numOfTables,
- STsdbReader** ppReader, const char* idstr) {
+ SSDataBlock* pResBlock, STsdbReader** ppReader, const char* idstr) {
STimeWindow window = pCond->twindows;
if (pCond->type == TIMEWINDOW_RANGE_EXTERNAL) {
pCond->twindows.skey += 1;
pCond->twindows.ekey -= 1;
}
- int32_t code = tsdbReaderCreate(pVnode, pCond, ppReader, 4096, idstr);
+ int32_t capacity = 0;
+ if (pResBlock == NULL) {
+ capacity = 4096;
+ } else {
+ capacity = pResBlock->info.capacity;
+ }
+
+ int32_t code = tsdbReaderCreate(pVnode, pCond, ppReader, capacity, pResBlock, idstr);
if (code != TSDB_CODE_SUCCESS) {
goto _err;
}
@@ -3746,7 +3802,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
}
// here we only need one more row, so the capacity is set to be ONE.
- code = tsdbReaderCreate(pVnode, pCond, &pReader->innerReader[0], 1, idstr);
+ code = tsdbReaderCreate(pVnode, pCond, &pReader->innerReader[0], 1, pResBlock, idstr);
if (code != TSDB_CODE_SUCCESS) {
goto _err;
}
@@ -3760,7 +3816,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
}
pCond->order = order;
- code = tsdbReaderCreate(pVnode, pCond, &pReader->innerReader[1], 1, idstr);
+ code = tsdbReaderCreate(pVnode, pCond, &pReader->innerReader[1], 1, pResBlock, idstr);
if (code != TSDB_CODE_SUCCESS) {
goto _err;
}
@@ -3790,7 +3846,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
tsdbReaderClose(p);
*ppReader = NULL;
- code = TSDB_CODE_TDB_OUT_OF_MEMORY;
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto _err;
}
@@ -3832,10 +3888,10 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
tsdbDebug("%p total numOfTable:%d in this query %s", pReader, numOfTables, pReader->idStr);
return code;
-_err:
+ _err:
tsdbError("failed to create data reader, code:%s %s", tstrerror(code), idstr);
return code;
-}
+ }
void tsdbReaderClose(STsdbReader* pReader) {
if (pReader == NULL) {
@@ -3865,19 +3921,19 @@ void tsdbReaderClose(STsdbReader* pReader) {
SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
- taosMemoryFreeClear(pSupInfo->plist);
- taosMemoryFree(pSupInfo->colIds);
-
taosArrayDestroy(pSupInfo->pColAgg);
- for (int32_t i = 0; i < blockDataGetNumOfCols(pReader->pResBlock); ++i) {
+ for (int32_t i = 0; i < pSupInfo->numOfCols; ++i) {
if (pSupInfo->buildBuf[i] != NULL) {
taosMemoryFreeClear(pSupInfo->buildBuf[i]);
}
}
- taosMemoryFree(pSupInfo->buildBuf);
- tBlockDataDestroy(&pReader->status.fileBlockData, true);
+ if (pReader->freeBlock) {
+ pReader->pResBlock = blockDataDestroy(pReader->pResBlock);
+ }
+ taosMemoryFree(pSupInfo->colId);
+ tBlockDataDestroy(&pReader->status.fileBlockData, true);
cleanupDataBlockIterator(&pReader->status.blockIter);
size_t numOfTables = taosHashGetSize(pReader->status.pTableMap);
@@ -3886,12 +3942,19 @@ void tsdbReaderClose(STsdbReader* pReader) {
clearBlockScanInfoBuf(&pReader->blockInfoBuf);
}
- blockDataDestroy(pReader->pResBlock);
-
if (pReader->pFileReader != NULL) {
tsdbDataFReaderClose(&pReader->pFileReader);
}
+ if (pReader->pDelFReader != NULL) {
+ tsdbDelFReaderClose(&pReader->pDelFReader);
+ }
+
+ if (pReader->pDelIdx != NULL) {
+ taosArrayDestroy(pReader->pDelIdx);
+ pReader->pDelIdx = NULL;
+ }
+
tsdbUntakeReadSnap(pReader->pTsdb, pReader->pReadSnap, pReader->idStr);
taosMemoryFree(pReader->status.uidCheckInfo.tableUidList);
@@ -3933,6 +3996,9 @@ static bool doTsdbNextDataBlock(STsdbReader* pReader) {
blockDataCleanup(pBlock);
SReaderStatus* pStatus = &pReader->status;
+ if (taosHashGetSize(pStatus->pTableMap) == 0){
+ return false;
+ }
if (pStatus->loadFromFile) {
int32_t code = buildBlockFromFiles(pReader);
@@ -3950,8 +4016,6 @@ static bool doTsdbNextDataBlock(STsdbReader* pReader) {
buildBlockFromBufferSequentially(pReader);
return pBlock->info.rows > 0;
}
-
- return false;
}
bool tsdbNextDataBlock(STsdbReader* pReader) {
@@ -4002,20 +4066,10 @@ bool tsdbNextDataBlock(STsdbReader* pReader) {
return false;
}
-bool tsdbTableNextDataBlock(STsdbReader* pReader, uint64_t uid) {
- STableBlockScanInfo* pBlockScanInfo =
- *(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &uid, sizeof(uid));
- if (pBlockScanInfo == NULL) { // no data block for the table of given uid
- return false;
- }
-
- return true;
-}
-
static void setBlockInfo(const STsdbReader* pReader, int32_t* rows, uint64_t* uid, STimeWindow* pWindow) {
ASSERT(pReader != NULL);
*rows = pReader->pResBlock->info.rows;
- *uid = pReader->pResBlock->info.uid;
+ *uid = pReader->pResBlock->info.id.uid;
*pWindow = pReader->pResBlock->info.window;
}
@@ -4033,28 +4087,53 @@ void tsdbRetrieveDataBlockInfo(const STsdbReader* pReader, int32_t* rows, uint64
}
}
-int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockStatis, bool* allHave) {
+
+static void doFillNullColSMA(SBlockLoadSuppInfo* pSup, int32_t numOfRows, int32_t numOfCols,
+ SColumnDataAgg* pTsAgg) {
+ // do fill all null column value SMA info
+ int32_t i = 0, j = 0;
+ int32_t size = (int32_t) taosArrayGetSize(pSup->pColAgg);
+ taosArrayInsert(pSup->pColAgg, 0, pTsAgg);
+
+ while (j < numOfCols && i < size) {
+ SColumnDataAgg* pAgg = taosArrayGet(pSup->pColAgg, i);
+ if (pAgg->colId == pSup->colId[j]) {
+ i += 1;
+ j += 1;
+ } else if (pAgg->colId < pSup->colId[j]) {
+ i += 1;
+ } else if (pSup->colId[j] < pAgg->colId) {
+ if (pSup->colId[j] != PRIMARYKEY_TIMESTAMP_COL_ID) {
+ SColumnDataAgg nullColAgg = {.colId = pSup->colId[j], .numOfNull = numOfRows};
+ taosArrayInsert(pSup->pColAgg, i ,&nullColAgg);
+ }
+ j += 1;
+ }
+ }
+}
+
+int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SSDataBlock* pDataBlock, bool* allHave) {
int32_t code = 0;
+ SColumnDataAgg ***pBlockSMA = &pDataBlock->pBlockAgg;
*allHave = false;
if (pReader->type == TIMEWINDOW_RANGE_EXTERNAL) {
- *pBlockStatis = NULL;
+ *pBlockSMA = NULL;
return TSDB_CODE_SUCCESS;
}
// there is no statistics data for composed block
if (pReader->status.composedDataBlock || (!pReader->suppInfo.smaValid)) {
- *pBlockStatis = NULL;
+ *pBlockSMA = NULL;
return TSDB_CODE_SUCCESS;
}
SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(&pReader->status.blockIter);
-
- SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
- // int64_t stime = taosGetTimestampUs();
-
SBlockLoadSuppInfo* pSup = &pReader->suppInfo;
+ ASSERT(pReader->pResBlock->info.id.uid == pFBlock->uid);
+
+ SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
if (tDataBlkHasSma(pBlock)) {
code = tsdbReadBlockSma(pReader->pFileReader, pBlock, pSup->pColAgg);
if (code != TSDB_CODE_SUCCESS) {
@@ -4063,7 +4142,7 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockS
return code;
}
} else {
- *pBlockStatis = NULL;
+ *pBlockSMA = NULL;
return TSDB_CODE_SUCCESS;
}
@@ -4076,80 +4155,56 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockS
pTsAgg->colId = PRIMARYKEY_TIMESTAMP_COL_ID;
pTsAgg->min = pReader->pResBlock->info.window.skey;
pTsAgg->max = pReader->pResBlock->info.window.ekey;
- pSup->plist[0] = pTsAgg;
// update the number of NULL data rows
- size_t numOfCols = blockDataGetNumOfCols(pReader->pResBlock);
+ size_t numOfCols = pSup->numOfCols;
int32_t i = 0, j = 0;
size_t size = taosArrayGetSize(pSup->pColAgg);
-#if 0
- while (j < numOfCols && i < size) {
- SColumnDataAgg* pAgg = taosArrayGet(pSup->pColAgg, i);
- if (pAgg->colId == pSup->colIds[j]) {
- if (IS_BSMA_ON(&(pReader->pSchema->columns[i]))) {
- pSup->plist[j] = pAgg;
- } else {
- *allHave = false;
- break;
- }
- i += 1;
- j += 1;
- } else if (pAgg->colId < pSup->colIds[j]) {
- i += 1;
- } else if (pSup->colIds[j] < pAgg->colId) {
- j += 1;
- }
+
+ // ensure capacity
+ if(pDataBlock->pDataBlock) {
+ size_t colsNum = taosArrayGetSize(pDataBlock->pDataBlock);
+ taosArrayEnsureCap(pSup->pColAgg, colsNum);
+ }
+
+ SSDataBlock* pResBlock = pReader->pResBlock;
+ if (pResBlock->pBlockAgg == NULL) {
+ size_t num = taosArrayGetSize(pResBlock->pDataBlock);
+ pResBlock->pBlockAgg = taosMemoryCalloc(num, sizeof(SColumnDataAgg));
}
-#else
- // fill the all null data column
- SArray* pNewAggList = taosArrayInit(numOfCols, sizeof(SColumnDataAgg));
+ // do fill all null column value SMA info
+ doFillNullColSMA(pSup, pBlock->nRow, numOfCols, pTsAgg);
+ i = 0, j = 0;
while (j < numOfCols && i < size) {
SColumnDataAgg* pAgg = taosArrayGet(pSup->pColAgg, i);
- if (pAgg->colId == pSup->colIds[j]) {
- taosArrayPush(pNewAggList, pAgg);
+ if (pAgg->colId == pSup->colId[j]) {
+ pResBlock->pBlockAgg[pSup->slotId[j]] = pAgg;
i += 1;
j += 1;
- } else if (pAgg->colId < pSup->colIds[j]) {
+ } else if (pAgg->colId < pSup->colId[j]) {
i += 1;
- } else if (pSup->colIds[j] < pAgg->colId) {
- if (pSup->colIds[j] == PRIMARYKEY_TIMESTAMP_COL_ID) {
- taosArrayPush(pNewAggList, &pSup->tsColAgg);
- } else {
- // all date in this block are null
- SColumnDataAgg nullColAgg = {.colId = pSup->colIds[j], .numOfNull = pBlock->nRow};
- taosArrayPush(pNewAggList, &nullColAgg);
- }
+ } else if (pSup->colId[j] < pAgg->colId) {
+ ASSERT(pSup->colId[j] == PRIMARYKEY_TIMESTAMP_COL_ID);
+ pResBlock->pBlockAgg[pSup->slotId[j]] = &pSup->tsColAgg;
j += 1;
}
}
- taosArrayClear(pSup->pColAgg);
- taosArrayAddAll(pSup->pColAgg, pNewAggList);
-
- size_t num = taosArrayGetSize(pSup->pColAgg);
- for(int32_t k = 0; k < num; ++k) {
- pSup->plist[k] = taosArrayGet(pSup->pColAgg, k);
- }
-
- taosArrayDestroy(pNewAggList);
-
-#endif
-
+ *pBlockSMA = pResBlock->pBlockAgg;
pReader->cost.smaDataLoad += 1;
- *pBlockStatis = pSup->plist;
tsdbDebug("vgId:%d, succeed to load block SMA for uid %" PRIu64 ", %s", 0, pFBlock->uid, pReader->idStr);
return code;
}
-static SArray* doRetrieveDataBlock(STsdbReader* pReader) {
+static SSDataBlock* doRetrieveDataBlock(STsdbReader* pReader) {
SReaderStatus* pStatus = &pReader->status;
if (pStatus->composedDataBlock) {
- return pReader->pResBlock->pDataBlock;
+ return pReader->pResBlock;
}
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(&pStatus->blockIter);
@@ -4170,10 +4225,10 @@ static SArray* doRetrieveDataBlock(STsdbReader* pReader) {
}
copyBlockDataToSDataBlock(pReader, pBlockScanInfo);
- return pReader->pResBlock->pDataBlock;
+ return pReader->pResBlock;
}
-SArray* tsdbRetrieveDataBlock(STsdbReader* pReader, SArray* pIdList) {
+SSDataBlock* tsdbRetrieveDataBlock(STsdbReader* pReader, SArray* pIdList) {
if (pReader->type == TIMEWINDOW_RANGE_EXTERNAL) {
if (pReader->step == EXTERNAL_ROWS_PREV) {
return doRetrieveDataBlock(pReader->innerReader[0]);
@@ -4200,7 +4255,6 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
// allocate buffer in order to load data blocks from file
memset(&pReader->suppInfo.tsColAgg, 0, sizeof(SColumnDataAgg));
- memset(pReader->suppInfo.plist, 0, POINTER_BYTES);
pReader->suppInfo.tsColAgg.colId = PRIMARYKEY_TIMESTAMP_COL_ID;
tsdbDataFReaderClose(&pReader->pFileReader);
@@ -4345,7 +4399,7 @@ int32_t tsdbGetTableSchema(SVnode* pVnode, int64_t uid, STSchema** pSchema, int6
SMetaReader mr = {0};
metaReaderInit(&mr, pVnode->pMeta, 0);
- int32_t code = metaGetTableEntryByUid(&mr, uid);
+ int32_t code = metaGetTableEntryByUidCache(&mr, uid);
if (code != TSDB_CODE_SUCCESS) {
terrno = TSDB_CODE_TDB_INVALID_TABLE_ID;
metaReaderClear(&mr);
@@ -4357,7 +4411,7 @@ int32_t tsdbGetTableSchema(SVnode* pVnode, int64_t uid, STSchema** pSchema, int6
if (mr.me.type == TSDB_CHILD_TABLE) {
tDecoderClear(&mr.coder);
*suid = mr.me.ctbEntry.suid;
- code = metaGetTableEntryByUid(&mr, *suid);
+ code = metaGetTableEntryByUidCache(&mr, *suid);
if (code != TSDB_CODE_SUCCESS) {
terrno = TSDB_CODE_TDB_INVALID_TABLE_ID;
metaReaderClear(&mr);
diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
index 294a4bd3e4c404ddb33a4e3fe7cd0c5fe2203a87..c7bce6182a380bd278a8e272eae22773350a630c 100644
--- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
+++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
@@ -750,7 +750,7 @@ int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) {
// head
tsdbHeadFileName(pTsdb, pSetFrom->diskId, pSetFrom->fid, pSetFrom->pHeadF, fNameFrom);
tsdbHeadFileName(pTsdb, pSetTo->diskId, pSetTo->fid, pSetTo->pHeadF, fNameTo);
- pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
+ pOutFD = taosCreateFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
if (pOutFD == NULL) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
@@ -771,7 +771,7 @@ int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) {
// data
tsdbDataFileName(pTsdb, pSetFrom->diskId, pSetFrom->fid, pSetFrom->pDataF, fNameFrom);
tsdbDataFileName(pTsdb, pSetTo->diskId, pSetTo->fid, pSetTo->pDataF, fNameTo);
- pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
+ pOutFD = taosCreateFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
if (pOutFD == NULL) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
@@ -781,7 +781,7 @@ int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
}
- n = taosFSendFile(pOutFD, PInFD, 0, LOGIC_TO_FILE_OFFSET(pSetFrom->pDataF->size, szPage));
+ n = taosFSendFile(pOutFD, PInFD, 0, tsdbLogicToFileSize(pSetFrom->pDataF->size, szPage));
if (n < 0) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
@@ -792,7 +792,7 @@ int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) {
// sma
tsdbSmaFileName(pTsdb, pSetFrom->diskId, pSetFrom->fid, pSetFrom->pSmaF, fNameFrom);
tsdbSmaFileName(pTsdb, pSetTo->diskId, pSetTo->fid, pSetTo->pSmaF, fNameTo);
- pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
+ pOutFD = taosCreateFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
if (pOutFD == NULL) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
@@ -814,7 +814,7 @@ int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) {
for (int8_t iStt = 0; iStt < pSetFrom->nSttF; iStt++) {
tsdbSttFileName(pTsdb, pSetFrom->diskId, pSetFrom->fid, pSetFrom->aSttF[iStt], fNameFrom);
tsdbSttFileName(pTsdb, pSetTo->diskId, pSetTo->fid, pSetTo->aSttF[iStt], fNameTo);
- pOutFD = taosOpenFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
+ pOutFD = taosCreateFile(fNameTo, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
if (pOutFD == NULL) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
@@ -1477,9 +1477,8 @@ int32_t tsdbDelFReaderClose(SDelFReader **ppReader) {
}
taosMemoryFree(pReader);
}
- *ppReader = NULL;
-_exit:
+ *ppReader = NULL;
return code;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c
index ec89bed17a8c9ee002d751ee0c43bb5c0f5170e2..8be49043492054c106f1877f5f06533c6644356e 100644
--- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c
+++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c
@@ -155,7 +155,7 @@ static int32_t tsdbSnapReadOpenFile(STsdbSnapReader* pReader) {
if (rowVer >= pReader->sver && rowVer <= pReader->ever) {
pIter->rInfo.suid = pIter->bData.suid;
- pIter->rInfo.uid = pIter->bData.uid;
+ pIter->rInfo.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[pIter->iRow];
pIter->rInfo.row = tsdbRowFromBlockData(&pIter->bData, pIter->iRow);
goto _add_iter;
}
@@ -179,16 +179,14 @@ _err:
return code;
}
-static SRowInfo* tsdbSnapGetRow(STsdbSnapReader* pReader) { return pReader->pIter ? &pReader->pIter->rInfo : NULL; }
-
static int32_t tsdbSnapNextRow(STsdbSnapReader* pReader) {
int32_t code = 0;
if (pReader->pIter) {
- SFDataIter* pIter = pReader->pIter;
-
+ SFDataIter* pIter = NULL;
while (true) {
_find_row:
+ pIter = pReader->pIter;
for (pIter->iRow++; pIter->iRow < pIter->bData.nRow; pIter->iRow++) {
int64_t rowVer = pIter->bData.aVersion[pIter->iRow];
@@ -224,6 +222,7 @@ static int32_t tsdbSnapNextRow(STsdbSnapReader* pReader) {
}
pReader->pIter = NULL;
+ break;
} else if (pIter->type == SNAP_STT_FILE_ITER) {
for (pIter->iSttBlk++; pIter->iSttBlk < taosArrayGetSize(pIter->aSttBlk); pIter->iSttBlk++) {
SSttBlk* pSttBlk = (SSttBlk*)taosArrayGet(pIter->aSttBlk, pIter->iSttBlk);
@@ -238,6 +237,7 @@ static int32_t tsdbSnapNextRow(STsdbSnapReader* pReader) {
}
pReader->pIter = NULL;
+ break;
} else {
ASSERT(0);
}
@@ -269,6 +269,20 @@ _err:
return code;
}
+static SRowInfo* tsdbSnapGetRow(STsdbSnapReader* pReader) {
+ if (pReader->pIter) {
+ return &pReader->pIter->rInfo;
+ } else {
+ tsdbSnapNextRow(pReader);
+
+ if (pReader->pIter) {
+ return &pReader->pIter->rInfo;
+ } else {
+ return NULL;
+ }
+ }
+}
+
static int32_t tsdbSnapCmprData(STsdbSnapReader* pReader, uint8_t** ppData) {
int32_t code = 0;
@@ -555,7 +569,7 @@ int32_t tsdbSnapReaderClose(STsdbSnapReader** ppReader) {
}
tBlockDataDestroy(&pReader->bData, 1);
- tTSchemaDestroy(pReader->skmTable.pTSchema);
+ tDestroyTSchema(pReader->skmTable.pTSchema);
// del
if (pReader->pDelFReader) tsdbDelFReaderClose(&pReader->pDelFReader);
@@ -1356,7 +1370,7 @@ _exit:
taosMemoryFree(pWriter);
}
} else {
- tsdbDebug("vgId:%d, tsdb snapshot writer open for %s succeed", TD_VID(pTsdb->pVnode), pTsdb->path);
+ tsdbInfo("vgId:%d %s done", TD_VID(pTsdb->pVnode), __func__);
*ppWriter = pWriter;
}
return code;
@@ -1416,12 +1430,12 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** ppWriter, int8_t rollback) {
taosArrayDestroy(pWriter->dReader.aBlockIdx);
tBlockDataDestroy(&pWriter->bData, 1);
- tTSchemaDestroy(pWriter->skmTable.pTSchema);
+ tDestroyTSchema(pWriter->skmTable.pTSchema);
for (int32_t iBuf = 0; iBuf < sizeof(pWriter->aBuf) / sizeof(uint8_t*); iBuf++) {
tFree(pWriter->aBuf[iBuf]);
}
- tsdbInfo("vgId:%d, vnode snapshot tsdb writer close for %s", TD_VID(pWriter->pTsdb->pVnode), pWriter->pTsdb->path);
+ tsdbInfo("vgId:%d %s done", TD_VID(pWriter->pTsdb->pVnode), __func__);
taosMemoryFree(pWriter);
*ppWriter = NULL;
return code;
diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c
index b0cf09662c9e4ffccb663fd1689fcd16668cf05b..55703002b80a518d3d572dab6dc5368910dcfbc2 100644
--- a/source/dnode/vnode/src/tsdb/tsdbUtil.c
+++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c
@@ -101,6 +101,30 @@ void tMapDataGetItemByIdx(SMapData *pMapData, int32_t idx, void *pItem, int32_t
tGetItemFn(pMapData->pData + pMapData->aOffset[idx], pItem);
}
+int32_t tMapDataToArray(SMapData *pMapData, int32_t itemSize, int32_t (*tGetItemFn)(uint8_t *, void *),
+ SArray **ppArray) {
+ int32_t code = 0;
+
+ SArray *pArray = taosArrayInit(pMapData->nItem, itemSize);
+ if (pArray == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+
+ for (int32_t i = 0; i < pMapData->nItem; i++) {
+ tMapDataGetItemByIdx(pMapData, i, taosArrayReserve(pArray, 1), tGetItemFn);
+ }
+
+_exit:
+ if (code) {
+ *ppArray = NULL;
+ if (pArray) taosArrayDestroy(pArray);
+ } else {
+ *ppArray = pArray;
+ }
+ return code;
+}
+
int32_t tPutMapData(uint8_t *p, SMapData *pMapData) {
int32_t n = 0;
@@ -579,8 +603,8 @@ int32_t tsdbRowCmprFn(const void *p1, const void *p2) {
return tsdbKeyCmprFn(&TSDBROW_KEY((TSDBROW *)p1), &TSDBROW_KEY((TSDBROW *)p2));
}
-// SRowIter ======================================================
-void tRowIterInit(SRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema) {
+// STSDBRowIter ======================================================
+void tsdbRowIterInit(STSDBRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema) {
pIter->pRow = pRow;
if (pRow->type == 0) {
ASSERT(pTSchema);
@@ -594,7 +618,7 @@ void tRowIterInit(SRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema) {
}
}
-SColVal *tRowIterNext(SRowIter *pIter) {
+SColVal *tsdbRowIterNext(STSDBRowIter *pIter) {
if (pIter->pRow->type == 0) {
if (pIter->i < pIter->pTSchema->numOfCols) {
tTSRowGetVal(pIter->pRow->pTSRow, pIter->pTSchema, pIter->i, &pIter->colVal);
@@ -704,7 +728,7 @@ int32_t tRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) {
taosArraySet(pMerger->pArray, iCol, pColVal);
}
} else {
- ASSERT(0);
+ ASSERT(0 && "dup versions not allowed");
}
}
@@ -878,7 +902,6 @@ int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SAr
code = TSDB_CODE_OUT_OF_MEMORY;
goto _clear;
}
-
midx = (sidx + eidx) / 2;
code = tsdbBuildDeleteSkyline(aDelData, sidx, midx, aSkyline1);
@@ -1084,11 +1107,11 @@ static int32_t tBlockDataAppendTPRow(SBlockData *pBlockData, STSRow *pRow, STSch
cv.flag = CV_FLAG_VALUE;
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
- void *pData = (char *)pRow + *(int32_t *)(pRow->data + pTColumn->offset - sizeof(TSKEY));
+ void *pData = (char *)pRow + *(int32_t *)(pRow->data + pTColumn->offset);
cv.value.nData = varDataLen(pData);
cv.value.pData = varDataVal(pData);
} else {
- memcpy(&cv.value.val, pRow->data + pTColumn->offset - sizeof(TSKEY), pTColumn->bytes);
+ memcpy(&cv.value.val, pRow->data + pTColumn->offset, pTColumn->bytes);
}
code = tColDataAppendValue(pColData, &cv);
@@ -1106,11 +1129,11 @@ static int32_t tBlockDataAppendTPRow(SBlockData *pBlockData, STSRow *pRow, STSch
cv.flag = CV_FLAG_VALUE;
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
- void *pData = (char *)pRow + *(int32_t *)(pRow->data + pTColumn->offset - sizeof(TSKEY));
+ void *pData = (char *)pRow + *(int32_t *)(pRow->data + pTColumn->offset);
cv.value.nData = varDataLen(pData);
cv.value.pData = varDataVal(pData);
} else {
- memcpy(&cv.value.val, pRow->data + pTColumn->offset - sizeof(TSKEY), pTColumn->bytes);
+ memcpy(&cv.value.val, pRow->data + pTColumn->offset, pTColumn->bytes);
}
code = tColDataAppendValue(pColData, &cv);
diff --git a/source/dnode/vnode/src/vnd/vnodeBufPool.c b/source/dnode/vnode/src/vnd/vnodeBufPool.c
index 71e926bd350bd032ed3314baf9e037b128f5991d..dcc323f778dcb58eda9e9bd9cc160d1e7b522619 100644
--- a/source/dnode/vnode/src/vnd/vnodeBufPool.c
+++ b/source/dnode/vnode/src/vnd/vnodeBufPool.c
@@ -176,6 +176,9 @@ void vnodeBufPoolRef(SVBufPool *pPool) {
}
void vnodeBufPoolUnRef(SVBufPool *pPool) {
+ if (pPool == NULL) {
+ return;
+ }
int32_t nRef = atomic_sub_fetch_32(&pPool->nRef, 1);
if (nRef == 0) {
SVnode *pVnode = pPool->pVnode;
diff --git a/source/dnode/vnode/src/vnd/vnodeCommit.c b/source/dnode/vnode/src/vnd/vnodeCommit.c
index 7040d2d7c8a0dbc4dd9bc5923723c648d593712a..cd56468371a81b79e4b0a2daa8298fff5bc2287a 100644
--- a/source/dnode/vnode/src/vnd/vnodeCommit.c
+++ b/source/dnode/vnode/src/vnd/vnodeCommit.c
@@ -14,14 +14,14 @@
*/
#include "vnd.h"
+#include "vnodeInt.h"
-#define VND_INFO_FNAME "vnode.json"
+#define VND_INFO_FNAME "vnode.json"
#define VND_INFO_FNAME_TMP "vnode_tmp.json"
-static int vnodeEncodeInfo(const SVnodeInfo *pInfo, char **ppData);
-static int vnodeDecodeInfo(uint8_t *pData, SVnodeInfo *pInfo);
-static int vnodeCommitImpl(void *arg);
-static void vnodeWaitCommit(SVnode *pVnode);
+static int vnodeEncodeInfo(const SVnodeInfo *pInfo, char **ppData);
+static int vnodeDecodeInfo(uint8_t *pData, SVnodeInfo *pInfo);
+static int vnodeCommitImpl(SCommitInfo *pInfo);
int vnodeBegin(SVnode *pVnode) {
// alloc buffer pool
@@ -107,7 +107,8 @@ int vnodeSaveInfo(const char *dir, const SVnodeInfo *pInfo) {
// free info binary
taosMemoryFree(data);
- vInfo("vgId:%d, vnode info is saved, fname:%s replica:%d", pInfo->config.vgId, fname, pInfo->config.syncCfg.replicaNum);
+ vInfo("vgId:%d, vnode info is saved, fname:%s replica:%d", pInfo->config.vgId, fname,
+ pInfo->config.syncCfg.replicaNum);
return 0;
@@ -185,32 +186,80 @@ _err:
return -1;
}
+static void vnodePrepareCommit(SVnode *pVnode) {
+ tsem_wait(&pVnode->canCommit);
+
+ tsdbPrepareCommit(pVnode->pTsdb);
+ metaPrepareAsyncCommit(pVnode->pMeta);
+ smaPrepareAsyncCommit(pVnode->pSma);
+
+ vnodeBufPoolUnRef(pVnode->inUse);
+ pVnode->inUse = NULL;
+}
+static int32_t vnodeCommitTask(void *arg) {
+ int32_t code = 0;
+
+ SCommitInfo *pInfo = (SCommitInfo *)arg;
+
+ // commit
+ code = vnodeCommitImpl(pInfo);
+ if (code) goto _exit;
+
+ // end commit
+ tsem_post(&pInfo->pVnode->canCommit);
+
+_exit:
+ taosMemoryFree(pInfo);
+ return code;
+}
int vnodeAsyncCommit(SVnode *pVnode) {
- vnodeWaitCommit(pVnode);
+ int32_t code = 0;
- // vnodeBufPoolSwitch(pVnode);
- // tsdbPrepareCommit(pVnode->pTsdb);
+ // prepare to commit
+ vnodePrepareCommit(pVnode);
- vnodeScheduleTask(vnodeCommitImpl, pVnode);
+ // schedule the task
+ pVnode->state.commitTerm = pVnode->state.applyTerm;
- return 0;
+ SCommitInfo *pInfo = (SCommitInfo *)taosMemoryCalloc(1, sizeof(*pInfo));
+ if (NULL == pInfo) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+ pInfo->info.config = pVnode->config;
+ pInfo->info.state.committed = pVnode->state.applied;
+ pInfo->info.state.commitTerm = pVnode->state.applyTerm;
+ pInfo->info.state.commitID = pVnode->state.commitID;
+ pInfo->pVnode = pVnode;
+ pInfo->txn = metaGetTxn(pVnode->pMeta);
+ vnodeScheduleTask(vnodeCommitTask, pInfo);
+
+_exit:
+ if (code) {
+ vError("vgId:%d %s failed since %s, commit id:%" PRId64, TD_VID(pVnode), __func__, tstrerror(code),
+ pVnode->state.commitID);
+ } else {
+ vDebug("vgId:%d %s done", TD_VID(pVnode), __func__);
+ }
+ return code;
}
int vnodeSyncCommit(SVnode *pVnode) {
vnodeAsyncCommit(pVnode);
- vnodeWaitCommit(pVnode);
- tsem_post(&(pVnode->canCommit));
+ tsem_wait(&pVnode->canCommit);
+ tsem_post(&pVnode->canCommit);
return 0;
}
-int vnodeCommit(SVnode *pVnode) {
- int32_t code = 0;
- int32_t lino = 0;
- SVnodeInfo info = {0};
- char dir[TSDB_FILENAME_LEN];
+static int vnodeCommitImpl(SCommitInfo *pInfo) {
+ int32_t code = 0;
+ int32_t lino = 0;
- vInfo("vgId:%d, start to commit, commit ID:%" PRId64 " version:%" PRId64, TD_VID(pVnode), pVnode->state.commitID,
- pVnode->state.applied);
+ char dir[TSDB_FILENAME_LEN] = {0};
+ SVnode *pVnode = pInfo->pVnode;
+
+ vInfo("vgId:%d, start to commit, commit ID:%" PRId64 " version:%" PRId64 " term: %" PRId64, TD_VID(pVnode),
+ pVnode->state.commitID, pVnode->state.applied, pVnode->state.applyTerm);
// persist wal before starting
if (walPersist(pVnode->pWal) < 0) {
@@ -218,19 +267,13 @@ int vnodeCommit(SVnode *pVnode) {
return -1;
}
- pVnode->state.commitTerm = pVnode->state.applyTerm;
-
// save info
- info.config = pVnode->config;
- info.state.committed = pVnode->state.applied;
- info.state.commitTerm = pVnode->state.applyTerm;
- info.state.commitID = pVnode->state.commitID;
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) {
+ if (vnodeSaveInfo(dir, &pInfo->info) < 0) {
code = terrno;
TSDB_CHECK_CODE(code, lino, _exit);
}
@@ -238,23 +281,12 @@ int vnodeCommit(SVnode *pVnode) {
// walBeginSnapshot(pVnode->pWal, pVnode->state.applied);
syncBeginSnapshot(pVnode->sync, pVnode->state.applied);
- code = smaPreCommit(pVnode->pSma);
- TSDB_CHECK_CODE(code, lino, _exit);
-
- vnodeBufPoolUnRef(pVnode->inUse);
- pVnode->inUse = NULL;
-
// commit each sub-system
- if (metaCommit(pVnode->pMeta) < 0) {
- code = TSDB_CODE_FAILED;
- TSDB_CHECK_CODE(code, lino, _exit);
- }
-
- code = tsdbCommit(pVnode->pTsdb);
+ code = tsdbCommit(pVnode->pTsdb, pInfo);
TSDB_CHECK_CODE(code, lino, _exit);
if (VND_IS_RSMA(pVnode)) {
- code = smaCommit(pVnode->pSma);
+ code = smaCommit(pVnode->pSma, pInfo);
TSDB_CHECK_CODE(code, lino, _exit);
}
@@ -264,7 +296,7 @@ int vnodeCommit(SVnode *pVnode) {
}
// commit info
- if (vnodeCommitInfo(dir, &info) < 0) {
+ if (vnodeCommitInfo(dir, &pInfo->info) < 0) {
code = terrno;
TSDB_CHECK_CODE(code, lino, _exit);
}
@@ -277,19 +309,18 @@ int vnodeCommit(SVnode *pVnode) {
TSDB_CHECK_CODE(code, lino, _exit);
}
- if (metaFinishCommit(pVnode->pMeta) < 0) {
+ if (metaFinishCommit(pVnode->pMeta, pInfo->txn) < 0) {
code = terrno;
TSDB_CHECK_CODE(code, lino, _exit);
}
- pVnode->state.committed = info.state.committed;
+ pVnode->state.committed = pInfo->info.state.committed;
if (smaPostCommit(pVnode->pSma) < 0) {
vError("vgId:%d, failed to post-commit sma since %s", TD_VID(pVnode), tstrerror(terrno));
return -1;
}
- // apply the commit (TODO)
// walEndSnapshot(pVnode->pWal);
syncEndSnapshot(pVnode->sync);
@@ -318,20 +349,6 @@ void vnodeRollback(SVnode *pVnode) {
(void)taosRemoveFile(tFName);
}
-static int vnodeCommitImpl(void *arg) {
- SVnode *pVnode = (SVnode *)arg;
-
- // metaCommit(pVnode->pMeta);
- tqCommit(pVnode->pTq);
- // tsdbCommit(pVnode->pTsdb, );
-
- // vnodeBufPoolRecycle(pVnode);
- tsem_post(&(pVnode->canCommit));
- return 0;
-}
-
-static FORCE_INLINE void vnodeWaitCommit(SVnode *pVnode) { tsem_wait(&pVnode->canCommit); }
-
static int vnodeEncodeState(const void *pObj, SJson *pJson) {
const SVState *pState = (SVState *)pObj;
diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c
index 77d375bc45d6d1f3a2e9a2276ed9e3d8f84b47f6..e09fafb75690f13dd160763126d139dd21ae8c1b 100644
--- a/source/dnode/vnode/src/vnd/vnodeOpen.c
+++ b/source/dnode/vnode/src/vnd/vnodeOpen.c
@@ -144,9 +144,9 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
pVnode->config = info.config;
pVnode->state.committed = info.state.committed;
pVnode->state.commitTerm = info.state.commitTerm;
- pVnode->state.applied = info.state.committed;
pVnode->state.commitID = info.state.commitID;
- pVnode->state.commitTerm = info.state.commitTerm;
+ pVnode->state.applied = info.state.committed;
+ pVnode->state.applyTerm = info.state.commitTerm;
pVnode->pTfs = pTfs;
pVnode->msgCb = msgCb;
taosThreadMutexInit(&pVnode->lock, NULL);
@@ -242,14 +242,14 @@ _err:
return NULL;
}
-void vnodePreClose(SVnode *pVnode) {
+void vnodePreClose(SVnode *pVnode) {
vnodeQueryPreClose(pVnode);
- vnodeSyncPreClose(pVnode);
+ vnodeSyncPreClose(pVnode);
}
void vnodeClose(SVnode *pVnode) {
if (pVnode) {
- vnodeCommit(pVnode);
+ vnodeSyncCommit(pVnode);
vnodeSyncClose(pVnode);
vnodeQueryClose(pVnode);
walClose(pVnode->pWal);
@@ -269,10 +269,7 @@ void vnodeClose(SVnode *pVnode) {
}
// start the sync timer after the queue is ready
-int32_t vnodeStart(SVnode *pVnode) {
- vnodeSyncStart(pVnode);
- return 0;
-}
+int32_t vnodeStart(SVnode *pVnode) { return vnodeSyncStart(pVnode); }
void vnodeStop(SVnode *pVnode) {}
diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c
index 8e9aab0afd129dbf1fab3d301d6da406590db3d2..1199127f6d42bf2d3f7488fb120e8fa9ab09c490 100644
--- a/source/dnode/vnode/src/vnd/vnodeQuery.c
+++ b/source/dnode/vnode/src/vnd/vnodeQuery.c
@@ -380,6 +380,7 @@ int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
pLoad->vgId = TD_VID(pVnode);
pLoad->syncState = state.state;
pLoad->syncRestore = state.restored;
+ pLoad->syncCanRead = state.canRead;
pLoad->cacheUsage = tsdbCacheGetUsage(pVnode);
pLoad->numOfTables = metaGetTbNum(pVnode->pMeta);
pLoad->numOfTimeSeries = metaGetTimeSeriesNum(pVnode->pMeta);
diff --git a/source/dnode/vnode/src/vnd/vnodeSnapshot.c b/source/dnode/vnode/src/vnd/vnodeSnapshot.c
index e8cdf9513f8fc80d479114273a5bf4984bb71337..a34744a1da9055f5131ef96afdca0e3e79c9e90e 100644
--- a/source/dnode/vnode/src/vnd/vnodeSnapshot.c
+++ b/source/dnode/vnode/src/vnd/vnodeSnapshot.c
@@ -259,7 +259,7 @@ int32_t vnodeSnapWriterOpen(SVnode *pVnode, int64_t sver, int64_t ever, SVSnapWr
pWriter->ever = ever;
// commit it
- code = vnodeCommit(pVnode);
+ code = vnodeSyncCommit(pVnode);
if (code) {
taosMemoryFree(pWriter);
goto _err;
diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c
index c75d1ffded37b3651e539a3353c48b9ba35d2f68..0fc42f3744194f7695ff4806c6260ff7082b9c5c 100644
--- a/source/dnode/vnode/src/vnd/vnodeSvr.c
+++ b/source/dnode/vnode/src/vnd/vnodeSvr.c
@@ -178,12 +178,25 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
return -1;
}
+ if (version <= pVnode->state.applied) {
+ vError("vgId:%d, duplicate write request. version: %" PRId64 ", applied: %" PRId64 "", TD_VID(pVnode), version,
+ pVnode->state.applied);
+ terrno = TSDB_CODE_VND_DUP_REQUEST;
+ pRsp->info.handle = NULL;
+ return -1;
+ }
+
vDebug("vgId:%d, start to process write request %s, index:%" PRId64, TD_VID(pVnode), TMSG_INFO(pMsg->msgType),
version);
+ ASSERT(pVnode->state.applyTerm <= pMsg->info.conn.applyTerm);
+ ASSERT(pVnode->state.applied + 1 == version);
+
pVnode->state.applied = version;
pVnode->state.applyTerm = pMsg->info.conn.applyTerm;
+ if (!syncUtilUserCommit(pMsg->msgType)) goto _exit;
+
// skip header
pReq = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
len = pMsg->contLen - sizeof(SMsgHead);
@@ -263,7 +276,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
goto _err;
}
} break;
- case TDMT_VND_STREAM_RECOVER_STEP2: {
+ case TDMT_VND_STREAM_RECOVER_BLOCKING_STAGE: {
if (tqProcessTaskRecover2Req(pVnode->pTq, version, pMsg->pCont, pMsg->contLen) < 0) {
goto _err;
}
@@ -283,7 +296,9 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
vnodeProcessAlterConfigReq(pVnode, version, pReq, len, pRsp);
break;
case TDMT_VND_COMMIT:
- goto _do_commit;
+ vnodeSyncCommit(pVnode);
+ vnodeBegin(pVnode);
+ goto _exit;
default:
vError("vgId:%d, unprocessed msg, %d", TD_VID(pVnode), pMsg->msgType);
return -1;
@@ -301,13 +316,12 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
// commit if need
if (vnodeShouldCommit(pVnode)) {
- _do_commit:
vInfo("vgId:%d, commit at version %" PRId64, TD_VID(pVnode), version);
- // commit current change
- if (vnodeCommit(pVnode) < 0) {
- vError("vgId:%d, failed to commit vnode since %s.", TD_VID(pVnode), tstrerror(terrno));
- goto _err;
- }
+#if 0
+ vnodeSyncCommit(pVnode);
+#else
+ vnodeAsyncCommit(pVnode);
+#endif
// start a new one
if (vnodeBegin(pVnode) < 0) {
@@ -316,6 +330,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
}
}
+_exit:
return 0;
_err:
@@ -336,7 +351,7 @@ int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
vTrace("message in vnode query queue is processing");
// if ((pMsg->msgType == TDMT_SCH_QUERY) && !vnodeIsLeader(pVnode)) {
if ((pMsg->msgType == TDMT_SCH_QUERY) && !syncIsReadyForRead(pVnode->sync)) {
- vnodeRedirectRpcMsg(pVnode, pMsg);
+ vnodeRedirectRpcMsg(pVnode, pMsg, terrno);
return 0;
}
@@ -359,12 +374,12 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) {
pMsg->msgType == TDMT_VND_BATCH_META) &&
!syncIsReadyForRead(pVnode->sync)) {
// !vnodeIsLeader(pVnode)) {
- vnodeRedirectRpcMsg(pVnode, pMsg);
+ vnodeRedirectRpcMsg(pVnode, pMsg, terrno);
return 0;
}
if (pMsg->msgType == TDMT_VND_TMQ_CONSUME && !pVnode->restored) {
- vnodeRedirectRpcMsg(pVnode, pMsg);
+ vnodeRedirectRpcMsg(pVnode, pMsg, TSDB_CODE_SYN_RESTORING);
return 0;
}
@@ -402,7 +417,7 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) {
return tqProcessTaskRetrieveReq(pVnode->pTq, pMsg);
case TDMT_STREAM_RETRIEVE_RSP:
return tqProcessTaskRetrieveRsp(pVnode->pTq, pMsg);
- case TDMT_VND_STREAM_RECOVER_STEP1:
+ case TDMT_VND_STREAM_RECOVER_NONBLOCKING_STAGE:
return tqProcessTaskRecover1Req(pVnode->pTq, pMsg);
case TDMT_STREAM_RECOVER_FINISH:
return tqProcessTaskRecoverFinishReq(pVnode->pTq, pMsg);
@@ -1184,11 +1199,11 @@ static int32_t vnodeProcessBatchDeleteReq(SVnode *pVnode, int64_t version, void
int64_t uid = mr.me.uid;
- int32_t code = tsdbDeleteTableData(pVnode->pTsdb, version, deleteReq.suid, uid, pOneReq->ts, pOneReq->ts);
+ int32_t code = tsdbDeleteTableData(pVnode->pTsdb, version, deleteReq.suid, uid, pOneReq->startTs, pOneReq->endTs);
if (code < 0) {
terrno = code;
vError("vgId:%d, delete error since %s, suid:%" PRId64 ", uid:%" PRId64 ", start ts:%" PRId64 ", end ts:%" PRId64,
- TD_VID(pVnode), terrstr(), deleteReq.suid, uid, pOneReq->ts, pOneReq->ts);
+ TD_VID(pVnode), terrstr(), deleteReq.suid, uid, pOneReq->startTs, pOneReq->endTs);
}
tDecoderClear(&mr.coder);
diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c
index 38cb534d7f3e7f8343893db38b286b2da2eabdae..aa215a852fa5169a4a4aefc09a228be8ee7d1891 100644
--- a/source/dnode/vnode/src/vnd/vnodeSync.c
+++ b/source/dnode/vnode/src/vnd/vnodeSync.c
@@ -16,16 +16,17 @@
#define _DEFAULT_SOURCE
#include "vnd.h"
-#define BATCH_DISABLE 1
-
-static inline bool vnodeIsMsgBlock(tmsg_t type) {
- return (type == TDMT_VND_CREATE_TABLE) || (type == TDMT_VND_ALTER_TABLE) || (type == TDMT_VND_DROP_TABLE) ||
- (type == TDMT_VND_UPDATE_TAG_VAL);
-}
+#define BATCH_ENABLE 0
static inline bool vnodeIsMsgWeak(tmsg_t type) { return false; }
static inline void vnodeWaitBlockMsg(SVnode *pVnode, const SRpcMsg *pMsg) {
+ const STraceId *trace = &pMsg->info.traceId;
+ vGTrace("vgId:%d, msg:%p wait block, type:%s", pVnode->config.vgId, pMsg, TMSG_INFO(pMsg->msgType));
+ tsem_wait(&pVnode->syncSem);
+}
+
+static inline void vnodeWaitBlockMsgOld(SVnode *pVnode, const SRpcMsg *pMsg) {
if (vnodeIsMsgBlock(pMsg->msgType)) {
const STraceId *trace = &pMsg->info.traceId;
taosThreadMutexLock(&pVnode->lock);
@@ -53,7 +54,7 @@ static inline void vnodePostBlockMsg(SVnode *pVnode, const SRpcMsg *pMsg) {
}
}
-void vnodeRedirectRpcMsg(SVnode *pVnode, SRpcMsg *pMsg) {
+void vnodeRedirectRpcMsg(SVnode *pVnode, SRpcMsg *pMsg, int32_t code) {
SEpSet newEpSet = {0};
syncGetRetryEpSet(pVnode->sync, &newEpSet);
@@ -66,8 +67,20 @@ void vnodeRedirectRpcMsg(SVnode *pVnode, SRpcMsg *pMsg) {
}
pMsg->info.hasEpSet = 1;
- SRpcMsg rsp = {.code = TSDB_CODE_RPC_REDIRECT, .info = pMsg->info, .msgType = pMsg->msgType + 1};
- tmsgSendRedirectRsp(&rsp, &newEpSet);
+ if (code == 0) code = TSDB_CODE_SYN_NOT_LEADER;
+
+ SRpcMsg rsp = {.code = code, .info = pMsg->info, .msgType = pMsg->msgType + 1};
+ int32_t contLen = tSerializeSEpSet(NULL, 0, &newEpSet);
+
+ rsp.pCont = rpcMallocCont(contLen);
+ if (rsp.pCont == NULL) {
+ pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
+ } else {
+ tSerializeSEpSet(rsp.pCont, contLen, &newEpSet);
+ rsp.contLen = contLen;
+ }
+
+ tmsgSendRsp(&rsp);
}
static void inline vnodeHandleWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
@@ -87,8 +100,8 @@ static void inline vnodeHandleWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
}
static void vnodeHandleProposeError(SVnode *pVnode, SRpcMsg *pMsg, int32_t code) {
- if (code == TSDB_CODE_SYN_NOT_LEADER) {
- vnodeRedirectRpcMsg(pVnode, pMsg);
+ if (code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_SYN_RESTORING) {
+ vnodeRedirectRpcMsg(pVnode, pMsg, code);
} else {
const STraceId *trace = &pMsg->info.traceId;
vGError("vgId:%d, msg:%p failed to propose since %s, code:0x%x", pVnode->config.vgId, pMsg, tstrerror(code), code);
@@ -99,28 +112,35 @@ static void vnodeHandleProposeError(SVnode *pVnode, SRpcMsg *pMsg, int32_t code)
}
}
+#if BATCH_ENABLE
+
static void inline vnodeProposeBatchMsg(SVnode *pVnode, SRpcMsg **pMsgArr, bool *pIsWeakArr, int32_t *arrSize) {
if (*arrSize <= 0) return;
+ SRpcMsg *pLastMsg = pMsgArr[*arrSize - 1];
-#if BATCH_DISABLE
- int32_t code = syncPropose(pVnode->sync, pMsgArr[0], pIsWeakArr[0]);
-#else
+ taosThreadMutexLock(&pVnode->lock);
int32_t code = syncProposeBatch(pVnode->sync, pMsgArr, pIsWeakArr, *arrSize);
-#endif
+ bool wait = (code == 0 && vnodeIsBlockMsg(pLastMsg->msgType));
+ if (wait) {
+ ASSERT(!pVnode->blocked);
+ pVnode->blocked = true;
+ }
+ taosThreadMutexUnlock(&pVnode->lock);
if (code > 0) {
for (int32_t i = 0; i < *arrSize; ++i) {
vnodeHandleWriteMsg(pVnode, pMsgArr[i]);
}
- } else if (code == 0) {
- vnodeWaitBlockMsg(pVnode, pMsgArr[*arrSize - 1]);
- } else {
+ } else if (code < 0) {
if (terrno != 0) code = terrno;
for (int32_t i = 0; i < *arrSize; ++i) {
vnodeHandleProposeError(pVnode, pMsgArr[i], code);
}
}
+ if (wait) vnodeWaitBlockMsg(pVnode, pLastMsg);
+ pLastMsg = NULL;
+
for (int32_t i = 0; i < *arrSize; ++i) {
SRpcMsg *pMsg = pMsgArr[i];
const STraceId *trace = &pMsg->info.traceId;
@@ -153,8 +173,8 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs)
if (!pVnode->restored) {
vGError("vgId:%d, msg:%p failed to process since restore not finished", vgId, pMsg);
- terrno = TSDB_CODE_APP_NOT_READY;
- vnodeHandleProposeError(pVnode, pMsg, TSDB_CODE_APP_NOT_READY);
+ terrno = TSDB_CODE_SYN_RESTORING;
+ vnodeHandleProposeError(pVnode, pMsg, TSDB_CODE_SYN_RESTORING);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
continue;
@@ -177,7 +197,7 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs)
continue;
}
- if (isBlock || BATCH_DISABLE) {
+ if (isBlock) {
vnodeProposeBatchMsg(pVnode, pMsgArr, pIsWeakArr, &arrayPos);
}
@@ -185,7 +205,7 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs)
pIsWeakArr[arrayPos] = isWeak;
arrayPos++;
- if (isBlock || msg == numOfMsgs - 1 || BATCH_DISABLE) {
+ if (isBlock || msg == numOfMsgs - 1) {
vnodeProposeBatchMsg(pVnode, pMsgArr, pIsWeakArr, &arrayPos);
}
}
@@ -194,6 +214,72 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs)
taosMemoryFree(pIsWeakArr);
}
+#else
+
+static int32_t inline vnodeProposeMsg(SVnode *pVnode, SRpcMsg *pMsg, bool isWeak) {
+ taosThreadMutexLock(&pVnode->lock);
+ int32_t code = syncPropose(pVnode->sync, pMsg, isWeak);
+ bool wait = (code == 0 && vnodeIsMsgBlock(pMsg->msgType));
+ if (wait) {
+ ASSERT(!pVnode->blocked);
+ pVnode->blocked = true;
+ }
+ taosThreadMutexUnlock(&pVnode->lock);
+
+ if (code > 0) {
+ vnodeHandleWriteMsg(pVnode, pMsg);
+ } else if (code < 0) {
+ if (terrno != 0) code = terrno;
+ vnodeHandleProposeError(pVnode, pMsg, code);
+ }
+
+ if (wait) vnodeWaitBlockMsg(pVnode, pMsg);
+ return code;
+}
+
+void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
+ SVnode *pVnode = pInfo->ahandle;
+ int32_t vgId = pVnode->config.vgId;
+ int32_t code = 0;
+ SRpcMsg *pMsg = NULL;
+ vTrace("vgId:%d, get %d msgs from vnode-write queue", vgId, numOfMsgs);
+
+ for (int32_t msg = 0; msg < numOfMsgs; msg++) {
+ if (taosGetQitem(qall, (void **)&pMsg) == 0) continue;
+ bool isWeak = vnodeIsMsgWeak(pMsg->msgType);
+
+ const STraceId *trace = &pMsg->info.traceId;
+ vGTrace("vgId:%d, msg:%p get from vnode-write queue, weak:%d block:%d msg:%d:%d, handle:%p", vgId, pMsg, isWeak,
+ vnodeIsMsgBlock(pMsg->msgType), msg, numOfMsgs, pMsg->info.handle);
+
+ if (!pVnode->restored) {
+ vGError("vgId:%d, msg:%p failed to process since restore not finished", vgId, pMsg);
+ vnodeHandleProposeError(pVnode, pMsg, TSDB_CODE_SYN_RESTORING);
+ rpcFreeCont(pMsg->pCont);
+ taosFreeQitem(pMsg);
+ continue;
+ }
+
+ code = vnodePreProcessWriteMsg(pVnode, pMsg);
+ if (code != 0) {
+ vGError("vgId:%d, msg:%p failed to pre-process since %s", vgId, pMsg, terrstr());
+ if (terrno != 0) code = terrno;
+ vnodeHandleProposeError(pVnode, pMsg, code);
+ rpcFreeCont(pMsg->pCont);
+ taosFreeQitem(pMsg);
+ continue;
+ }
+
+ code = vnodeProposeMsg(pVnode, pMsg, isWeak);
+
+ vGTrace("vgId:%d, msg:%p is freed, code:0x%x", vgId, pMsg, code);
+ rpcFreeCont(pMsg->pCont);
+ taosFreeQitem(pMsg);
+ }
+}
+
+#endif
+
void vnodeApplyWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
SVnode *pVnode = pInfo->ahandle;
int32_t vgId = pVnode->config.vgId;
@@ -206,6 +292,11 @@ void vnodeApplyWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
vGTrace("vgId:%d, msg:%p get from vnode-apply queue, type:%s handle:%p index:%" PRId64, vgId, pMsg,
TMSG_INFO(pMsg->msgType), pMsg->info.handle, pMsg->info.conn.applyIndex);
+ if (vnodeIsMsgBlock(pMsg->msgType)) {
+ vTrace("vgId:%d, blocking msg obtained from apply-queue. index:%" PRId64 ", term: %" PRId64 ", type: %s", vgId,
+ pMsg->info.conn.applyIndex, pMsg->info.conn.applyTerm, TMSG_INFO(pMsg->msgType));
+ }
+
SRpcMsg rsp = {.code = pMsg->code, .info = pMsg->info};
if (rsp.code == 0) {
if (vnodeProcessWriteMsg(pVnode, pMsg, pMsg->info.conn.applyIndex, &rsp) < 0) {
@@ -295,47 +386,32 @@ static int32_t vnodeSyncGetSnapshot(const SSyncFSM *pFsm, SSnapshot *pSnapshot)
return 0;
}
-static void vnodeSyncApplyMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
+static int32_t vnodeSyncApplyMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
SVnode *pVnode = pFsm->data;
+ pMsg->info.conn.applyIndex = pMeta->index;
+ pMsg->info.conn.applyTerm = pMeta->term;
- if (pMeta->code == 0) {
- SRpcMsg rpcMsg = {.msgType = pMsg->msgType, .contLen = pMsg->contLen};
- rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
- memcpy(rpcMsg.pCont, pMsg->pCont, pMsg->contLen);
- rpcMsg.info = pMsg->info;
- rpcMsg.info.conn.applyIndex = pMeta->index;
- rpcMsg.info.conn.applyTerm = pMeta->term;
-
- const STraceId *trace = &pMsg->info.traceId;
- vGTrace("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64
- ", weak:%d, code:%d, state:%d %s, type:%s",
- pVnode->config.vgId, pFsm, pMeta->index, pMeta->term, rpcMsg.info.conn.applyIndex, pMeta->isWeak,
- pMeta->code, pMeta->state, syncStr(pMeta->state), TMSG_INFO(pMsg->msgType));
+ const STraceId *trace = &pMsg->info.traceId;
+ vGTrace("vgId:%d, commit-cb is excuted, fsm:%p, index:%" PRId64 ", term:%" PRIu64 ", msg-index:%" PRId64
+ ", weak:%d, code:%d, state:%d %s, type:%s",
+ pVnode->config.vgId, pFsm, pMeta->index, pMeta->term, pMsg->info.conn.applyIndex, pMeta->isWeak, pMeta->code,
+ pMeta->state, syncStr(pMeta->state), TMSG_INFO(pMsg->msgType));
- tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, &rpcMsg);
- } else {
- SRpcMsg rsp = {.code = pMeta->code, .info = pMsg->info};
- vError("vgId:%d, commit-cb execute error, type:%s, index:%" PRId64 ", error:0x%x %s", pVnode->config.vgId,
- TMSG_INFO(pMsg->msgType), pMeta->index, pMeta->code, tstrerror(pMeta->code));
- if (rsp.info.handle != NULL) {
- tmsgSendRsp(&rsp);
- }
- }
+ return tmsgPutToQueue(&pVnode->msgCb, APPLY_QUEUE, pMsg);
}
-static void vnodeSyncCommitMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
- if (pMeta->isWeak == 0) {
- vnodeSyncApplyMsg(pFsm, pMsg, pMeta);
- }
+static int32_t vnodeSyncCommitMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
+ return vnodeSyncApplyMsg(pFsm, pMsg, pMeta);
}
-static void vnodeSyncPreCommitMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
+static int32_t vnodeSyncPreCommitMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
if (pMeta->isWeak == 1) {
- vnodeSyncApplyMsg(pFsm, pMsg, pMeta);
+ return vnodeSyncApplyMsg(pFsm, pMsg, pMeta);
}
+ return 0;
}
-static void vnodeSyncRollBackMsg(const SSyncFSM *pFsm, const SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
+static void vnodeSyncRollBackMsg(const SSyncFSM *pFsm, SRpcMsg *pMsg, const SFsmCbMeta *pMeta) {
SVnode *pVnode = pFsm->data;
vTrace("vgId:%d, rollback-cb is excuted, fsm:%p, index:%" PRId64 ", weak:%d, code:%d, state:%d %s, type:%s",
pVnode->config.vgId, pFsm, pMeta->index, pMeta->isWeak, pMeta->code, pMeta->state, syncStr(pMeta->state),
@@ -415,12 +491,12 @@ static void vnodeRestoreFinish(const SSyncFSM *pFsm) {
walApplyVer(pVnode->pWal, pVnode->state.applied);
pVnode->restored = true;
- vDebug("vgId:%d, sync restore finished", pVnode->config.vgId);
+ vInfo("vgId:%d, sync restore finished", pVnode->config.vgId);
}
static void vnodeBecomeFollower(const SSyncFSM *pFsm) {
SVnode *pVnode = pFsm->data;
- vDebug("vgId:%d, become follower", pVnode->config.vgId);
+ vInfo("vgId:%d, become follower", pVnode->config.vgId);
taosThreadMutexLock(&pVnode->lock);
if (pVnode->blocked) {
@@ -517,15 +593,20 @@ int32_t vnodeSyncOpen(SVnode *pVnode, char *path) {
return 0;
}
-void vnodeSyncStart(SVnode *pVnode) {
+int32_t vnodeSyncStart(SVnode *pVnode) {
vInfo("vgId:%d, start sync", pVnode->config.vgId);
- syncStart(pVnode->sync);
+ if (syncStart(pVnode->sync) < 0) {
+ vError("vgId:%d, failed to start sync subsystem since %s", pVnode->config.vgId, terrstr());
+ return -1;
+ }
+ return 0;
}
void vnodeSyncPreClose(SVnode *pVnode) {
vInfo("vgId:%d, pre close sync", pVnode->config.vgId);
syncLeaderTransfer(pVnode->sync);
syncPreStop(pVnode->sync);
+
taosThreadMutexLock(&pVnode->lock);
if (pVnode->blocked) {
vInfo("vgId:%d, post block after close sync", pVnode->config.vgId);
@@ -546,21 +627,23 @@ bool vnodeIsRoleLeader(SVnode *pVnode) {
}
bool vnodeIsLeader(SVnode *pVnode) {
+ terrno = 0;
SSyncState state = syncGetState(pVnode->sync);
- if (state.state != TAOS_SYNC_STATE_LEADER || !state.restored) {
- if (state.state != TAOS_SYNC_STATE_LEADER) {
- terrno = TSDB_CODE_SYN_NOT_LEADER;
- } else {
- terrno = TSDB_CODE_APP_NOT_READY;
- }
- vDebug("vgId:%d, vnode not ready, state:%s, restore:%d", pVnode->config.vgId, syncStr(state.state), state.restored);
+ if (terrno != 0) {
+ vInfo("vgId:%d, vnode is stopping", pVnode->config.vgId);
+ return false;
+ }
+
+ if (state.state != TAOS_SYNC_STATE_LEADER) {
+ terrno = TSDB_CODE_SYN_NOT_LEADER;
+ vInfo("vgId:%d, vnode not leader, state:%s", pVnode->config.vgId, syncStr(state.state));
return false;
}
- if (!pVnode->restored) {
- vDebug("vgId:%d, vnode not restored", pVnode->config.vgId);
- terrno = TSDB_CODE_APP_NOT_READY;
+ if (!state.restored || !pVnode->restored) {
+ terrno = TSDB_CODE_SYN_RESTORING;
+ vInfo("vgId:%d, vnode not restored:%d:%d", pVnode->config.vgId, state.restored, pVnode->restored);
return false;
}
diff --git a/source/dnode/vnode/test/tsdbSmaTest.cpp b/source/dnode/vnode/test/tsdbSmaTest.cpp
index 0278a11f809fbdd8b6eeb1712c8eb220fea72990..be101059f26e8aabd451f39843ce45aecd960850 100644
--- a/source/dnode/vnode/test/tsdbSmaTest.cpp
+++ b/source/dnode/vnode/test/tsdbSmaTest.cpp
@@ -436,7 +436,7 @@ TEST(testCase, tSma_Data_Insert_Query_Test) {
pDataBlock->pBlockAgg = NULL;
taosArrayGetSize(pDataBlock->pDataBlock) = tSmaNumOfCols;
pDataBlock->info.rows = tSmaNumOfRows;
- pDataBlock->info.groupId = tSmaGroupId + g;
+ pDataBlock->info.id.groupId = tSmaGroupId + g;
pDataBlock->pDataBlock = taosArrayInit(tSmaNumOfCols, sizeof(SColumnInfoData *));
EXPECT_NE(pDataBlock->pDataBlock, nullptr);
diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h
index c95d0fe4620f7a068813701588da77d9d149a936..6e072a96309f79d4a824ded468a0e5b258e4e3e8 100644
--- a/source/libs/catalog/inc/catalogInt.h
+++ b/source/libs/catalog/inc/catalogInt.h
@@ -547,6 +547,14 @@ typedef struct SCtgOperation {
#define ctgDebug(param, ...) qDebug("CTG:%p " param, pCtg, __VA_ARGS__)
#define ctgTrace(param, ...) qTrace("CTG:%p " param, pCtg, __VA_ARGS__)
+#define ctgTaskFatal(param, ...) qFatal("QID:%" PRIx64 " CTG:%p " param, pTask->pJob->queryId, pCtg, __VA_ARGS__)
+#define ctgTaskError(param, ...) qError("QID:%" PRIx64 " CTG:%p " param, pTask->pJob->queryId, pCtg, __VA_ARGS__)
+#define ctgTaskWarn(param, ...) qWarn("QID:%" PRIx64 " CTG:%p " param, pTask->pJob->queryId, pCtg, __VA_ARGS__)
+#define ctgTaskInfo(param, ...) qInfo("QID:%" PRIx64 " CTG:%p " param, pTask->pJob->queryId, pCtg, __VA_ARGS__)
+#define ctgTaskDebug(param, ...) qDebug("QID:%" PRIx64 " CTG:%p " param, pTask->pJob->queryId, pCtg, __VA_ARGS__)
+#define ctgTaskTrace(param, ...) qTrace("QID:%" PRIx64 " CTG:%p " param, pTask->pJob->queryId, pCtg, __VA_ARGS__)
+
+
#define CTG_LOCK_DEBUG(...) \
do { \
if (gCTGDebug.lockEnable) { \
@@ -762,7 +770,6 @@ int32_t ctgCloneMetaOutput(STableMetaOutput* output, STableMetaOutput** pOutput)
int32_t ctgGenerateVgList(SCatalog* pCtg, SHashObj* vgHash, SArray** pList);
void ctgFreeJob(void* job);
void ctgFreeHandleImpl(SCatalog* pCtg);
-void ctgFreeVgInfo(SDBVgInfo* vgInfo);
int32_t ctgGetVgInfoFromHashValue(SCatalog* pCtg, SDBVgInfo* dbInfo, const SName* pTableName, SVgroupInfo* pVgroup);
int32_t ctgGetVgInfosFromHashValue(SCatalog* pCtg, SCtgTaskReq* tReq, SDBVgInfo* dbInfo, SCtgTbHashsCtx* pCtx,
char* dbFName, SArray* pNames, bool update);
@@ -789,6 +796,11 @@ int32_t ctgRemoveTbMeta(SCatalog* pCtg, SName* pTableName);
int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists);
SName* ctgGetFetchName(SArray* pNames, SCtgFetch* pFetch);
int32_t ctgdGetOneHandle(SCatalog **pHandle);
+int ctgVgInfoComp(const void* lp, const void* rp);
+int32_t ctgMakeVgArray(SDBVgInfo* dbInfo);
+int32_t ctgAcquireVgMetaFromCache(SCatalog *pCtg, const char *dbFName, const char *tbName, SCtgDBCache **pDb, SCtgTbCache **pTb);
+int32_t ctgCopyTbMeta(SCatalog *pCtg, SCtgTbMetaCtx *ctx, SCtgDBCache **pDb, SCtgTbCache **pTb, STableMeta **pTableMeta, char* dbFName);
+void ctgReleaseVgMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache);
extern SCatalogMgmt gCtgMgmt;
extern SCtgDebug gCTGDebug;
diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c
index 2dcd681205a6bd4cae98ddb1141e0b5744a173bc..e9e0bae8d7c569760d4dfd74aa0a1d1a15753f7c 100644
--- a/source/libs/catalog/src/catalog.c
+++ b/source/libs/catalog/src/catalog.c
@@ -505,8 +505,7 @@ _return:
taosMemoryFreeClear(tbMeta);
if (vgInfo) {
- taosHashCleanup(vgInfo->vgHash);
- taosMemoryFreeClear(vgInfo);
+ freeVgInfo(vgInfo);
}
if (vgList) {
@@ -546,13 +545,41 @@ _return:
}
if (vgInfo) {
- taosHashCleanup(vgInfo->vgHash);
- taosMemoryFreeClear(vgInfo);
+ freeVgInfo(vgInfo);
}
CTG_RET(code);
}
+int32_t ctgGetCachedTbVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta) {
+ int32_t code = 0;
+ char db[TSDB_DB_FNAME_LEN] = {0};
+ tNameGetFullDbName(pTableName, db);
+ SCtgDBCache *dbCache = NULL;
+ SCtgTbCache *tbCache = NULL;
+
+ CTG_ERR_RET(ctgAcquireVgMetaFromCache(pCtg, db, pTableName->tname, &dbCache, &tbCache));
+
+ if (NULL == dbCache || NULL == tbCache) {
+ *pTableMeta = NULL;
+ return TSDB_CODE_SUCCESS;
+ }
+
+ CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pTableName, pVgroup));
+
+ SCtgTbMetaCtx ctx = {0};
+ ctx.pName = (SName*)pTableName;
+ ctx.flag = CTG_FLAG_UNKNOWN_STB;
+ CTG_ERR_JRET(ctgCopyTbMeta(pCtg, &ctx, &dbCache, &tbCache, pTableMeta, db));
+
+_return:
+
+ ctgReleaseVgMetaToCache(pCtg, dbCache, tbCache);
+
+ CTG_RET(code);
+}
+
+
int32_t ctgRemoveTbMeta(SCatalog* pCtg, SName* pTableName) {
int32_t code = 0;
@@ -619,7 +646,7 @@ int32_t catalogInit(SCatalogCfg* cfg) {
gCtgMgmt.queue.head = taosMemoryCalloc(1, sizeof(SCtgQNode));
if (NULL == gCtgMgmt.queue.head) {
qError("calloc %d failed", (int32_t)sizeof(SCtgQNode));
- CTG_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
gCtgMgmt.queue.tail = gCtgMgmt.queue.head;
@@ -778,8 +805,7 @@ _return:
}
if (vgInfo) {
- taosHashCleanup(vgInfo->vgHash);
- taosMemoryFreeClear(vgInfo);
+ freeVgInfo(vgInfo);
}
CTG_API_LEAVE(code);
@@ -836,8 +862,7 @@ _return:
ctgRUnlockVgInfo(dbCache);
ctgReleaseDBCache(pCtg, dbCache);
} else if (dbInfo) {
- taosHashCleanup(dbInfo->vgHash);
- taosMemoryFreeClear(dbInfo);
+ freeVgInfo(dbInfo);
}
CTG_API_LEAVE(code);
@@ -849,7 +874,7 @@ int32_t catalogUpdateDBVgInfo(SCatalog* pCtg, const char* dbFName, uint64_t dbId
int32_t code = 0;
if (NULL == pCtg || NULL == dbFName || NULL == dbInfo) {
- ctgFreeVgInfo(dbInfo);
+ freeVgInfo(dbInfo);
CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
}
@@ -1076,6 +1101,9 @@ int32_t catalogRefreshTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const S
SCtgTbMetaCtx ctx = {0};
ctx.pName = (SName*)pTableName;
ctx.flag = CTG_FLAG_FORCE_UPDATE | CTG_FLAG_MAKE_STB(isSTable);
+ if (IS_SYS_DBNAME(ctx.pName->dbname)) {
+ CTG_FLAG_SET_SYS_DB(ctx.flag);
+ }
CTG_API_LEAVE(ctgRefreshTbMeta(pCtg, pConn, &ctx, NULL, true));
}
@@ -1119,6 +1147,13 @@ int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName,
CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, NULL, pTableName, pVgroup, exists));
}
+int32_t catalogGetCachedTableVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta) {
+ CTG_API_ENTER();
+
+ CTG_API_LEAVE(ctgGetCachedTbVgMeta(pCtg, pTableName, pVgroup, pTableMeta));
+}
+
+
#if 0
int32_t catalogGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, SMetaData* pRsp) {
CTG_API_ENTER();
diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c
index 2a032de003fda1db02896606b869f0f0afa1cf5e..5b01ac1fb96007234863d7c96f7aaa1e75b3c962 100644
--- a/source/libs/catalog/src/ctgAsync.c
+++ b/source/libs/catalog/src/ctgAsync.c
@@ -1094,6 +1094,9 @@ _return:
ctgReleaseVgInfoToCache(pCtg, dbCache);
}
+ if (code) {
+ ctgTaskError("Get table %d.%s.%s meta failed with error %s", pName->acctId, pName->dbname, pName->tname, tstrerror(code));
+ }
if (pTask->res || code) {
ctgHandleTaskEnd(pTask, code);
}
@@ -1124,7 +1127,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
SVgroupInfo vgInfo = {0};
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, pOut->dbVgroup, pName, &vgInfo));
- ctgDebug("will refresh tbmeta, not supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(pName), flag);
+ ctgTaskDebug("will refresh tbmeta, not supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(pName), flag);
*vgId = vgInfo.vgId;
CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, pName, &vgInfo, NULL, tReq));
@@ -1144,7 +1147,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
SVgroupInfo vgInfo = {0};
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pName, &vgInfo));
- ctgDebug("will refresh tbmeta, supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(pName), flag);
+ ctgTaskDebug("will refresh tbmeta, supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(pName), flag);
*vgId = vgInfo.vgId;
CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, pName, &vgInfo, NULL, tReq));
@@ -1162,7 +1165,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
return TSDB_CODE_SUCCESS;
}
- ctgError("no tbmeta got, tbName:%s", tNameGetTableName(pName));
+ ctgTaskError("no tbmeta got, tbName:%s", tNameGetTableName(pName));
ctgRemoveTbMetaFromCache(pCtg, pName, false);
CTG_ERR_JRET(CTG_ERR_CODE_TABLE_NOT_EXIST);
@@ -1180,7 +1183,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
STableMetaOutput* pOut = (STableMetaOutput*)pMsgCtx->out;
if (CTG_IS_META_NULL(pOut->metaType)) {
- ctgError("no tbmeta got, tbNmae:%s", tNameGetTableName(pName));
+ ctgTaskError("no tbmeta got, tbNmae:%s", tNameGetTableName(pName));
ctgRemoveTbMetaFromCache(pCtg, pName, false);
CTG_ERR_JRET(CTG_ERR_CODE_TABLE_NOT_EXIST);
}
@@ -1190,7 +1193,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
}
if (CTG_IS_META_TABLE(pOut->metaType) && TSDB_SUPER_TABLE == pOut->tbMeta->tableType) {
- ctgDebug("will continue to refresh tbmeta since got stb, tbName:%s", tNameGetTableName(pName));
+ ctgTaskDebug("will continue to refresh tbmeta since got stb, tbName:%s", tNameGetTableName(pName));
taosMemoryFreeClear(pOut->tbMeta);
@@ -1205,13 +1208,13 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
stbCtx.pName = &stbName;
STableMeta* stbMeta = NULL;
- ctgReadTbMetaFromCache(pCtg, &stbCtx, &stbMeta);
+ (void)ctgReadTbMetaFromCache(pCtg, &stbCtx, &stbMeta);
if (stbMeta && stbMeta->sversion >= pOut->tbMeta->sversion) {
- ctgDebug("use cached stb meta, tbName:%s", tNameGetTableName(pName));
+ ctgTaskDebug("use cached stb meta, tbName:%s", tNameGetTableName(pName));
exist = 1;
taosMemoryFreeClear(stbMeta);
} else {
- ctgDebug("need to get/update stb meta, tbName:%s", tNameGetTableName(pName));
+ ctgTaskDebug("need to get/update stb meta, tbName:%s", tNameGetTableName(pName));
taosMemoryFreeClear(pOut->tbMeta);
taosMemoryFreeClear(stbMeta);
}
@@ -1225,7 +1228,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
break;
}
default:
- ctgError("invalid reqType %d", reqType);
+ ctgTaskError("invalid reqType %d", reqType);
CTG_ERR_JRET(TSDB_CODE_INVALID_MSG);
}
@@ -1280,6 +1283,7 @@ _return:
TSWAP(pTask->res, ctx->pResList);
taskDone = true;
}
+ ctgTaskError("Get table %d.%s.%s meta failed with error %s", pName->acctId, pName->dbname, pName->tname, tstrerror(code));
}
if (pTask->res && taskDone) {
diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c
index fa38eeba0c9d664df1dcd2f3dc313f0f89bd603e..47cb0ef55910ddbd6ff77827067167818d87fabe 100644
--- a/source/libs/catalog/src/ctgCache.c
+++ b/source/libs/catalog/src/ctgCache.c
@@ -130,7 +130,7 @@ void ctgReleaseVgInfoToCache(SCatalog *pCtg, SCtgDBCache *dbCache) {
}
void ctgReleaseTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache) {
- if (pCache) {
+ if (pCache && dbCache) {
CTG_UNLOCK(CTG_READ, &pCache->metaLock);
taosHashRelease(dbCache->tbCache, pCache);
}
@@ -151,6 +151,18 @@ void ctgReleaseTbIndexToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache
}
}
+void ctgReleaseVgMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, SCtgTbCache *pCache) {
+ if (pCache && dbCache) {
+ CTG_UNLOCK(CTG_READ, &pCache->metaLock);
+ taosHashRelease(dbCache->tbCache, pCache);
+ }
+
+ if (dbCache) {
+ ctgRUnlockVgInfo(dbCache);
+ ctgReleaseDBCache(pCtg, dbCache);
+ }
+}
+
int32_t ctgAcquireVgInfoFromCache(SCatalog *pCtg, const char *dbFName, SCtgDBCache **pCache) {
SCtgDBCache *dbCache = NULL;
ctgAcquireDBCache(pCtg, dbFName, &dbCache);
@@ -226,6 +238,76 @@ _return:
return TSDB_CODE_SUCCESS;
}
+int32_t ctgAcquireVgMetaFromCache(SCatalog *pCtg, const char *dbFName, const char *tbName, SCtgDBCache **pDb, SCtgTbCache **pTb) {
+ SCtgDBCache *dbCache = NULL;
+ SCtgTbCache *tbCache = NULL;
+ bool vgInCache = false;
+
+ ctgAcquireDBCache(pCtg, dbFName, &dbCache);
+ if (NULL == dbCache) {
+ ctgDebug("db %s not in cache", dbFName);
+ CTG_CACHE_STAT_INC(numOfVgMiss, 1);
+ goto _return;
+ }
+
+ ctgRLockVgInfo(pCtg, dbCache, &vgInCache);
+ if (!vgInCache) {
+ ctgDebug("vgInfo of db %s not in cache", dbFName);
+ CTG_CACHE_STAT_INC(numOfVgMiss, 1);
+ goto _return;
+ }
+
+ *pDb = dbCache;
+
+ CTG_CACHE_STAT_INC(numOfVgHit, 1);
+
+ ctgDebug("Got db vgInfo from cache, dbFName:%s", dbFName);
+
+ tbCache = taosHashAcquire(dbCache->tbCache, tbName, strlen(tbName));
+ if (NULL == tbCache) {
+ ctgDebug("tb %s not in cache, dbFName:%s", tbName, dbFName);
+ CTG_CACHE_STAT_INC(numOfMetaMiss, 1);
+ goto _return;
+ }
+
+ CTG_LOCK(CTG_READ, &tbCache->metaLock);
+ if (NULL == tbCache->pMeta) {
+ ctgDebug("tb %s meta not in cache, dbFName:%s", tbName, dbFName);
+ CTG_CACHE_STAT_INC(numOfMetaMiss, 1);
+ goto _return;
+ }
+
+ *pTb = tbCache;
+
+ ctgDebug("tb %s meta got in cache, dbFName:%s", tbName, dbFName);
+
+ CTG_CACHE_STAT_INC(numOfMetaHit, 1);
+
+ return TSDB_CODE_SUCCESS;
+
+_return:
+
+ if (tbCache) {
+ CTG_UNLOCK(CTG_READ, &tbCache->metaLock);
+ taosHashRelease(dbCache->tbCache, tbCache);
+ }
+
+ if (vgInCache) {
+ ctgRUnlockVgInfo(dbCache);
+ }
+
+ if (dbCache) {
+ ctgReleaseDBCache(pCtg, dbCache);
+ }
+
+ *pDb = NULL;
+ *pTb = NULL;
+
+ return TSDB_CODE_SUCCESS;
+}
+
+
+/*
int32_t ctgAcquireStbMetaFromCache(SCatalog *pCtg, char *dbFName, uint64_t suid, SCtgDBCache **pDb, SCtgTbCache **pTb) {
SCtgDBCache *dbCache = NULL;
SCtgTbCache *pCache = NULL;
@@ -276,6 +358,49 @@ _return:
return TSDB_CODE_SUCCESS;
}
+*/
+
+int32_t ctgAcquireStbMetaFromCache(SCtgDBCache *dbCache, SCatalog *pCtg, char *dbFName, uint64_t suid, SCtgTbCache **pTb) {
+ SCtgTbCache *pCache = NULL;
+ char *stName = taosHashAcquire(dbCache->stbCache, &suid, sizeof(suid));
+ if (NULL == stName) {
+ ctgDebug("stb 0x%" PRIx64 " not in cache, dbFName:%s", suid, dbFName);
+ goto _return;
+ }
+
+ pCache = taosHashAcquire(dbCache->tbCache, stName, strlen(stName));
+ if (NULL == pCache) {
+ ctgDebug("stb 0x%" PRIx64 " name %s not in cache, dbFName:%s", suid, stName, dbFName);
+ taosHashRelease(dbCache->stbCache, stName);
+ goto _return;
+ }
+
+ taosHashRelease(dbCache->stbCache, stName);
+
+ CTG_LOCK(CTG_READ, &pCache->metaLock);
+ if (NULL == pCache->pMeta) {
+ ctgDebug("stb 0x%" PRIx64 " meta not in cache, dbFName:%s", suid, dbFName);
+ goto _return;
+ }
+
+ *pTb = pCache;
+
+ ctgDebug("stb 0x%" PRIx64 " meta got in cache, dbFName:%s", suid, dbFName);
+
+ CTG_CACHE_STAT_INC(numOfMetaHit, 1);
+
+ return TSDB_CODE_SUCCESS;
+
+_return:
+
+ ctgReleaseTbMetaToCache(pCtg, dbCache, pCache);
+
+ CTG_CACHE_STAT_INC(numOfMetaMiss, 1);
+
+ *pTb = NULL;
+
+ return TSDB_CODE_SUCCESS;
+}
int32_t ctgAcquireTbIndexFromCache(SCatalog *pCtg, char *dbFName, char *tbName, SCtgDBCache **pDb, SCtgTbCache **pTb) {
SCtgDBCache *dbCache = NULL;
@@ -334,25 +459,9 @@ int32_t ctgTbMetaExistInCache(SCatalog *pCtg, char *dbFName, char *tbName, int32
return TSDB_CODE_SUCCESS;
}
-int32_t ctgReadTbMetaFromCache(SCatalog *pCtg, SCtgTbMetaCtx *ctx, STableMeta **pTableMeta) {
- int32_t code = 0;
- SCtgDBCache *dbCache = NULL;
- SCtgTbCache *tbCache = NULL;
- *pTableMeta = NULL;
-
- char dbFName[TSDB_DB_FNAME_LEN] = {0};
- if (CTG_FLAG_IS_SYS_DB(ctx->flag)) {
- strcpy(dbFName, ctx->pName->dbname);
- } else {
- tNameGetFullDbName(ctx->pName, dbFName);
- }
-
- ctgAcquireTbMetaFromCache(pCtg, dbFName, ctx->pName->tname, &dbCache, &tbCache);
- if (NULL == tbCache) {
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
- return TSDB_CODE_SUCCESS;
- }
-
+int32_t ctgCopyTbMeta(SCatalog *pCtg, SCtgTbMetaCtx *ctx, SCtgDBCache **pDb, SCtgTbCache **pTb, STableMeta **pTableMeta, char* dbFName) {
+ SCtgDBCache *dbCache = *pDb;
+ SCtgTbCache *tbCache = *pTb;
STableMeta *tbMeta = tbCache->pMeta;
ctx->tbInfo.inCache = true;
ctx->tbInfo.dbId = dbCache->dbId;
@@ -363,13 +472,11 @@ int32_t ctgReadTbMetaFromCache(SCatalog *pCtg, SCtgTbMetaCtx *ctx, STableMeta **
int32_t metaSize = CTG_META_SIZE(tbMeta);
*pTableMeta = taosMemoryCalloc(1, metaSize);
if (NULL == *pTableMeta) {
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
- CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
memcpy(*pTableMeta, tbMeta, metaSize);
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
ctgDebug("Got tb %s meta from cache, type:%d, dbFName:%s", ctx->pName->tname, tbMeta->tableType, dbFName);
return TSDB_CODE_SUCCESS;
}
@@ -379,39 +486,72 @@ int32_t ctgReadTbMetaFromCache(SCatalog *pCtg, SCtgTbMetaCtx *ctx, STableMeta **
int32_t metaSize = sizeof(SCTableMeta);
*pTableMeta = taosMemoryCalloc(1, metaSize);
if (NULL == *pTableMeta) {
- CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
memcpy(*pTableMeta, tbMeta, metaSize);
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
+ //ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
+
+ if (tbCache) {
+ CTG_UNLOCK(CTG_READ, &tbCache->metaLock);
+ taosHashRelease(dbCache->tbCache, tbCache);
+ *pTb = NULL;
+ }
+
ctgDebug("Got ctb %s meta from cache, will continue to get its stb meta, type:%d, dbFName:%s", ctx->pName->tname,
ctx->tbInfo.tbType, dbFName);
- ctgAcquireStbMetaFromCache(pCtg, dbFName, ctx->tbInfo.suid, &dbCache, &tbCache);
+ ctgAcquireStbMetaFromCache(dbCache, pCtg, dbFName, ctx->tbInfo.suid, &tbCache);
if (NULL == tbCache) {
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
taosMemoryFreeClear(*pTableMeta);
+ *pDb = NULL;
ctgDebug("stb 0x%" PRIx64 " meta not in cache", ctx->tbInfo.suid);
return TSDB_CODE_SUCCESS;
}
+ *pTb = tbCache;
+
STableMeta *stbMeta = tbCache->pMeta;
if (stbMeta->suid != ctx->tbInfo.suid) {
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
ctgError("stb suid 0x%" PRIx64 " in stbCache mis-match, expected suid 0x%" PRIx64, stbMeta->suid, ctx->tbInfo.suid);
- CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
+ taosMemoryFreeClear(*pTableMeta);
+ CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
}
metaSize = CTG_META_SIZE(stbMeta);
*pTableMeta = taosMemoryRealloc(*pTableMeta, metaSize);
if (NULL == *pTableMeta) {
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
- CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
memcpy(&(*pTableMeta)->sversion, &stbMeta->sversion, metaSize - sizeof(SCTableMeta));
+ return TSDB_CODE_SUCCESS;
+}
+
+
+int32_t ctgReadTbMetaFromCache(SCatalog *pCtg, SCtgTbMetaCtx *ctx, STableMeta **pTableMeta) {
+ int32_t code = 0;
+ SCtgDBCache *dbCache = NULL;
+ SCtgTbCache *tbCache = NULL;
+ *pTableMeta = NULL;
+
+ char dbFName[TSDB_DB_FNAME_LEN] = {0};
+ if (CTG_FLAG_IS_SYS_DB(ctx->flag)) {
+ strcpy(dbFName, ctx->pName->dbname);
+ } else {
+ tNameGetFullDbName(ctx->pName, dbFName);
+ }
+
+ ctgAcquireTbMetaFromCache(pCtg, dbFName, ctx->pName->tname, &dbCache, &tbCache);
+ if (NULL == tbCache) {
+ ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
+ return TSDB_CODE_SUCCESS;
+ }
+
+ CTG_ERR_JRET(ctgCopyTbMeta(pCtg, ctx, &dbCache, &tbCache, pTableMeta, dbFName));
+
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
ctgDebug("Got tb %s meta from cache, dbFName:%s", ctx->pName->tname, dbFName);
@@ -460,12 +600,17 @@ int32_t ctgReadTbVerFromCache(SCatalog *pCtg, SName *pTableName, int32_t *sver,
// PROCESS FOR CHILD TABLE
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
+ //ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
+ if (tbCache) {
+ CTG_UNLOCK(CTG_READ, &tbCache->metaLock);
+ taosHashRelease(dbCache->tbCache, tbCache);
+ }
+
ctgDebug("Got ctb %s ver from cache, will continue to get its stb ver, dbFName:%s", pTableName->tname, dbFName);
- ctgAcquireStbMetaFromCache(pCtg, dbFName, *suid, &dbCache, &tbCache);
+ ctgAcquireStbMetaFromCache(dbCache, pCtg, dbFName, *suid, &tbCache);
if (NULL == tbCache) {
- ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
+ //ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
ctgDebug("stb 0x%" PRIx64 " meta not in cache", *suid);
return TSDB_CODE_SUCCESS;
}
@@ -663,6 +808,7 @@ int32_t ctgDropDbCacheEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId)
int32_t code = 0;
SCtgCacheOperation *op = taosMemoryCalloc(1, sizeof(SCtgCacheOperation));
op->opId = CTG_OP_DROP_DB_CACHE;
+ op->syncOp = true;
SCtgDropDBMsg *msg = taosMemoryMalloc(sizeof(SCtgDropDBMsg));
if (NULL == msg) {
@@ -793,7 +939,7 @@ int32_t ctgUpdateVgroupEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId
if (NULL == msg) {
ctgError("malloc %d failed", (int32_t)sizeof(SCtgUpdateVgMsg));
taosMemoryFree(op);
- ctgFreeVgInfo(dbInfo);
+ freeVgInfo(dbInfo);
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
@@ -802,6 +948,14 @@ int32_t ctgUpdateVgroupEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId
dbFName = p + 1;
}
+ code = ctgMakeVgArray(dbInfo);
+ if (code) {
+ taosMemoryFree(op);
+ taosMemoryFree(msg);
+ freeVgInfo(dbInfo);
+ CTG_ERR_RET(code);
+ }
+
tstrncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
msg->pCtg = pCtg;
msg->dbId = dbId;
@@ -815,7 +969,7 @@ int32_t ctgUpdateVgroupEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId
_return:
- ctgFreeVgInfo(dbInfo);
+ freeVgInfo(dbInfo);
CTG_RET(code);
}
@@ -1548,6 +1702,20 @@ void ctgFreeAllInstance(void) {
taosHashClear(gCtgMgmt.pCluster);
}
+int32_t ctgVgInfoIdComp(void const* lp, void const* rp) {
+ int32_t* key = (int32_t*)lp;
+ SVgroupInfo* pVg = (SVgroupInfo*)rp;
+
+ if (*key < pVg->vgId) {
+ return -1;
+ } else if (*key > pVg->vgId) {
+ return 1;
+ }
+
+ return 0;
+}
+
+
int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
int32_t code = 0;
SCtgUpdateVgMsg *msg = operation->data;
@@ -1599,7 +1767,7 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
goto _return;
}
- ctgFreeVgInfo(vgInfo);
+ freeVgInfo(vgInfo);
}
vgCache->vgInfo = dbInfo;
@@ -1612,15 +1780,15 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
dbCache = NULL;
- if (!IS_SYS_DBNAME(dbFName)) {
+ //if (!IS_SYS_DBNAME(dbFName)) {
tstrncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
CTG_ERR_JRET(ctgMetaRentUpdate(&msg->pCtg->dbRent, &vgVersion, vgVersion.dbId, sizeof(SDbVgVersion),
ctgDbVgVersionSortCompare, ctgDbVgVersionSearchCompare));
- }
+ //}
_return:
- ctgFreeVgInfo(msg->dbInfo);
+ freeVgInfo(msg->dbInfo);
taosMemoryFreeClear(msg);
CTG_RET(code);
@@ -1641,7 +1809,7 @@ int32_t ctgOpDropDbCache(SCtgCacheOperation *operation) {
goto _return;
}
- if (dbCache->dbId != msg->dbId) {
+ if (msg->dbId && dbCache->dbId != msg->dbId) {
ctgInfo("dbId already updated, dbFName:%s, dbId:0x%" PRIx64 ", targetId:0x%" PRIx64, msg->dbFName, dbCache->dbId,
msg->dbId);
goto _return;
@@ -1673,7 +1841,7 @@ int32_t ctgOpDropDbVgroup(SCtgCacheOperation *operation) {
CTG_ERR_JRET(ctgWLockVgInfo(pCtg, dbCache));
- ctgFreeVgInfo(dbCache->vgCache.vgInfo);
+ freeVgInfo(dbCache->vgCache.vgInfo);
dbCache->vgCache.vgInfo = NULL;
ctgDebug("db vgInfo removed, dbFName:%s", msg->dbFName);
@@ -1929,7 +2097,13 @@ int32_t ctgOpUpdateEpset(SCtgCacheOperation *operation) {
SVgroupInfo *pInfo = taosHashGet(vgInfo->vgHash, &msg->vgId, sizeof(msg->vgId));
if (NULL == pInfo) {
- ctgDebug("no vgroup %d in db %s, ignore epset update", msg->vgId, msg->dbFName);
+ ctgDebug("no vgroup %d in db %s vgHash, ignore epset update", msg->vgId, msg->dbFName);
+ goto _return;
+ }
+
+ SVgroupInfo *pInfo2 = taosArraySearch(vgInfo->vgArray, &msg->vgId, ctgVgInfoIdComp, TD_EQ);
+ if (NULL == pInfo2) {
+ ctgDebug("no vgroup %d in db %s vgArray, ignore epset update", msg->vgId, msg->dbFName);
goto _return;
}
@@ -1940,6 +2114,7 @@ int32_t ctgOpUpdateEpset(SCtgCacheOperation *operation) {
msg->epSet.numOfEps, pNewEp->fqdn, pNewEp->port, msg->dbFName);
pInfo->epSet = msg->epSet;
+ pInfo2->epSet = msg->epSet;
_return:
@@ -2056,7 +2231,7 @@ void ctgFreeCacheOperationData(SCtgCacheOperation *op) {
switch (op->opId) {
case CTG_OP_UPDATE_VGROUP: {
SCtgUpdateVgMsg *msg = op->data;
- ctgFreeVgInfo(msg->dbInfo);
+ freeVgInfo(msg->dbInfo);
taosMemoryFreeClear(op->data);
break;
}
diff --git a/source/libs/catalog/src/ctgRemote.c b/source/libs/catalog/src/ctgRemote.c
index 753c4ce9171a7acc6a1b5d065751b0ca32268972..7cc6c90d303c4c425358800eb646f986417cefdd 100644
--- a/source/libs/catalog/src/ctgRemote.c
+++ b/source/libs/catalog/src/ctgRemote.c
@@ -384,13 +384,13 @@ int32_t ctgMakeMsgSendInfo(SCtgJob* pJob, SArray* pTaskId, int32_t batchId, SArr
SMsgSendInfo* msgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (NULL == msgSendInfo) {
qError("calloc %d failed", (int32_t)sizeof(SMsgSendInfo));
- CTG_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
SCtgTaskCallbackParam* param = taosMemoryCalloc(1, sizeof(SCtgTaskCallbackParam));
if (NULL == param) {
qError("calloc %d failed", (int32_t)sizeof(SCtgTaskCallbackParam));
- CTG_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
param->reqType = msgType;
diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c
index 3d21bbbcd9a2060d71d81193f37fc68e9bf6bd26..802ecde63eaae46645712a5d3f60ae76cdfeee6f 100644
--- a/source/libs/catalog/src/ctgUtil.c
+++ b/source/libs/catalog/src/ctgUtil.c
@@ -231,20 +231,7 @@ void ctgFreeTbCache(SCtgDBCache* dbCache) {
CTG_CACHE_STAT_DEC(numOfTbl, tblNum);
}
-void ctgFreeVgInfo(SDBVgInfo* vgInfo) {
- if (NULL == vgInfo) {
- return;
- }
-
- if (vgInfo->vgHash) {
- taosHashCleanup(vgInfo->vgHash);
- vgInfo->vgHash = NULL;
- }
-
- taosMemoryFreeClear(vgInfo);
-}
-
-void ctgFreeVgInfoCache(SCtgDBCache* dbCache) { ctgFreeVgInfo(dbCache->vgCache.vgInfo); }
+void ctgFreeVgInfoCache(SCtgDBCache* dbCache) { freeVgInfo(dbCache->vgCache.vgInfo); }
void ctgFreeDbCache(SCtgDBCache* dbCache) {
if (NULL == dbCache) {
@@ -366,8 +353,7 @@ void ctgFreeSUseDbOutput(SUseDbOutput* pOutput) {
}
if (pOutput->dbVgroup) {
- taosHashCleanup(pOutput->dbVgroup->vgHash);
- taosMemoryFreeClear(pOutput->dbVgroup);
+ freeVgInfo(pOutput->dbVgroup);
}
taosMemoryFree(pOutput);
@@ -573,8 +559,7 @@ void ctgFreeSubTaskRes(CTG_TASK_TYPE type, void** pRes) {
case CTG_TASK_GET_DB_VGROUP: {
if (*pRes) {
SDBVgInfo* pInfo = (SDBVgInfo*)*pRes;
- taosHashCleanup(pInfo->vgHash);
- taosMemoryFreeClear(*pRes);
+ freeVgInfo(pInfo);
}
break;
}
@@ -837,10 +822,36 @@ _return:
CTG_RET(code);
}
+int ctgVgInfoComp(const void* lp, const void* rp) {
+ SVgroupInfo* pLeft = (SVgroupInfo*)lp;
+ SVgroupInfo* pRight = (SVgroupInfo*)rp;
+ if (pLeft->hashBegin < pRight->hashBegin) {
+ return -1;
+ } else if (pLeft->hashBegin > pRight->hashBegin) {
+ return 1;
+ }
+
+ return 0;
+}
+
+int32_t ctgHashValueComp(void const* lp, void const* rp) {
+ uint32_t* key = (uint32_t*)lp;
+ SVgroupInfo* pVg = (SVgroupInfo*)rp;
+
+ if (*key < pVg->hashBegin) {
+ return -1;
+ } else if (*key > pVg->hashEnd) {
+ return 1;
+ }
+
+ return 0;
+}
+
int32_t ctgGetVgInfoFromHashValue(SCatalog* pCtg, SDBVgInfo* dbInfo, const SName* pTableName, SVgroupInfo* pVgroup) {
int32_t code = 0;
+ CTG_ERR_RET(ctgMakeVgArray(dbInfo));
- int32_t vgNum = taosHashGetSize(dbInfo->vgHash);
+ int32_t vgNum = taosArrayGetSize(dbInfo->vgArray);
char db[TSDB_DB_FNAME_LEN] = {0};
tNameGetFullDbName(pTableName, db);
@@ -856,6 +867,9 @@ int32_t ctgGetVgInfoFromHashValue(SCatalog* pCtg, SDBVgInfo* dbInfo, const SName
uint32_t hashValue = taosGetTbHashVal(tbFullName, (uint32_t)strlen(tbFullName), dbInfo->hashMethod,
dbInfo->hashPrefix, dbInfo->hashSuffix);
+ vgInfo = taosArraySearch(dbInfo->vgArray, &hashValue, ctgHashValueComp, TD_EQ);
+
+/*
void* pIter = taosHashIterate(dbInfo->vgHash, NULL);
while (pIter) {
vgInfo = pIter;
@@ -867,10 +881,11 @@ int32_t ctgGetVgInfoFromHashValue(SCatalog* pCtg, SDBVgInfo* dbInfo, const SName
pIter = taosHashIterate(dbInfo->vgHash, pIter);
vgInfo = NULL;
}
+*/
if (NULL == vgInfo) {
ctgError("no hash range found for hash value [%u], db:%s, numOfVgId:%d", hashValue, db,
- taosHashGetSize(dbInfo->vgHash));
+ (int32_t)taosArrayGetSize(dbInfo->vgArray));
CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
}
@@ -883,37 +898,15 @@ int32_t ctgGetVgInfoFromHashValue(SCatalog* pCtg, SDBVgInfo* dbInfo, const SName
CTG_RET(code);
}
-int32_t ctgHashValueComp(void const* lp, void const* rp) {
- uint32_t* key = (uint32_t*)lp;
- SVgroupInfo* pVg = *(SVgroupInfo**)rp;
-
- if (*key < pVg->hashBegin) {
- return -1;
- } else if (*key > pVg->hashEnd) {
- return 1;
- }
-
- return 0;
-}
-
-int ctgVgInfoComp(const void* lp, const void* rp) {
- SVgroupInfo* pLeft = *(SVgroupInfo**)lp;
- SVgroupInfo* pRight = *(SVgroupInfo**)rp;
- if (pLeft->hashBegin < pRight->hashBegin) {
- return -1;
- } else if (pLeft->hashBegin > pRight->hashBegin) {
- return 1;
- }
-
- return 0;
-}
-
int32_t ctgGetVgInfosFromHashValue(SCatalog* pCtg, SCtgTaskReq* tReq, SDBVgInfo* dbInfo, SCtgTbHashsCtx* pCtx,
char* dbFName, SArray* pNames, bool update) {
int32_t code = 0;
SCtgTask* pTask = tReq->pTask;
SMetaRes res = {0};
- int32_t vgNum = taosHashGetSize(dbInfo->vgHash);
+
+ CTG_ERR_RET(ctgMakeVgArray(dbInfo));
+
+ int32_t vgNum = taosArrayGetSize(dbInfo->vgArray);
if (vgNum <= 0) {
ctgError("db vgroup cache invalid, db:%s, vgroup number:%d", dbFName, vgNum);
CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
@@ -923,20 +916,13 @@ int32_t ctgGetVgInfosFromHashValue(SCatalog* pCtg, SCtgTaskReq* tReq, SDBVgInfo*
int32_t tbNum = taosArrayGetSize(pNames);
if (1 == vgNum) {
- void* pIter = taosHashIterate(dbInfo->vgHash, NULL);
- if (NULL == pIter) {
- ctgError("empty vgHash, db:%s, vgroup number:%d", dbFName, vgNum);
- CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
- }
-
for (int32_t i = 0; i < tbNum; ++i) {
vgInfo = taosMemoryMalloc(sizeof(SVgroupInfo));
if (NULL == vgInfo) {
- taosHashCancelIterate(dbInfo->vgHash, pIter);
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
- *vgInfo = *(SVgroupInfo*)pIter;
+ *vgInfo = *(SVgroupInfo*)taosArrayGet(dbInfo->vgArray, 0);
ctgDebug("Got tb hash vgroup, vgId:%d, epNum %d, current %s port %d", vgInfo->vgId, vgInfo->epSet.numOfEps,
vgInfo->epSet.eps[vgInfo->epSet.inUse].fqdn, vgInfo->epSet.eps[vgInfo->epSet.inUse].port);
@@ -951,19 +937,9 @@ int32_t ctgGetVgInfosFromHashValue(SCatalog* pCtg, SCtgTaskReq* tReq, SDBVgInfo*
}
}
- taosHashCancelIterate(dbInfo->vgHash, pIter);
return TSDB_CODE_SUCCESS;
}
- SArray* pVgList = taosArrayInit(vgNum, POINTER_BYTES);
- void* pIter = taosHashIterate(dbInfo->vgHash, NULL);
- while (pIter) {
- taosArrayPush(pVgList, &pIter);
- pIter = taosHashIterate(dbInfo->vgHash, pIter);
- }
-
- taosArraySort(pVgList, ctgVgInfoComp);
-
char tbFullName[TSDB_TABLE_FNAME_LEN];
sprintf(tbFullName, "%s.", dbFName);
int32_t offset = strlen(tbFullName);
@@ -979,20 +955,15 @@ int32_t ctgGetVgInfosFromHashValue(SCatalog* pCtg, SCtgTaskReq* tReq, SDBVgInfo*
uint32_t hashValue = taosGetTbHashVal(tbFullName, (uint32_t)strlen(tbFullName), dbInfo->hashMethod,
dbInfo->hashPrefix, dbInfo->hashSuffix);
- SVgroupInfo** p = taosArraySearch(pVgList, &hashValue, ctgHashValueComp, TD_EQ);
-
- if (NULL == p) {
+ vgInfo = taosArraySearch(dbInfo->vgArray, &hashValue, ctgHashValueComp, TD_EQ);
+ if (NULL == vgInfo) {
ctgError("no hash range found for hash value [%u], db:%s, numOfVgId:%d", hashValue, dbFName,
- taosHashGetSize(dbInfo->vgHash));
- taosArrayDestroy(pVgList);
+ (int32_t)taosArrayGetSize(dbInfo->vgArray));
CTG_ERR_RET(TSDB_CODE_CTG_INTERNAL_ERROR);
}
- vgInfo = *p;
-
SVgroupInfo* pNewVg = taosMemoryMalloc(sizeof(SVgroupInfo));
if (NULL == pNewVg) {
- taosArrayDestroy(pVgList);
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
@@ -1012,8 +983,6 @@ int32_t ctgGetVgInfosFromHashValue(SCatalog* pCtg, SCtgTaskReq* tReq, SDBVgInfo*
}
}
- taosArrayDestroy(pVgList);
-
CTG_RET(code);
}
@@ -1057,7 +1026,33 @@ int32_t ctgDbVgVersionSortCompare(const void* key1, const void* key2) {
}
}
+int32_t ctgMakeVgArray(SDBVgInfo* dbInfo) {
+ if (NULL == dbInfo) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ if (dbInfo->vgHash && NULL == dbInfo->vgArray) {
+ dbInfo->vgArray = taosArrayInit(100, sizeof(SVgroupInfo));
+ if (NULL == dbInfo->vgArray) {
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+
+ void* pIter = taosHashIterate(dbInfo->vgHash, NULL);
+ while (pIter) {
+ taosArrayPush(dbInfo->vgArray, pIter);
+ pIter = taosHashIterate(dbInfo->vgHash, pIter);
+ }
+
+ taosArraySort(dbInfo->vgArray, ctgVgInfoComp);
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+
int32_t ctgCloneVgInfo(SDBVgInfo* src, SDBVgInfo** dst) {
+ CTG_ERR_RET(ctgMakeVgArray(src));
+
*dst = taosMemoryMalloc(sizeof(SDBVgInfo));
if (NULL == *dst) {
qError("malloc %d failed", (int32_t)sizeof(SDBVgInfo));
@@ -1090,6 +1085,10 @@ int32_t ctgCloneVgInfo(SDBVgInfo* src, SDBVgInfo** dst) {
pIter = taosHashIterate(src->vgHash, pIter);
}
+ if (src->vgArray) {
+ (*dst)->vgArray = taosArrayDup(src->vgArray, NULL);
+ }
+
return TSDB_CODE_SUCCESS;
}
@@ -1188,7 +1187,7 @@ 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* ctgCloneDbVgroup(void* pSrc) { return taosArrayDup((const SArray*)pSrc, NULL); }
static void ctgFreeDbVgroup(void* p) { taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); }
@@ -1238,7 +1237,7 @@ static void* ctgCloneVgroupInfo(void* pSrc) {
static void ctgFreeVgroupInfo(void* p) { taosMemoryFree(((SMetaRes*)p)->pRes); }
-static void* ctgCloneTableIndices(void* pSrc) { return taosArrayDup((const SArray*)pSrc); }
+static void* ctgCloneTableIndices(void* pSrc) { return taosArrayDup((const SArray*)pSrc, NULL); }
static void ctgFreeTableIndices(void* p) { taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); }
@@ -1275,7 +1274,7 @@ static void* ctgCloneUserAuth(void* pSrc) {
static void ctgFreeUserAuth(void* p) { taosMemoryFree(((SMetaRes*)p)->pRes); }
-static void* ctgCloneQnodeList(void* pSrc) { return taosArrayDup((const SArray*)pSrc); }
+static void* ctgCloneQnodeList(void* pSrc) { return taosArrayDup((const SArray*)pSrc, NULL); }
static void ctgFreeQnodeList(void* p) { taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); }
@@ -1290,11 +1289,11 @@ static void* ctgCloneTableCfg(void* pSrc) {
static void ctgFreeTableCfg(void* p) { taosMemoryFree(((SMetaRes*)p)->pRes); }
-static void* ctgCloneDnodeList(void* pSrc) { return taosArrayDup((const SArray*)pSrc); }
+static void* ctgCloneDnodeList(void* pSrc) { return taosArrayDup((const SArray*)pSrc, NULL); }
static void ctgFreeDnodeList(void* p) { taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); }
-static int32_t ctgCloneMetaDataArray(SArray* pSrc, FCopy copyFunc, SArray** pDst) {
+static int32_t ctgCloneMetaDataArray(SArray* pSrc, __array_item_dup_fn_t copyFunc, SArray** pDst) {
if (NULL == pSrc) {
return TSDB_CODE_SUCCESS;
}
diff --git a/source/libs/command/inc/commandInt.h b/source/libs/command/inc/commandInt.h
index 4d0c5389e145bc91ebe459f95d8a34fa5b1552df..6acf19218d893a9962853e1fe7b0c73c8dddf7bc 100644
--- a/source/libs/command/inc/commandInt.h
+++ b/source/libs/command/inc/commandInt.h
@@ -34,6 +34,7 @@ extern "C" {
#define EXPLAIN_SYSTBL_SCAN_FORMAT "System Table Scan on %s"
#define EXPLAIN_DISTBLK_SCAN_FORMAT "Block Dist Scan on %s"
#define EXPLAIN_LASTROW_SCAN_FORMAT "Last Row Scan on %s"
+#define EXPLAIN_TABLE_COUNT_SCAN_FORMAT "Table Count Row Scan on %s"
#define EXPLAIN_PROJECTION_FORMAT "Projection"
#define EXPLAIN_JOIN_FORMAT "%s"
#define EXPLAIN_AGG_FORMAT "Aggragate"
diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c
index 64fec145efbf66922b37bf478cd5a52664e7a796..5f1b87a1386c1f9fa2009242c1660adf52bdc6a8 100644
--- a/source/libs/command/src/command.c
+++ b/source/libs/command/src/command.c
@@ -36,7 +36,7 @@ static int32_t buildRetrieveTableRsp(SSDataBlock* pBlock, int32_t numOfCols, SRe
(*pRsp)->precision = 0;
(*pRsp)->compressed = 0;
(*pRsp)->compLen = 0;
- (*pRsp)->numOfRows = htonl(pBlock->info.rows);
+ (*pRsp)->numOfRows = htobe64((int64_t)pBlock->info.rows);
(*pRsp)->numOfCols = htonl(numOfCols);
int32_t len = blockEncode(pBlock, (*pRsp)->data, numOfCols);
@@ -270,10 +270,10 @@ static void setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbFName, S
"CREATE DATABASE `%s` BUFFER %d CACHESIZE %d CACHEMODEL '%s' COMP %d DURATION %dm "
"WAL_FSYNC_PERIOD %d MAXROWS %d MINROWS %d KEEP %dm,%dm,%dm PAGES %d PAGESIZE %d PRECISION '%s' REPLICA %d "
"STRICT '%s' WAL_LEVEL %d VGROUPS %d SINGLE_STABLE %d",
- dbFName, pCfg->buffer, pCfg->cacheSize, cacheModelStr(pCfg->cacheLast), pCfg->compression, pCfg->daysPerFile, pCfg->walFsyncPeriod,
- pCfg->maxRows, pCfg->minRows, pCfg->daysToKeep0, pCfg->daysToKeep1, pCfg->daysToKeep2, pCfg->pages,
- pCfg->pageSize, prec, pCfg->replications, strictStr(pCfg->strict), pCfg->walLevel, pCfg->numOfVgroups,
- 1 == pCfg->numOfStables);
+ dbFName, pCfg->buffer, pCfg->cacheSize, cacheModelStr(pCfg->cacheLast), pCfg->compression, pCfg->daysPerFile,
+ pCfg->walFsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->daysToKeep0, pCfg->daysToKeep1, pCfg->daysToKeep2,
+ pCfg->pages, pCfg->pageSize, prec, pCfg->replications, strictStr(pCfg->strict), pCfg->walLevel,
+ pCfg->numOfVgroups, 1 == pCfg->numOfStables);
if (retentions) {
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, " RETENTIONS %s", retentions);
@@ -497,11 +497,11 @@ static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, SDbCfgInfo* p
SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
char* buf2 = taosMemoryMalloc(SHOW_CREATE_TB_RESULT_FIELD2_LEN);
if (NULL == buf2) {
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return terrno;
}
-
- int32_t len = 0;
+
+ int32_t len = 0;
if (TSDB_SUPER_TABLE == pCfg->tableType) {
len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE STABLE `%s` (", tbName);
@@ -533,7 +533,7 @@ static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, SDbCfgInfo* p
colDataAppend(pCol2, 0, buf2, false);
taosMemoryFree(buf2);
-
+
return TSDB_CODE_SUCCESS;
}
@@ -691,9 +691,15 @@ static int32_t createSelectResultDataBlock(SNodeList* pProjects, SSDataBlock** p
SNode* pProj = NULL;
FOREACH(pProj, pProjects) {
+ SExprNode* pExpr = (SExprNode*)pProj;
SColumnInfoData infoData = {0};
- infoData.info.type = ((SExprNode*)pProj)->resType.type;
- infoData.info.bytes = ((SExprNode*)pProj)->resType.bytes;
+ if (TSDB_DATA_TYPE_NULL == pExpr->resType.type) {
+ infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
+ infoData.info.bytes = 0;
+ } else {
+ infoData.info.type = pExpr->resType.type;
+ infoData.info.bytes = pExpr->resType.bytes;
+ }
blockDataAppendColInfo(pBlock, &infoData);
}
*pOutput = pBlock;
diff --git a/source/libs/command/src/explain.c b/source/libs/command/src/explain.c
index 915dc08c142bcff36e3e6b7fbc1306d3d3cb107f..253718048dcebb71b64ca4d4b48b3004c6d9ea3a 100644
--- a/source/libs/command/src/explain.c
+++ b/source/libs/command/src/explain.c
@@ -19,6 +19,7 @@
#include "query.h"
#include "tcommon.h"
#include "tdatablock.h"
+#include "systable.h"
int32_t qExplainGenerateResNode(SPhysiNode *pNode, SExplainGroup *group, SExplainResNode **pRes);
int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t level, bool singleChannel);
@@ -76,19 +77,19 @@ int32_t qExplainInitCtx(SExplainCtx **pCtx, SHashObj *groupHash, bool verbose, d
SExplainCtx *ctx = taosMemoryCalloc(1, sizeof(SExplainCtx));
if (NULL == ctx) {
qError("calloc SExplainCtx failed");
- QRY_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
SArray *rows = taosArrayInit(10, sizeof(SQueryExplainRowInfo));
if (NULL == rows) {
qError("taosArrayInit SQueryExplainRowInfo failed");
- QRY_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
char *tbuf = taosMemoryMalloc(TSDB_EXPLAIN_RESULT_ROW_SIZE);
if (NULL == tbuf) {
qError("malloc size %d failed", TSDB_EXPLAIN_RESULT_ROW_SIZE);
- QRY_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
ctx->mode = mode;
@@ -212,6 +213,11 @@ int32_t qExplainGenerateResChildren(SPhysiNode *pNode, SExplainGroup *group, SNo
pPhysiChildren = lastRowPhysiNode->scan.node.pChildren;
break;
}
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
+ STableCountScanPhysiNode *tableCountPhysiNode = (STableCountScanPhysiNode *)pNode;
+ pPhysiChildren = tableCountPhysiNode->scan.node.pChildren;
+ break;
+ }
case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
SGroupSortPhysiNode *groupSortPhysiNode = (SGroupSortPhysiNode *)pNode;
pPhysiChildren = groupSortPhysiNode->node.pChildren;
@@ -229,14 +235,14 @@ int32_t qExplainGenerateResChildren(SPhysiNode *pNode, SExplainGroup *group, SNo
}
default:
qError("not supported physical node type %d", pNode->type);
- QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ QRY_ERR_RET(TSDB_CODE_APP_ERROR);
}
if (pPhysiChildren) {
*pChildren = nodesMakeList();
if (NULL == *pChildren) {
qError("nodesMakeList failed");
- QRY_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
}
@@ -254,7 +260,7 @@ int32_t qExplainGenerateResNodeExecInfo(SPhysiNode *pNode, SArray **pExecInfo, S
*pExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainExecInfo));
if (NULL == (*pExecInfo)) {
qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
SExplainRsp *rsp = NULL;
@@ -266,7 +272,7 @@ int32_t qExplainGenerateResNodeExecInfo(SPhysiNode *pNode, SArray **pExecInfo, S
rsp = taosArrayGet(group->nodeExecInfo, group->nodeIdx++);
if (group->physiPlanExecIdx >= rsp->numOfPlans) {
qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx);
@@ -275,7 +281,7 @@ int32_t qExplainGenerateResNodeExecInfo(SPhysiNode *pNode, SArray **pExecInfo, S
rsp = taosArrayGet(group->nodeExecInfo, i);
if (group->physiPlanExecIdx >= rsp->numOfPlans) {
qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx);
@@ -291,13 +297,13 @@ int32_t qExplainGenerateResNode(SPhysiNode *pNode, SExplainGroup *group, SExplai
if (NULL == pNode) {
*pResNode = NULL;
qError("physical node is NULL");
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
SExplainResNode *resNode = taosMemoryCalloc(1, sizeof(SExplainResNode));
if (NULL == resNode) {
qError("calloc SPhysiNodeExplainRes failed");
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
int32_t code = 0;
@@ -372,7 +378,7 @@ int32_t qExplainResAppendRow(SExplainCtx *ctx, char *tbuf, int32_t len, int32_t
row.buf = taosMemoryMalloc(len);
if (NULL == row.buf) {
qError("taosMemoryMalloc %d failed", len);
- QRY_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
memcpy(row.buf, tbuf, len);
@@ -383,7 +389,7 @@ int32_t qExplainResAppendRow(SExplainCtx *ctx, char *tbuf, int32_t len, int32_t
if (NULL == taosArrayPush(ctx->rows, &row)) {
qError("taosArrayPush row to explain res rows failed");
taosMemoryFree(row.buf);
- QRY_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
return TSDB_CODE_SUCCESS;
@@ -401,7 +407,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
SPhysiNode *pNode = pResNode->pNode;
if (NULL == pNode) {
qError("pyhsical node in explain res node is NULL");
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
switch (pNode->type) {
@@ -782,13 +788,18 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
}
case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
SExchangePhysiNode *pExchNode = (SExchangePhysiNode *)pNode;
- SExplainGroup *group = taosHashGet(ctx->groupHash, &pExchNode->srcStartGroupId, sizeof(pExchNode->srcStartGroupId));
- if (NULL == group) {
- qError("exchange src group %d not in groupHash", pExchNode->srcStartGroupId);
- QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ int32_t nodeNum = 0;
+ for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
+ SExplainGroup *group = taosHashGet(ctx->groupHash, &pExchNode->srcStartGroupId, sizeof(pExchNode->srcStartGroupId));
+ if (NULL == group) {
+ qError("exchange src group %d not in groupHash", pExchNode->srcStartGroupId);
+ QRY_ERR_RET(TSDB_CODE_APP_ERROR);
+ }
+
+ nodeNum += group->nodeNum;
}
- EXPLAIN_ROW_NEW(level, EXPLAIN_EXCHANGE_FORMAT, pExchNode->singleChannel ? 1 : group->nodeNum);
+ EXPLAIN_ROW_NEW(level, EXPLAIN_EXCHANGE_FORMAT, pExchNode->singleChannel ? 1 : nodeNum);
EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
if (pResNode->pExecInfo) {
QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
@@ -819,7 +830,9 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
}
}
- QRY_ERR_RET(qExplainAppendGroupResRows(ctx, pExchNode->srcStartGroupId, level + 1, pExchNode->singleChannel));
+ for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
+ QRY_ERR_RET(qExplainAppendGroupResRows(ctx, i, level + 1, pExchNode->singleChannel));
+ }
break;
}
case QUERY_NODE_PHYSICAL_PLAN_SORT: {
@@ -1348,6 +1361,48 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
}
break;
}
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
+ STableCountScanPhysiNode *pLastRowNode = (STableCountScanPhysiNode *)pNode;
+ EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT,
+ ('\0' != pLastRowNode->scan.tableName.tname[0] ? pLastRowNode->scan.tableName.tname : TSDB_INS_TABLE_TABLES));
+ EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
+ if (pResNode->pExecInfo) {
+ QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
+ EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
+ }
+ EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, LIST_LENGTH(pLastRowNode->scan.pScanCols));
+ EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
+ if (pLastRowNode->scan.pScanPseudoCols) {
+ EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
+ EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
+ }
+ EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
+ EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
+ EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
+ EXPLAIN_ROW_END();
+ QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
+
+ if (verbose) {
+ EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
+ EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
+ nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
+ EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
+ EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
+ EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
+ EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
+ EXPLAIN_ROW_END();
+ QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
+
+ if (pLastRowNode->scan.node.pConditions) {
+ EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
+ QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
+ TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
+ EXPLAIN_ROW_END();
+ QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
+ }
+ }
+ break;
+ }
case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
SGroupSortPhysiNode *pSortNode = (SGroupSortPhysiNode *)pNode;
EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_SORT_FORMAT);
@@ -1530,7 +1585,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
}
default:
qError("not supported physical node type %d", pNode->type);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
return TSDB_CODE_SUCCESS;
@@ -1539,7 +1594,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
int32_t qExplainResNodeToRows(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t level) {
if (NULL == pResNode) {
qError("explain res node is NULL");
- QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ QRY_ERR_RET(TSDB_CODE_APP_ERROR);
}
int32_t code = 0;
@@ -1559,7 +1614,7 @@ int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t level, b
SExplainGroup *group = taosHashGet(ctx->groupHash, &groupId, sizeof(groupId));
if (NULL == group) {
qError("group %d not in groupHash", groupId);
- QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ QRY_ERR_RET(TSDB_CODE_APP_ERROR);
}
group->singleChannel = singleChannel;
@@ -1581,7 +1636,7 @@ int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
int32_t rowNum = taosArrayGetSize(pCtx->rows);
if (rowNum <= 0) {
qError("empty explain res rows");
- QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ QRY_ERR_RET(TSDB_CODE_APP_ERROR);
}
SSDataBlock *pBlock = createDataBlock();
@@ -1604,11 +1659,11 @@ int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
if (NULL == rsp) {
qError("malloc SRetrieveTableRsp failed, size:%d", rspSize);
blockDataDestroy(pBlock);
- QRY_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
rsp->completed = 1;
- rsp->numOfRows = htonl(rowNum);
+ rsp->numOfRows = htobe64((int64_t)rowNum);
int32_t len = blockEncode(pBlock, rsp->data, taosArrayGetSize(pBlock->pDataBlock));
ASSERT(len == rspSize - sizeof(SRetrieveTableRsp));
@@ -1643,7 +1698,7 @@ int32_t qExplainPrepareCtx(SQueryPlan *pDag, SExplainCtx **pCtx) {
taosHashInit(EXPLAIN_MAX_GROUP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
if (NULL == groupHash) {
qError("groupHash %d failed", EXPLAIN_MAX_GROUP_NUM);
- QRY_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
QRY_ERR_JRET(
@@ -1677,7 +1732,7 @@ int32_t qExplainPrepareCtx(SQueryPlan *pDag, SExplainCtx **pCtx) {
if (0 != taosHashPut(groupHash, &plan->id.groupId, sizeof(plan->id.groupId), &group, sizeof(group))) {
qError("taosHashPut to explainGroupHash failed, taskIdx:%d", n);
- QRY_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
}
@@ -1745,7 +1800,7 @@ int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t
if (NULL == group) {
qError("group %d not in groupHash", groupId);
tFreeSExplainRsp(pRspMsg);
- QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ QRY_ERR_RET(TSDB_CODE_APP_ERROR);
}
taosWLockLatch(&group->lock);
@@ -1756,7 +1811,7 @@ int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t
tFreeSExplainRsp(pRspMsg);
taosWUnLockLatch(&group->lock);
- QRY_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ QRY_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
group->physiPlanExecNum = pRspMsg->numOfPlans;
@@ -1766,7 +1821,7 @@ int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t
tFreeSExplainRsp(pRspMsg);
taosWUnLockLatch(&group->lock);
- QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ QRY_ERR_RET(TSDB_CODE_APP_ERROR);
}
if (group->physiPlanExecNum != pRspMsg->numOfPlans) {
@@ -1775,7 +1830,7 @@ int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t
tFreeSExplainRsp(pRspMsg);
taosWUnLockLatch(&group->lock);
- QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ QRY_ERR_RET(TSDB_CODE_APP_ERROR);
}
taosArrayPush(group->nodeExecInfo, pRspMsg);
diff --git a/source/libs/executor/inc/executil.h b/source/libs/executor/inc/executil.h
index fd8a357a8b50bfddc3346bb0f8a92b0712bfcd9f..51150ede3c6b31c1a75dd4dd1197a4fe4f7d20a1 100644
--- a/source/libs/executor/inc/executil.h
+++ b/source/libs/executor/inc/executil.h
@@ -38,16 +38,7 @@
memcpy((_k) + sizeof(uint64_t), (_ori), (_len)); \
} while (0)
-#define SET_RES_EXT_WINDOW_KEY(_k, _ori, _len, _uid, _buf) \
- do { \
- assert(sizeof(_uid) == sizeof(uint64_t)); \
- *(void**)(_k) = (_buf); \
- *(uint64_t*)((_k) + POINTER_BYTES) = (_uid); \
- memcpy((_k) + POINTER_BYTES + sizeof(uint64_t), (_ori), (_len)); \
- } while (0)
-
#define GET_RES_WINDOW_KEY_LEN(_l) ((_l) + sizeof(uint64_t))
-#define GET_RES_EXT_WINDOW_KEY_LEN(_l) ((_l) + sizeof(uint64_t) + POINTER_BYTES)
#define GET_TASKID(_t) (((SExecTaskInfo*)(_t))->id.str)
@@ -104,16 +95,17 @@ int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags
STableListInfo* pTableListInfo, SNode* pTagCond, SNode* pTagIndexCond, SExecTaskInfo* pTaskInfo);
STableListInfo* tableListCreate();
-void* tableListDestroy(STableListInfo* pTableListInfo);
-void tableListClear(STableListInfo* pTableListInfo);
-int32_t tableListGetOutputGroups(const STableListInfo* pTableList);
-bool oneTableForEachGroup(const STableListInfo* pTableList);
-uint64_t getTableGroupId(const STableListInfo* pTableList, uint64_t tableUid);
-int32_t tableListAddTableInfo(STableListInfo* pTableList, uint64_t uid, uint64_t gid);
-int32_t tableListGetGroupList(const STableListInfo* pTableList, int32_t ordinalIndex, STableKeyInfo** pKeyInfo, int32_t* num);
-uint64_t tableListGetSize(const STableListInfo* pTableList);
-uint64_t tableListGetSuid(const STableListInfo* pTableList);
-STableKeyInfo* tableListGetInfo(const STableListInfo* pTableList, int32_t index);
+void* tableListDestroy(STableListInfo* pTableListInfo);
+void tableListClear(STableListInfo* pTableListInfo);
+int32_t tableListGetOutputGroups(const STableListInfo* pTableList);
+bool oneTableForEachGroup(const STableListInfo* pTableList);
+uint64_t getTableGroupId(const STableListInfo* pTableList, uint64_t tableUid);
+int32_t tableListAddTableInfo(STableListInfo* pTableList, uint64_t uid, uint64_t gid);
+int32_t tableListGetGroupList(const STableListInfo* pTableList, int32_t ordinalIndex, STableKeyInfo** pKeyInfo,
+ int32_t* num);
+uint64_t tableListGetSize(const STableListInfo* pTableList);
+uint64_t tableListGetSuid(const STableListInfo* pTableList);
+STableKeyInfo* tableListGetInfo(const STableListInfo* pTableList, int32_t index);
size_t getResultRowSize(struct SqlFunctionCtx* pCtx, int32_t numOfOutput);
void initResultRowInfo(SResultRowInfo* pResultRowInfo);
@@ -140,7 +132,7 @@ bool hasRemainResults(SGroupResInfo* pGroupResInfo);
int32_t getNumOfTotalRes(SGroupResInfo* pGroupResInfo);
-SSDataBlock* createResDataBlock(SDataBlockDescNode* pNode);
+SSDataBlock* createDataBlockFromDescNode(SDataBlockDescNode* pNode);
EDealRes doTranslateTagExpr(SNode** pNode, void* pContext);
int32_t getGroupIdFromTagsVal(void* pMeta, uint64_t uid, SNodeList* pGroupNode, char* keyBuf, uint64_t* pGroupId);
@@ -169,4 +161,6 @@ int32_t convertFillType(int32_t mode);
int32_t resultrowComparAsc(const void* p1, const void* p2);
int32_t isQualifiedTable(STableKeyInfo* info, SNode* pTagCond, void* metaHandle, bool* pQualified);
+void printDataBlock(SSDataBlock* pBlock, const char* flag);
+
#endif // TDENGINE_QUERYUTIL_H
diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h
index b4420348604beb0f31923828dc9807b32994fac7..b302641c94df828c785554ebd32911e043589680 100644
--- a/source/libs/executor/inc/executorimpl.h
+++ b/source/libs/executor/inc/executorimpl.h
@@ -46,7 +46,6 @@ extern "C" {
typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int32_t order);
-#define Q_STATUS_EQUAL(p, s) (((p) & (s)) != 0u)
#define IS_VALID_SESSION_WIN(winInfo) ((winInfo).sessionWin.win.skey > 0)
#define SET_SESSION_WIN_INVALID(winInfo) ((winInfo).sessionWin.win.skey = INT64_MIN)
#define IS_INVALID_SESSION_WIN_KEY(winKey) ((winKey).win.skey <= 0)
@@ -109,6 +108,7 @@ typedef int32_t (*__optr_open_fn_t)(struct SOperatorInfo* pOptr);
typedef SSDataBlock* (*__optr_fn_t)(struct SOperatorInfo* pOptr);
typedef void (*__optr_close_fn_t)(void* param);
typedef int32_t (*__optr_explain_fn_t)(struct SOperatorInfo* pOptr, void** pOptrExplain, uint32_t* len);
+typedef int32_t (*__optr_reqBuf_fn_t)(struct SOperatorInfo* pOptr);
typedef struct STaskIdInfo {
uint64_t queryId; // this is also a request id
@@ -153,12 +153,12 @@ typedef struct {
SSchemaWrapper* qsw;
} SSchemaInfo;
-typedef struct {
+typedef struct SExchangeOpStopInfo {
int32_t operatorType;
int64_t refId;
} SExchangeOpStopInfo;
-typedef struct {
+typedef struct STaskStopInfo {
SRWLatch lock;
SArray* pStopInfo;
} STaskStopInfo;
@@ -170,8 +170,9 @@ struct SExecTaskInfo {
STaskCostInfo cost;
int64_t owner; // if it is in execution
int32_t code;
+ int32_t qbufQuota; // total available buffer (in KB) during execution query
- int64_t version; // used for stream to record wal version
+ int64_t version; // used for stream to record wal version, why not move to sschemainfo
SStreamTaskInfo streamInfo;
SSchemaInfo schemaInfo;
STableListInfo* pTableInfoList; // this is a table list
@@ -181,6 +182,7 @@ struct SExecTaskInfo {
SSubplan* pSubplan;
struct SOperatorInfo* pRoot;
SLocalFetch localFetch;
+ SArray* pResultBlockList;// result block list
STaskStopInfo stopInfo;
};
@@ -197,6 +199,7 @@ typedef struct SOperatorFpSet {
__optr_fn_t getNextFn;
__optr_fn_t cleanupFn; // call this function to release the allocated resources ASAP
__optr_close_fn_t closeFn;
+ __optr_reqBuf_fn_t reqBufFn; // total used buffer for blocking operator
__optr_encode_fn_t encodeResultRow;
__optr_decode_fn_t decodeResultRow;
__optr_explain_fn_t getExplainFn;
@@ -252,21 +255,22 @@ typedef struct SLimitInfo {
} SLimitInfo;
typedef struct SExchangeInfo {
- SArray* pSources;
- SArray* pSourceDataInfo;
- tsem_t ready;
- void* pTransporter;
+ SArray* pSources;
+ SArray* pSourceDataInfo;
+ tsem_t ready;
+ void* pTransporter;
+
// SArray, result block list, used to keep the multi-block that
// passed by downstream operator
SArray* pResultBlockList;
- int32_t rspBlockIndex; // indicate the return block index in pResultBlockList
+ SArray* pRecycledBlocks;// build a pool for small data block to avoid to repeatly create and then destroy.
SSDataBlock* pDummyBlock; // dummy block, not keep data
bool seqLoadData; // sequential load data or not, false by default
int32_t current;
SLoadRemoteDataInfo loadInfo;
uint64_t self;
SLimitInfo limitInfo;
- int64_t openedTs; // start exec time stamp
+ int64_t openedTs; // start exec time stamp, todo: move to SLoadRemoteDataInfo
} SExchangeInfo;
typedef struct SScanInfo {
@@ -301,9 +305,9 @@ typedef struct {
} SAggOptrPushDownInfo;
typedef struct STableMetaCacheInfo {
- SLRUCache* pTableMetaEntryCache; // 100 by default
- uint64_t metaFetch;
- uint64_t cacheHit;
+ SLRUCache* pTableMetaEntryCache; // 100 by default
+ uint64_t metaFetch;
+ uint64_t cacheHit;
} STableMetaCacheInfo;
typedef struct STableScanBase {
@@ -330,6 +334,7 @@ typedef struct STableScanInfo {
int32_t currentTable;
int8_t scanMode;
int8_t assignBlockUid;
+ bool hasGroupByTag;
} STableScanInfo;
typedef struct STableMergeScanInfo {
@@ -479,6 +484,26 @@ typedef struct {
SSnapContext* sContext;
} SStreamRawScanInfo;
+typedef struct STableCountScanSupp {
+ int16_t dbNameSlotId;
+ int16_t stbNameSlotId;
+ int16_t tbCountSlotId;
+ bool groupByDbName;
+ bool groupByStbName;
+ char dbNameFilter[TSDB_DB_NAME_LEN];
+ char stbNameFilter[TSDB_TABLE_NAME_LEN];
+} STableCountScanSupp;
+
+typedef struct STableCountScanOperatorInfo {
+ SReadHandle readHandle;
+ SSDataBlock* pRes;
+
+ STableCountScanSupp supp;
+
+ int32_t currGrpIdx;
+ SArray* stbUidList; // when group by db_name and/or stable_name
+} STableCountScanOperatorInfo;
+
typedef struct SOptrBasicInfo {
SResultRowInfo resultRowInfo;
SSDataBlock* pRes;
@@ -533,34 +558,9 @@ typedef struct SStreamIntervalOperatorInfo {
SArray* pChildren;
SStreamState* pState;
SWinKey delKey;
+ uint64_t numOfDatapack;
} SStreamIntervalOperatorInfo;
-typedef struct SAggOperatorInfo {
- SOptrBasicInfo binfo;
- SAggSupporter aggSup;
- STableQueryInfo* current;
- uint64_t groupId;
- SGroupResInfo groupResInfo;
- SExprSupp scalarExprSup;
-} SAggOperatorInfo;
-
-typedef struct SFillOperatorInfo {
- struct SFillInfo* pFillInfo;
- SSDataBlock* pRes;
- SSDataBlock* pFinalRes;
- int64_t totalInputRows;
- void** p;
- SSDataBlock* existNewGroupBlock;
- STimeWindow win;
- SColMatchInfo matchInfo;
- int32_t primaryTsCol;
- int32_t primarySrcSlotId;
- uint64_t curGroupId; // current handled group id
- SExprInfo* pExprInfo;
- int32_t numOfExpr;
- SExprSupp noFillExprSupp;
-} SFillOperatorInfo;
-
typedef struct SDataGroupInfo {
uint64_t groupId;
int64_t numOfRows;
@@ -575,18 +575,6 @@ typedef struct SWindowRowsSup {
uint64_t groupId;
} SWindowRowsSup;
-typedef struct SSessionAggOperatorInfo {
- SOptrBasicInfo binfo;
- SAggSupporter aggSup;
-
- SGroupResInfo groupResInfo;
- SWindowRowsSup winSup;
- bool reptScan; // next round scan
- int64_t gap; // session window gap
- int32_t tsSlotId; // primary timestamp slot id
- STimeWindowAggSupp twAggSup;
-} SSessionAggOperatorInfo;
-
typedef struct SResultWindowInfo {
void* pOutputBuf;
SSessionKey sessionWin;
@@ -679,53 +667,31 @@ typedef struct SStreamFillOperatorInfo {
SStreamFillInfo* pFillInfo;
} SStreamFillOperatorInfo;
-typedef struct STimeSliceOperatorInfo {
- SSDataBlock* pRes;
- STimeWindow win;
- SInterval interval;
- int64_t current;
- SArray* pPrevRow; // SArray
- SArray* pNextRow; // SArray
- SArray* pLinearInfo; // SArray
- bool isPrevRowSet;
- bool isNextRowSet;
- int32_t fillType; // fill type
- SColumn tsCol; // primary timestamp column
- SExprSupp scalarSup; // scalar calculation
- struct SFillColInfo* pFillColInfo; // fill column info
-} STimeSliceOperatorInfo;
-
-typedef struct SStateWindowOperatorInfo {
- // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode
- SOptrBasicInfo binfo;
- SAggSupporter aggSup;
- SExprSupp scalarSup;
-
- SGroupResInfo groupResInfo;
- SWindowRowsSup winSup;
- SColumn stateCol; // start row index
- bool hasKey;
- SStateKeys stateKey;
- int32_t tsSlotId; // primary timestamp column slot id
- STimeWindowAggSupp twAggSup;
-} SStateWindowOperatorInfo;
-
#define OPTR_IS_OPENED(_optr) (((_optr)->status & OP_OPENED) == OP_OPENED)
#define OPTR_SET_OPENED(_optr) ((_optr)->status |= OP_OPENED)
SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t cleanup,
- __optr_close_fn_t closeFn, __optr_explain_fn_t explain);
-
-int32_t operatorDummyOpenFn(SOperatorInfo* pOperator);
-int32_t appendDownstream(SOperatorInfo* p, SOperatorInfo** pDownstream, int32_t num);
+ __optr_close_fn_t closeFn, __optr_reqBuf_fn_t reqBufFn, __optr_explain_fn_t explain);
+int32_t optrDummyOpenFn(SOperatorInfo* pOperator);
+int32_t appendDownstream(SOperatorInfo* p, SOperatorInfo** pDownstream, int32_t num);
+void setOperatorCompleted(SOperatorInfo* pOperator);
+void setOperatorInfo(SOperatorInfo* pOperator, const char* name, int32_t type, bool blocking, int32_t status,
+ void* pInfo, SExecTaskInfo* pTaskInfo);
+void destroyOperatorInfo(SOperatorInfo* pOperator);
+int32_t optrDefaultBufFn(SOperatorInfo* pOperator);
void initBasicInfo(SOptrBasicInfo* pInfo, SSDataBlock* pBlock);
void cleanupBasicInfo(SOptrBasicInfo* pInfo);
+
int32_t initExprSupp(SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfExpr);
void cleanupExprSupp(SExprSupp* pSup);
+
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);
+
+int32_t initAggSup(SExprSupp* pSup, SAggSupporter* pAggSup, SExprInfo* pExprInfo, int32_t numOfCols, size_t keyBufSize,
+ const char* pkey);
+void cleanupAggSup(SAggSupporter* pAggSup);
+
void initResultSizeInfo(SResultInfo* pResultInfo, int32_t numOfRows);
void doBuildStreamResBlock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo,
@@ -733,15 +699,15 @@ void doBuildStreamResBlock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGr
void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo,
SDiskbasedBuf* pBuf);
-bool hasLimitOffsetInfo(SLimitInfo* pLimitInfo);
-void initLimitInfo(const SNode* pLimit, const SNode* pSLimit, SLimitInfo* pLimitInfo);
+bool hasLimitOffsetInfo(SLimitInfo* pLimitInfo);
+void initLimitInfo(const SNode* pLimit, const SNode* pSLimit, SLimitInfo* pLimitInfo);
void applyLimitOffset(SLimitInfo* pLimitInfo, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo, SOperatorInfo* pOperator);
-void doApplyFunctions(SExecTaskInfo* taskInfo, SqlFunctionCtx* pCtx, SColumnInfoData* pTimeWindowData, int32_t offset,
- int32_t forwardStep, int32_t numOfTotal, int32_t numOfOutput);
+void applyAggFunctionOnPartialTuples(SExecTaskInfo* taskInfo, SqlFunctionCtx* pCtx, SColumnInfoData* pTimeWindowData,
+ int32_t offset, int32_t forwardStep, int32_t numOfTotal, int32_t numOfOutput);
int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, char* pData, SArray* pColList, char** pNextStart);
-void updateLoadRemoteInfo(SLoadRemoteDataInfo* pInfo, int32_t numOfRows, int32_t dataLen, int64_t startTs,
+void updateLoadRemoteInfo(SLoadRemoteDataInfo* pInfo, int64_t numOfRows, int32_t dataLen, int64_t startTs,
SOperatorInfo* pOperator);
STimeWindow getFirstQualifiedTimeWindow(int64_t ts, STimeWindow* pWindow, SInterval* pInterval, int32_t order);
@@ -749,125 +715,101 @@ STimeWindow getFirstQualifiedTimeWindow(int64_t ts, STimeWindow* pWindow, SInter
int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scanFlag);
int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz);
-void doDestroyExchangeOperatorInfo(void* param);
+extern void doDestroyExchangeOperatorInfo(void* param);
-void setOperatorCompleted(SOperatorInfo* pOperator);
-void setOperatorInfo(SOperatorInfo* pOperator, const char* name, int32_t type, bool blocking, int32_t status,
- void* pInfo, SExecTaskInfo* pTaskInfo);
void doFilter(SSDataBlock* pBlock, SFilterInfo* pFilterInfo, SColMatchInfo* pColMatchInfo);
int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int32_t numOfExpr, SSDataBlock* pBlock,
int32_t rows, const char* idStr, STableMetaCacheInfo* pCache);
-void cleanupAggSup(SAggSupporter* pAggSup);
void appendOneRowToDataBlock(SSDataBlock* pBlock, STupleHandle* pTupleHandle);
void setTbNameColData(const SSDataBlock* pBlock, SColumnInfoData* pColInfoData, int32_t functionId, const char* name);
-SSDataBlock* loadNextDataBlock(void* param);
-
void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowEntryInfoOffset);
SResultRow* doSetResultOutBufByKey(SDiskbasedBuf* pResultBuf, SResultRowInfo* pResultRowInfo, char* pData,
int16_t bytes, bool masterscan, uint64_t groupId, SExecTaskInfo* pTaskInfo,
bool isIntervalQuery, SAggSupporter* pSup);
-
+// operator creater functions
+// clang-format off
SOperatorInfo* createExchangeOperatorInfo(void* pTransporter, SExchangePhysiNode* pExNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* pHandle,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysiNode* pPhyNode,
- STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode,
- const char* pUser, SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* pHandle, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* readHandle, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode, const char* pUser, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createTableCountScanOperatorInfo(SReadHandle* handle, STableCountScanPhysiNode* pNode, SExecTaskInfo* pTaskInfo);
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SAggPhysiNode* pNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhysiNode* pProjPhyNode,
- SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhysiNode* pProjPhyNode, SExecTaskInfo* pTaskInfo);
+
SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode* pSortNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** dowStreams, size_t numStreams,
- SMergePhysiNode* pMergePhysiNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pTableScanNode, SReadHandle* readHandle,
- SExecTaskInfo* pTaskInfo);
-
-SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SIntervalPhysiNode* pPhyNode,
- SExecTaskInfo* pTaskInfo, bool isStream);
-SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMergeIntervalPhysiNode* pIntervalPhyNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SMergeAlignedIntervalPhysiNode* pNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
- SExecTaskInfo* pTaskInfo, int32_t numOfChild);
-SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionWinodwPhysiNode* pSessionNode,
- SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** dowStreams, size_t numStreams, SMergePhysiNode* pMergePhysiNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pTableScanNode, SReadHandle* readHandle, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SIntervalPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, bool isStream);
+
+SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMergeIntervalPhysiNode* pIntervalPhyNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SMergeAlignedIntervalPhysiNode* pNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild);
+
+SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionWinodwPhysiNode* pSessionNode, SExecTaskInfo* pTaskInfo);
+
SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SAggPhysiNode* pAggNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDistScanPhysiNode* pBlockScanNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode, SNode* pTagCond,
- SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDistScanPhysiNode* pBlockScanNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode, SNode* pTagCond, SExecTaskInfo* pTaskInfo);
SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode,
- SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStreamPartitionPhysiNode* pPartNode,
- SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStreamPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo);
SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream,
- SSortMergeJoinPhysiNode* pJoinNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
- SExecTaskInfo* pTaskInfo, int32_t numOfChild);
-SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
- SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream, SSortMergeJoinPhysiNode* pJoinNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild);
+
+SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFillPhysiNode* pPhyFillNode,
- SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFillPhysiNode* pPhyFillNode, SExecTaskInfo* pTaskInfo);
+
+SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSortPhysiNode* pSortPhyNode, SExecTaskInfo* pTaskInfo);
+// clang-format on
int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBlock* pSrcBlock, SqlFunctionCtx* pCtx,
int32_t numOfOutput, SArray* pPseudoList);
void setInputDataBlock(SExprSupp* pExprSupp, SSDataBlock* pBlock, int32_t order, int32_t scanFlag, bool createDummyCol);
-bool isTaskKilled(SExecTaskInfo* pTaskInfo);
int32_t checkForQueryBuf(size_t numOfTables);
-void setTaskKilled(SExecTaskInfo* pTaskInfo);
-void queryCostStatis(SExecTaskInfo* pTaskInfo);
+bool isTaskKilled(SExecTaskInfo* pTaskInfo);
+void setTaskKilled(SExecTaskInfo* pTaskInfo, int32_t rspCode);
void doDestroyTask(SExecTaskInfo* pTaskInfo);
-void destroyOperatorInfo(SOperatorInfo* pOperator);
-int32_t getMaximumIdleDurationSec();
-
-/*
- * ops: root operator
- * data: *data save the result of encode, need to be freed by caller
- * length: *length save the length of *data
- * nOptrWithVal: *nOptrWithVal save the number of optr with value
- * return: result code, 0 means success
- */
-int32_t encodeOperator(SOperatorInfo* ops, char** data, int32_t* length, int32_t* nOptrWithVal);
-
-/*
- * ops: root operator, created by caller
- * data: save the result of decode
- * length: the length of data
- * return: result code, 0 means success
- */
-int32_t decodeOperator(SOperatorInfo* ops, const char* data, int32_t length);
-
void setTaskStatus(SExecTaskInfo* pTaskInfo, int8_t status);
+
int32_t createExecTaskInfoImpl(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, SReadHandle* pHandle, uint64_t taskId,
char* sql, EOPTR_EXEC_MODEL model);
int32_t createDataSinkParam(SDataSinkNode* pNode, void** pParam, qTaskInfo_t* pTaskInfo, SReadHandle* readHandle);
@@ -888,22 +830,13 @@ bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup);
bool isDeletedStreamWindow(STimeWindow* pWin, uint64_t groupId, SStreamState* pState, STimeWindowAggSupp* pTwSup);
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);
-void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock);
+uint64_t calGroupIdByData(SPartitionBySupporter* pParSup, SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t rowId);
+void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock);
int32_t finalizeResultRows(SDiskbasedBuf* pBuf, SResultRowPosition* resultRowPosition, SExprSupp* pSup,
SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSortPhysiNode* pSortPhyNode,
- SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* readHandle,
- SExecTaskInfo* pTaskInfo);
-
-void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsColIndex);
-
bool groupbyTbname(SNodeList* pGroupList);
-void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput);
int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock* pBlock, SExprSupp* pSup,
SGroupResInfo* pGroupResInfo);
int32_t saveSessionDiscBuf(SStreamState* pState, SSessionKey* key, void* buf, int32_t size);
diff --git a/source/libs/executor/inc/tfill.h b/source/libs/executor/inc/tfill.h
index b0017fef5037ed030e3295019436a1d5fd48296e..fad4059515f386ca94ce2c97985184ff4b95f744 100644
--- a/source/libs/executor/inc/tfill.h
+++ b/source/libs/executor/inc/tfill.h
@@ -25,6 +25,8 @@ extern "C" {
#include "tcommon.h"
#include "tsimplehash.h"
+#define GET_DEST_SLOT_ID(_p) ((_p)->pExpr->base.resSchema.slotId)
+
struct SSDataBlock;
typedef struct SFillColInfo {
@@ -113,12 +115,12 @@ typedef struct SStreamFillInfo {
int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, int64_t ekey, int32_t maxNumOfRows);
-void taosFillSetStartInfo(struct SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey);
-void taosResetFillInfo(struct SFillInfo* pFillInfo, TSKEY startTimestamp);
-void taosFillSetInputDataBlock(struct SFillInfo* pFillInfo, const struct SSDataBlock* pInput);
-struct SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprInfo* pNotFillExpr,
- int32_t numOfNotFillCols, const struct SNodeListNode* val);
-bool taosFillHasMoreResults(struct SFillInfo* pFillInfo);
+void taosFillSetStartInfo(struct SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey);
+void taosResetFillInfo(struct SFillInfo* pFillInfo, TSKEY startTimestamp);
+void taosFillSetInputDataBlock(struct SFillInfo* pFillInfo, const struct SSDataBlock* pInput);
+SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprInfo* pNotFillExpr,
+ int32_t numOfNotFillCols, const struct SNodeListNode* val);
+bool taosFillHasMoreResults(struct SFillInfo* pFillInfo);
SFillInfo* taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t capacity,
SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, int32_t slotId,
@@ -128,6 +130,8 @@ void* taosDestroyFillInfo(struct SFillInfo* pFillInfo);
int64_t taosFillResultDataBlock(struct SFillInfo* pFillInfo, SSDataBlock* p, int32_t capacity);
int64_t getFillInfoStart(struct SFillInfo* pFillInfo);
+bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData,
+ int32_t rowIndex);
#ifdef __cplusplus
}
#endif
diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c
index 6b5f773fe35a0c7072e7c81d005a65c9b84d8fb2..672bb09b14ecdba9e79c674d850100e8a07195ff 100644
--- a/source/libs/executor/src/cachescanoperator.c
+++ b/source/libs/executor/src/cachescanoperator.c
@@ -44,6 +44,8 @@ static void destroyCacheScanOperator(void* param);
static int32_t extractCacheScanSlotId(const SArray* pColMatchInfo, SExecTaskInfo* pTaskInfo, int32_t** pSlotIds);
static int32_t removeRedundantTsCol(SLastRowScanPhysiNode* pScanNode, SColMatchInfo* pColMatchInfo);
+#define SCAN_ROW_TYPE(_t) ((_t)? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW)
+
SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SReadHandle* readHandle,
SExecTaskInfo* pTaskInfo) {
int32_t code = TSDB_CODE_SUCCESS;
@@ -57,7 +59,7 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
pInfo->readHandle = *readHandle;
SDataBlockDescNode* pDescNode = pScanNode->scan.node.pOutputDataBlockDesc;
- pInfo->pRes = createResDataBlock(pDescNode);
+ pInfo->pRes = createDataBlockFromDescNode(pDescNode);
int32_t numOfCols = 0;
code =
@@ -75,32 +77,36 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
STableListInfo* pTableList = pTaskInfo->pTableInfoList;
- initResultSizeInfo(&pOperator->resultInfo, 4096);
- blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
+ int32_t totalTables = tableListGetSize(pTableList);
+ int32_t capacity = 0;
+
pInfo->pUidList = taosArrayInit(4, sizeof(int64_t));
- // partition by tbname, todo opt perf
- if (oneTableForEachGroup(pTableList) || (tableListGetSize(pTableList) == 1)) {
- pInfo->retrieveType =
- CACHESCAN_RETRIEVE_TYPE_ALL | (pScanNode->ignoreNull ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW);
+ // partition by tbname
+ if (oneTableForEachGroup(pTableList) || (totalTables == 1)) {
+ pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_ALL | SCAN_ROW_TYPE(pScanNode->ignoreNull);
STableKeyInfo* pList = tableListGetInfo(pTableList, 0);
- size_t num = tableListGetSize(pTableList);
uint64_t suid = tableListGetSuid(pTableList);
- code = tsdbCacherowsReaderOpen(pInfo->readHandle.vnode, pInfo->retrieveType, pList, num,
+ code = tsdbCacherowsReaderOpen(pInfo->readHandle.vnode, pInfo->retrieveType, pList, totalTables,
taosArrayGetSize(pInfo->matchInfo.pList), suid, &pInfo->pLastrowReader);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
+ capacity = TMIN(totalTables, 4096);
+
pInfo->pBufferredRes = createOneDataBlock(pInfo->pRes, false);
- blockDataEnsureCapacity(pInfo->pBufferredRes, pOperator->resultInfo.capacity);
+ blockDataEnsureCapacity(pInfo->pBufferredRes, capacity);
} else { // by tags
- pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_SINGLE |
- (pScanNode->ignoreNull ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW);
+ pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_SINGLE | SCAN_ROW_TYPE(pScanNode->ignoreNull);
+ capacity = 1; // only one row output
}
+ initResultSizeInfo(&pOperator->resultInfo, capacity);
+ blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
+
if (pScanNode->scan.pScanPseudoCols != NULL) {
SExprSupp* p = &pInfo->pseudoExprSup;
p->pExprInfo = createExprInfo(pScanNode->scan.pScanPseudoCols, NULL, &p->numOfExprs);
@@ -111,7 +117,7 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doScanCache, NULL, destroyCacheScanOperator, NULL);
+ createOperatorFpSet(optrDummyOpenFn, doScanCache, NULL, destroyCacheScanOperator, optrDefaultBufFn, NULL);
pOperator->cost.openCost = 0;
return pOperator;
@@ -179,7 +185,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
}
}
- pRes->info.uid = *(tb_uid_t*)taosArrayGet(pInfo->pUidList, pInfo->indexOfBufferedRes);
+ pRes->info.id.uid = *(tb_uid_t*)taosArrayGet(pInfo->pUidList, pInfo->indexOfBufferedRes);
pRes->info.rows = 1;
SExprSupp* pSup = &pInfo->pseudoExprSup;
@@ -190,7 +196,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
return NULL;
}
- pRes->info.groupId = getTableGroupId(pTableList, pRes->info.uid);
+ pRes->info.id.groupId = getTableGroupId(pTableList, pRes->info.id.uid);
pInfo->indexOfBufferedRes += 1;
return pRes;
} else {
@@ -226,12 +232,12 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
SExprSupp* pSup = &pInfo->pseudoExprSup;
STableKeyInfo* pKeyInfo = &((STableKeyInfo*)pList)[0];
- pInfo->pRes->info.groupId = pKeyInfo->groupId;
+ pInfo->pRes->info.id.groupId = pKeyInfo->groupId;
if (taosArrayGetSize(pInfo->pUidList) > 0) {
ASSERT((pInfo->retrieveType & CACHESCAN_RETRIEVE_LAST_ROW) == CACHESCAN_RETRIEVE_LAST_ROW);
- pInfo->pRes->info.uid = *(tb_uid_t*)taosArrayGet(pInfo->pUidList, 0);
+ pInfo->pRes->info.id.uid = *(tb_uid_t*)taosArrayGet(pInfo->pUidList, 0);
code = addTagPseudoColumnData(&pInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pInfo->pRes, pInfo->pRes->info.rows,
GET_TASKID(pTaskInfo), NULL);
if (code != TSDB_CODE_SUCCESS) {
diff --git a/source/libs/executor/src/dataDeleter.c b/source/libs/executor/src/dataDeleter.c
index c7a248020472e229a2f786f8918e71fc8a36d765..12fb44923836f9de852e302906a27cecdeebcc8a 100644
--- a/source/libs/executor/src/dataDeleter.c
+++ b/source/libs/executor/src/dataDeleter.c
@@ -135,12 +135,12 @@ static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput,
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
SDataDeleterBuf* pBuf = taosAllocateQitem(sizeof(SDataDeleterBuf), DEF_QITEM);
if (NULL == pBuf) {
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
if (!allocBuf(pDeleter, pInput, pBuf)) {
taosFreeQitem(pBuf);
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
toDataCacheEntry(pDeleter, pInput, pBuf);
diff --git a/source/libs/executor/src/dataDispatcher.c b/source/libs/executor/src/dataDispatcher.c
index 3d9757c96f0e46f7c4aedd4c78833bba5f1ebdcd..c45226e02bdc742c796f7b0cec6db45fe2e4afc9 100644
--- a/source/libs/executor/src/dataDispatcher.c
+++ b/source/libs/executor/src/dataDispatcher.c
@@ -128,17 +128,19 @@ static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput,
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
SDataDispatchBuf* pBuf = taosAllocateQitem(sizeof(SDataDispatchBuf), DEF_QITEM);
if (NULL == pBuf) {
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
if (!allocBuf(pDispatcher, pInput, pBuf)) {
taosFreeQitem(pBuf);
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
toDataCacheEntry(pDispatcher, pInput, pBuf);
taosWriteQitem(pDispatcher->pDataBlocks, pBuf);
- *pContinue = (DS_BUF_LOW == updateStatus(pDispatcher) ? true : false);
+
+ int32_t status = updateStatus(pDispatcher);
+ *pContinue = (status == DS_BUF_LOW || status == DS_BUF_EMPTY);
return TSDB_CODE_SUCCESS;
}
@@ -235,8 +237,8 @@ static int32_t getCacheSize(struct SDataSinkHandle* pHandle, uint64_t* size) {
int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pDataSink, DataSinkHandle* pHandle) {
SDataDispatchHandle* dispatcher = taosMemoryCalloc(1, sizeof(SDataDispatchHandle));
if (NULL == dispatcher) {
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
dispatcher->sink.fPut = putDataBlock;
dispatcher->sink.fEndPut = endPut;
@@ -252,8 +254,8 @@ int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pD
taosThreadMutexInit(&dispatcher->mutex, NULL);
if (NULL == dispatcher->pDataBlocks) {
taosMemoryFree(dispatcher);
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
*pHandle = dispatcher;
return TSDB_CODE_SUCCESS;
diff --git a/source/libs/executor/src/dataInserter.c b/source/libs/executor/src/dataInserter.c
index 09ca1d27b914c1ff888cd6e5c7990e6642343f4d..346fcc9729d30e896a24dc63bc3f996e14606da3 100644
--- a/source/libs/executor/src/dataInserter.c
+++ b/source/libs/executor/src/dataInserter.c
@@ -101,7 +101,7 @@ static int32_t sendSubmitRequest(SDataInserterHandle* pInserter, SSubmitReq* pMs
SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (NULL == pMsgSendInfo) {
taosMemoryFreeClear(pMsg);
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return terrno;
}
@@ -304,8 +304,8 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
void* pParam) {
SDataInserterHandle* inserter = taosMemoryCalloc(1, sizeof(SDataInserterHandle));
if (NULL == inserter) {
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
SQueryInserterNode* pInserterNode = (SQueryInserterNode*)pDataSink;
@@ -342,8 +342,8 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
if (NULL == inserter->pDataBlocks) {
destroyDataSinker((SDataSinkHandle*)inserter);
taosMemoryFree(inserter);
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
inserter->pCols = taosHashInit(pInserterNode->pCols->length, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT),
diff --git a/source/libs/executor/src/exchangeoperator.c b/source/libs/executor/src/exchangeoperator.c
index c858536bb1d9ff0832caef0048387cea93bdd98b..8423b77906da9088cb0815688b6e072aed650880 100644
--- a/source/libs/executor/src/exchangeoperator.c
+++ b/source/libs/executor/src/exchangeoperator.c
@@ -15,26 +15,15 @@
#include "filter.h"
#include "function.h"
-#include "functionMgt.h"
#include "os.h"
-#include "querynodes.h"
-#include "tfill.h"
#include "tname.h"
#include "tref.h"
-
#include "tdatablock.h"
-#include "tglobal.h"
#include "tmsg.h"
-#include "tsort.h"
-#include "ttime.h"
-
#include "executorimpl.h"
#include "index.h"
#include "query.h"
-#include "tcompare.h"
#include "thash.h"
-#include "ttypes.h"
-#include "vnode.h"
typedef struct SFetchRspHandleWrapper {
uint32_t exchangeId;
@@ -51,9 +40,9 @@ typedef struct SSourceDataInfo {
const char* taskId;
} SSourceDataInfo;
-static void destroyExchangeOperatorInfo(void* param);
-static void freeBlock(void* pParam);
-static void freeSourceDataInfo(void* param);
+static void destroyExchangeOperatorInfo(void* param);
+static void freeBlock(void* pParam);
+static void freeSourceDataInfo(void* param);
static void* setAllSourcesCompleted(SOperatorInfo* pOperator);
static int32_t loadRemoteDataCallback(void* param, SDataBuf* pMsg, int32_t code);
@@ -62,7 +51,9 @@ static int32_t getCompletedSources(const SArray* pArray);
static int32_t prepareConcurrentlyLoad(SOperatorInfo* pOperator);
static int32_t seqLoadRemoteData(SOperatorInfo* pOperator);
static int32_t prepareLoadRemoteData(SOperatorInfo* pOperator);
-static int32_t handleLimitOffset(SOperatorInfo* pOperator, SLimitInfo* pLimitInfo, SSDataBlock* pBlock, bool holdDataInBuf);
+static int32_t handleLimitOffset(SOperatorInfo* pOperator, SLimitInfo* pLimitInfo, SSDataBlock* pBlock,
+ bool holdDataInBuf);
+static int32_t doExtractResultBlocks(SExchangeInfo* pExchangeInfo, SSourceDataInfo* pDataInfo);
static void concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SExchangeInfo* pExchangeInfo,
SExecTaskInfo* pTaskInfo) {
@@ -75,9 +66,11 @@ static void concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SExchangeIn
}
while (1) {
+ qDebug("prepare wait for ready, %p, %s", pExchangeInfo, GET_TASKID(pTaskInfo));
tsem_wait(&pExchangeInfo->ready);
+
if (isTaskKilled(pTaskInfo)) {
- longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ longjmp(pTaskInfo->env, pTaskInfo->code);
}
for (int32_t i = 0; i < totalSources; ++i) {
@@ -103,41 +96,33 @@ static void concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SExchangeIn
if (pRsp->numOfRows == 0) {
pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
qDebug("%s vgId:%d, taskId:0x%" PRIx64 " execId:%d index:%d completed, rowsOfSource:%" PRIu64
- ", totalRows:%" PRIu64 ", try next %d/%" PRIzu,
+ ", totalRows:%" PRIu64 ", try next %d/%" PRIzu,
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, i, pDataInfo->totalRows,
pExchangeInfo->loadInfo.totalRows, i + 1, totalSources);
taosMemoryFreeClear(pDataInfo->pRsp);
break;
}
- SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
- int32_t index = 0;
- char* pStart = pRetrieveRsp->data;
- while (index++ < pRetrieveRsp->numOfBlocks) {
- SSDataBlock* pb = createOneDataBlock(pExchangeInfo->pDummyBlock, false);
- code = extractDataBlockFromFetchRsp(pb, pStart, NULL, &pStart);
- if (code != 0) {
- taosMemoryFreeClear(pDataInfo->pRsp);
- goto _error;
- }
-
- taosArrayPush(pExchangeInfo->pResultBlockList, &pb);
+ code = doExtractResultBlocks(pExchangeInfo, pDataInfo);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
}
+ SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
updateLoadRemoteInfo(pLoadInfo, pRetrieveRsp->numOfRows, pRetrieveRsp->compLen, pDataInfo->startTime, pOperator);
pDataInfo->totalRows += pRetrieveRsp->numOfRows;
if (pRsp->completed == 1) {
pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64
- " execId:%d index:%d completed, blocks:%d, numOfRows:%d, rowsOfSource:%" PRIu64 ", totalRows:%" PRIu64
- ", total:%.2f Kb, try next %d/%" PRIzu,
+ " execId:%d index:%d completed, blocks:%d, numOfRows:%" PRId64 ", rowsOfSource:%" PRIu64 ", totalRows:%" PRIu64
+ ", total:%.2f Kb, try next %d/%" PRIzu,
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, i, pRsp->numOfBlocks,
- pRsp->numOfRows, pDataInfo->totalRows, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0,
- i + 1, totalSources);
+ pRsp->numOfRows, pDataInfo->totalRows, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0, i + 1,
+ totalSources);
} else {
qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64
- " execId:%d blocks:%d, numOfRows:%d, totalRows:%" PRIu64 ", total:%.2f Kb",
+ " execId:%d blocks:%d, numOfRows:%" PRId64 ", totalRows:%" PRIu64 ", total:%.2f Kb",
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRsp->numOfBlocks,
pRsp->numOfRows, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0);
}
@@ -162,7 +147,7 @@ static void concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SExchangeIn
}
}
- _error:
+_error:
pTaskInfo->code = code;
}
@@ -185,10 +170,17 @@ static SSDataBlock* doLoadRemoteDataImpl(SOperatorInfo* pOperator) {
return NULL;
}
- size_t size = taosArrayGetSize(pExchangeInfo->pResultBlockList);
- if (size == 0 || pExchangeInfo->rspBlockIndex >= size) {
- pExchangeInfo->rspBlockIndex = 0;
- taosArrayClearEx(pExchangeInfo->pResultBlockList, freeBlock);
+ // we have buffered retrieved datablock, return it directly
+ SSDataBlock* p = NULL;
+ if (taosArrayGetSize(pExchangeInfo->pResultBlockList) > 0) {
+ p = taosArrayGetP(pExchangeInfo->pResultBlockList, 0);
+ taosArrayRemove(pExchangeInfo->pResultBlockList, 0);
+ }
+
+ if (p != NULL) {
+ taosArrayPush(pExchangeInfo->pRecycledBlocks, &p);
+ return p;
+ } else {
if (pExchangeInfo->seqLoadData) {
seqLoadRemoteData(pOperator);
} else {
@@ -197,14 +189,16 @@ static SSDataBlock* doLoadRemoteDataImpl(SOperatorInfo* pOperator) {
if (taosArrayGetSize(pExchangeInfo->pResultBlockList) == 0) {
return NULL;
+ } else {
+ p = taosArrayGetP(pExchangeInfo->pResultBlockList, 0);
+ taosArrayRemove(pExchangeInfo->pResultBlockList, 0);
+ taosArrayPush(pExchangeInfo->pRecycledBlocks, &p);
+ return p;
}
}
-
- // we have buffered retrieved datablock, return it directly
- return taosArrayGetP(pExchangeInfo->pResultBlockList, pExchangeInfo->rspBlockIndex++);
}
-static SSDataBlock* doLoadRemoteData(SOperatorInfo* pOperator) {
+static SSDataBlock* loadRemoteData(SOperatorInfo* pOperator) {
SExchangeInfo* pExchangeInfo = pOperator->info;
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
@@ -298,22 +292,25 @@ SOperatorInfo* createExchangeOperatorInfo(void* pTransporter, SExchangePhysiNode
}
tsem_init(&pInfo->ready, 0, 0);
- pInfo->pDummyBlock = createResDataBlock(pExNode->node.pOutputDataBlockDesc);
- pInfo->pResultBlockList = taosArrayInit(1, POINTER_BYTES);
+ pInfo->pDummyBlock = createDataBlockFromDescNode(pExNode->node.pOutputDataBlockDesc);
+ pInfo->pResultBlockList = taosArrayInit(64, POINTER_BYTES);
+ pInfo->pRecycledBlocks = taosArrayInit(64, POINTER_BYTES);
SExchangeOpStopInfo stopInfo = {QUERY_NODE_PHYSICAL_PLAN_EXCHANGE, pInfo->self};
qAppendTaskStopInfo(pTaskInfo, &stopInfo);
-
- pInfo->seqLoadData = false;
+
+ pInfo->seqLoadData = pExNode->seqRecvData;
pInfo->pTransporter = pTransporter;
- setOperatorInfo(pOperator, "ExchangeOperator", QUERY_NODE_PHYSICAL_PLAN_EXCHANGE, false, OP_NOT_OPENED, pInfo, pTaskInfo);
+ setOperatorInfo(pOperator, "ExchangeOperator", QUERY_NODE_PHYSICAL_PLAN_EXCHANGE, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pDummyBlock->pDataBlock);
- pOperator->fpSet = createOperatorFpSet(prepareLoadRemoteData, doLoadRemoteData, NULL, destroyExchangeOperatorInfo, NULL);
+ pOperator->fpSet =
+ createOperatorFpSet(prepareLoadRemoteData, loadRemoteData, NULL, destroyExchangeOperatorInfo, optrDefaultBufFn, NULL);
return pOperator;
- _error:
+_error:
if (pInfo != NULL) {
doDestroyExchangeOperatorInfo(pInfo);
}
@@ -344,10 +341,8 @@ void doDestroyExchangeOperatorInfo(void* param) {
taosArrayDestroy(pExInfo->pSources);
taosArrayDestroyEx(pExInfo->pSourceDataInfo, freeSourceDataInfo);
- if (pExInfo->pResultBlockList != NULL) {
- taosArrayDestroyEx(pExInfo->pResultBlockList, freeBlock);
- pExInfo->pResultBlockList = NULL;
- }
+ taosArrayDestroyEx(pExInfo->pResultBlockList, freeBlock);
+ taosArrayDestroyEx(pExInfo->pRecycledBlocks, freeBlock);
blockDataDestroy(pExInfo->pDummyBlock);
@@ -360,7 +355,7 @@ int32_t loadRemoteDataCallback(void* param, SDataBuf* pMsg, int32_t code) {
SExchangeInfo* pExchangeInfo = taosAcquireRef(exchangeObjRefPool, pWrapper->exchangeId);
if (pExchangeInfo == NULL) {
- qWarn("failed to acquire exchange operator, since it may have been released");
+ qWarn("failed to acquire exchange operator, since it may have been released, %p", pExchangeInfo);
taosMemoryFree(pMsg->pData);
return TSDB_CODE_SUCCESS;
}
@@ -372,27 +367,31 @@ int32_t loadRemoteDataCallback(void* param, SDataBuf* pMsg, int32_t code) {
pSourceDataInfo->pRsp = pMsg->pData;
SRetrieveTableRsp* pRsp = pSourceDataInfo->pRsp;
- pRsp->numOfRows = htonl(pRsp->numOfRows);
+ pRsp->numOfRows = htobe64(pRsp->numOfRows);
pRsp->compLen = htonl(pRsp->compLen);
pRsp->numOfCols = htonl(pRsp->numOfCols);
pRsp->useconds = htobe64(pRsp->useconds);
pRsp->numOfBlocks = htonl(pRsp->numOfBlocks);
ASSERT(pRsp != NULL);
- qDebug("%s fetch rsp received, index:%d, blocks:%d, rows:%d", pSourceDataInfo->taskId, index, pRsp->numOfBlocks,
- pRsp->numOfRows);
+ qDebug("%s fetch rsp received, index:%d, blocks:%d, rows:%" PRId64 ", %p", pSourceDataInfo->taskId, index, pRsp->numOfBlocks,
+ pRsp->numOfRows, pExchangeInfo);
} else {
taosMemoryFree(pMsg->pData);
pSourceDataInfo->code = code;
- qDebug("%s fetch rsp received, index:%d, error:%s", pSourceDataInfo->taskId, index, tstrerror(code));
+ qDebug("%s fetch rsp received, index:%d, error:%s, %p", pSourceDataInfo->taskId, index, tstrerror(code),
+ pExchangeInfo);
}
pSourceDataInfo->status = EX_SOURCE_DATA_READY;
+ code = tsem_post(&pExchangeInfo->ready);
+ if (code != TSDB_CODE_SUCCESS) {
+ code = TAOS_SYSTEM_ERROR(code);
+ qError("failed to invoke post when fetch rsp is ready, code:%s, %p", tstrerror(code), pExchangeInfo);
+ }
- tsem_post(&pExchangeInfo->ready);
taosReleaseRef(exchangeObjRefPool, pWrapper->exchangeId);
-
- return TSDB_CODE_SUCCESS;
+ return code;
}
int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTaskInfo, int32_t sourceIndex) {
@@ -416,37 +415,52 @@ int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTas
loadRemoteDataCallback(pWrapper, &pBuf, code);
taosMemoryFree(pWrapper);
} else {
- SResFetchReq* pMsg = taosMemoryCalloc(1, sizeof(SResFetchReq));
- if (NULL == pMsg) {
- pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ SResFetchReq req = {0};
+ req.header.vgId = pSource->addr.nodeId;
+ req.sId = pSource->schedId;
+ req.taskId = pSource->taskId;
+ req.queryId = pTaskInfo->id.queryId;
+ req.execId = pSource->execId;
+
+ int32_t msgSize = tSerializeSResFetchReq(NULL, 0, &req);
+ if (msgSize < 0) {
+ pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
taosMemoryFree(pWrapper);
return pTaskInfo->code;
}
- qDebug("%s build fetch msg and send to vgId:%d, ep:%s, taskId:0x%" PRIx64 ", execId:%d, %d/%" PRIzu,
- GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->addr.epSet.eps[0].fqdn, pSource->taskId,
- pSource->execId, sourceIndex, totalSources);
+ void* msg = taosMemoryCalloc(1, msgSize);
+ if (NULL == msg) {
+ pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
+ taosMemoryFree(pWrapper);
+ return pTaskInfo->code;
+ }
+
+ if (tSerializeSResFetchReq(msg, msgSize, &req) < 0) {
+ pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
+ taosMemoryFree(pWrapper);
+ taosMemoryFree(msg);
+ return pTaskInfo->code;
+ }
- pMsg->header.vgId = htonl(pSource->addr.nodeId);
- pMsg->sId = htobe64(pSource->schedId);
- pMsg->taskId = htobe64(pSource->taskId);
- pMsg->queryId = htobe64(pTaskInfo->id.queryId);
- pMsg->execId = htonl(pSource->execId);
+ qDebug("%s build fetch msg and send to vgId:%d, ep:%s, taskId:0x%" PRIx64 ", execId:%d, %p, %d/%" PRIzu,
+ GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->addr.epSet.eps[0].fqdn, pSource->taskId,
+ pSource->execId, pExchangeInfo, sourceIndex, totalSources);
// send the fetch remote task result reques
SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (NULL == pMsgSendInfo) {
- taosMemoryFreeClear(pMsg);
+ taosMemoryFreeClear(msg);
taosMemoryFree(pWrapper);
qError("%s prepare message %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
- pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
return pTaskInfo->code;
}
pMsgSendInfo->param = pWrapper;
pMsgSendInfo->paramFreeFp = taosMemoryFree;
- pMsgSendInfo->msgInfo.pData = pMsg;
- pMsgSendInfo->msgInfo.len = sizeof(SResFetchReq);
+ pMsgSendInfo->msgInfo.pData = msg;
+ pMsgSendInfo->msgInfo.len = msgSize;
pMsgSendInfo->msgType = pSource->fetchMsgType;
pMsgSendInfo->fp = loadRemoteDataCallback;
@@ -458,7 +472,7 @@ int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTas
return TSDB_CODE_SUCCESS;
}
-void updateLoadRemoteInfo(SLoadRemoteDataInfo* pInfo, int32_t numOfRows, int32_t dataLen, int64_t startTs,
+void updateLoadRemoteInfo(SLoadRemoteDataInfo* pInfo, int64_t numOfRows, int32_t dataLen, int64_t startTs,
SOperatorInfo* pOperator) {
pInfo->totalRows += numOfRows;
pInfo->totalSize += dataLen;
@@ -511,7 +525,7 @@ void* setAllSourcesCompleted(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
- size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
+ size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
qDebug("%s all %" PRIzu " sources are exhausted, total rows: %" PRIu64 ", %.2f Kb, elapsed:%.2f ms",
GET_TASKID(pTaskInfo), totalSources, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0,
pLoadInfo->totalElapsed / 1000.0);
@@ -556,20 +570,39 @@ int32_t prepareConcurrentlyLoad(SOperatorInfo* pOperator) {
pOperator->status = OP_RES_TO_RETURN;
pOperator->cost.openCost = taosGetTimestampUs() - startTs;
-
- tsem_wait(&pExchangeInfo->ready);
if (isTaskKilled(pTaskInfo)) {
- longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ longjmp(pTaskInfo->env, pTaskInfo->code);
}
-
- tsem_post(&pExchangeInfo->ready);
+
return TSDB_CODE_SUCCESS;
}
+int32_t doExtractResultBlocks(SExchangeInfo* pExchangeInfo, SSourceDataInfo* pDataInfo) {
+ SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
+
+ char* pStart = pRetrieveRsp->data;
+ int32_t index = 0;
+ int32_t code = 0;
+ while (index++ < pRetrieveRsp->numOfBlocks) {
+ SSDataBlock* pb = createOneDataBlock(pExchangeInfo->pDummyBlock, false);
+
+ code = extractDataBlockFromFetchRsp(pb, pStart, NULL, &pStart);
+ if (code != 0) {
+ taosMemoryFreeClear(pDataInfo->pRsp);
+ return code;
+ }
+
+ taosArrayPush(pExchangeInfo->pResultBlockList, &pb);
+ }
+
+ return code;
+}
+
int32_t seqLoadRemoteData(SOperatorInfo* pOperator) {
SExchangeInfo* pExchangeInfo = pOperator->info;
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ int32_t code = 0;
size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
int64_t startTs = taosGetTimestampUs();
@@ -579,13 +612,15 @@ int32_t seqLoadRemoteData(SOperatorInfo* pOperator) {
return TSDB_CODE_SUCCESS;
}
+ SSourceDataInfo* pDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, pExchangeInfo->current);
+ pDataInfo->status = EX_SOURCE_DATA_NOT_READY;
+
doSendFetchDataRequest(pExchangeInfo, pTaskInfo, pExchangeInfo->current);
tsem_wait(&pExchangeInfo->ready);
if (isTaskKilled(pTaskInfo)) {
- longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ longjmp(pTaskInfo->env, pTaskInfo->code);
}
- SSourceDataInfo* pDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, pExchangeInfo->current);
SDownstreamSourceNode* pSource = taosArrayGet(pExchangeInfo->pSources, pExchangeInfo->current);
if (pDataInfo->code != TSDB_CODE_SUCCESS) {
@@ -597,9 +632,10 @@ int32_t seqLoadRemoteData(SOperatorInfo* pOperator) {
SRetrieveTableRsp* pRsp = pDataInfo->pRsp;
SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
+
if (pRsp->numOfRows == 0) {
qDebug("%s vgId:%d, taskID:0x%" PRIx64 " execId:%d %d of total completed, rowsOfSource:%" PRIu64
- ", totalRows:%" PRIu64 " try next",
+ ", totalRows:%" PRIu64 " try next",
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pExchangeInfo->current + 1,
pDataInfo->totalRows, pLoadInfo->totalRows);
@@ -609,14 +645,15 @@ int32_t seqLoadRemoteData(SOperatorInfo* pOperator) {
continue;
}
- SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
-
- char* pStart = pRetrieveRsp->data;
- int32_t code = extractDataBlockFromFetchRsp(NULL, pStart, NULL, &pStart);
+ code = doExtractResultBlocks(pExchangeInfo, pDataInfo);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+ SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
if (pRsp->completed == 1) {
- qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64 " execId:%d numOfRows:%d, rowsOfSource:%" PRIu64
- ", totalRows:%" PRIu64 ", totalBytes:%" PRIu64 " try next %d/%" PRIzu,
+ qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64 " execId:%d numOfRows:%" PRId64 ", rowsOfSource:%" PRIu64
+ ", totalRows:%" PRIu64 ", totalBytes:%" PRIu64 " try next %d/%" PRIzu,
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRetrieveRsp->numOfRows,
pDataInfo->totalRows, pLoadInfo->totalRows, pLoadInfo->totalSize, pExchangeInfo->current + 1,
totalSources);
@@ -624,8 +661,8 @@ int32_t seqLoadRemoteData(SOperatorInfo* pOperator) {
pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
pExchangeInfo->current += 1;
} else {
- qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64 " execId:%d numOfRows:%d, totalRows:%" PRIu64
- ", totalBytes:%" PRIu64,
+ qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64 " execId:%d numOfRows:%" PRId64 ", totalRows:%" PRIu64
+ ", totalBytes:%" PRIu64,
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRetrieveRsp->numOfRows,
pLoadInfo->totalRows, pLoadInfo->totalSize);
}
@@ -636,6 +673,10 @@ int32_t seqLoadRemoteData(SOperatorInfo* pOperator) {
taosMemoryFreeClear(pDataInfo->pRsp);
return TSDB_CODE_SUCCESS;
}
+
+_error:
+ pTaskInfo->code = code;
+ return code;
}
int32_t prepareLoadRemoteData(SOperatorInfo* pOperator) {
@@ -662,10 +703,10 @@ int32_t prepareLoadRemoteData(SOperatorInfo* pOperator) {
int32_t handleLimitOffset(SOperatorInfo* pOperator, SLimitInfo* pLimitInfo, SSDataBlock* pBlock, bool holdDataInBuf) {
if (pLimitInfo->remainGroupOffset > 0) {
if (pLimitInfo->currentGroupId == 0) { // it is the first group
- pLimitInfo->currentGroupId = pBlock->info.groupId;
+ pLimitInfo->currentGroupId = pBlock->info.id.groupId;
blockDataCleanup(pBlock);
return PROJECT_RETRIEVE_CONTINUE;
- } else if (pLimitInfo->currentGroupId != pBlock->info.groupId) {
+ } else if (pLimitInfo->currentGroupId != pBlock->info.id.groupId) {
// now it is the data from a new group
pLimitInfo->remainGroupOffset -= 1;
@@ -677,11 +718,11 @@ int32_t handleLimitOffset(SOperatorInfo* pOperator, SLimitInfo* pLimitInfo, SSDa
}
// set current group id of the project operator
- pLimitInfo->currentGroupId = pBlock->info.groupId;
+ pLimitInfo->currentGroupId = pBlock->info.id.groupId;
}
// here check for a new group data, we need to handle the data of the previous group.
- if (pLimitInfo->currentGroupId != 0 && pLimitInfo->currentGroupId != pBlock->info.groupId) {
+ if (pLimitInfo->currentGroupId != 0 && pLimitInfo->currentGroupId != pBlock->info.id.groupId) {
pLimitInfo->numOfOutputGroups += 1;
if ((pLimitInfo->slimit.limit > 0) && (pLimitInfo->slimit.limit <= pLimitInfo->numOfOutputGroups)) {
pOperator->status = OP_EXEC_DONE;
@@ -703,7 +744,7 @@ int32_t handleLimitOffset(SOperatorInfo* pOperator, SLimitInfo* pLimitInfo, SSDa
// here we reach the start position, according to the limit/offset requirements.
// set current group id
- pLimitInfo->currentGroupId = pBlock->info.groupId;
+ pLimitInfo->currentGroupId = pBlock->info.id.groupId;
if (pLimitInfo->remainOffset >= pBlock->info.rows) {
pLimitInfo->remainOffset -= pBlock->info.rows;
diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c
index d1046ff02cbbabcf31442e1c4b151a9006aaa836..fc3cfbd0f65bc7668679fc23aa8466a11ee9ac81 100644
--- a/source/libs/executor/src/executil.c
+++ b/source/libs/executor/src/executil.c
@@ -129,6 +129,7 @@ void initGroupedResultInfo(SGroupResInfo* pGroupResInfo, SSHashObj* pHashmap, in
void* pData = NULL;
pGroupResInfo->pRows = taosArrayInit(10, POINTER_BYTES);
+ // todo avoid repeated malloc memory
size_t keyLen = 0;
int32_t iter = 0;
while ((pData = tSimpleHashIterate(pHashmap, pData, &iter)) != NULL) {
@@ -208,12 +209,12 @@ SArray* createSortInfo(SNodeList* pNodeList) {
return pList;
}
-SSDataBlock* createResDataBlock(SDataBlockDescNode* pNode) {
+SSDataBlock* createDataBlockFromDescNode(SDataBlockDescNode* pNode) {
int32_t numOfCols = LIST_LENGTH(pNode->pSlots);
SSDataBlock* pBlock = createDataBlock();
- pBlock->info.blockId = pNode->dataBlockId;
+ pBlock->info.id.blockId = pNode->dataBlockId;
pBlock->info.type = STREAM_INVALID;
pBlock->info.calWin = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
pBlock->info.watermark = INT64_MIN;
@@ -290,7 +291,7 @@ int32_t isQualifiedTable(STableKeyInfo* info, SNode* pTagCond, void* metaHandle,
SMetaReader mr = {0};
metaReaderInit(&mr, metaHandle, 0);
- code = metaGetTableEntryByUid(&mr, info->uid);
+ code = metaGetTableEntryByUidCache(&mr, info->uid);
if (TSDB_CODE_SUCCESS != code) {
metaReaderClear(&mr);
*pQualified = false;
@@ -405,7 +406,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray*
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
- ctx.index = 0;
+
ctx.cInfoList = taosArrayInit(4, sizeof(SColumnInfo));
if (ctx.cInfoList == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
@@ -421,7 +422,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray*
}
for (int32_t i = 0; i < taosArrayGetSize(ctx.cInfoList); ++i) {
- SColumnInfoData colInfo = {0, {0}};
+ SColumnInfoData colInfo = {0};
colInfo.info = *(SColumnInfo*)taosArrayGet(ctx.cInfoList, i);
blockDataAppendColInfo(pResBlock, &colInfo);
}
@@ -438,13 +439,14 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray*
goto end;
}
}
+ if (suid != 0) {
+ removeInvalidTable(uidList, tags);
+ }
int32_t rows = taosArrayGetSize(uidList);
if (rows == 0) {
goto end;
}
- // int64_t stt1 = taosGetTimestampUs();
- // qDebug("generate tag meta rows:%d, cost:%ld us", rows, stt1-stt);
code = blockDataEnsureCapacity(pResBlock, rows);
if (code != TSDB_CODE_SUCCESS) {
@@ -452,7 +454,6 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray*
goto end;
}
- // int64_t st = taosGetTimestampUs();
for (int32_t i = 0; i < rows; i++) {
int64_t* uid = taosArrayGet(uidList, i);
for (int32_t j = 0; j < taosArrayGetSize(pResBlock->pDataBlock); j++) {
@@ -467,7 +468,9 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray*
#endif
} else {
void* tag = taosHashGet(tags, uid, sizeof(int64_t));
- ASSERT(tag);
+ if (tag == NULL) {
+ continue;
+ }
STagVal tagVal = {0};
tagVal.cid = pColInfo->info.colId;
const char* p = metaGetTableTagVal(tag, pColInfo->info.type, &tagVal);
@@ -582,7 +585,7 @@ int32_t getColInfoResultForGroupby(void* metaHandle, SNodeList* group, STableLis
}
for (int32_t i = 0; i < taosArrayGetSize(ctx.cInfoList); ++i) {
- SColumnInfoData colInfo = {0, {0}};
+ SColumnInfoData colInfo = {0};
colInfo.info = *(SColumnInfo*)taosArrayGet(ctx.cInfoList, i);
blockDataAppendColInfo(pResBlock, &colInfo);
}
@@ -923,14 +926,14 @@ static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray*
return -1;
}
- SArray* pTbList = getTableNameList(pList);
- int32_t numOfTables = taosArrayGetSize(pTbList);
- SHashObj *uHash = NULL;
+ SArray* pTbList = getTableNameList(pList);
+ int32_t numOfTables = taosArrayGetSize(pTbList);
+ SHashObj* uHash = NULL;
size_t listlen = taosArrayGetSize(list); // len > 0 means there already have uids
if (listlen > 0) {
uHash = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
for (int i = 0; i < listlen; i++) {
- int64_t *uid = taosArrayGet(list, i);
+ int64_t* uid = taosArrayGet(list, i);
taosHashPut(uHash, uid, sizeof(int64_t), &i, sizeof(i));
}
}
@@ -964,67 +967,132 @@ static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray*
return -1;
}
+static void genTagFilterDigest(const SNode* pTagCond, T_MD5_CTX* pContext) {
+ if (pTagCond == NULL) {
+ return;
+ }
+
+ char* payload = NULL;
+ int32_t len = 0;
+ nodesNodeToMsg(pTagCond, &payload, &len);
+
+ tMD5Init(pContext);
+ tMD5Update(pContext, (uint8_t*)payload, (uint32_t)len);
+ tMD5Final(pContext);
+
+ taosMemoryFree(payload);
+}
+
+static int32_t doFilterByTagCond(STableListInfo* pListInfo, SArray* res, SNode* pTagCond, void* metaHandle) {
+ if (pTagCond == NULL) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ terrno = TDB_CODE_SUCCESS;
+ SColumnInfoData* pColInfoData = getColInfoResult(metaHandle, pListInfo->suid, res, pTagCond);
+ if (terrno != TDB_CODE_SUCCESS) {
+ colDataDestroy(pColInfoData);
+ taosMemoryFreeClear(pColInfoData);
+ taosArrayDestroy(res);
+ qError("failed to getColInfoResult, code: %s", tstrerror(terrno));
+ return terrno;
+ }
+
+ int32_t i = 0;
+ int32_t len = taosArrayGetSize(res);
+
+ if (pColInfoData != NULL) {
+ bool* pResult = (bool*)pColInfoData->pData;
+ SArray* p = taosArrayInit(taosArrayGetSize(res), sizeof(uint64_t));
+
+ while (i < len && pColInfoData) {
+ int64_t* uid = taosArrayGet(res, i);
+ qDebug("tagfilter get uid:%" PRId64 ", res:%d", *uid, pResult[i]);
+
+ if (pResult[i]) {
+ taosArrayPush(p, uid);
+ }
+ i += 1;
+ }
+
+ taosArraySwap(res, p);
+ taosArrayDestroy(p);
+ }
+
+ colDataDestroy(pColInfoData);
+ taosMemoryFreeClear(pColInfoData);
+
+ return TSDB_CODE_SUCCESS;
+}
+
int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, SNode* pTagIndexCond,
STableListInfo* pListInfo) {
int32_t code = TSDB_CODE_SUCCESS;
+ size_t numOfTables = 0;
uint64_t tableUid = pScanNode->uid;
pListInfo->suid = pScanNode->suid;
SArray* res = taosArrayInit(8, sizeof(uint64_t));
- if (pScanNode->tableType == TSDB_SUPER_TABLE) {
- if (pTagIndexCond) {
- SIndexMetaArg metaArg = {
- .metaEx = metaHandle, .idx = tsdbGetIdx(metaHandle), .ivtIdx = tsdbGetIvtIdx(metaHandle), .suid = tableUid};
-
- // int64_t stt = taosGetTimestampUs();
- SIdxFltStatus status = SFLT_NOT_INDEX;
- code = doFilterTag(pTagIndexCond, &metaArg, res, &status);
- if (code != 0 || status == SFLT_NOT_INDEX) {
- qError("failed to get tableIds from index, reason:%s, suid:%" PRIu64, tstrerror(code), tableUid);
- code = TDB_CODE_SUCCESS;
- }
- } else if (!pTagCond) {
- vnodeGetCtbIdList(pVnode, pScanNode->suid, res);
- }
- } else { // Create one table group.
+ if (pScanNode->tableType != TSDB_SUPER_TABLE) {
if (metaIsTableExist(metaHandle, tableUid)) {
taosArrayPush(res, &tableUid);
}
- }
- if (pTagCond) {
- terrno = TDB_CODE_SUCCESS;
- SColumnInfoData* pColInfoData = getColInfoResult(metaHandle, pListInfo->suid, res, pTagCond);
- if (terrno != TDB_CODE_SUCCESS) {
- colDataDestroy(pColInfoData);
- taosMemoryFreeClear(pColInfoData);
- taosArrayDestroy(res);
- qError("failed to getColInfoResult, code: %s", tstrerror(terrno));
- return terrno;
+ code = doFilterByTagCond(pListInfo, res, pTagCond, metaHandle);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+ } else {
+ // try to retrieve the result from meta cache
+ T_MD5_CTX context = {0};
+ genTagFilterDigest(pTagCond, &context);
+
+ bool acquired = false;
+ metaGetCachedTableUidList(metaHandle, pScanNode->suid, context.digest, tListLen(context.digest), res, &acquired);
+ if (acquired) {
+ qDebug("retrieve table uid list from cache, numOfTables:%d", (int32_t)taosArrayGetSize(res));
+ goto _end;
}
- int32_t i = 0;
- int32_t j = 0;
- int32_t len = taosArrayGetSize(res);
- while (i < taosArrayGetSize(res) && j < len && pColInfoData) {
- void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes);
-
- int64_t* uid = taosArrayGet(res, i);
- qDebug("tagfilter get uid:%" PRId64 ", res:%d", *uid, *(bool*)var);
- if (*(bool*)var == false) {
- taosArrayRemove(res, i);
- j++;
- continue;
+ if (!pTagCond) { // no tag condition exists, let's fetch all tables of this super table
+ ASSERT(pTagIndexCond == NULL);
+ vnodeGetCtbIdList(pVnode, pScanNode->suid, res);
+ } else {
+ // failed to find the result in the cache, let try to calculate the results
+ if (pTagIndexCond) {
+ SIndexMetaArg metaArg = {
+ .metaEx = metaHandle, .idx = tsdbGetIdx(metaHandle), .ivtIdx = tsdbGetIvtIdx(metaHandle), .suid = tableUid};
+
+ SIdxFltStatus status = SFLT_NOT_INDEX;
+ code = doFilterTag(pTagIndexCond, &metaArg, res, &status);
+ if (code != 0 || status == SFLT_NOT_INDEX) {
+ qError("failed to get tableIds from index, reason:%s, suid:%" PRIu64, tstrerror(code), tableUid);
+ code = TDB_CODE_SUCCESS;
+ }
}
- i++;
- j++;
}
- colDataDestroy(pColInfoData);
- taosMemoryFreeClear(pColInfoData);
+
+ code = doFilterByTagCond(pListInfo, res, pTagCond, metaHandle);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+
+ // let's add the filter results into meta-cache
+ numOfTables = taosArrayGetSize(res);
+ size_t size = numOfTables * sizeof(uint64_t) + sizeof(int32_t);
+ char* pPayload = taosMemoryMalloc(size);
+ *(int32_t*)pPayload = numOfTables;
+
+ if (numOfTables > 0) {
+ memcpy(pPayload + sizeof(int32_t), taosArrayGet(res, 0), numOfTables * sizeof(uint64_t));
+ }
+
+ metaUidFilterCachePut(metaHandle, pScanNode->suid, context.digest, tListLen(context.digest), pPayload, size, 1);
}
- size_t numOfTables = taosArrayGetSize(res);
+_end:
+ numOfTables = taosArrayGetSize(res);
for (int i = 0; i < numOfTables; i++) {
STableKeyInfo info = {.uid = *(uint64_t*)taosArrayGet(res, i), .groupId = 0};
@@ -1034,7 +1102,7 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode,
return TSDB_CODE_OUT_OF_MEMORY;
}
- qDebug("tagfilter get uid:%" PRIu64 "", info.uid);
+ qTrace("tagfilter get uid:%" PRIu64 "", info.uid);
}
taosArrayDestroy(res);
@@ -1057,7 +1125,7 @@ size_t getTableTagsBufLen(const SNodeList* pGroups) {
int32_t getGroupIdFromTagsVal(void* pMeta, uint64_t uid, SNodeList* pGroupNode, char* keyBuf, uint64_t* pGroupId) {
SMetaReader mr = {0};
metaReaderInit(&mr, pMeta, 0);
- if (metaGetTableEntryByUid(&mr, uid) != 0) { // table not exist
+ if (metaGetTableEntryByUidCache(&mr, uid) != 0) { // table not exist
metaReaderClear(&mr);
return TSDB_CODE_PAR_TABLE_NOT_EXIST;
}
@@ -1176,6 +1244,7 @@ int32_t extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNod
}
}
+ // set the output flag for each column in SColMatchInfo, according to the
*numOfOutputCols = 0;
int32_t num = LIST_LENGTH(pOutputNodeList->pSlots);
for (int32_t i = 0; i < num; ++i) {
@@ -1283,6 +1352,7 @@ void createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId) {
pExprNode->_function.functionId = pFuncNode->funcId;
pExprNode->_function.pFunctNode = pFuncNode;
+ pExprNode->_function.functionType = pFuncNode->funcType;
tstrncpy(pExprNode->_function.functionName, pFuncNode->functionName, tListLen(pExprNode->_function.functionName));
@@ -1390,7 +1460,7 @@ static int32_t setSelectValueColumnInfo(SqlFunctionCtx* pCtx, int32_t numOfOutpu
SqlFunctionCtx* p = NULL;
SqlFunctionCtx** pValCtx = taosMemoryCalloc(numOfOutput, POINTER_BYTES);
if (pValCtx == NULL) {
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
for (int32_t i = 0; i < numOfOutput; ++i) {
@@ -1471,8 +1541,6 @@ SqlFunctionCtx* createSqlFunctionCtx(SExprInfo* pExprInfo, int32_t numOfOutput,
pCtx->start.key = INT64_MIN;
pCtx->end.key = INT64_MIN;
pCtx->numOfParams = pExpr->base.numOfParams;
- pCtx->isStream = false;
-
pCtx->param = pFunct->pParam;
pCtx->saveHandle.currentPage = -1;
}
@@ -1536,20 +1604,22 @@ SColumn extractColumnFromColumnNode(SColumnNode* pColNode) {
int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysiNode* pTableScanNode) {
pCond->order = pTableScanNode->scanSeq[0] > 0 ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
pCond->numOfCols = LIST_LENGTH(pTableScanNode->scan.pScanCols);
+
pCond->colList = taosMemoryCalloc(pCond->numOfCols, sizeof(SColumnInfo));
- if (pCond->colList == NULL) {
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ pCond->pSlotList = taosMemoryMalloc(sizeof(int32_t) * pCond->numOfCols);
+ if (pCond->colList == NULL || pCond->pSlotList == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ taosMemoryFreeClear(pCond->colList);
+ taosMemoryFreeClear(pCond->pSlotList);
return terrno;
}
- // pCond->twindow = pTableScanNode->scanRange;
// TODO: get it from stable scan node
pCond->twindows = pTableScanNode->scanRange;
pCond->suid = pTableScanNode->scan.suid;
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
pCond->startVersion = -1;
pCond->endVersion = -1;
- // pCond->type = pTableScanNode->scanFlag;
int32_t j = 0;
for (int32_t i = 0; i < pCond->numOfCols; ++i) {
@@ -1562,6 +1632,8 @@ int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysi
pCond->colList[j].type = pColNode->node.resType.type;
pCond->colList[j].bytes = pColNode->node.resType.bytes;
pCond->colList[j].colId = pColNode->colId;
+
+ pCond->pSlotList[j] = pNode->slotId;
j += 1;
}
@@ -1569,7 +1641,10 @@ int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysi
return TSDB_CODE_SUCCESS;
}
-void cleanupQueryTableDataCond(SQueryTableDataCond* pCond) { taosMemoryFreeClear(pCond->colList); }
+void cleanupQueryTableDataCond(SQueryTableDataCond* pCond) {
+ taosMemoryFreeClear(pCond->colList);
+ taosMemoryFreeClear(pCond->pSlotList);
+}
int32_t convertFillType(int32_t mode) {
int32_t type = TSDB_FILL_NONE;
@@ -1770,7 +1845,7 @@ STableListInfo* tableListCreate() {
goto _error;
}
- pListInfo->map = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
+ pListInfo->map = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
if (pListInfo->map == NULL) {
goto _error;
}
@@ -1899,7 +1974,7 @@ int32_t buildGroupIdMapForAllTables(STableListInfo* pTableListInfo, SReadHandle*
int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags, bool groupSort, SReadHandle* pHandle,
STableListInfo* pTableListInfo, SNode* pTagCond, SNode* pTagIndexCond,
- struct SExecTaskInfo* pTaskInfo) {
+ SExecTaskInfo* pTaskInfo) {
int64_t st = taosGetTimestampUs();
const char* idStr = GET_TASKID(pTaskInfo);
@@ -1914,13 +1989,15 @@ int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags
return code;
}
+ int32_t numOfTables = taosArrayGetSize(pTableListInfo->pTableList);
ASSERT(pTableListInfo->numOfOuputGroups == 1);
int64_t st1 = taosGetTimestampUs();
pTaskInfo->cost.extractListTime = (st1 - st) / 1000.0;
- qDebug("extract queried table list completed, elapsed time:%.2f ms %s", pTaskInfo->cost.extractListTime, idStr);
+ qDebug("extract queried table list completed, %d tables, elapsed time:%.2f ms %s", numOfTables,
+ pTaskInfo->cost.extractListTime, idStr);
- if (taosArrayGetSize(pTableListInfo->pTableList) == 0) {
+ if (numOfTables == 0) {
qDebug("no table qualified for query, %s" PRIx64, idStr);
return TSDB_CODE_SUCCESS;
}
@@ -1935,3 +2012,13 @@ int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags
return TSDB_CODE_SUCCESS;
}
+
+void printDataBlock(SSDataBlock* pBlock, const char* flag) {
+ if (!pBlock || pBlock->info.rows == 0) {
+ qDebug("===stream===printDataBlock: Block is Null or Empty");
+ return;
+ }
+ char* pBuf = NULL;
+ qDebug("%s", dumpBlockData(pBlock, flag, &pBuf));
+ taosMemoryFree(pBuf);
+}
diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c
index 7dad9245d5efde4ed93e116f09e9ea46d7b92ad4..6fca2858dcefbe79c2bfe7b91d014745564f5227 100644
--- a/source/libs/executor/src/executor.c
+++ b/source/libs/executor/src/executor.c
@@ -35,12 +35,12 @@ static int32_t doSetSMABlock(SOperatorInfo* pOperator, void* input, size_t numOf
if (pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
if (pOperator->numOfDownstream == 0) {
qError("failed to find stream scan operator to set the input data block, %s" PRIx64, id);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
if (pOperator->numOfDownstream > 1) { // not handle this in join query
qError("join not supported for stream block scan, %s" PRIx64, id);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
pOperator->status = OP_NOT_OPENED;
return doSetSMABlock(pOperator->pDownstream[0], input, numOfBlocks, type, id);
@@ -76,12 +76,12 @@ static int32_t doSetStreamOpOpen(SOperatorInfo* pOperator, char* id) {
if (pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
if (pOperator->numOfDownstream == 0) {
qError("failed to find stream scan operator to set the input data block, %s" PRIx64, id);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
if (pOperator->numOfDownstream > 1) { // not handle this in join query
qError("join not supported for stream block scan, %s" PRIx64, id);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
pOperator->status = OP_NOT_OPENED;
return doSetStreamOpOpen(pOperator->pDownstream[0], id);
@@ -95,12 +95,12 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
if (pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
if (pOperator->numOfDownstream == 0) {
qError("failed to find stream scan operator to set the input data block, %s" PRIx64, id);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
if (pOperator->numOfDownstream > 1) { // not handle this in join query
qError("join not supported for stream block scan, %s" PRIx64, id);
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
pOperator->status = OP_NOT_OPENED;
return doSetStreamBlock(pOperator->pDownstream[0], input, numOfBlocks, type, id);
@@ -139,7 +139,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
int32_t qSetStreamOpOpen(qTaskInfo_t tinfo) {
if (tinfo == NULL) {
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
@@ -156,7 +156,7 @@ int32_t qSetStreamOpOpen(qTaskInfo_t tinfo) {
int32_t qSetMultiStreamInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numOfBlocks, int32_t type) {
if (tinfo == NULL) {
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
if (pBlocks == NULL || numOfBlocks == 0) {
@@ -177,7 +177,7 @@ int32_t qSetMultiStreamInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numO
int32_t qSetSMAInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numOfBlocks, int32_t type) {
if (tinfo == NULL) {
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
if (pBlocks == NULL || numOfBlocks == 0) {
@@ -207,7 +207,7 @@ qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* readers, int32_t* n
}
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
- pTaskInfo->cost.created = taosGetTimestampMs();
+ pTaskInfo->cost.created = taosGetTimestampUs();
pTaskInfo->execModel = OPTR_EXEC_MODEL_QUEUE;
pTaskInfo->pRoot = createRawScanOperatorInfo(readers, pTaskInfo);
if (NULL == pTaskInfo->pRoot) {
@@ -480,51 +480,6 @@ _error:
return code;
}
-#ifdef TEST_IMPL
-// wait moment
-int waitMoment(SQInfo* pQInfo) {
- if (pQInfo->sql) {
- int ms = 0;
- char* pcnt = strstr(pQInfo->sql, " count(*)");
- if (pcnt) return 0;
-
- char* pos = strstr(pQInfo->sql, " t_");
- if (pos) {
- pos += 3;
- ms = atoi(pos);
- while (*pos >= '0' && *pos <= '9') {
- pos++;
- }
- char unit_char = *pos;
- if (unit_char == 'h') {
- ms *= 3600 * 1000;
- } else if (unit_char == 'm') {
- ms *= 60 * 1000;
- } else if (unit_char == 's') {
- ms *= 1000;
- }
- }
- if (ms == 0) return 0;
- printf("test wait sleep %dms. sql=%s ...\n", ms, pQInfo->sql);
-
- if (ms < 1000) {
- taosMsleep(ms);
- } else {
- int used_ms = 0;
- while (used_ms < ms) {
- taosMsleep(1000);
- used_ms += 1000;
- if (isTaskKilled(pQInfo)) {
- printf("test check query is canceled, sleep break.%s\n", pQInfo->sql);
- break;
- }
- }
- }
- }
- return 1;
-}
-#endif
-
static void freeBlock(void* param) {
SSDataBlock* pBlock = *(SSDataBlock**)param;
blockDataDestroy(pBlock);
@@ -538,7 +493,7 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bo
memcpy(&pTaskInfo->localFetch, pLocal, sizeof(*pLocal));
}
- taosArrayClearEx(pResList, freeBlock);
+ taosArrayClear(pResList);
int64_t curOwner = 0;
if ((curOwner = atomic_val_compare_exchange_64(&pTaskInfo->owner, 0, threadId)) != 0) {
@@ -548,7 +503,7 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bo
}
if (pTaskInfo->cost.start == 0) {
- pTaskInfo->cost.start = taosGetTimestampMs();
+ pTaskInfo->cost.start = taosGetTimestampUs();
}
if (isTaskKilled(pTaskInfo)) {
@@ -576,8 +531,20 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bo
int64_t st = taosGetTimestampUs();
+ int32_t blockIndex = 0;
while ((pRes = pTaskInfo->pRoot->fpSet.getNextFn(pTaskInfo->pRoot)) != NULL) {
- SSDataBlock* p = createOneDataBlock(pRes, true);
+ SSDataBlock* p = NULL;
+ if (blockIndex >= taosArrayGetSize(pTaskInfo->pResultBlockList)) {
+ SSDataBlock* p1 = createOneDataBlock(pRes, true);
+ taosArrayPush(pTaskInfo->pResultBlockList, &p1);
+ p = p1;
+ } else {
+ p = *(SSDataBlock**) taosArrayGet(pTaskInfo->pResultBlockList, blockIndex);
+ copyDataBlock(p, pRes);
+ }
+
+ blockIndex += 1;
+
current += p->info.rows;
ASSERT(p->info.rows > 0);
taosArrayPush(pResList, &p);
@@ -605,6 +572,18 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bo
return pTaskInfo->code;
}
+void qCleanExecTaskBlockBuf(qTaskInfo_t tinfo) {
+ SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
+ SArray* pList = pTaskInfo->pResultBlockList;
+ size_t num = taosArrayGetSize(pList);
+ for(int32_t i = 0; i < num; ++i) {
+ SSDataBlock** p = taosArrayGet(pTaskInfo->pResultBlockList, i);
+ blockDataDestroy(*p);
+ }
+
+ taosArrayClear(pTaskInfo->pResultBlockList);
+}
+
int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t* useconds) {
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
int64_t threadId = taosGetSelfPthreadId();
@@ -618,7 +597,7 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t* useconds) {
}
if (pTaskInfo->cost.start == 0) {
- pTaskInfo->cost.start = taosGetTimestampMs();
+ pTaskInfo->cost.start = taosGetTimestampUs();
}
if (isTaskKilled(pTaskInfo)) {
@@ -709,7 +688,7 @@ void qStopTaskOperators(SExecTaskInfo* pTaskInfo) {
taosWUnLockLatch(&pTaskInfo->stopInfo.lock);
}
-int32_t qAsyncKillTask(qTaskInfo_t qinfo) {
+int32_t qAsyncKillTask(qTaskInfo_t qinfo, int32_t rspCode) {
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo;
if (pTaskInfo == NULL) {
@@ -718,13 +697,32 @@ int32_t qAsyncKillTask(qTaskInfo_t qinfo) {
qDebug("%s execTask async killed", GET_TASKID(pTaskInfo));
- setTaskKilled(pTaskInfo);
+ setTaskKilled(pTaskInfo, rspCode);
qStopTaskOperators(pTaskInfo);
return TSDB_CODE_SUCCESS;
}
+static void printTaskExecCostInLog(SExecTaskInfo* pTaskInfo) {
+ STaskCostInfo* pSummary = &pTaskInfo->cost;
+ int64_t idleTime = pSummary->start - pSummary->created;
+
+ SFileBlockLoadRecorder* pRecorder = pSummary->pRecoder;
+ if (pSummary->pRecoder != NULL) {
+ qDebug(
+ "%s :cost summary: idle:%.2f ms, elapsed time:%.2f ms, extract tableList:%.2f ms, "
+ "createGroupIdMap:%.2f ms, total blocks:%d, "
+ "load block SMA:%d, load data block:%d, total rows:%" PRId64 ", check rows:%" PRId64,
+ GET_TASKID(pTaskInfo), idleTime / 1000.0, pSummary->elapsedTime / 1000.0, pSummary->extractListTime,
+ pSummary->groupIdMapTime, pRecorder->totalBlocks, pRecorder->loadBlockStatis, pRecorder->loadBlocks,
+ pRecorder->totalRows, pRecorder->totalCheckedRows);
+ } else {
+ qDebug("%s :cost summary: idle in queue:%.2f ms, elapsed time:%.2f ms", GET_TASKID(pTaskInfo), idleTime / 1000.0,
+ pSummary->elapsedTime / 1000.0);
+ }
+}
+
void qDestroyTask(qTaskInfo_t qTaskHandle) {
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qTaskHandle;
if (pTaskInfo == NULL) {
@@ -733,7 +731,7 @@ void qDestroyTask(qTaskInfo_t qTaskHandle) {
qDebug("%s execTask completed, numOfRows:%" PRId64, GET_TASKID(pTaskInfo), pTaskInfo->pRoot->resultInfo.totalRows);
- queryCostStatis(pTaskInfo); // print the query cost summary
+ printTaskExecCostInLog(pTaskInfo); // print the query cost summary
doDestroyTask(pTaskInfo);
}
@@ -749,12 +747,12 @@ int32_t qSerializeTaskStatus(qTaskInfo_t tinfo, char** pOutput, int32_t* len) {
}
int32_t nOptrWithVal = 0;
- int32_t code = encodeOperator(pTaskInfo->pRoot, pOutput, len, &nOptrWithVal);
- if ((code == TSDB_CODE_SUCCESS) && (nOptrWithVal == 0)) {
- taosMemoryFreeClear(*pOutput);
- *len = 0;
- }
- return code;
+// int32_t code = encodeOperator(pTaskInfo->pRoot, pOutput, len, &nOptrWithVal);
+// if ((code == TSDB_CODE_SUCCESS) && (nOptrWithVal == 0)) {
+// taosMemoryFreeClear(*pOutput);
+// *len = 0;
+// }
+ return 0;
}
int32_t qDeserializeTaskStatus(qTaskInfo_t tinfo, const char* pInput, int32_t len) {
@@ -764,7 +762,8 @@ int32_t qDeserializeTaskStatus(qTaskInfo_t tinfo, const char* pInput, int32_t le
return TSDB_CODE_INVALID_PARA;
}
- return decodeOperator(pTaskInfo->pRoot, pInput, len);
+ return 0;
+// return decodeOperator(pTaskInfo->pRoot, pInput, len);
}
int32_t qExtractStreamScanner(qTaskInfo_t tinfo, void** scanner) {
@@ -977,21 +976,27 @@ int32_t initQueryTableDataCondForTmq(SQueryTableDataCond* pCond, SSnapContext* s
pCond->order = TSDB_ORDER_ASC;
pCond->numOfCols = pMtInfo->schema->nCols;
pCond->colList = taosMemoryCalloc(pCond->numOfCols, sizeof(SColumnInfo));
- if (pCond->colList == NULL) {
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ pCond->pSlotList = taosMemoryMalloc(sizeof(int32_t) * pCond->numOfCols);
+ if (pCond->colList == NULL || pCond->pSlotList == NULL) {
+ taosMemoryFreeClear(pCond->colList);
+ taosMemoryFreeClear(pCond->pSlotList);
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return terrno;
}
- pCond->twindows = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
+ pCond->twindows = TSWINDOW_INITIALIZER;
pCond->suid = pMtInfo->suid;
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
pCond->startVersion = -1;
pCond->endVersion = sContext->snapVersion;
for (int32_t i = 0; i < pCond->numOfCols; ++i) {
- pCond->colList[i].type = pMtInfo->schema->pSchema[i].type;
- pCond->colList[i].bytes = pMtInfo->schema->pSchema[i].bytes;
- pCond->colList[i].colId = pMtInfo->schema->pSchema[i].colId;
+ SColumnInfo* pColInfo = &pCond->colList[i];
+ pColInfo->type = pMtInfo->schema->pSchema[i].type;
+ pColInfo->bytes = pMtInfo->schema->pSchema[i].bytes;
+ pColInfo->colId = pMtInfo->schema->pSchema[i].colId;
+
+ pCond->pSlotList[i] = i;
}
return TSDB_CODE_SUCCESS;
@@ -1084,7 +1089,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
int32_t num = tableListGetSize(pTaskInfo->pTableInfoList);
if (tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &pTableScanInfo->base.cond, pList, num,
- &pTableScanInfo->base.dataReader, NULL) < 0 ||
+ pTableScanInfo->pResBlock, &pTableScanInfo->base.dataReader, NULL) < 0 ||
pTableScanInfo->base.dataReader == NULL) {
ASSERT(0);
}
@@ -1136,7 +1141,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
int32_t size = tableListGetSize(pTaskInfo->pTableInfoList);
ASSERT(size == 1);
- tsdbReaderOpen(pInfo->vnode, &pTaskInfo->streamInfo.tableCond, pList, size, &pInfo->dataReader, NULL);
+ tsdbReaderOpen(pInfo->vnode, &pTaskInfo->streamInfo.tableCond, pList, size, NULL, &pInfo->dataReader, NULL);
cleanupQueryTableDataCond(&pTaskInfo->streamInfo.tableCond);
strcpy(pTaskInfo->streamInfo.tbName, mtInfo.tbName);
diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c
index 4319dd379a5ffcbfe674efb04ccde6136baf29d1..043cc396b5f3d87f627d379d7f70086d112e4d77 100644
--- a/source/libs/executor/src/executorimpl.c
+++ b/source/libs/executor/src/executorimpl.c
@@ -76,24 +76,35 @@ static UNUSED_FUNC void* u_realloc(void* p, size_t __size) {
#define CLEAR_QUERY_STATUS(q, st) ((q)->status &= (~(st)))
#define QUERY_IS_INTERVAL_QUERY(_q) ((_q)->interval.interval > 0)
-int32_t getMaximumIdleDurationSec() { return tsShellActivityTimer * 2; }
+typedef struct SAggOperatorInfo {
+ SOptrBasicInfo binfo;
+ SAggSupporter aggSup;
+ STableQueryInfo* current;
+ uint64_t groupId;
+ SGroupResInfo groupResInfo;
+ SExprSupp scalarExprSup;
+} SAggOperatorInfo;
static void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExpr, SSDataBlock* pBlock);
static void releaseQueryBuf(size_t numOfTables);
-static void destroyFillOperatorInfo(void* param);
-static void destroyProjectOperatorInfo(void* param);
-static void destroySortOperatorInfo(void* param);
-static void destroyAggOperatorInfo(void* param);
-
-static void destroyIntervalOperatorInfo(void* param);
+static void destroyAggOperatorInfo(void* param);
+static void initCtxOutputBuffer(SqlFunctionCtx* pCtx, int32_t size);
+static void doSetTableGroupOutputBuf(SOperatorInfo* pOperator, int32_t numOfOutput, uint64_t groupId);
+static void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag);
+static int32_t doInitAggInfoSup(SAggSupporter* pAggSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, size_t keyBufSize,
+ const char* pKey);
+static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const SColumnInfoData* p, bool keep,
+ int32_t status);
+static int32_t doSetInputDataBlock(SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t order, int32_t scanFlag,
+ bool createDummyCol);
void setOperatorCompleted(SOperatorInfo* pOperator) {
pOperator->status = OP_EXEC_DONE;
ASSERT(pOperator->pTaskInfo != NULL);
- pOperator->cost.totalCost = (taosGetTimestampUs() - pOperator->pTaskInfo->cost.start * 1000) / 1000.0;
+ pOperator->cost.totalCost = (taosGetTimestampUs() - pOperator->pTaskInfo->cost.start) / 1000.0;
setTaskStatus(pOperator->pTaskInfo, TASK_COMPLETED);
}
@@ -107,19 +118,21 @@ void setOperatorInfo(SOperatorInfo* pOperator, const char* name, int32_t type, b
pOperator->pTaskInfo = pTaskInfo;
}
-int32_t operatorDummyOpenFn(SOperatorInfo* pOperator) {
+int32_t optrDummyOpenFn(SOperatorInfo* pOperator) {
OPTR_SET_OPENED(pOperator);
pOperator->cost.openCost = 0;
return TSDB_CODE_SUCCESS;
}
SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t cleanup,
- __optr_close_fn_t closeFn, __optr_explain_fn_t explain) {
+ __optr_close_fn_t closeFn, __optr_reqBuf_fn_t reqBufFn,
+ __optr_explain_fn_t explain) {
SOperatorFpSet fpSet = {
._openFn = openFn,
.getNextFn = nextFn,
.cleanupFn = cleanup,
.closeFn = closeFn,
+ .reqBufFn = reqBufFn,
.getExplainFn = explain,
};
@@ -129,9 +142,6 @@ SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn,
static int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprSupp* pSup, SDiskbasedBuf* pBuf,
SGroupResInfo* pGroupResInfo);
-static void initCtxOutputBuffer(SqlFunctionCtx* pCtx, int32_t size);
-static void doSetTableGroupOutputBuf(SOperatorInfo* pOperator, int32_t numOfOutput, uint64_t groupId);
-
SResultRow* getNewResultRow(SDiskbasedBuf* pResultBuf, int32_t* currentPageId, int32_t interBufSize) {
SFilePage* pData = NULL;
@@ -244,7 +254,7 @@ static int32_t addNewWindowResultBuf(SResultRow* pWindowRes, SDiskbasedBuf* pRes
// in the first scan, new space needed for results
int32_t pageId = -1;
- SIDList list = getDataBufPagesIdList(pResultBuf);
+ SArray* list = getDataBufPagesIdList(pResultBuf);
if (taosArrayGetSize(list) == 0) {
pData = getNewBufPage(pResultBuf, &pageId);
@@ -303,19 +313,19 @@ typedef struct {
} SFunctionCtxStatus;
static void functionCtxSave(SqlFunctionCtx* pCtx, SFunctionCtxStatus* pStatus) {
- pStatus->hasAgg = pCtx->input.colDataAggIsSet;
+ pStatus->hasAgg = pCtx->input.colDataSMAIsSet;
pStatus->numOfRows = pCtx->input.numOfRows;
pStatus->startOffset = pCtx->input.startRowIndex;
}
static void functionCtxRestore(SqlFunctionCtx* pCtx, SFunctionCtxStatus* pStatus) {
- pCtx->input.colDataAggIsSet = pStatus->hasAgg;
+ pCtx->input.colDataSMAIsSet = pStatus->hasAgg;
pCtx->input.numOfRows = pStatus->numOfRows;
pCtx->input.startRowIndex = pStatus->startOffset;
}
-void doApplyFunctions(SExecTaskInfo* taskInfo, SqlFunctionCtx* pCtx, SColumnInfoData* pTimeWindowData, int32_t offset,
- int32_t forwardStep, int32_t numOfTotal, int32_t numOfOutput) {
+void applyAggFunctionOnPartialTuples(SExecTaskInfo* taskInfo, SqlFunctionCtx* pCtx, SColumnInfoData* pTimeWindowData,
+ int32_t offset, int32_t forwardStep, int32_t numOfTotal, int32_t numOfOutput) {
for (int32_t k = 0; k < numOfOutput; ++k) {
// keep it temporarily
SFunctionCtxStatus status = {0};
@@ -326,8 +336,8 @@ void doApplyFunctions(SExecTaskInfo* taskInfo, SqlFunctionCtx* pCtx, SColumnInfo
// not a whole block involved in query processing, statistics data can not be used
// NOTE: the original value of isSet have been changed here
- if (pCtx[k].input.colDataAggIsSet && forwardStep < numOfTotal) {
- pCtx[k].input.colDataAggIsSet = false;
+ if (pCtx[k].input.colDataSMAIsSet && forwardStep < numOfTotal) {
+ pCtx[k].input.colDataSMAIsSet = false;
}
if (fmIsWindowPseudoColumnFunc(pCtx[k].functionId)) {
@@ -362,9 +372,6 @@ void doApplyFunctions(SExecTaskInfo* taskInfo, SqlFunctionCtx* pCtx, SColumnInfo
}
}
-static int32_t doSetInputDataBlock(SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t order, int32_t scanFlag,
- bool createDummyCol);
-
static void doSetInputDataBlockInfo(SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t order) {
SqlFunctionCtx* pCtx = pExprSup->pCtx;
for (int32_t i = 0; i < pExprSup->numOfExprs; ++i) {
@@ -439,8 +446,8 @@ static int32_t doSetInputDataBlock(SExprSupp* pExprSup, SSDataBlock* pBlock, int
pCtx[i].scanFlag = scanFlag;
SInputColumnInfoData* pInput = &pCtx[i].input;
- pInput->uid = pBlock->info.uid;
- pInput->colDataAggIsSet = false;
+ pInput->uid = pBlock->info.id.uid;
+ pInput->colDataSMAIsSet = false;
SExprInfo* pOneExpr = &pExprSup->pExprInfo[i];
for (int32_t j = 0; j < pOneExpr->base.numOfParams; ++j) {
@@ -498,184 +505,6 @@ static int32_t doAggregateImpl(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx) {
return TSDB_CODE_SUCCESS;
}
-static void setPseudoOutputColInfo(SSDataBlock* pResult, SqlFunctionCtx* pCtx, SArray* pPseudoList) {
- size_t num = (pPseudoList != NULL) ? taosArrayGetSize(pPseudoList) : 0;
- for (int32_t i = 0; i < num; ++i) {
- pCtx[i].pOutput = taosArrayGet(pResult->pDataBlock, i);
- }
-}
-
-int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBlock* pSrcBlock, SqlFunctionCtx* pCtx,
- int32_t numOfOutput, SArray* pPseudoList) {
- setPseudoOutputColInfo(pResult, pCtx, pPseudoList);
-
- if (pSrcBlock == NULL) {
- for (int32_t k = 0; k < numOfOutput; ++k) {
- int32_t outputSlotId = pExpr[k].base.resSchema.slotId;
-
- ASSERT(pExpr[k].pExpr->nodeType == QUERY_NODE_VALUE);
- SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId);
-
- int32_t type = pExpr[k].base.pParam[0].param.nType;
- if (TSDB_DATA_TYPE_NULL == type) {
- colDataAppendNNULL(pColInfoData, 0, 1);
- } else {
- colDataAppend(pColInfoData, 0, taosVariantGet(&pExpr[k].base.pParam[0].param, type), false);
- }
- }
-
- pResult->info.rows = 1;
- return TSDB_CODE_SUCCESS;
- }
-
- if (pResult != pSrcBlock) {
- pResult->info.groupId = pSrcBlock->info.groupId;
- memcpy(pResult->info.parTbName, pSrcBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
- }
-
- // if the source equals to the destination, it is to create a new column as the result of scalar
- // function or some operators.
- bool createNewColModel = (pResult == pSrcBlock);
- if (createNewColModel) {
- blockDataEnsureCapacity(pResult, pResult->info.rows);
- }
-
- int32_t numOfRows = 0;
-
- for (int32_t k = 0; k < numOfOutput; ++k) {
- int32_t outputSlotId = pExpr[k].base.resSchema.slotId;
- SqlFunctionCtx* pfCtx = &pCtx[k];
- SInputColumnInfoData* pInputData = &pfCtx->input;
-
- if (pExpr[k].pExpr->nodeType == QUERY_NODE_COLUMN) { // it is a project query
- SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId);
- if (pResult->info.rows > 0 && !createNewColModel) {
- colDataMergeCol(pColInfoData, pResult->info.rows, (int32_t*)&pResult->info.capacity, pInputData->pData[0],
- pInputData->numOfRows);
- } else {
- colDataAssign(pColInfoData, pInputData->pData[0], pInputData->numOfRows, &pResult->info);
- }
-
- numOfRows = pInputData->numOfRows;
- } else if (pExpr[k].pExpr->nodeType == QUERY_NODE_VALUE) {
- SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId);
-
- int32_t offset = createNewColModel ? 0 : pResult->info.rows;
-
- int32_t type = pExpr[k].base.pParam[0].param.nType;
- if (TSDB_DATA_TYPE_NULL == type) {
- colDataAppendNNULL(pColInfoData, offset, pSrcBlock->info.rows);
- } else {
- for (int32_t i = 0; i < pSrcBlock->info.rows; ++i) {
- colDataAppend(pColInfoData, i + offset, taosVariantGet(&pExpr[k].base.pParam[0].param, type), false);
- }
- }
-
- numOfRows = pSrcBlock->info.rows;
- } else if (pExpr[k].pExpr->nodeType == QUERY_NODE_OPERATOR) {
- SArray* pBlockList = taosArrayInit(4, POINTER_BYTES);
- taosArrayPush(pBlockList, &pSrcBlock);
-
- SColumnInfoData* pResColData = taosArrayGet(pResult->pDataBlock, outputSlotId);
- SColumnInfoData idata = {.info = pResColData->info, .hasNull = true};
-
- SScalarParam dest = {.columnData = &idata};
- int32_t code = scalarCalculate(pExpr[k].pExpr->_optrRoot.pRootNode, pBlockList, &dest);
- if (code != TSDB_CODE_SUCCESS) {
- taosArrayDestroy(pBlockList);
- return code;
- }
-
- int32_t startOffset = createNewColModel ? 0 : pResult->info.rows;
- ASSERT(pResult->info.capacity > 0);
-
- colDataMergeCol(pResColData, startOffset, (int32_t*)&pResult->info.capacity, &idata, dest.numOfRows);
- colDataDestroy(&idata);
-
- numOfRows = dest.numOfRows;
- taosArrayDestroy(pBlockList);
- } else if (pExpr[k].pExpr->nodeType == QUERY_NODE_FUNCTION) {
- // _rowts/_c0, not tbname column
- if (fmIsPseudoColumnFunc(pfCtx->functionId) && (!fmIsScanPseudoColumnFunc(pfCtx->functionId))) {
- // do nothing
- } else if (fmIsIndefiniteRowsFunc(pfCtx->functionId)) {
- SResultRowEntryInfo* pResInfo = GET_RES_INFO(pfCtx);
- pfCtx->fpSet.init(pfCtx, pResInfo);
-
- pfCtx->pOutput = taosArrayGet(pResult->pDataBlock, outputSlotId);
- pfCtx->offset = createNewColModel ? 0 : pResult->info.rows; // set the start offset
-
- // set the timestamp(_rowts) output buffer
- if (taosArrayGetSize(pPseudoList) > 0) {
- int32_t* outputColIndex = taosArrayGet(pPseudoList, 0);
- pfCtx->pTsOutput = (SColumnInfoData*)pCtx[*outputColIndex].pOutput;
- }
-
- // link pDstBlock to set selectivity value
- if (pfCtx->subsidiaries.num > 0) {
- pfCtx->pDstBlock = pResult;
- }
-
- int32_t code = pfCtx->fpSet.process(pfCtx);
- if (code != TSDB_CODE_SUCCESS) {
- return code;
- }
- numOfRows = pResInfo->numOfRes;
- } else if (fmIsAggFunc(pfCtx->functionId)) {
- // selective value output should be set during corresponding function execution
- if (fmIsSelectValueFunc(pfCtx->functionId)) {
- continue;
- }
- // _group_key function for "partition by tbname" + csum(col_name) query
- SColumnInfoData* pOutput = taosArrayGet(pResult->pDataBlock, outputSlotId);
- int32_t slotId = pfCtx->param[0].pCol->slotId;
-
- // todo handle the json tag
- SColumnInfoData* pInput = taosArrayGet(pSrcBlock->pDataBlock, slotId);
- for (int32_t f = 0; f < pSrcBlock->info.rows; ++f) {
- bool isNull = colDataIsNull_s(pInput, f);
- if (isNull) {
- colDataAppendNULL(pOutput, pResult->info.rows + f);
- } else {
- char* data = colDataGetData(pInput, f);
- colDataAppend(pOutput, pResult->info.rows + f, data, isNull);
- }
- }
-
- } else {
- SArray* pBlockList = taosArrayInit(4, POINTER_BYTES);
- taosArrayPush(pBlockList, &pSrcBlock);
-
- SColumnInfoData* pResColData = taosArrayGet(pResult->pDataBlock, outputSlotId);
- SColumnInfoData idata = {.info = pResColData->info, .hasNull = true};
-
- SScalarParam dest = {.columnData = &idata};
- int32_t code = scalarCalculate((SNode*)pExpr[k].pExpr->_function.pFunctNode, pBlockList, &dest);
- if (code != TSDB_CODE_SUCCESS) {
- taosArrayDestroy(pBlockList);
- return code;
- }
-
- int32_t startOffset = createNewColModel ? 0 : pResult->info.rows;
- ASSERT(pResult->info.capacity > 0);
- colDataMergeCol(pResColData, startOffset, (int32_t*)&pResult->info.capacity, &idata, dest.numOfRows);
- colDataDestroy(&idata);
-
- numOfRows = dest.numOfRows;
- taosArrayDestroy(pBlockList);
- }
- } else {
- return TSDB_CODE_OPS_NOT_SUPPORT;
- }
- }
-
- if (!createNewColModel) {
- pResult->info.rows += numOfRows;
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
bool functionNeedToExecute(SqlFunctionCtx* pCtx) {
struct SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
@@ -756,7 +585,7 @@ void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, SSDataBlock* pB
pInput->totalRows = numOfRows;
if (pBlock->pBlockAgg != NULL) {
- pInput->colDataAggIsSet = true;
+ pInput->colDataSMAIsSet = true;
for (int32_t j = 0; j < pExprInfo->base.numOfParams; ++j) {
SFunctParam* pFuncParam = &pExprInfo->base.pParam[j];
@@ -765,7 +594,7 @@ void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, SSDataBlock* pB
int32_t slotId = pFuncParam->pCol->slotId;
pInput->pColumnDataAgg[j] = pBlock->pBlockAgg[slotId];
if (pInput->pColumnDataAgg[j] == NULL) {
- pInput->colDataAggIsSet = false;
+ pInput->colDataSMAIsSet = false;
}
// Here we set the column info data since the data type for each column data is required, but
@@ -776,26 +605,15 @@ void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, SSDataBlock* pB
}
}
} else {
- pInput->colDataAggIsSet = false;
+ pInput->colDataSMAIsSet = false;
}
}
bool isTaskKilled(SExecTaskInfo* pTaskInfo) {
- // query has been executed more than tsShellActivityTimer, and the retrieve has not arrived
- // abort current query execution.
- if (pTaskInfo->owner != 0 &&
- ((taosGetTimestampSec() - pTaskInfo->cost.start / 1000) > 10 * getMaximumIdleDurationSec())
- /*(!needBuildResAfterQueryComplete(pTaskInfo))*/) {
- assert(pTaskInfo->cost.start != 0);
- // qDebug("QInfo:%" PRIu64 " retrieve not arrive beyond %d ms, abort current query execution, start:%" PRId64
- // ", current:%d", pQInfo->qId, 1, pQInfo->startExecTs, taosGetTimestampSec());
- // return true;
- }
-
- return false;
+ return (0 != pTaskInfo->code) ? true : false;
}
-void setTaskKilled(SExecTaskInfo* pTaskInfo) { pTaskInfo->code = TSDB_CODE_TSC_QUERY_CANCELLED; }
+void setTaskKilled(SExecTaskInfo* pTaskInfo, int32_t rspCode) { pTaskInfo->code = rspCode; }
/////////////////////////////////////////////////////////////////////////////////////////////
STimeWindow getAlignQueryTimeWindow(SInterval* pInterval, int32_t precision, int64_t key) {
@@ -854,10 +672,10 @@ int32_t loadDataBlockOnDemand(SExecTaskInfo* pTaskInfo, STableScanInfo* pTableSc
pTableScanInfo->pCtx, pTableScanInfo->numOfOutput,
pTableScanInfo->rowEntryInfoOffset);
} else {
- if (setResultOutputBufByKey(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pBlock->info.uid, &win, masterScan, &pResult, groupId,
+ if (setResultOutputBufByKey(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pBlock->info.id.uid, &win, masterScan, &pResult, groupId,
pTableScanInfo->pCtx, pTableScanInfo->numOfOutput,
pTableScanInfo->rowEntryInfoOffset) != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pRuntimeEnv->env, TSDB_CODE_OUT_OF_MEMORY);
}
}
} else if (pQueryAttr->stableQuery && (!pQueryAttr->tsCompQuery) && (!pQueryAttr->diffQuery)) { // stable aggregate, not interval aggregate or normal column aggregate
@@ -905,10 +723,10 @@ int32_t loadDataBlockOnDemand(SExecTaskInfo* pTaskInfo, STableScanInfo* pTableSc
TSKEY k = ascQuery? pBlock->info.window.skey : pBlock->info.window.ekey;
STimeWindow win = getActiveTimeWindow(pTableScanInfo->pResultRowInfo, k, pQueryAttr);
- if (setResultOutputBufByKey(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pBlock->info.uid, &win, masterScan, &pResult, groupId,
+ if (setResultOutputBufByKey(pRuntimeEnv, pTableScanInfo->pResultRowInfo, pBlock->info.id.uid, &win, masterScan, &pResult, groupId,
pTableScanInfo->pCtx, pTableScanInfo->numOfOutput,
pTableScanInfo->rowEntryInfoOffset) != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pRuntimeEnv->env, TSDB_CODE_OUT_OF_MEMORY);
}
}
}
@@ -996,9 +814,6 @@ void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numO
}
}
-static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const SColumnInfoData* p, bool keep,
- int32_t status);
-
void doFilter(SSDataBlock* pBlock, SFilterInfo* pFilterInfo, SColMatchInfo* pColMatchInfo) {
if (pFilterInfo == NULL || pBlock->info.rows == 0) {
return;
@@ -1124,10 +939,10 @@ static void setExecutionContext(SOperatorInfo* pOperator, int32_t numOfOutput, u
}
static void doUpdateNumOfRows(SqlFunctionCtx* pCtx, SResultRow* pRow, int32_t numOfExprs,
- const int32_t* rowCellOffset) {
+ const int32_t* rowEntryOffset) {
bool returnNotNull = false;
for (int32_t j = 0; j < numOfExprs; ++j) {
- struct SResultRowEntryInfo* pResInfo = getResultEntryInfo(pRow, j, rowCellOffset);
+ SResultRowEntryInfo* pResInfo = getResultEntryInfo(pRow, j, rowEntryOffset);
if (!isRowEntryInitialized(pResInfo)) {
continue;
}
@@ -1240,11 +1055,11 @@ int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprS
continue;
}
- if (pBlock->info.groupId == 0) {
- pBlock->info.groupId = pPos->groupId;
+ if (pBlock->info.id.groupId == 0) {
+ pBlock->info.id.groupId = pPos->groupId;
} else {
// current value belongs to different group, it can't be packed into one datablock
- if (pBlock->info.groupId != pPos->groupId) {
+ if (pBlock->info.id.groupId != pPos->groupId) {
releaseBufPage(pBuf, page);
break;
}
@@ -1264,7 +1079,7 @@ int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprS
}
qDebug("%s result generated, rows:%d, groupId:%" PRIu64, GET_TASKID(pTaskInfo), pBlock->info.rows,
- pBlock->info.groupId);
+ pBlock->info.id.groupId);
blockDataUpdateTsWindow(pBlock, 0);
return 0;
@@ -1284,12 +1099,12 @@ void doBuildStreamResBlock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGr
}
// clear the existed group id
- pBlock->info.groupId = 0;
+ pBlock->info.id.groupId = 0;
ASSERT(!pbInfo->mergeResultBlock);
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo);
void* tbname = NULL;
- if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname) < 0) {
pBlock->info.parTbName[0] = 0;
} else {
memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
@@ -1311,7 +1126,7 @@ void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SG
}
// clear the existed group id
- pBlock->info.groupId = 0;
+ pBlock->info.id.groupId = 0;
if (!pbInfo->mergeResultBlock) {
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo);
} else {
@@ -1322,67 +1137,14 @@ void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SG
}
// clearing group id to continue to merge data that belong to different groups
- pBlock->info.groupId = 0;
+ pBlock->info.id.groupId = 0;
}
// clear the group id info in SSDataBlock, since the client does not need it
- pBlock->info.groupId = 0;
- }
-}
-
-void queryCostStatis(SExecTaskInfo* pTaskInfo) {
- STaskCostInfo* pSummary = &pTaskInfo->cost;
-
- SFileBlockLoadRecorder* pRecorder = pSummary->pRecoder;
- if (pSummary->pRecoder != NULL) {
- qDebug(
- "%s :cost summary: elapsed time:%.2f ms, extract tableList:%.2f ms, createGroupIdMap:%.2f ms, total blocks:%d, "
- "load block SMA:%d, load data block:%d, total rows:%" PRId64 ", check rows:%" PRId64,
- GET_TASKID(pTaskInfo), pSummary->elapsedTime / 1000.0, pSummary->extractListTime, pSummary->groupIdMapTime,
- pRecorder->totalBlocks, pRecorder->loadBlockStatis, pRecorder->loadBlocks, pRecorder->totalRows,
- pRecorder->totalCheckedRows);
+ pBlock->info.id.groupId = 0;
}
}
-// void skipBlocks(STaskRuntimeEnv *pRuntimeEnv) {
-// STaskAttr *pQueryAttr = pRuntimeEnv->pQueryAttr;
-//
-// if (pQueryAttr->limit.offset <= 0 || pQueryAttr->numOfFilterCols > 0) {
-// return;
-// }
-//
-// pQueryAttr->pos = 0;
-// int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQueryAttr->order.order);
-//
-// STableQueryInfo* pTableQueryInfo = pRuntimeEnv->current;
-// TsdbQueryHandleT pTsdbReadHandle = pRuntimeEnv->pTsdbReadHandle;
-//
-// SDataBlockInfo blockInfo = SDATA_BLOCK_INITIALIZER;
-// while (tsdbNextDataBlock(pTsdbReadHandle)) {
-// if (isTaskKilled(pRuntimeEnv->qinfo)) {
-// T_LONG_JMP(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
-// }
-//
-// tsdbRetrieveDataBlockInfo(pTsdbReadHandle, &blockInfo);
-//
-// if (pQueryAttr->limit.offset > blockInfo.rows) {
-// pQueryAttr->limit.offset -= blockInfo.rows;
-// pTableQueryInfo->lastKey = (QUERY_IS_ASC_QUERY(pQueryAttr)) ? blockInfo.window.ekey : blockInfo.window.skey;
-// pTableQueryInfo->lastKey += step;
-//
-// //qDebug("QInfo:0x%"PRIx64" skip rows:%d, offset:%" PRId64, GET_TASKID(pRuntimeEnv), blockInfo.rows,
-// pQuery->limit.offset);
-// } else { // find the appropriated start position in current block
-// updateOffsetVal(pRuntimeEnv, &blockInfo);
-// break;
-// }
-// }
-//
-// if (terrno != TSDB_CODE_SUCCESS) {
-// T_LONG_JMP(pRuntimeEnv->env, terrno);
-// }
-// }
-
// static TSKEY doSkipIntervalProcess(STaskRuntimeEnv* pRuntimeEnv, STimeWindow* win, SDataBlockInfo* pBlockInfo,
// STableQueryInfo* pTableQueryInfo) {
// STaskAttr *pQueryAttr = pRuntimeEnv->pQueryAttr;
@@ -1564,15 +1326,13 @@ int32_t appendDownstream(SOperatorInfo* p, SOperatorInfo** pDownstream, int32_t
return TSDB_CODE_SUCCESS;
}
-static int32_t doInitAggInfoSup(SAggSupporter* pAggSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, size_t keyBufSize,
- const char* pKey);
-
int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scanFlag) {
// todo add more information about exchange operation
int32_t type = pOperator->operatorType;
if (type == QUERY_NODE_PHYSICAL_PLAN_EXCHANGE || type == QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN ||
type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN || type == QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN ||
- type == QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN || type == QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN) {
+ type == QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN || type == QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN ||
+ type == QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN) {
*order = TSDB_ORDER_ASC;
*scanFlag = MAIN_SCAN;
return TSDB_CODE_SUCCESS;
@@ -1595,6 +1355,77 @@ int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scan
}
}
+static int32_t createDataBlockForEmptyInput(SOperatorInfo* pOperator, SSDataBlock **ppBlock) {
+ if (!tsCountAlwaysReturnValue) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ SOperatorInfo* downstream = pOperator->pDownstream[0];
+ if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_PARTITION ||
+ (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN &&
+ ((STableScanInfo *)downstream->info)->hasGroupByTag == true)) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ SqlFunctionCtx* pCtx = pOperator->exprSupp.pCtx;
+ bool hasCountFunc = false;
+
+ for (int32_t i = 0; i < pOperator->exprSupp.numOfExprs; ++i) {
+ const char* pName = pCtx[i].pExpr->pExpr->_function.functionName;
+ if ((strcmp(pName, "count") == 0) || (strcmp(pName, "hyperloglog") == 0) ||
+ (strcmp(pName, "_hyperloglog_partial") == 0) || (strcmp(pName, "_hyperloglog_merge") == 0)) {
+ hasCountFunc = true;
+ break;
+ }
+ }
+
+ if (!hasCountFunc) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ SSDataBlock* pBlock = createDataBlock();
+ pBlock->info.rows = 1;
+ pBlock->info.capacity = 0;
+
+ for (int32_t i = 0; i < pOperator->exprSupp.numOfExprs; ++i) {
+ SColumnInfoData colInfo = {0};
+ colInfo.hasNull = true;
+ colInfo.info.type = TSDB_DATA_TYPE_NULL;
+ colInfo.info.bytes = 1;
+
+ SExprInfo* pOneExpr = &pOperator->exprSupp.pExprInfo[i];
+ for (int32_t j = 0; j < pOneExpr->base.numOfParams; ++j) {
+ SFunctParam* pFuncParam = &pOneExpr->base.pParam[j];
+ if (pFuncParam->type == FUNC_PARAM_TYPE_COLUMN) {
+ int32_t slotId = pFuncParam->pCol->slotId;
+ int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ if (slotId >= numOfCols) {
+ taosArrayEnsureCap(pBlock->pDataBlock, slotId + 1);
+ for (int32_t k = numOfCols; k < slotId + 1; ++k) {
+ taosArrayPush(pBlock->pDataBlock, &colInfo);
+ }
+ }
+ } else if (pFuncParam->type == FUNC_PARAM_TYPE_VALUE) {
+ // do nothing
+ }
+ }
+ }
+
+ blockDataEnsureCapacity(pBlock, pBlock->info.rows);
+ *ppBlock = pBlock;
+
+ return TSDB_CODE_SUCCESS;
+}
+
+static void destroyDataBlockForEmptyInput(bool blockAllocated, SSDataBlock **ppBlock) {
+ if (!blockAllocated) {
+ return;
+ }
+
+ blockDataDestroy(*ppBlock);
+ *ppBlock = NULL;
+}
+
// this is a blocking operator
static int32_t doOpenAggregateOptr(SOperatorInfo* pOperator) {
if (OPTR_IS_OPENED(pOperator)) {
@@ -1612,40 +1443,63 @@ static int32_t doOpenAggregateOptr(SOperatorInfo* pOperator) {
int32_t order = TSDB_ORDER_ASC;
int32_t scanFlag = MAIN_SCAN;
+ bool hasValidBlock = false;
+ bool blockAllocated = false;
+
while (1) {
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
if (pBlock == NULL) {
- break;
+ if (!hasValidBlock) {
+ createDataBlockForEmptyInput(pOperator, &pBlock);
+ if (pBlock == NULL) {
+ break;
+ }
+ blockAllocated = true;
+ } else {
+ break;
+ }
}
+ hasValidBlock = true;
int32_t code = getTableScanInfo(pOperator, &order, &scanFlag);
if (code != TSDB_CODE_SUCCESS) {
+ destroyDataBlockForEmptyInput(blockAllocated, &pBlock);
T_LONG_JMP(pTaskInfo->env, code);
}
// there is an scalar expression that needs to be calculated before apply the group aggregation.
- if (pAggInfo->scalarExprSup.pExprInfo != NULL) {
+ if (pAggInfo->scalarExprSup.pExprInfo != NULL && !blockAllocated) {
SExprSupp* pSup1 = &pAggInfo->scalarExprSup;
code = projectApplyFunctions(pSup1->pExprInfo, pBlock, pBlock, pSup1->pCtx, pSup1->numOfExprs, NULL);
if (code != TSDB_CODE_SUCCESS) {
+ destroyDataBlockForEmptyInput(blockAllocated, &pBlock);
T_LONG_JMP(pTaskInfo->env, code);
}
}
// the pDataBlock are always the same one, no need to call this again
- setExecutionContext(pOperator, pOperator->exprSupp.numOfExprs, pBlock->info.groupId);
+ setExecutionContext(pOperator, pOperator->exprSupp.numOfExprs, pBlock->info.id.groupId);
setInputDataBlock(pSup, pBlock, order, scanFlag, true);
code = doAggregateImpl(pOperator, pSup->pCtx);
if (code != 0) {
+ destroyDataBlockForEmptyInput(blockAllocated, &pBlock);
T_LONG_JMP(pTaskInfo->env, code);
}
+
+ destroyDataBlockForEmptyInput(blockAllocated, &pBlock);
+
+ }
+
+ // the downstream operator may return with error code, so let's check the code before generating results.
+ if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
+ T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
}
initGroupedResultInfo(&pAggInfo->groupResInfo, pAggInfo->aggSup.pResultRowHashTable, 0);
OPTR_SET_OPENED(pOperator);
pOperator->cost.openCost = (taosGetTimestampUs() - st) / 1000.0;
- return TSDB_CODE_SUCCESS;
+ return pTaskInfo->code;
}
static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) {
@@ -1684,180 +1538,6 @@ static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) {
return (rows == 0) ? NULL : pInfo->pRes;
}
-static void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag);
-static void doHandleRemainBlockForNewGroupImpl(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo,
- SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) {
- pInfo->totalInputRows = pInfo->existNewGroupBlock->info.rows;
- SSDataBlock* pResBlock = pInfo->pFinalRes;
-
- int32_t order = TSDB_ORDER_ASC;
- int32_t scanFlag = MAIN_SCAN;
- getTableScanInfo(pOperator, &order, &scanFlag);
-
- int64_t ekey = pInfo->existNewGroupBlock->info.window.ekey;
- taosResetFillInfo(pInfo->pFillInfo, getFillInfoStart(pInfo->pFillInfo));
-
- blockDataCleanup(pInfo->pRes);
- doApplyScalarCalculation(pOperator, pInfo->existNewGroupBlock, order, scanFlag);
-
- taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, ekey);
- taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes);
-
- int32_t numOfResultRows = pResultInfo->capacity - pResBlock->info.rows;
- taosFillResultDataBlock(pInfo->pFillInfo, pResBlock, numOfResultRows);
-
- pInfo->curGroupId = pInfo->existNewGroupBlock->info.groupId;
- pInfo->existNewGroupBlock = NULL;
-}
-
-static void doHandleRemainBlockFromNewGroup(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo,
- SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) {
- if (taosFillHasMoreResults(pInfo->pFillInfo)) {
- int32_t numOfResultRows = pResultInfo->capacity - pInfo->pFinalRes->info.rows;
- taosFillResultDataBlock(pInfo->pFillInfo, pInfo->pFinalRes, numOfResultRows);
- pInfo->pRes->info.groupId = pInfo->curGroupId;
- return;
- }
-
- // handle the cached new group data block
- if (pInfo->existNewGroupBlock) {
- doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo);
- }
-}
-
-static void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag) {
- SFillOperatorInfo* pInfo = pOperator->info;
- SExprSupp* pSup = &pOperator->exprSupp;
- setInputDataBlock(pSup, pBlock, order, scanFlag, false);
- projectApplyFunctions(pSup->pExprInfo, pInfo->pRes, pBlock, pSup->pCtx, pSup->numOfExprs, NULL);
-
- // reset the row value before applying the no-fill functions to the input data block, which is "pBlock" in this case.
- pInfo->pRes->info.rows = 0;
- SExprSupp* pNoFillSupp = &pInfo->noFillExprSupp;
- setInputDataBlock(pNoFillSupp, pBlock, order, scanFlag, false);
-
- projectApplyFunctions(pNoFillSupp->pExprInfo, pInfo->pRes, pBlock, pNoFillSupp->pCtx, pNoFillSupp->numOfExprs, NULL);
- pInfo->pRes->info.groupId = pBlock->info.groupId;
-}
-
-static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
- SFillOperatorInfo* pInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- SResultInfo* pResultInfo = &pOperator->resultInfo;
- SSDataBlock* pResBlock = pInfo->pFinalRes;
-
- blockDataCleanup(pResBlock);
-
- int32_t order = TSDB_ORDER_ASC;
- int32_t scanFlag = MAIN_SCAN;
- getTableScanInfo(pOperator, &order, &scanFlag);
-
- doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo);
- if (pResBlock->info.rows > 0) {
- pResBlock->info.groupId = pInfo->curGroupId;
- return pResBlock;
- }
-
- SOperatorInfo* pDownstream = pOperator->pDownstream[0];
- while (1) {
- SSDataBlock* pBlock = pDownstream->fpSet.getNextFn(pDownstream);
- if (pBlock == NULL) {
- if (pInfo->totalInputRows == 0) {
- setOperatorCompleted(pOperator);
- return NULL;
- }
-
- taosFillSetStartInfo(pInfo->pFillInfo, 0, pInfo->win.ekey);
- } else {
- blockDataUpdateTsWindow(pBlock, pInfo->primarySrcSlotId);
-
- blockDataCleanup(pInfo->pRes);
- blockDataEnsureCapacity(pInfo->pRes, pBlock->info.rows);
- blockDataEnsureCapacity(pInfo->pFinalRes, pBlock->info.rows);
- doApplyScalarCalculation(pOperator, pBlock, order, scanFlag);
-
- if (pInfo->curGroupId == 0 || pInfo->curGroupId == pInfo->pRes->info.groupId) {
- pInfo->curGroupId = pInfo->pRes->info.groupId; // the first data block
- pInfo->totalInputRows += pInfo->pRes->info.rows;
-
- if (order == pInfo->pFillInfo->order) {
- taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.ekey);
- } else {
- taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.skey);
- }
- taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes);
- } else if (pInfo->curGroupId != pBlock->info.groupId) { // the new group data block
- pInfo->existNewGroupBlock = pBlock;
-
- // Fill the previous group data block, before handle the data block of new group.
- // Close the fill operation for previous group data block
- taosFillSetStartInfo(pInfo->pFillInfo, 0, pInfo->win.ekey);
- }
- }
-
- int32_t numOfResultRows = pOperator->resultInfo.capacity - pResBlock->info.rows;
- taosFillResultDataBlock(pInfo->pFillInfo, pResBlock, numOfResultRows);
-
- // current group has no more result to return
- if (pResBlock->info.rows > 0) {
- // 1. The result in current group not reach the threshold of output result, continue
- // 2. If multiple group results existing in one SSDataBlock is not allowed, return immediately
- if (pResBlock->info.rows > pResultInfo->threshold || pBlock == NULL || pInfo->existNewGroupBlock != NULL) {
- pResBlock->info.groupId = pInfo->curGroupId;
- return pResBlock;
- }
-
- doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo);
- if (pResBlock->info.rows >= pOperator->resultInfo.threshold || pBlock == NULL) {
- pResBlock->info.groupId = pInfo->curGroupId;
- return pResBlock;
- }
- } else if (pInfo->existNewGroupBlock) { // try next group
- assert(pBlock != NULL);
-
- blockDataCleanup(pResBlock);
-
- doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo);
- if (pResBlock->info.rows > pResultInfo->threshold) {
- pResBlock->info.groupId = pInfo->curGroupId;
- return pResBlock;
- }
- } else {
- return NULL;
- }
- }
-}
-
-static SSDataBlock* doFill(SOperatorInfo* pOperator) {
- SFillOperatorInfo* pInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- if (pOperator->status == OP_EXEC_DONE) {
- return NULL;
- }
-
- SSDataBlock* fillResult = NULL;
- while (true) {
- fillResult = doFillImpl(pOperator);
- if (fillResult == NULL) {
- setOperatorCompleted(pOperator);
- break;
- }
-
- doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo);
- if (fillResult->info.rows > 0) {
- break;
- }
- }
-
- if (fillResult != NULL) {
- pOperator->resultInfo.totalRows += fillResult->info.rows;
- }
-
- return fillResult;
-}
-
void destroyExprInfo(SExprInfo* pExpr, int32_t numOfExprs) {
for (int32_t i = 0; i < numOfExprs; ++i) {
SExprInfo* pExprInfo = &pExpr[i];
@@ -1896,6 +1576,16 @@ void destroyOperatorInfo(SOperatorInfo* pOperator) {
taosMemoryFreeClear(pOperator);
}
+// each operator should be set their own function to return total cost buffer
+int32_t optrDefaultBufFn(SOperatorInfo* pOperator) {
+ if (pOperator->blocking) {
+ ASSERT(0);
+ return 0;
+ } else {
+ return 0;
+ }
+}
+
int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz) {
*defaultPgsz = 4096;
while (*defaultPgsz < rowSize * 4) {
@@ -1921,7 +1611,7 @@ int32_t doInitAggInfoSup(SAggSupporter* pAggSup, SqlFunctionCtx* pCtx, int32_t n
pAggSup->currentPageId = -1;
pAggSup->resultRowSize = getResultRowSize(pCtx, numOfOutput);
pAggSup->keyBuf = taosMemoryCalloc(1, keyBufSize + POINTER_BYTES + sizeof(int64_t));
- pAggSup->pResultRowHashTable = tSimpleHashInit(10, hashFn);
+ pAggSup->pResultRowHashTable = tSimpleHashInit(100, hashFn);
if (pAggSup->keyBuf == NULL || pAggSup->pResultRowHashTable == NULL) {
return TSDB_CODE_OUT_OF_MEMORY;
@@ -1952,7 +1642,7 @@ void cleanupAggSup(SAggSupporter* pAggSup) {
destroyDiskbasedBuf(pAggSup->pResultBuf);
}
-int32_t initAggInfo(SExprSupp* pSup, SAggSupporter* pAggSup, SExprInfo* pExprInfo, int32_t numOfCols, size_t keyBufSize,
+int32_t initAggSup(SExprSupp* pSup, SAggSupporter* pAggSup, SExprInfo* pExprInfo, int32_t numOfCols, size_t keyBufSize,
const char* pkey) {
int32_t code = initExprSupp(pSup, pExprInfo, numOfCols);
if (code != TSDB_CODE_SUCCESS) {
@@ -2042,7 +1732,7 @@ SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SAggPhysiN
goto _error;
}
- SSDataBlock* pResBlock = createResDataBlock(pAggNode->node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pAggNode->node.pOutputDataBlockDesc);
initBasicInfo(&pInfo->binfo, pResBlock);
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
@@ -2050,7 +1740,7 @@ SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SAggPhysiN
int32_t num = 0;
SExprInfo* pExprInfo = createExprInfo(pAggNode->pAggFuncs, pAggNode->pGroupKeys, &num);
- int32_t code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
+ int32_t code = initAggSup(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -2076,7 +1766,7 @@ SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SAggPhysiN
setOperatorInfo(pOperator, "TableAggregate", QUERY_NODE_PHYSICAL_PLAN_HASH_AGG, true, OP_NOT_OPENED, pInfo,
pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(doOpenAggregateOptr, getAggregateResult, NULL, destroyAggOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(doOpenAggregateOptr, getAggregateResult, NULL, destroyAggOperatorInfo, optrDefaultBufFn, NULL);
if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
STableScanInfo* pTableScanInfo = downstream->info;
@@ -2127,167 +1817,6 @@ void destroyAggOperatorInfo(void* param) {
taosMemoryFreeClear(param);
}
-void destroyFillOperatorInfo(void* param) {
- SFillOperatorInfo* pInfo = (SFillOperatorInfo*)param;
- pInfo->pFillInfo = taosDestroyFillInfo(pInfo->pFillInfo);
- pInfo->pRes = blockDataDestroy(pInfo->pRes);
- pInfo->pFinalRes = blockDataDestroy(pInfo->pFinalRes);
-
- cleanupExprSupp(&pInfo->noFillExprSupp);
-
- taosMemoryFreeClear(pInfo->p);
- taosArrayDestroy(pInfo->matchInfo.pList);
- taosMemoryFreeClear(param);
-}
-
-static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t numOfCols, SExprInfo* pNotFillExpr,
- int32_t numOfNotFillCols, SNodeListNode* pValNode, STimeWindow win, int32_t capacity,
- const char* id, SInterval* pInterval, int32_t fillType, int32_t order) {
- SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfCols, pNotFillExpr, numOfNotFillCols, pValNode);
-
- int64_t startKey = (order == TSDB_ORDER_ASC) ? win.skey : win.ekey;
- STimeWindow w = getAlignQueryTimeWindow(pInterval, pInterval->precision, startKey);
- w = getFirstQualifiedTimeWindow(startKey, &w, pInterval, order);
-
- pInfo->pFillInfo = taosCreateFillInfo(w.skey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo,
- pInfo->primaryTsCol, order, id);
-
- if (order == TSDB_ORDER_ASC) {
- pInfo->win.skey = win.skey;
- pInfo->win.ekey = win.ekey;
- } else {
- pInfo->win.skey = win.ekey;
- pInfo->win.ekey = win.skey;
- }
- pInfo->p = taosMemoryCalloc(numOfCols, POINTER_BYTES);
-
- if (pInfo->pFillInfo == NULL || pInfo->p == NULL) {
- taosMemoryFree(pInfo->pFillInfo);
- taosMemoryFree(pInfo->p);
- return TSDB_CODE_OUT_OF_MEMORY;
- } else {
- return TSDB_CODE_SUCCESS;
- }
-}
-
-static bool isWstartColumnExist(SFillOperatorInfo* pInfo) {
- if (pInfo->noFillExprSupp.numOfExprs == 0) {
- return false;
- }
-
- for (int32_t i = 0; i < pInfo->noFillExprSupp.numOfExprs; ++i) {
- SExprInfo* exprInfo = pInfo->noFillExprSupp.pExprInfo + i;
- if (exprInfo->pExpr->nodeType == QUERY_NODE_COLUMN && exprInfo->base.numOfParams == 1 &&
- exprInfo->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_START) {
- return true;
- }
- }
- return false;
-}
-
-static int32_t createPrimaryTsExprIfNeeded(SFillOperatorInfo* pInfo, SFillPhysiNode* pPhyFillNode, SExprSupp* pExprSupp,
- const char* idStr) {
- bool wstartExist = isWstartColumnExist(pInfo);
-
- if (wstartExist == false) {
- if (pPhyFillNode->pWStartTs->type != QUERY_NODE_TARGET) {
- qError("pWStartTs of fill physical node is not a target node, %s", idStr);
- return TSDB_CODE_QRY_SYS_ERROR;
- }
-
- SExprInfo* pExpr = taosMemoryRealloc(pExprSupp->pExprInfo, (pExprSupp->numOfExprs + 1) * sizeof(SExprInfo));
- if (pExpr == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
-
- createExprFromTargetNode(&pExpr[pExprSupp->numOfExprs], (STargetNode*)pPhyFillNode->pWStartTs);
- pExprSupp->numOfExprs += 1;
- pExprSupp->pExprInfo = pExpr;
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
-SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode,
- SExecTaskInfo* pTaskInfo) {
- SFillOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SFillOperatorInfo));
- SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- if (pInfo == NULL || pOperator == NULL) {
- goto _error;
- }
-
- pInfo->pRes = createResDataBlock(pPhyFillNode->node.pOutputDataBlockDesc);
- SExprInfo* pExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &pInfo->numOfExpr);
- pOperator->exprSupp.pExprInfo = pExprInfo;
-
- SExprSupp* pNoFillSupp = &pInfo->noFillExprSupp;
- pNoFillSupp->pExprInfo = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &pNoFillSupp->numOfExprs);
- int32_t code = createPrimaryTsExprIfNeeded(pInfo, pPhyFillNode, pNoFillSupp, pTaskInfo->id.str);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- code = initExprSupp(pNoFillSupp, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- SInterval* pInterval =
- QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == downstream->operatorType
- ? &((SMergeAlignedIntervalAggOperatorInfo*)downstream->info)->intervalAggOperatorInfo->interval
- : &((SIntervalAggOperatorInfo*)downstream->info)->interval;
-
- int32_t order = (pPhyFillNode->inputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
- int32_t type = convertFillType(pPhyFillNode->mode);
-
- SResultInfo* pResultInfo = &pOperator->resultInfo;
-
- initResultSizeInfo(&pOperator->resultInfo, 4096);
- blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
- code = initExprSupp(&pOperator->exprSupp, pExprInfo, pInfo->numOfExpr);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- pInfo->primaryTsCol = ((STargetNode*)pPhyFillNode->pWStartTs)->slotId;
- pInfo->primarySrcSlotId = ((SColumnNode*)((STargetNode*)pPhyFillNode->pWStartTs)->pExpr)->slotId;
-
- int32_t numOfOutputCols = 0;
- code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc, &numOfOutputCols,
- COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo);
-
- code = initFillInfo(pInfo, pExprInfo, pInfo->numOfExpr, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs,
- (SNodeListNode*)pPhyFillNode->pValues, pPhyFillNode->timeRange, pResultInfo->capacity,
- pTaskInfo->id.str, pInterval, type, order);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- pInfo->pFinalRes = createOneDataBlock(pInfo->pRes, false);
- blockDataEnsureCapacity(pInfo->pFinalRes, pOperator->resultInfo.capacity);
-
- code = filterInitFromNode((SNode*)pPhyFillNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- setOperatorInfo(pOperator, "FillOperator", QUERY_NODE_PHYSICAL_PLAN_FILL, false, OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->exprSupp.numOfExprs = pInfo->numOfExpr;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doFill, NULL, destroyFillOperatorInfo, NULL);
-
- code = appendDownstream(pOperator, &downstream, 1);
- return pOperator;
-
-_error:
- if (pInfo != NULL) {
- destroyFillOperatorInfo(pInfo);
- }
-
- pTaskInfo->code = code;
- taosMemoryFreeClear(pOperator);
- return NULL;
-}
-
static SExecTaskInfo* createExecTaskInfo(uint64_t queryId, uint64_t taskId, EOPTR_EXEC_MODEL model, char* dbFName) {
SExecTaskInfo* pTaskInfo = taosMemoryCalloc(1, sizeof(SExecTaskInfo));
if (pTaskInfo == NULL) {
@@ -2298,11 +1827,11 @@ static SExecTaskInfo* createExecTaskInfo(uint64_t queryId, uint64_t taskId, EOPT
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
pTaskInfo->schemaInfo.dbname = strdup(dbFName);
- pTaskInfo->cost.created = taosGetTimestampMs();
pTaskInfo->id.queryId = queryId;
pTaskInfo->execModel = model;
pTaskInfo->pTableInfoList = tableListCreate();
pTaskInfo->stopInfo.pStopInfo = taosArrayInit(4, sizeof(SExchangeOpStopInfo));
+ pTaskInfo->pResultBlockList = taosArrayInit(128, POINTER_BYTES);
char* p = taosMemoryCalloc(1, 128);
snprintf(p, 128, "TID:0x%" PRIx64 " QID:0x%" PRIx64, taskId, queryId);
@@ -2316,7 +1845,7 @@ SSchemaWrapper* extractQueriedColumnSchema(SScanPhysiNode* pScanNode);
int32_t extractTableSchemaInfo(SReadHandle* pHandle, SScanPhysiNode* pScanNode, SExecTaskInfo* pTaskInfo) {
SMetaReader mr = {0};
metaReaderInit(&mr, pHandle->meta, 0);
- int32_t code = metaGetTableEntryByUid(&mr, pScanNode->uid);
+ int32_t code = metaGetTableEntryByUidCache(&mr, pScanNode->uid);
if (code != TSDB_CODE_SUCCESS) {
qError("failed to get the table meta, uid:0x%" PRIx64 ", suid:0x%" PRIx64 ", %s", pScanNode->uid, pScanNode->suid,
GET_TASKID(pTaskInfo));
@@ -2335,7 +1864,7 @@ int32_t extractTableSchemaInfo(SReadHandle* pHandle, SScanPhysiNode* pScanNode,
tDecoderClear(&mr.coder);
tb_uid_t suid = mr.me.ctbEntry.suid;
- metaGetTableEntryByUid(&mr, suid);
+ metaGetTableEntryByUidCache(&mr, suid);
pSchemaInfo->sw = tCloneSSchemaWrapper(&mr.me.stbEntry.schemaRow);
pSchemaInfo->tversion = mr.me.stbEntry.schemaTag.version;
} else {
@@ -2503,6 +2032,9 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
} else if (QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN == type) {
SSystemTableScanPhysiNode* pSysScanPhyNode = (SSystemTableScanPhysiNode*)pPhyNode;
pOperator = createSysTableScanOperatorInfo(pHandle, pSysScanPhyNode, pUser, pTaskInfo);
+ } else if (QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN == type) {
+ STableCountScanPhysiNode* pTblCountScanNode = (STableCountScanPhysiNode*)pPhyNode;
+ pOperator = createTableCountScanOperatorInfo(pHandle, pTblCountScanNode, pTaskInfo);
} else if (QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN == type) {
STagScanPhysiNode* pScanPhyNode = (STagScanPhysiNode*)pPhyNode;
@@ -2514,7 +2046,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
return NULL;
}
- pOperator = createTagScanOperatorInfo(pHandle, pScanPhyNode, pTableListInfo, pTaskInfo);
+ pOperator = createTagScanOperatorInfo(pHandle, pScanPhyNode, pTaskInfo);
} else if (QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN == type) {
SBlockDistScanPhysiNode* pBlockNode = (SBlockDistScanPhysiNode*)pPhyNode;
@@ -2526,10 +2058,12 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
return NULL;
}
- for (int32_t i = 0; i < tableListGetSize(pTableListInfo); ++i) {
+ size_t num = taosArrayGetSize(pList);
+ for (int32_t i = 0; i < num; ++i) {
STableKeyInfo* p = taosArrayGet(pList, i);
tableListAddTableInfo(pTableListInfo, p->uid, 0);
}
+
taosArrayDestroy(pList);
} else { // Create group with only one table
tableListAddTableInfo(pTableListInfo, pBlockNode->uid, 0);
@@ -2663,12 +2197,12 @@ static int32_t extractTbscanInStreamOpTree(SOperatorInfo* pOperator, STableScanI
if (pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
if (pOperator->numOfDownstream == 0) {
qError("failed to find stream scan operator");
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
if (pOperator->numOfDownstream > 1) {
qError("join not supported for stream block scan");
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
return extractTbscanInStreamOpTree(pOperator->pDownstream[0], ppInfo);
} else {
@@ -2686,13 +2220,13 @@ int32_t extractTableScanNode(SPhysiNode* pNode, STableScanPhysiNode** ppNode) {
return 0;
} else {
ASSERT(0);
- terrno = TSDB_CODE_QRY_APP_ERROR;
+ terrno = TSDB_CODE_APP_ERROR;
return -1;
}
} else {
if (LIST_LENGTH(pNode->pChildren) != 1) {
ASSERT(0);
- terrno = TSDB_CODE_QRY_APP_ERROR;
+ terrno = TSDB_CODE_APP_ERROR;
return -1;
}
SPhysiNode* pChildNode = (SPhysiNode*)nodesListGetNode(pNode->pChildren, 0);
@@ -2720,110 +2254,13 @@ int32_t rebuildReader(SOperatorInfo* pOperator, SSubplan* plan, SReadHandle* pHa
if (pTableScanInfo->dataReader == NULL) {
ASSERT(0);
qError("failed to create data reader");
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
// TODO: set uid and ts to data reader
return 0;
}
#endif
-int32_t encodeOperator(SOperatorInfo* ops, char** result, int32_t* length, int32_t* nOptrWithVal) {
- int32_t code = TDB_CODE_SUCCESS;
- char* pCurrent = NULL;
- int32_t currLength = 0;
- if (ops->fpSet.encodeResultRow) {
- if (result == NULL || length == NULL || nOptrWithVal == NULL) {
- return TSDB_CODE_TSC_INVALID_INPUT;
- }
- code = ops->fpSet.encodeResultRow(ops, &pCurrent, &currLength);
-
- if (code != TDB_CODE_SUCCESS) {
- if (*result != NULL) {
- taosMemoryFree(*result);
- *result = NULL;
- }
- return code;
- } else if (currLength == 0) {
- ASSERT(!pCurrent);
- goto _downstream;
- }
-
- ++(*nOptrWithVal);
-
- ASSERT(currLength >= 0);
-
- if (*result == NULL) {
- *result = (char*)taosMemoryCalloc(1, currLength + sizeof(int32_t));
- if (*result == NULL) {
- taosMemoryFree(pCurrent);
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- memcpy(*result + sizeof(int32_t), pCurrent, currLength);
- *(int32_t*)(*result) = currLength + sizeof(int32_t);
- } else {
- int32_t sizePre = *(int32_t*)(*result);
- char* tmp = (char*)taosMemoryRealloc(*result, sizePre + currLength);
- if (tmp == NULL) {
- taosMemoryFree(pCurrent);
- taosMemoryFree(*result);
- *result = NULL;
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- *result = tmp;
- memcpy(*result + sizePre, pCurrent, currLength);
- *(int32_t*)(*result) += currLength;
- }
- taosMemoryFree(pCurrent);
- *length = *(int32_t*)(*result);
- }
-
-_downstream:
- for (int32_t i = 0; i < ops->numOfDownstream; ++i) {
- code = encodeOperator(ops->pDownstream[i], result, length, nOptrWithVal);
- if (code != TDB_CODE_SUCCESS) {
- return code;
- }
- }
- return TDB_CODE_SUCCESS;
-}
-
-int32_t decodeOperator(SOperatorInfo* ops, const char* result, int32_t length) {
- int32_t code = TDB_CODE_SUCCESS;
- if (ops->fpSet.decodeResultRow) {
- if (result == NULL) {
- return TSDB_CODE_TSC_INVALID_INPUT;
- }
-
- ASSERT(length == *(int32_t*)result);
-
- const char* data = result + sizeof(int32_t);
- code = ops->fpSet.decodeResultRow(ops, (char*)data);
- if (code != TDB_CODE_SUCCESS) {
- return code;
- }
-
- int32_t totalLength = *(int32_t*)result;
- int32_t dataLength = *(int32_t*)data;
-
- if (totalLength == dataLength + sizeof(int32_t)) { // the last data
- result = NULL;
- length = 0;
- } else {
- result += dataLength;
- *(int32_t*)(result) = totalLength - dataLength;
- length = totalLength - dataLength;
- }
- }
-
- for (int32_t i = 0; i < ops->numOfDownstream; ++i) {
- code = decodeOperator(ops->pDownstream[i], result, length);
- if (code != TDB_CODE_SUCCESS) {
- return code;
- }
- }
- return TDB_CODE_SUCCESS;
-}
-
int32_t createDataSinkParam(SDataSinkNode* pNode, void** pParam, qTaskInfo_t* pTaskInfo, SReadHandle* readHandle) {
SExecTaskInfo* pTask = *(SExecTaskInfo**)pTaskInfo;
@@ -2896,6 +2333,7 @@ int32_t createExecTaskInfoImpl(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, SRead
goto _complete;
}
+ (*pTaskInfo)->cost.created = taosGetTimestampUs();
return TSDB_CODE_SUCCESS;
_complete:
@@ -2904,6 +2342,11 @@ _complete:
return terrno;
}
+static void freeBlock(void* pParam) {
+ SSDataBlock* pBlock = *(SSDataBlock**)pParam;
+ blockDataDestroy(pBlock);
+}
+
void doDestroyTask(SExecTaskInfo* pTaskInfo) {
qDebug("%s execTask is freed", GET_TASKID(pTaskInfo));
@@ -2916,6 +2359,7 @@ void doDestroyTask(SExecTaskInfo* pTaskInfo) {
nodesDestroyNode((SNode*)pTaskInfo->pSubplan);
}
+ taosArrayDestroyEx(pTaskInfo->pResultBlockList, freeBlock);
taosArrayDestroy(pTaskInfo->stopInfo.pStopInfo);
taosMemoryFreeClear(pTaskInfo->sql);
taosMemoryFreeClear(pTaskInfo->id.str);
@@ -2985,7 +2429,7 @@ int32_t getOperatorExplainExecInfo(SOperatorInfo* operatorInfo, SArray* pExecInf
code = getOperatorExplainExecInfo(operatorInfo->pDownstream[i], pExecInfoList);
if (code != TSDB_CODE_SUCCESS) {
// taosMemoryFreeClear(*pRes);
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
}
@@ -3002,7 +2446,7 @@ int32_t setOutputBuf(SStreamState* pState, STimeWindow* win, SResultRow** pResul
int32_t size = pAggSup->resultRowSize;
if (streamStateAddIfNotExist(pState, &key, (void**)&value, &size) < 0) {
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
*pResult = (SResultRow*)value;
ASSERT(*pResult);
@@ -3051,10 +2495,10 @@ int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pStat
continue;
}
- if (pBlock->info.groupId == 0) {
- pBlock->info.groupId = pPos->groupId;
+ if (pBlock->info.id.groupId == 0) {
+ pBlock->info.id.groupId = pPos->groupId;
void* tbname = NULL;
- if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname) < 0) {
pBlock->info.parTbName[0] = 0;
} else {
memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
@@ -3062,7 +2506,7 @@ int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pStat
tdbFree(tbname);
} else {
// current value belongs to different group, it can't be packed into one datablock
- if (pBlock->info.groupId != pPos->groupId) {
+ if (pBlock->info.id.groupId != pPos->groupId) {
releaseOutputBuf(pState, &key, pRow);
break;
}
@@ -3142,11 +2586,11 @@ int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, SStreamState* pSta
continue;
}
- if (pBlock->info.groupId == 0) {
- pBlock->info.groupId = pKey->groupId;
+ if (pBlock->info.id.groupId == 0) {
+ pBlock->info.id.groupId = pKey->groupId;
void* tbname = NULL;
- if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname) < 0) {
pBlock->info.parTbName[0] = 0;
} else {
memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
@@ -3154,7 +2598,7 @@ int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, SStreamState* pSta
tdbFree(tbname);
} else {
// current value belongs to different group, it can't be packed into one datablock
- if (pBlock->info.groupId != pKey->groupId) {
+ if (pBlock->info.id.groupId != pKey->groupId) {
releaseOutputBuf(pState, NULL, pRow);
break;
}
diff --git a/source/libs/executor/src/filloperator.c b/source/libs/executor/src/filloperator.c
new file mode 100644
index 0000000000000000000000000000000000000000..8d5af64777172adf3e24bf3edebc8c47438b7476
--- /dev/null
+++ b/source/libs/executor/src/filloperator.c
@@ -0,0 +1,1494 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#include "filter.h"
+#include "os.h"
+#include "query.h"
+#include "taosdef.h"
+#include "tmsg.h"
+#include "ttypes.h"
+
+#include "executorimpl.h"
+#include "tcommon.h"
+#include "thash.h"
+#include "ttime.h"
+
+#include "executorInt.h"
+#include "function.h"
+#include "querynodes.h"
+#include "tdatablock.h"
+#include "tfill.h"
+
+#define FILL_POS_INVALID 0
+#define FILL_POS_START 1
+#define FILL_POS_MID 2
+#define FILL_POS_END 3
+
+typedef struct STimeRange {
+ TSKEY skey;
+ TSKEY ekey;
+ uint64_t groupId;
+} STimeRange;
+
+typedef struct SFillOperatorInfo {
+ struct SFillInfo* pFillInfo;
+ SSDataBlock* pRes;
+ SSDataBlock* pFinalRes;
+ int64_t totalInputRows;
+ void** p;
+ SSDataBlock* existNewGroupBlock;
+ STimeWindow win;
+ SColMatchInfo matchInfo;
+ int32_t primaryTsCol;
+ int32_t primarySrcSlotId;
+ uint64_t curGroupId; // current handled group id
+ SExprInfo* pExprInfo;
+ int32_t numOfExpr;
+ SExprSupp noFillExprSupp;
+} SFillOperatorInfo;
+
+static void destroyFillOperatorInfo(void* param);
+static void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag);
+
+static void doHandleRemainBlockForNewGroupImpl(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo,
+ SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) {
+ pInfo->totalInputRows = pInfo->existNewGroupBlock->info.rows;
+ SSDataBlock* pResBlock = pInfo->pFinalRes;
+
+ int32_t order = TSDB_ORDER_ASC;
+ int32_t scanFlag = MAIN_SCAN;
+ getTableScanInfo(pOperator, &order, &scanFlag);
+
+ int64_t ekey = pInfo->existNewGroupBlock->info.window.ekey;
+ taosResetFillInfo(pInfo->pFillInfo, getFillInfoStart(pInfo->pFillInfo));
+
+ blockDataCleanup(pInfo->pRes);
+ doApplyScalarCalculation(pOperator, pInfo->existNewGroupBlock, order, scanFlag);
+
+ taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, ekey);
+ taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes);
+
+ int32_t numOfResultRows = pResultInfo->capacity - pResBlock->info.rows;
+ taosFillResultDataBlock(pInfo->pFillInfo, pResBlock, numOfResultRows);
+
+ pInfo->curGroupId = pInfo->existNewGroupBlock->info.id.groupId;
+ pInfo->existNewGroupBlock = NULL;
+}
+
+static void doHandleRemainBlockFromNewGroup(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo,
+ SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) {
+ if (taosFillHasMoreResults(pInfo->pFillInfo)) {
+ int32_t numOfResultRows = pResultInfo->capacity - pInfo->pFinalRes->info.rows;
+ taosFillResultDataBlock(pInfo->pFillInfo, pInfo->pFinalRes, numOfResultRows);
+ pInfo->pRes->info.id.groupId = pInfo->curGroupId;
+ return;
+ }
+
+ // handle the cached new group data block
+ if (pInfo->existNewGroupBlock) {
+ doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo);
+ }
+}
+
+void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag) {
+ SFillOperatorInfo* pInfo = pOperator->info;
+ SExprSupp* pSup = &pOperator->exprSupp;
+ setInputDataBlock(pSup, pBlock, order, scanFlag, false);
+ projectApplyFunctions(pSup->pExprInfo, pInfo->pRes, pBlock, pSup->pCtx, pSup->numOfExprs, NULL);
+
+ // reset the row value before applying the no-fill functions to the input data block, which is "pBlock" in this case.
+ pInfo->pRes->info.rows = 0;
+ SExprSupp* pNoFillSupp = &pInfo->noFillExprSupp;
+ setInputDataBlock(pNoFillSupp, pBlock, order, scanFlag, false);
+
+ projectApplyFunctions(pNoFillSupp->pExprInfo, pInfo->pRes, pBlock, pNoFillSupp->pCtx, pNoFillSupp->numOfExprs, NULL);
+ pInfo->pRes->info.id.groupId = pBlock->info.id.groupId;
+}
+
+static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
+ SFillOperatorInfo* pInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ SResultInfo* pResultInfo = &pOperator->resultInfo;
+ SSDataBlock* pResBlock = pInfo->pFinalRes;
+
+ blockDataCleanup(pResBlock);
+
+ int32_t order = TSDB_ORDER_ASC;
+ int32_t scanFlag = MAIN_SCAN;
+ getTableScanInfo(pOperator, &order, &scanFlag);
+
+ doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo);
+ if (pResBlock->info.rows > 0) {
+ pResBlock->info.id.groupId = pInfo->curGroupId;
+ return pResBlock;
+ }
+
+ SOperatorInfo* pDownstream = pOperator->pDownstream[0];
+ while (1) {
+ SSDataBlock* pBlock = pDownstream->fpSet.getNextFn(pDownstream);
+ if (pBlock == NULL) {
+ if (pInfo->totalInputRows == 0) {
+ setOperatorCompleted(pOperator);
+ return NULL;
+ }
+
+ taosFillSetStartInfo(pInfo->pFillInfo, 0, pInfo->win.ekey);
+ } else {
+ blockDataUpdateTsWindow(pBlock, pInfo->primarySrcSlotId);
+
+ blockDataCleanup(pInfo->pRes);
+ blockDataEnsureCapacity(pInfo->pRes, pBlock->info.rows);
+ blockDataEnsureCapacity(pInfo->pFinalRes, pBlock->info.rows);
+ doApplyScalarCalculation(pOperator, pBlock, order, scanFlag);
+
+ if (pInfo->curGroupId == 0 || pInfo->curGroupId == pInfo->pRes->info.id.groupId) {
+ pInfo->curGroupId = pInfo->pRes->info.id.groupId; // the first data block
+ pInfo->totalInputRows += pInfo->pRes->info.rows;
+
+ if (order == pInfo->pFillInfo->order) {
+ taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.ekey);
+ } else {
+ taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.skey);
+ }
+ taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes);
+ } else if (pInfo->curGroupId != pBlock->info.id.groupId) { // the new group data block
+ pInfo->existNewGroupBlock = pBlock;
+
+ // Fill the previous group data block, before handle the data block of new group.
+ // Close the fill operation for previous group data block
+ taosFillSetStartInfo(pInfo->pFillInfo, 0, pInfo->win.ekey);
+ }
+ }
+
+ int32_t numOfResultRows = pOperator->resultInfo.capacity - pResBlock->info.rows;
+ taosFillResultDataBlock(pInfo->pFillInfo, pResBlock, numOfResultRows);
+
+ // current group has no more result to return
+ if (pResBlock->info.rows > 0) {
+ // 1. The result in current group not reach the threshold of output result, continue
+ // 2. If multiple group results existing in one SSDataBlock is not allowed, return immediately
+ if (pResBlock->info.rows > pResultInfo->threshold || pBlock == NULL || pInfo->existNewGroupBlock != NULL) {
+ pResBlock->info.id.groupId = pInfo->curGroupId;
+ return pResBlock;
+ }
+
+ doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo);
+ if (pResBlock->info.rows >= pOperator->resultInfo.threshold || pBlock == NULL) {
+ pResBlock->info.id.groupId = pInfo->curGroupId;
+ return pResBlock;
+ }
+ } else if (pInfo->existNewGroupBlock) { // try next group
+ assert(pBlock != NULL);
+
+ blockDataCleanup(pResBlock);
+
+ doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo);
+ if (pResBlock->info.rows > pResultInfo->threshold) {
+ pResBlock->info.id.groupId = pInfo->curGroupId;
+ return pResBlock;
+ }
+ } else {
+ return NULL;
+ }
+ }
+}
+
+static SSDataBlock* doFill(SOperatorInfo* pOperator) {
+ SFillOperatorInfo* pInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
+
+ SSDataBlock* fillResult = NULL;
+ while (true) {
+ fillResult = doFillImpl(pOperator);
+ if (fillResult == NULL) {
+ setOperatorCompleted(pOperator);
+ break;
+ }
+
+ doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo);
+ if (fillResult->info.rows > 0) {
+ break;
+ }
+ }
+
+ if (fillResult != NULL) {
+ pOperator->resultInfo.totalRows += fillResult->info.rows;
+ }
+
+ return fillResult;
+}
+
+void destroyFillOperatorInfo(void* param) {
+ SFillOperatorInfo* pInfo = (SFillOperatorInfo*)param;
+ pInfo->pFillInfo = taosDestroyFillInfo(pInfo->pFillInfo);
+ pInfo->pRes = blockDataDestroy(pInfo->pRes);
+ pInfo->pFinalRes = blockDataDestroy(pInfo->pFinalRes);
+
+ cleanupExprSupp(&pInfo->noFillExprSupp);
+
+ taosMemoryFreeClear(pInfo->p);
+ taosArrayDestroy(pInfo->matchInfo.pList);
+ taosMemoryFreeClear(param);
+}
+
+static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t numOfCols, SExprInfo* pNotFillExpr,
+ int32_t numOfNotFillCols, SNodeListNode* pValNode, STimeWindow win, int32_t capacity,
+ const char* id, SInterval* pInterval, int32_t fillType, int32_t order) {
+ SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfCols, pNotFillExpr, numOfNotFillCols, pValNode);
+
+ int64_t startKey = (order == TSDB_ORDER_ASC) ? win.skey : win.ekey;
+ STimeWindow w = getAlignQueryTimeWindow(pInterval, pInterval->precision, startKey);
+ w = getFirstQualifiedTimeWindow(startKey, &w, pInterval, order);
+
+ pInfo->pFillInfo = taosCreateFillInfo(w.skey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo,
+ pInfo->primaryTsCol, order, id);
+
+ if (order == TSDB_ORDER_ASC) {
+ pInfo->win.skey = win.skey;
+ pInfo->win.ekey = win.ekey;
+ } else {
+ pInfo->win.skey = win.ekey;
+ pInfo->win.ekey = win.skey;
+ }
+ pInfo->p = taosMemoryCalloc(numOfCols, POINTER_BYTES);
+
+ if (pInfo->pFillInfo == NULL || pInfo->p == NULL) {
+ taosMemoryFree(pInfo->pFillInfo);
+ taosMemoryFree(pInfo->p);
+ return TSDB_CODE_OUT_OF_MEMORY;
+ } else {
+ return TSDB_CODE_SUCCESS;
+ }
+}
+
+static bool isWstartColumnExist(SFillOperatorInfo* pInfo) {
+ if (pInfo->noFillExprSupp.numOfExprs == 0) {
+ return false;
+ }
+
+ for (int32_t i = 0; i < pInfo->noFillExprSupp.numOfExprs; ++i) {
+ SExprInfo* exprInfo = pInfo->noFillExprSupp.pExprInfo + i;
+ if (exprInfo->pExpr->nodeType == QUERY_NODE_COLUMN && exprInfo->base.numOfParams == 1 &&
+ exprInfo->base.pParam[0].pCol->colType == COLUMN_TYPE_WINDOW_START) {
+ return true;
+ }
+ }
+ return false;
+}
+
+static int32_t createPrimaryTsExprIfNeeded(SFillOperatorInfo* pInfo, SFillPhysiNode* pPhyFillNode, SExprSupp* pExprSupp,
+ const char* idStr) {
+ bool wstartExist = isWstartColumnExist(pInfo);
+
+ if (wstartExist == false) {
+ if (pPhyFillNode->pWStartTs->type != QUERY_NODE_TARGET) {
+ qError("pWStartTs of fill physical node is not a target node, %s", idStr);
+ return TSDB_CODE_QRY_SYS_ERROR;
+ }
+
+ SExprInfo* pExpr = taosMemoryRealloc(pExprSupp->pExprInfo, (pExprSupp->numOfExprs + 1) * sizeof(SExprInfo));
+ if (pExpr == NULL) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
+ createExprFromTargetNode(&pExpr[pExprSupp->numOfExprs], (STargetNode*)pPhyFillNode->pWStartTs);
+ pExprSupp->numOfExprs += 1;
+ pExprSupp->pExprInfo = pExpr;
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode,
+ SExecTaskInfo* pTaskInfo) {
+ SFillOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SFillOperatorInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ if (pInfo == NULL || pOperator == NULL) {
+ goto _error;
+ }
+
+ pInfo->pRes = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc);
+ SExprInfo* pExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &pInfo->numOfExpr);
+ pOperator->exprSupp.pExprInfo = pExprInfo;
+
+ SExprSupp* pNoFillSupp = &pInfo->noFillExprSupp;
+ pNoFillSupp->pExprInfo = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &pNoFillSupp->numOfExprs);
+ int32_t code = createPrimaryTsExprIfNeeded(pInfo, pPhyFillNode, pNoFillSupp, pTaskInfo->id.str);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ code = initExprSupp(pNoFillSupp, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ SInterval* pInterval =
+ QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == downstream->operatorType
+ ? &((SMergeAlignedIntervalAggOperatorInfo*)downstream->info)->intervalAggOperatorInfo->interval
+ : &((SIntervalAggOperatorInfo*)downstream->info)->interval;
+
+ int32_t order = (pPhyFillNode->inputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
+ int32_t type = convertFillType(pPhyFillNode->mode);
+
+ SResultInfo* pResultInfo = &pOperator->resultInfo;
+
+ initResultSizeInfo(&pOperator->resultInfo, 4096);
+ blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
+ code = initExprSupp(&pOperator->exprSupp, pExprInfo, pInfo->numOfExpr);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ pInfo->primaryTsCol = ((STargetNode*)pPhyFillNode->pWStartTs)->slotId;
+ pInfo->primarySrcSlotId = ((SColumnNode*)((STargetNode*)pPhyFillNode->pWStartTs)->pExpr)->slotId;
+
+ int32_t numOfOutputCols = 0;
+ code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc, &numOfOutputCols,
+ COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo);
+
+ code = initFillInfo(pInfo, pExprInfo, pInfo->numOfExpr, pNoFillSupp->pExprInfo, pNoFillSupp->numOfExprs,
+ (SNodeListNode*)pPhyFillNode->pValues, pPhyFillNode->timeRange, pResultInfo->capacity,
+ pTaskInfo->id.str, pInterval, type, order);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ pInfo->pFinalRes = createOneDataBlock(pInfo->pRes, false);
+ blockDataEnsureCapacity(pInfo->pFinalRes, pOperator->resultInfo.capacity);
+
+ code = filterInitFromNode((SNode*)pPhyFillNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ setOperatorInfo(pOperator, "FillOperator", QUERY_NODE_PHYSICAL_PLAN_FILL, false, OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->exprSupp.numOfExprs = pInfo->numOfExpr;
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doFill, NULL, destroyFillOperatorInfo, optrDefaultBufFn, NULL);
+
+ code = appendDownstream(pOperator, &downstream, 1);
+ return pOperator;
+
+ _error:
+ if (pInfo != NULL) {
+ destroyFillOperatorInfo(pInfo);
+ }
+
+ pTaskInfo->code = code;
+ taosMemoryFreeClear(pOperator);
+ return NULL;
+}
+
+TSKEY getNextWindowTs(TSKEY ts, SInterval* pInterval) {
+ STimeWindow win = {.skey = ts, .ekey = ts};
+ getNextIntervalWindow(pInterval, &win, TSDB_ORDER_ASC);
+ return win.skey;
+}
+
+TSKEY getPrevWindowTs(TSKEY ts, SInterval* pInterval) {
+ STimeWindow win = {.skey = ts, .ekey = ts};
+ getNextIntervalWindow(pInterval, &win, TSDB_ORDER_DESC);
+ return win.skey;
+}
+
+void setRowCell(SColumnInfoData* pCol, int32_t rowId, const SResultCellData* pCell) {
+ colDataAppend(pCol, rowId, pCell->pData, pCell->isNull);
+}
+
+SResultCellData* getResultCell(SResultRowData* pRaw, int32_t index) {
+ if (!pRaw || !pRaw->pRowVal) {
+ return NULL;
+ }
+ char* pData = (char*)pRaw->pRowVal;
+ SResultCellData* pCell = pRaw->pRowVal;
+ for (int32_t i = 0; i < index; i++) {
+ pData += (pCell->bytes + sizeof(SResultCellData));
+ pCell = (SResultCellData*)pData;
+ }
+ return pCell;
+}
+
+void* destroyFillColumnInfo(SFillColInfo* pFillCol, int32_t start, int32_t end) {
+ for (int32_t i = start; i < end; i++) {
+ destroyExprInfo(pFillCol[i].pExpr, 1);
+ taosVariantDestroy(&pFillCol[i].fillVal);
+ }
+ taosMemoryFreeClear(pFillCol[start].pExpr);
+ taosMemoryFree(pFillCol);
+ return NULL;
+}
+
+void* destroyStreamFillSupporter(SStreamFillSupporter* pFillSup) {
+ pFillSup->pAllColInfo = destroyFillColumnInfo(pFillSup->pAllColInfo, pFillSup->numOfFillCols, pFillSup->numOfAllCols);
+ tSimpleHashCleanup(pFillSup->pResMap);
+ pFillSup->pResMap = NULL;
+ releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal);
+ pFillSup->cur.pRowVal = NULL;
+ cleanupExprSupp(&pFillSup->notFillExprSup);
+
+ taosMemoryFree(pFillSup);
+ return NULL;
+}
+
+void* destroyStreamFillLinearInfo(SStreamFillLinearInfo* pFillLinear) {
+ taosArrayDestroy(pFillLinear->pDeltaVal);
+ taosArrayDestroy(pFillLinear->pNextDeltaVal);
+ taosMemoryFree(pFillLinear);
+ return NULL;
+}
+void* destroyStreamFillInfo(SStreamFillInfo* pFillInfo) {
+ if (pFillInfo->type == TSDB_FILL_SET_VALUE || pFillInfo->type == TSDB_FILL_NULL) {
+ taosMemoryFreeClear(pFillInfo->pResRow->pRowVal);
+ taosMemoryFreeClear(pFillInfo->pResRow);
+ }
+ pFillInfo->pLinearInfo = destroyStreamFillLinearInfo(pFillInfo->pLinearInfo);
+ taosArrayDestroy(pFillInfo->delRanges);
+ taosMemoryFree(pFillInfo);
+ return NULL;
+}
+
+static void destroyStreamFillOperatorInfo(void* param) {
+ SStreamFillOperatorInfo* pInfo = (SStreamFillOperatorInfo*)param;
+ pInfo->pFillInfo = destroyStreamFillInfo(pInfo->pFillInfo);
+ pInfo->pFillSup = destroyStreamFillSupporter(pInfo->pFillSup);
+ pInfo->pRes = blockDataDestroy(pInfo->pRes);
+ pInfo->pSrcBlock = blockDataDestroy(pInfo->pSrcBlock);
+ pInfo->pPrevSrcBlock = blockDataDestroy(pInfo->pPrevSrcBlock);
+ pInfo->pDelRes = blockDataDestroy(pInfo->pDelRes);
+ pInfo->matchInfo.pList = taosArrayDestroy(pInfo->matchInfo.pList);
+ taosMemoryFree(pInfo);
+}
+
+static void resetFillWindow(SResultRowData* pRowData) {
+ pRowData->key = INT64_MIN;
+ pRowData->pRowVal = NULL;
+}
+
+void resetPrevAndNextWindow(SStreamFillSupporter* pFillSup, SStreamState* pState) {
+ resetFillWindow(&pFillSup->prev);
+ releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal);
+ resetFillWindow(&pFillSup->cur);
+ resetFillWindow(&pFillSup->next);
+ resetFillWindow(&pFillSup->nextNext);
+}
+
+void getCurWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) {
+ SStreamState* pState = pOperator->pTaskInfo->streamInfo.pState;
+ resetPrevAndNextWindow(pFillSup, pState);
+
+ SWinKey key = {.ts = ts, .groupId = groupId};
+ int32_t curVLen = 0;
+ int32_t code = streamStateFillGet(pState, &key, (void**)&pFillSup->cur.pRowVal, &curVLen);
+ ASSERT(code == TSDB_CODE_SUCCESS);
+ pFillSup->cur.key = key.ts;
+}
+
+void getWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) {
+ SStreamState* pState = pOperator->pTaskInfo->streamInfo.pState;
+ resetPrevAndNextWindow(pFillSup, pState);
+
+ SWinKey key = {.ts = ts, .groupId = groupId};
+ void* curVal = NULL;
+ int32_t curVLen = 0;
+ int32_t code = streamStateFillGet(pState, &key, (void**)&curVal, &curVLen);
+ ASSERT(code == TSDB_CODE_SUCCESS);
+ pFillSup->cur.key = key.ts;
+ pFillSup->cur.pRowVal = curVal;
+
+ SStreamStateCur* pCur = streamStateFillSeekKeyPrev(pState, &key);
+ SWinKey preKey = {.groupId = groupId};
+ void* preVal = NULL;
+ int32_t preVLen = 0;
+ code = streamStateGetGroupKVByCur(pCur, &preKey, (const void**)&preVal, &preVLen);
+
+ if (code == TSDB_CODE_SUCCESS) {
+ pFillSup->prev.key = preKey.ts;
+ pFillSup->prev.pRowVal = preVal;
+
+ code = streamStateCurNext(pState, pCur);
+ ASSERT(code == TSDB_CODE_SUCCESS);
+
+ code = streamStateCurNext(pState, pCur);
+ if (code != TSDB_CODE_SUCCESS) {
+ streamStateFreeCur(pCur);
+ pCur = NULL;
+ }
+ } else {
+ streamStateFreeCur(pCur);
+ pCur = streamStateFillSeekKeyNext(pState, &key);
+ }
+
+ SWinKey nextKey = {.groupId = groupId};
+ void* nextVal = NULL;
+ int32_t nextVLen = 0;
+ code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextVLen);
+ if (code == TSDB_CODE_SUCCESS) {
+ pFillSup->next.key = nextKey.ts;
+ pFillSup->next.pRowVal = nextVal;
+ if (pFillSup->type == TSDB_FILL_PREV || pFillSup->type == TSDB_FILL_NEXT) {
+ code = streamStateCurNext(pState, pCur);
+ if (code == TSDB_CODE_SUCCESS) {
+ SWinKey nextNextKey = {.groupId = groupId};
+ void* nextNextVal = NULL;
+ int32_t nextNextVLen = 0;
+ code = streamStateGetGroupKVByCur(pCur, &nextNextKey, (const void**)&nextNextVal, &nextNextVLen);
+ if (code == TSDB_CODE_SUCCESS) {
+ pFillSup->nextNext.key = nextNextKey.ts;
+ pFillSup->nextNext.pRowVal = nextNextVal;
+ }
+ }
+ }
+ }
+ streamStateFreeCur(pCur);
+}
+
+static bool hasPrevWindow(SStreamFillSupporter* pFillSup) { return pFillSup->prev.key != INT64_MIN; }
+static bool hasNextWindow(SStreamFillSupporter* pFillSup) { return pFillSup->next.key != INT64_MIN; }
+static bool hasNextNextWindow(SStreamFillSupporter* pFillSup) {
+ return pFillSup->nextNext.key != INT64_MIN;
+ return false;
+}
+
+static void transBlockToResultRow(const SSDataBlock* pBlock, int32_t rowId, TSKEY ts, SResultRowData* pRowVal) {
+ int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, i);
+ SResultCellData* pCell = getResultCell(pRowVal, i);
+ if (!colDataIsNull_s(pColData, rowId)) {
+ pCell->isNull = false;
+ pCell->type = pColData->info.type;
+ pCell->bytes = pColData->info.bytes;
+ char* val = colDataGetData(pColData, rowId);
+ if (IS_VAR_DATA_TYPE(pCell->type)) {
+ memcpy(pCell->pData, val, varDataTLen(val));
+ } else {
+ memcpy(pCell->pData, val, pCell->bytes);
+ }
+ } else {
+ pCell->isNull = true;
+ }
+ }
+ pRowVal->key = ts;
+}
+
+static void calcDeltaData(SSDataBlock* pBlock, int32_t rowId, SResultRowData* pRowVal, SArray* pDelta,
+ SFillColInfo* pFillCol, int32_t numOfCol, int32_t winCount, int32_t order) {
+ for (int32_t i = 0; i < numOfCol; i++) {
+ if (!pFillCol[i].notFillCol) {
+ int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i);
+ SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, slotId);
+ char* var = colDataGetData(pCol, rowId);
+ double start = 0;
+ GET_TYPED_DATA(start, double, pCol->info.type, var);
+ SResultCellData* pCell = getResultCell(pRowVal, slotId);
+ double end = 0;
+ GET_TYPED_DATA(end, double, pCell->type, pCell->pData);
+ double delta = 0;
+ if (order == TSDB_ORDER_ASC) {
+ delta = (end - start) / winCount;
+ } else {
+ delta = (start - end) / winCount;
+ }
+ taosArraySet(pDelta, slotId, &delta);
+ }
+ }
+}
+
+static void calcRowDeltaData(SResultRowData* pStartRow, SResultRowData* pEndRow, SArray* pDelta, SFillColInfo* pFillCol,
+ int32_t numOfCol, int32_t winCount) {
+ for (int32_t i = 0; i < numOfCol; i++) {
+ if (!pFillCol[i].notFillCol) {
+ int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i);
+ SResultCellData* pSCell = getResultCell(pStartRow, slotId);
+ double start = 0.0;
+ GET_TYPED_DATA(start, double, pSCell->type, pSCell->pData);
+ SResultCellData* pECell = getResultCell(pEndRow, slotId);
+ double end = 0.0;
+ GET_TYPED_DATA(end, double, pECell->type, pECell->pData);
+ double delta = (end - start) / winCount;
+ taosArraySet(pDelta, slotId, &delta);
+ }
+ }
+}
+
+static void setFillInfoStart(TSKEY ts, SInterval* pInterval, SStreamFillInfo* pFillInfo) {
+ ts = taosTimeAdd(ts, pInterval->sliding, pInterval->slidingUnit, pInterval->precision);
+ pFillInfo->start = ts;
+}
+
+static void setFillInfoEnd(TSKEY ts, SInterval* pInterval, SStreamFillInfo* pFillInfo) {
+ ts = taosTimeAdd(ts, pInterval->sliding * -1, pInterval->slidingUnit, pInterval->precision);
+ pFillInfo->end = ts;
+}
+
+static void setFillKeyInfo(TSKEY start, TSKEY end, SInterval* pInterval, SStreamFillInfo* pFillInfo) {
+ setFillInfoStart(start, pInterval, pFillInfo);
+ pFillInfo->current = pFillInfo->start;
+ setFillInfoEnd(end, pInterval, pFillInfo);
+}
+
+void setDeleteFillValueInfo(TSKEY start, TSKEY end, SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo) {
+ if (!hasPrevWindow(pFillSup) || !hasNextWindow(pFillSup)) {
+ pFillInfo->needFill = false;
+ return;
+ }
+
+ TSKEY realStart = taosTimeAdd(pFillSup->prev.key, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
+ pFillSup->interval.precision);
+
+ pFillInfo->needFill = true;
+ pFillInfo->start = realStart;
+ pFillInfo->current = pFillInfo->start;
+ pFillInfo->end = end;
+ pFillInfo->pos = FILL_POS_INVALID;
+ switch (pFillInfo->type) {
+ case TSDB_FILL_NULL:
+ case TSDB_FILL_SET_VALUE:
+ break;
+ case TSDB_FILL_PREV:
+ pFillInfo->pResRow = &pFillSup->prev;
+ break;
+ case TSDB_FILL_NEXT:
+ pFillInfo->pResRow = &pFillSup->next;
+ break;
+ case TSDB_FILL_LINEAR: {
+ setFillKeyInfo(pFillSup->prev.key, pFillSup->next.key, &pFillSup->interval, pFillInfo);
+ pFillInfo->pLinearInfo->hasNext = false;
+ pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
+ int32_t numOfWins = taosTimeCountInterval(pFillSup->prev.key, pFillSup->next.key, pFillSup->interval.sliding,
+ pFillSup->interval.slidingUnit, pFillSup->interval.precision);
+ calcRowDeltaData(&pFillSup->prev, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
+ pFillSup->numOfAllCols, numOfWins);
+ pFillInfo->pResRow = &pFillSup->prev;
+ pFillInfo->pLinearInfo->winIndex = 0;
+ } break;
+ default:
+ ASSERT(0);
+ break;
+ }
+}
+
+void copyNotFillExpData(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo) {
+ for (int32_t i = pFillSup->numOfFillCols; i < pFillSup->numOfAllCols; ++i) {
+ SFillColInfo* pFillCol = pFillSup->pAllColInfo + i;
+ int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
+ SResultCellData* pCell = getResultCell(pFillInfo->pResRow, slotId);
+ SResultCellData* pCurCell = getResultCell(&pFillSup->cur, slotId);
+ pCell->isNull = pCurCell->isNull;
+ if (!pCurCell->isNull) {
+ memcpy(pCell->pData, pCurCell->pData, pCell->bytes);
+ }
+ }
+}
+
+void setFillValueInfo(SSDataBlock* pBlock, TSKEY ts, int32_t rowId, SStreamFillSupporter* pFillSup,
+ SStreamFillInfo* pFillInfo) {
+ pFillInfo->preRowKey = pFillSup->cur.key;
+ if (!hasPrevWindow(pFillSup) && !hasNextWindow(pFillSup)) {
+ pFillInfo->needFill = false;
+ pFillInfo->pos = FILL_POS_START;
+ return;
+ }
+ TSKEY prevWKey = INT64_MIN;
+ TSKEY nextWKey = INT64_MIN;
+ if (hasPrevWindow(pFillSup)) {
+ prevWKey = pFillSup->prev.key;
+ }
+ if (hasNextWindow(pFillSup)) {
+ nextWKey = pFillSup->next.key;
+ }
+
+ pFillInfo->needFill = true;
+ pFillInfo->pos = FILL_POS_INVALID;
+ switch (pFillInfo->type) {
+ case TSDB_FILL_NULL:
+ case TSDB_FILL_SET_VALUE: {
+ if (pFillSup->prev.key == pFillInfo->preRowKey) {
+ resetFillWindow(&pFillSup->prev);
+ }
+ if (hasPrevWindow(pFillSup) && hasNextWindow(pFillSup)) {
+ if (pFillSup->next.key == pFillInfo->nextRowKey) {
+ pFillInfo->preRowKey = INT64_MIN;
+ setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_END;
+ } else {
+ pFillInfo->needFill = false;
+ pFillInfo->pos = FILL_POS_START;
+ }
+ } else if (hasPrevWindow(pFillSup)) {
+ setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_END;
+ } else {
+ setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_START;
+ }
+ copyNotFillExpData(pFillSup, pFillInfo);
+ } break;
+ case TSDB_FILL_PREV: {
+ if (hasNextWindow(pFillSup) && ((pFillSup->next.key != pFillInfo->nextRowKey) ||
+ (pFillSup->next.key == pFillInfo->nextRowKey && hasNextNextWindow(pFillSup)) ||
+ (pFillSup->next.key == pFillInfo->nextRowKey && !hasPrevWindow(pFillSup)))) {
+ setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_START;
+ pFillSup->prev.key = pFillSup->cur.key;
+ pFillSup->prev.pRowVal = pFillSup->cur.pRowVal;
+ } else if (hasPrevWindow(pFillSup)) {
+ setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_END;
+ pFillInfo->preRowKey = INT64_MIN;
+ }
+ pFillInfo->pResRow = &pFillSup->prev;
+ } break;
+ case TSDB_FILL_NEXT: {
+ if (hasPrevWindow(pFillSup)) {
+ setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_END;
+ pFillSup->next.key = pFillSup->cur.key;
+ pFillSup->next.pRowVal = pFillSup->cur.pRowVal;
+ pFillInfo->preRowKey = INT64_MIN;
+ } else {
+ ASSERT(hasNextWindow(pFillSup));
+ setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_START;
+ }
+ pFillInfo->pResRow = &pFillSup->next;
+ } break;
+ case TSDB_FILL_LINEAR: {
+ pFillInfo->pLinearInfo->winIndex = 0;
+ if (hasPrevWindow(pFillSup) && hasNextWindow(pFillSup)) {
+ setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_MID;
+ pFillInfo->pLinearInfo->nextEnd = nextWKey;
+ int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding,
+ pFillSup->interval.slidingUnit, pFillSup->interval.precision);
+ calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
+ pFillSup->numOfAllCols, numOfWins);
+ pFillInfo->pResRow = &pFillSup->prev;
+
+ numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
+ pFillSup->interval.precision);
+ calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pNextDeltaVal, pFillSup->pAllColInfo,
+ pFillSup->numOfAllCols, numOfWins);
+ pFillInfo->pLinearInfo->hasNext = true;
+ } else if (hasPrevWindow(pFillSup)) {
+ setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_END;
+ pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
+ int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding,
+ pFillSup->interval.slidingUnit, pFillSup->interval.precision);
+ calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
+ pFillSup->numOfAllCols, numOfWins);
+ pFillInfo->pResRow = &pFillSup->prev;
+ pFillInfo->pLinearInfo->hasNext = false;
+ } else {
+ ASSERT(hasNextWindow(pFillSup));
+ setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
+ pFillInfo->pos = FILL_POS_START;
+ pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
+ int32_t numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding,
+ pFillSup->interval.slidingUnit, pFillSup->interval.precision);
+ calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
+ pFillSup->numOfAllCols, numOfWins);
+ pFillInfo->pResRow = &pFillSup->cur;
+ pFillInfo->pLinearInfo->hasNext = false;
+ }
+ } break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ ASSERT(pFillInfo->pos != FILL_POS_INVALID);
+}
+
+static bool checkResult(SStreamFillSupporter* pFillSup, TSKEY ts, uint64_t groupId) {
+ SWinKey key = {.groupId = groupId, .ts = ts};
+ if (tSimpleHashGet(pFillSup->pResMap, &key, sizeof(SWinKey)) != NULL) {
+ return false;
+ }
+ tSimpleHashPut(pFillSup->pResMap, &key, sizeof(SWinKey), NULL, 0);
+ return true;
+}
+
+static void buildFillResult(SResultRowData* pResRow, SStreamFillSupporter* pFillSup, TSKEY ts, SSDataBlock* pBlock) {
+ uint64_t groupId = pBlock->info.id.groupId;
+ if (pFillSup->hasDelete && !checkResult(pFillSup, ts, groupId)) {
+ return;
+ }
+ for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) {
+ SFillColInfo* pFillCol = pFillSup->pAllColInfo + i;
+ int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
+ SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, slotId);
+ SFillInfo tmpInfo = {
+ .currentKey = ts,
+ .order = TSDB_ORDER_ASC,
+ .interval = pFillSup->interval,
+ };
+ bool filled = fillIfWindowPseudoColumn(&tmpInfo, pFillCol, pColData, pBlock->info.rows);
+ if (!filled) {
+ SResultCellData* pCell = getResultCell(pResRow, slotId);
+ setRowCell(pColData, pBlock->info.rows, pCell);
+ }
+ }
+ pBlock->info.rows++;
+}
+
+static bool hasRemainCalc(SStreamFillInfo* pFillInfo) {
+ if (pFillInfo->current != INT64_MIN && pFillInfo->current <= pFillInfo->end) {
+ return true;
+ }
+ return false;
+}
+
+static void doStreamFillNormal(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock) {
+ while (hasRemainCalc(pFillInfo) && pBlock->info.rows < pBlock->info.capacity) {
+ buildFillResult(pFillInfo->pResRow, pFillSup, pFillInfo->current, pBlock);
+ pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
+ pFillSup->interval.precision);
+ }
+}
+
+static void doStreamFillLinear(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock) {
+ while (hasRemainCalc(pFillInfo) && pBlock->info.rows < pBlock->info.capacity) {
+ uint64_t groupId = pBlock->info.id.groupId;
+ SWinKey key = {.groupId = groupId, .ts = pFillInfo->current};
+ if (pFillSup->hasDelete && !checkResult(pFillSup, pFillInfo->current, groupId)) {
+ pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
+ pFillSup->interval.precision);
+ pFillInfo->pLinearInfo->winIndex++;
+ continue;
+ }
+ pFillInfo->pLinearInfo->winIndex++;
+ for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) {
+ SFillColInfo* pFillCol = pFillSup->pAllColInfo + i;
+ SFillInfo tmp = {
+ .currentKey = pFillInfo->current,
+ .order = TSDB_ORDER_ASC,
+ .interval = pFillSup->interval,
+ };
+
+ int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
+ SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, slotId);
+ int16_t type = pColData->info.type;
+ SResultCellData* pCell = getResultCell(pFillInfo->pResRow, slotId);
+ int32_t index = pBlock->info.rows;
+ if (pFillCol->notFillCol) {
+ bool filled = fillIfWindowPseudoColumn(&tmp, pFillCol, pColData, index);
+ if (!filled) {
+ setRowCell(pColData, index, pCell);
+ }
+ } else {
+ if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_BOOL || pCell->isNull) {
+ colDataAppendNULL(pColData, index);
+ continue;
+ }
+ double* pDelta = taosArrayGet(pFillInfo->pLinearInfo->pDeltaVal, slotId);
+ double vCell = 0;
+ GET_TYPED_DATA(vCell, double, pCell->type, pCell->pData);
+ vCell += (*pDelta) * pFillInfo->pLinearInfo->winIndex;
+ int64_t result = 0;
+ SET_TYPED_DATA(&result, pCell->type, vCell);
+ colDataAppend(pColData, index, (const char*)&result, false);
+ }
+ }
+ pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
+ pFillSup->interval.precision);
+ pBlock->info.rows++;
+ }
+}
+
+static void keepResultInDiscBuf(SOperatorInfo* pOperator, uint64_t groupId, SResultRowData* pRow, int32_t len) {
+ SWinKey key = {.groupId = groupId, .ts = pRow->key};
+ int32_t code = streamStateFillPut(pOperator->pTaskInfo->streamInfo.pState, &key, pRow->pRowVal, len);
+ ASSERT(code == TSDB_CODE_SUCCESS);
+}
+
+static void doStreamFillRange(SStreamFillInfo* pFillInfo, SStreamFillSupporter* pFillSup, SSDataBlock* pRes) {
+ if (pFillInfo->needFill == false) {
+ buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes);
+ return;
+ }
+
+ if (pFillInfo->pos == FILL_POS_START) {
+ buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes);
+ }
+ if (pFillInfo->type != TSDB_FILL_LINEAR) {
+ doStreamFillNormal(pFillSup, pFillInfo, pRes);
+ } else {
+ doStreamFillLinear(pFillSup, pFillInfo, pRes);
+
+ if (pFillInfo->pos == FILL_POS_MID) {
+ buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes);
+ }
+
+ if (pFillInfo->current > pFillInfo->end && pFillInfo->pLinearInfo->hasNext) {
+ pFillInfo->pLinearInfo->hasNext = false;
+ pFillInfo->pLinearInfo->winIndex = 0;
+ taosArrayClear(pFillInfo->pLinearInfo->pDeltaVal);
+ taosArrayAddAll(pFillInfo->pLinearInfo->pDeltaVal, pFillInfo->pLinearInfo->pNextDeltaVal);
+ pFillInfo->pResRow = &pFillSup->cur;
+ setFillKeyInfo(pFillSup->cur.key, pFillInfo->pLinearInfo->nextEnd, &pFillSup->interval, pFillInfo);
+ doStreamFillLinear(pFillSup, pFillInfo, pRes);
+ }
+ }
+ if (pFillInfo->pos == FILL_POS_END) {
+ buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes);
+ }
+}
+
+void keepBlockRowInDiscBuf(SOperatorInfo* pOperator, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock, TSKEY* tsCol,
+ int32_t rowId, uint64_t groupId, int32_t rowSize) {
+ TSKEY ts = tsCol[rowId];
+ pFillInfo->nextRowKey = ts;
+ SResultRowData tmpNextRow = {.key = ts};
+ tmpNextRow.pRowVal = taosMemoryCalloc(1, rowSize);
+ transBlockToResultRow(pBlock, rowId, ts, &tmpNextRow);
+ keepResultInDiscBuf(pOperator, groupId, &tmpNextRow, rowSize);
+ taosMemoryFreeClear(tmpNextRow.pRowVal);
+}
+
+static void doFillResults(SOperatorInfo* pOperator, SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo,
+ SSDataBlock* pBlock, TSKEY* tsCol, int32_t rowId, SSDataBlock* pRes) {
+ uint64_t groupId = pBlock->info.id.groupId;
+ getWindowFromDiscBuf(pOperator, tsCol[rowId], groupId, pFillSup);
+ if (pFillSup->prev.key == pFillInfo->preRowKey) {
+ resetFillWindow(&pFillSup->prev);
+ }
+ setFillValueInfo(pBlock, tsCol[rowId], rowId, pFillSup, pFillInfo);
+ doStreamFillRange(pFillInfo, pFillSup, pRes);
+}
+
+static void doStreamFillImpl(SOperatorInfo* pOperator) {
+ SStreamFillOperatorInfo* pInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SStreamFillSupporter* pFillSup = pInfo->pFillSup;
+ SStreamFillInfo* pFillInfo = pInfo->pFillInfo;
+ SSDataBlock* pBlock = pInfo->pSrcBlock;
+ uint64_t groupId = pBlock->info.id.groupId;
+ SSDataBlock* pRes = pInfo->pRes;
+ pRes->info.id.groupId = groupId;
+ if (hasRemainCalc(pFillInfo)) {
+ doStreamFillRange(pFillInfo, pFillSup, pRes);
+ }
+
+ SColumnInfoData* pTsCol = taosArrayGet(pInfo->pSrcBlock->pDataBlock, pInfo->primaryTsCol);
+ TSKEY* tsCol = (TSKEY*)pTsCol->pData;
+
+ if (pInfo->srcRowIndex == 0) {
+ keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize);
+ SSDataBlock* preBlock = pInfo->pPrevSrcBlock;
+ if (preBlock->info.rows > 0) {
+ int preRowId = preBlock->info.rows - 1;
+ SColumnInfoData* pPreTsCol = taosArrayGet(preBlock->pDataBlock, pInfo->primaryTsCol);
+ doFillResults(pOperator, pFillSup, pFillInfo, preBlock, (TSKEY*)pPreTsCol->pData, preRowId, pRes);
+ }
+ pInfo->srcRowIndex++;
+ }
+
+ while (pInfo->srcRowIndex < pBlock->info.rows) {
+ TSKEY ts = tsCol[pInfo->srcRowIndex];
+ keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize);
+ doFillResults(pOperator, pFillSup, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex - 1, pRes);
+ if (pInfo->pRes->info.rows == pInfo->pRes->info.capacity) {
+ blockDataUpdateTsWindow(pRes, pInfo->primaryTsCol);
+ return;
+ }
+ pInfo->srcRowIndex++;
+ }
+ blockDataUpdateTsWindow(pRes, pInfo->primaryTsCol);
+ blockDataCleanup(pInfo->pPrevSrcBlock);
+ copyDataBlock(pInfo->pPrevSrcBlock, pInfo->pSrcBlock);
+ blockDataCleanup(pInfo->pSrcBlock);
+}
+
+static void buildDeleteRange(SOperatorInfo* pOp, TSKEY start, TSKEY end, uint64_t groupId, SSDataBlock* delRes) {
+ SStreamState* pState = pOp->pTaskInfo->streamInfo.pState;
+
+ SSDataBlock* pBlock = delRes;
+ SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
+ SColumnInfoData* pEndCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX);
+ SColumnInfoData* pUidCol = taosArrayGet(pBlock->pDataBlock, UID_COLUMN_INDEX);
+ SColumnInfoData* pGroupCol = 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* pTbNameCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX);
+ colDataAppend(pStartCol, pBlock->info.rows, (const char*)&start, false);
+ colDataAppend(pEndCol, pBlock->info.rows, (const char*)&end, false);
+ colDataAppendNULL(pUidCol, pBlock->info.rows);
+ colDataAppend(pGroupCol, pBlock->info.rows, (const char*)&groupId, false);
+ colDataAppendNULL(pCalStartCol, pBlock->info.rows);
+ colDataAppendNULL(pCalEndCol, pBlock->info.rows);
+
+ SColumnInfoData* pTableCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX);
+
+ void* tbname = NULL;
+ streamStateGetParName(pOp->pTaskInfo->streamInfo.pState, groupId, &tbname);
+ if (tbname == NULL) {
+ colDataAppendNULL(pTableCol, pBlock->info.rows);
+ } else {
+ char parTbName[VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN];
+ STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName));
+ colDataAppend(pTableCol, pBlock->info.rows, (const char*)parTbName, false);
+ tdbFree(tbname);
+ }
+
+ pBlock->info.rows++;
+}
+
+static void buildDeleteResult(SOperatorInfo* pOperator, TSKEY startTs, TSKEY endTs, uint64_t groupId,
+ SSDataBlock* delRes) {
+ SStreamFillOperatorInfo* pInfo = pOperator->info;
+ SStreamFillSupporter* pFillSup = pInfo->pFillSup;
+ if (hasPrevWindow(pFillSup)) {
+ TSKEY start = getNextWindowTs(pFillSup->prev.key, &pFillSup->interval);
+ buildDeleteRange(pOperator, start, endTs, groupId, delRes);
+ } else if (hasNextWindow(pFillSup)) {
+ TSKEY end = getPrevWindowTs(pFillSup->next.key, &pFillSup->interval);
+ buildDeleteRange(pOperator, startTs, end, groupId, delRes);
+ } else {
+ buildDeleteRange(pOperator, startTs, endTs, groupId, delRes);
+ }
+}
+
+static void doDeleteFillResultImpl(SOperatorInfo* pOperator, TSKEY startTs, TSKEY endTs, uint64_t groupId) {
+ SStreamFillOperatorInfo* pInfo = pOperator->info;
+ getWindowFromDiscBuf(pOperator, startTs, groupId, pInfo->pFillSup);
+ setDeleteFillValueInfo(startTs, endTs, pInfo->pFillSup, pInfo->pFillInfo);
+ SWinKey key = {.ts = startTs, .groupId = groupId};
+ if (!pInfo->pFillInfo->needFill) {
+ streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &key);
+ buildDeleteResult(pOperator, startTs, endTs, groupId, pInfo->pDelRes);
+ } else {
+ STimeRange tw = {
+ .skey = startTs,
+ .ekey = endTs,
+ .groupId = groupId,
+ };
+ taosArrayPush(pInfo->pFillInfo->delRanges, &tw);
+ while (key.ts <= endTs) {
+ key.ts = taosTimeAdd(key.ts, pInfo->pFillSup->interval.sliding, pInfo->pFillSup->interval.slidingUnit,
+ pInfo->pFillSup->interval.precision);
+ tSimpleHashPut(pInfo->pFillSup->pResMap, &key, sizeof(SWinKey), NULL, 0);
+ }
+ }
+}
+
+static void doDeleteFillFinalize(SOperatorInfo* pOperator) {
+ SStreamFillOperatorInfo* pInfo = pOperator->info;
+ SStreamFillInfo* pFillInfo = pInfo->pFillInfo;
+ int32_t size = taosArrayGetSize(pFillInfo->delRanges);
+ tSimpleHashClear(pInfo->pFillSup->pResMap);
+ for (; pFillInfo->delIndex < size; pFillInfo->delIndex++) {
+ STimeRange* range = taosArrayGet(pFillInfo->delRanges, pFillInfo->delIndex);
+ if (pInfo->pRes->info.id.groupId != 0 && pInfo->pRes->info.id.groupId != range->groupId) {
+ return;
+ }
+ getWindowFromDiscBuf(pOperator, range->skey, range->groupId, pInfo->pFillSup);
+ setDeleteFillValueInfo(range->skey, range->ekey, pInfo->pFillSup, pInfo->pFillInfo);
+ if (pInfo->pFillInfo->needFill) {
+ doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes);
+ pInfo->pRes->info.id.groupId = range->groupId;
+ }
+ SWinKey key = {.ts = range->skey, .groupId = range->groupId};
+ streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &key);
+ }
+}
+
+static void doDeleteFillResult(SOperatorInfo* pOperator) {
+ SStreamFillOperatorInfo* pInfo = pOperator->info;
+ SStreamFillSupporter* pFillSup = pInfo->pFillSup;
+ SStreamFillInfo* pFillInfo = pInfo->pFillInfo;
+ SSDataBlock* pBlock = pInfo->pSrcDelBlock;
+ SSDataBlock* pRes = pInfo->pRes;
+ SSDataBlock* pDelRes = pInfo->pDelRes;
+
+ SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
+ TSKEY* tsStarts = (TSKEY*)pStartCol->pData;
+ SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
+ uint64_t* groupIds = (uint64_t*)pGroupCol->pData;
+ while (pInfo->srcDelRowIndex < pBlock->info.rows) {
+ TSKEY ts = tsStarts[pInfo->srcDelRowIndex];
+ TSKEY endTs = ts;
+ uint64_t groupId = groupIds[pInfo->srcDelRowIndex];
+ SWinKey key = {.ts = ts, .groupId = groupId};
+ SStreamStateCur* pCur = streamStateGetAndCheckCur(pOperator->pTaskInfo->streamInfo.pState, &key);
+ if (!pCur) {
+ pInfo->srcDelRowIndex++;
+ continue;
+ }
+
+ SWinKey nextKey = {.groupId = groupId, .ts = ts};
+ while (pInfo->srcDelRowIndex < pBlock->info.rows) {
+ void* nextVal = NULL;
+ int32_t nextLen = 0;
+ TSKEY delTs = tsStarts[pInfo->srcDelRowIndex];
+ uint64_t delGroupId = groupIds[pInfo->srcDelRowIndex];
+ int32_t code = TSDB_CODE_SUCCESS;
+ if (groupId != delGroupId) {
+ break;
+ }
+ if (delTs > nextKey.ts) {
+ break;
+ }
+
+ SWinKey delKey = {.groupId = delGroupId, .ts = delTs};
+ if (delTs == nextKey.ts) {
+ code = streamStateCurNext(pOperator->pTaskInfo->streamInfo.pState, pCur);
+ if (code == TSDB_CODE_SUCCESS) {
+ code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextLen);
+ }
+ // ts will be deleted later
+ if (delTs != ts) {
+ streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &delKey);
+ streamStateFreeCur(pCur);
+ pCur = streamStateGetAndCheckCur(pOperator->pTaskInfo->streamInfo.pState, &nextKey);
+ }
+ endTs = TMAX(delTs, nextKey.ts - 1);
+ if (code != TSDB_CODE_SUCCESS) {
+ break;
+ }
+ }
+ pInfo->srcDelRowIndex++;
+ }
+ streamStateFreeCur(pCur);
+ doDeleteFillResultImpl(pOperator, ts, endTs, groupId);
+ }
+ pFillInfo->current = pFillInfo->end + 1;
+}
+
+static void resetStreamFillInfo(SStreamFillOperatorInfo* pInfo) {
+ blockDataCleanup(pInfo->pPrevSrcBlock);
+ tSimpleHashClear(pInfo->pFillSup->pResMap);
+ pInfo->pFillSup->hasDelete = false;
+ taosArrayClear(pInfo->pFillInfo->delRanges);
+ pInfo->pFillInfo->delIndex = 0;
+}
+
+static void doApplyStreamScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pSrcBlock, SSDataBlock* pDstBlock) {
+ SStreamFillOperatorInfo* pInfo = pOperator->info;
+ SExprSupp* pSup = &pOperator->exprSupp;
+
+ blockDataCleanup(pDstBlock);
+ blockDataEnsureCapacity(pDstBlock, pSrcBlock->info.rows);
+ setInputDataBlock(pSup, pSrcBlock, TSDB_ORDER_ASC, MAIN_SCAN, false);
+ projectApplyFunctions(pSup->pExprInfo, pDstBlock, pSrcBlock, pSup->pCtx, pSup->numOfExprs, NULL);
+
+ pDstBlock->info.rows = 0;
+ pSup = &pInfo->pFillSup->notFillExprSup;
+ setInputDataBlock(pSup, pSrcBlock, TSDB_ORDER_ASC, MAIN_SCAN, false);
+ projectApplyFunctions(pSup->pExprInfo, pDstBlock, pSrcBlock, pSup->pCtx, pSup->numOfExprs, NULL);
+ pDstBlock->info.id.groupId = pSrcBlock->info.id.groupId;
+
+ blockDataUpdateTsWindow(pDstBlock, pInfo->primaryTsCol);
+}
+
+static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
+ SStreamFillOperatorInfo* pInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
+ blockDataCleanup(pInfo->pRes);
+ if (pOperator->status == OP_RES_TO_RETURN) {
+ if (hasRemainCalc(pInfo->pFillInfo)) {
+ doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes);
+ if (pInfo->pRes->info.rows > 0) {
+ return pInfo->pRes;
+ }
+ }
+ doDeleteFillFinalize(pOperator);
+ if (pInfo->pRes->info.rows > 0) {
+ printDataBlock(pInfo->pRes, "stream fill");
+ return pInfo->pRes;
+ }
+ setOperatorCompleted(pOperator);
+ resetStreamFillInfo(pInfo);
+ return NULL;
+ }
+
+ SSDataBlock* fillResult = NULL;
+ SOperatorInfo* downstream = pOperator->pDownstream[0];
+ while (1) {
+ if (pInfo->srcRowIndex >= pInfo->pSrcBlock->info.rows) {
+ // If there are delete datablocks, we receive them first.
+ SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
+ if (pBlock == NULL) {
+ pOperator->status = OP_RES_TO_RETURN;
+ SSDataBlock* preBlock = pInfo->pPrevSrcBlock;
+ if (preBlock->info.rows > 0) {
+ int preRowId = preBlock->info.rows - 1;
+ SColumnInfoData* pPreTsCol = taosArrayGet(preBlock->pDataBlock, pInfo->primaryTsCol);
+ doFillResults(pOperator, pInfo->pFillSup, pInfo->pFillInfo, preBlock, (TSKEY*)pPreTsCol->pData, preRowId,
+ pInfo->pRes);
+ }
+ pInfo->pFillInfo->preRowKey = INT64_MIN;
+ if (pInfo->pRes->info.rows > 0) {
+ printDataBlock(pInfo->pRes, "stream fill");
+ return pInfo->pRes;
+ }
+ break;
+ }
+ printDataBlock(pBlock, "stream fill recv");
+
+ switch (pBlock->info.type) {
+ case STREAM_RETRIEVE:
+ return pBlock;
+ case STREAM_DELETE_RESULT: {
+ pInfo->pSrcDelBlock = pBlock;
+ pInfo->srcDelRowIndex = 0;
+ blockDataCleanup(pInfo->pDelRes);
+ pInfo->pFillSup->hasDelete = true;
+ doDeleteFillResult(pOperator);
+ if (pInfo->pDelRes->info.rows > 0) {
+ printDataBlock(pInfo->pDelRes, "stream fill delete");
+ return pInfo->pDelRes;
+ }
+ continue;
+ } break;
+ case STREAM_NORMAL:
+ case STREAM_INVALID: {
+ doApplyStreamScalarCalculation(pOperator, pBlock, pInfo->pSrcBlock);
+ memcpy(pInfo->pSrcBlock->info.parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
+ pInfo->srcRowIndex = 0;
+ } break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+
+ doStreamFillImpl(pOperator);
+ doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo);
+ memcpy(pInfo->pRes->info.parTbName, pInfo->pSrcBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
+ pOperator->resultInfo.totalRows += pInfo->pRes->info.rows;
+ if (pInfo->pRes->info.rows > 0) {
+ break;
+ }
+ }
+ if (pOperator->status == OP_RES_TO_RETURN) {
+ doDeleteFillFinalize(pOperator);
+ }
+
+ if (pInfo->pRes->info.rows == 0) {
+ setOperatorCompleted(pOperator);
+ resetStreamFillInfo(pInfo);
+ return NULL;
+ }
+
+ pOperator->resultInfo.totalRows += pInfo->pRes->info.rows;
+ printDataBlock(pInfo->pRes, "stream fill");
+ return pInfo->pRes;
+}
+
+static int32_t initResultBuf(SStreamFillSupporter* pFillSup) {
+ pFillSup->rowSize = sizeof(SResultCellData) * pFillSup->numOfAllCols;
+ for (int i = 0; i < pFillSup->numOfAllCols; i++) {
+ SFillColInfo* pCol = &pFillSup->pAllColInfo[i];
+ SResSchema* pSchema = &pCol->pExpr->base.resSchema;
+ pFillSup->rowSize += pSchema->bytes;
+ }
+ pFillSup->next.key = INT64_MIN;
+ pFillSup->nextNext.key = INT64_MIN;
+ pFillSup->prev.key = INT64_MIN;
+ pFillSup->cur.key = INT64_MIN;
+ pFillSup->next.pRowVal = NULL;
+ pFillSup->nextNext.pRowVal = NULL;
+ pFillSup->prev.pRowVal = NULL;
+ pFillSup->cur.pRowVal = NULL;
+
+ return TSDB_CODE_SUCCESS;
+}
+
+static SStreamFillSupporter* initStreamFillSup(SStreamFillPhysiNode* pPhyFillNode, SInterval* pInterval,
+ SExprInfo* pFillExprInfo, int32_t numOfFillCols) {
+ SStreamFillSupporter* pFillSup = taosMemoryCalloc(1, sizeof(SStreamFillSupporter));
+ if (!pFillSup) {
+ return NULL;
+ }
+ pFillSup->numOfFillCols = numOfFillCols;
+ int32_t numOfNotFillCols = 0;
+ SExprInfo* noFillExprInfo = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &numOfNotFillCols);
+ pFillSup->pAllColInfo = createFillColInfo(pFillExprInfo, pFillSup->numOfFillCols, noFillExprInfo, numOfNotFillCols,
+ (const SNodeListNode*)(pPhyFillNode->pValues));
+ pFillSup->type = convertFillType(pPhyFillNode->mode);
+ pFillSup->numOfAllCols = pFillSup->numOfFillCols + numOfNotFillCols;
+ pFillSup->interval = *pInterval;
+
+ int32_t code = initResultBuf(pFillSup);
+ if (code != TSDB_CODE_SUCCESS) {
+ destroyStreamFillSupporter(pFillSup);
+ return NULL;
+ }
+
+ SExprInfo* noFillExpr = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &numOfNotFillCols);
+ code = initExprSupp(&pFillSup->notFillExprSup, noFillExpr, numOfNotFillCols);
+ if (code != TSDB_CODE_SUCCESS) {
+ destroyStreamFillSupporter(pFillSup);
+ return NULL;
+ }
+
+ _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
+ pFillSup->pResMap = tSimpleHashInit(16, hashFn);
+ pFillSup->hasDelete = false;
+ return pFillSup;
+}
+
+SStreamFillInfo* initStreamFillInfo(SStreamFillSupporter* pFillSup, SSDataBlock* pRes) {
+ SStreamFillInfo* pFillInfo = taosMemoryCalloc(1, sizeof(SStreamFillInfo));
+ pFillInfo->start = INT64_MIN;
+ pFillInfo->current = INT64_MIN;
+ pFillInfo->end = INT64_MIN;
+ pFillInfo->preRowKey = INT64_MIN;
+ pFillInfo->needFill = false;
+ pFillInfo->pLinearInfo = taosMemoryCalloc(1, sizeof(SStreamFillLinearInfo));
+ pFillInfo->pLinearInfo->hasNext = false;
+ pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
+ pFillInfo->pLinearInfo->pDeltaVal = NULL;
+ pFillInfo->pLinearInfo->pNextDeltaVal = NULL;
+ if (pFillSup->type == TSDB_FILL_LINEAR) {
+ pFillInfo->pLinearInfo->pDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double));
+ pFillInfo->pLinearInfo->pNextDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double));
+ for (int32_t i = 0; i < pFillSup->numOfAllCols; i++) {
+ double value = 0.0;
+ taosArrayPush(pFillInfo->pLinearInfo->pDeltaVal, &value);
+ taosArrayPush(pFillInfo->pLinearInfo->pNextDeltaVal, &value);
+ }
+ }
+ pFillInfo->pLinearInfo->winIndex = 0;
+
+ pFillInfo->pResRow = NULL;
+ if (pFillSup->type == TSDB_FILL_SET_VALUE || pFillSup->type == TSDB_FILL_NULL) {
+ pFillInfo->pResRow = taosMemoryCalloc(1, sizeof(SResultRowData));
+ pFillInfo->pResRow->key = INT64_MIN;
+ pFillInfo->pResRow->pRowVal = taosMemoryCalloc(1, pFillSup->rowSize);
+ for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) {
+ SColumnInfoData* pColData = taosArrayGet(pRes->pDataBlock, i);
+ SResultCellData* pCell = getResultCell(pFillInfo->pResRow, i);
+ pCell->bytes = pColData->info.bytes;
+ pCell->type = pColData->info.type;
+ }
+ }
+
+ pFillInfo->type = pFillSup->type;
+ pFillInfo->delRanges = taosArrayInit(16, sizeof(STimeRange));
+ pFillInfo->delIndex = 0;
+ return pFillInfo;
+}
+
+SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFillPhysiNode* pPhyFillNode,
+ SExecTaskInfo* pTaskInfo) {
+ SStreamFillOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamFillOperatorInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ if (pInfo == NULL || pOperator == NULL) {
+ goto _error;
+ }
+
+ SInterval* pInterval = &((SStreamIntervalOperatorInfo*)downstream->info)->interval;
+ int32_t numOfFillCols = 0;
+ SExprInfo* pFillExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &numOfFillCols);
+ pInfo->pFillSup = initStreamFillSup(pPhyFillNode, pInterval, pFillExprInfo, numOfFillCols);
+ if (!pInfo->pFillSup) {
+ goto _error;
+ }
+
+ initResultSizeInfo(&pOperator->resultInfo, 4096);
+ pInfo->pRes = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc);
+ pInfo->pSrcBlock = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc);
+ pInfo->pPrevSrcBlock = createDataBlockFromDescNode(pPhyFillNode->node.pOutputDataBlockDesc);
+ blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
+ blockDataEnsureCapacity(pInfo->pSrcBlock, pOperator->resultInfo.capacity);
+ blockDataEnsureCapacity(pInfo->pPrevSrcBlock, pOperator->resultInfo.capacity);
+
+ pInfo->pFillInfo = initStreamFillInfo(pInfo->pFillSup, pInfo->pRes);
+ if (!pInfo->pFillInfo) {
+ goto _error;
+ }
+
+ if (pInfo->pFillInfo->type == TSDB_FILL_SET_VALUE) {
+ for (int32_t i = 0; i < pInfo->pFillSup->numOfAllCols; ++i) {
+ SFillColInfo* pFillCol = pInfo->pFillSup->pAllColInfo + i;
+ int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
+ SResultCellData* pCell = getResultCell(pInfo->pFillInfo->pResRow, slotId);
+ SVariant* pVar = &(pFillCol->fillVal);
+ if (pCell->type == TSDB_DATA_TYPE_FLOAT) {
+ float v = 0;
+ GET_TYPED_DATA(v, float, pVar->nType, &pVar->i);
+ SET_TYPED_DATA(pCell->pData, pCell->type, v);
+ } else if (pCell->type == TSDB_DATA_TYPE_DOUBLE) {
+ double v = 0;
+ GET_TYPED_DATA(v, double, pVar->nType, &pVar->i);
+ SET_TYPED_DATA(pCell->pData, pCell->type, v);
+ } else if (IS_SIGNED_NUMERIC_TYPE(pCell->type)) {
+ int64_t v = 0;
+ GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i);
+ SET_TYPED_DATA(pCell->pData, pCell->type, v);
+ } else {
+ pCell->isNull = true;
+ }
+ }
+ } else if (pInfo->pFillInfo->type == TSDB_FILL_NULL) {
+ for (int32_t i = 0; i < pInfo->pFillSup->numOfAllCols; ++i) {
+ SFillColInfo* pFillCol = pInfo->pFillSup->pAllColInfo + i;
+ int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
+ SResultCellData* pCell = getResultCell(pInfo->pFillInfo->pResRow, slotId);
+ pCell->isNull = true;
+ }
+ }
+
+ pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
+ blockDataEnsureCapacity(pInfo->pDelRes, pOperator->resultInfo.capacity);
+
+ pInfo->primaryTsCol = ((STargetNode*)pPhyFillNode->pWStartTs)->slotId;
+ pInfo->primarySrcSlotId = ((SColumnNode*)((STargetNode*)pPhyFillNode->pWStartTs)->pExpr)->slotId;
+
+ int32_t numOfOutputCols = 0;
+ int32_t code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc,
+ &numOfOutputCols, COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ code = filterInitFromNode((SNode*)pPhyFillNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ code = initExprSupp(&pOperator->exprSupp, pFillExprInfo, numOfFillCols);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ pInfo->srcRowIndex = 0;
+ setOperatorInfo(pOperator, "StreamFillOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamFill, NULL, destroyStreamFillOperatorInfo, optrDefaultBufFn, NULL);
+
+ code = appendDownstream(pOperator, &downstream, 1);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+ return pOperator;
+
+ _error:
+ destroyStreamFillOperatorInfo(pInfo);
+ taosMemoryFreeClear(pOperator);
+ pTaskInfo->code = code;
+ return NULL;
+}
diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c
index fcfb79eb4b62457c51f2f0a9cc7bb8a90064d3ae..1a43ddecdd6d6b1a6e9b3daeda99f3b25da339c2 100644
--- a/source/libs/executor/src/groupoperator.c
+++ b/source/libs/executor/src/groupoperator.c
@@ -274,10 +274,9 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SSDataBlock* pBlock) {
// return;
// }
- int32_t len = 0;
- STimeWindow w = TSWINDOW_INITIALIZER;
-
+ int32_t len = 0;
terrno = TSDB_CODE_SUCCESS;
+
int32_t num = 0;
for (int32_t j = 0; j < pBlock->info.rows; ++j) {
// Compare with the previous row of this column, and do not set the output buffer again if they are identical.
@@ -309,13 +308,14 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SSDataBlock* pBlock) {
len = buildGroupKeys(pInfo->keyBuf, pInfo->pGroupColVals);
int32_t ret = setGroupResultOutputBuf(pOperator, &(pInfo->binfo), pOperator->exprSupp.numOfExprs, pInfo->keyBuf,
- len, pBlock->info.groupId, pInfo->aggSup.pResultBuf, &pInfo->aggSup);
+ len, pBlock->info.id.groupId, pInfo->aggSup.pResultBuf, &pInfo->aggSup);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_APP_ERROR);
}
int32_t rowIndex = j - num;
- doApplyFunctions(pTaskInfo, pCtx, NULL, rowIndex, num, pBlock->info.rows, pOperator->exprSupp.numOfExprs);
+ applyAggFunctionOnPartialTuples(pTaskInfo, pCtx, NULL, rowIndex, num, pBlock->info.rows,
+ pOperator->exprSupp.numOfExprs);
// assign the group keys or user input constant values if required
doAssignGroupKeys(pCtx, pOperator->exprSupp.numOfExprs, pBlock->info.rows, rowIndex);
@@ -326,13 +326,14 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SSDataBlock* pBlock) {
if (num > 0) {
len = buildGroupKeys(pInfo->keyBuf, pInfo->pGroupColVals);
int32_t ret = setGroupResultOutputBuf(pOperator, &(pInfo->binfo), pOperator->exprSupp.numOfExprs, pInfo->keyBuf,
- len, pBlock->info.groupId, pInfo->aggSup.pResultBuf, &pInfo->aggSup);
+ len, pBlock->info.id.groupId, pInfo->aggSup.pResultBuf, &pInfo->aggSup);
if (ret != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_APP_ERROR);
}
int32_t rowIndex = pBlock->info.rows - num;
- doApplyFunctions(pTaskInfo, pCtx, NULL, rowIndex, num, pBlock->info.rows, pOperator->exprSupp.numOfExprs);
+ applyAggFunctionOnPartialTuples(pTaskInfo, pCtx, NULL, rowIndex, num, pBlock->info.rows,
+ pOperator->exprSupp.numOfExprs);
doAssignGroupKeys(pCtx, pOperator->exprSupp.numOfExprs, pBlock->info.rows, rowIndex);
}
}
@@ -432,7 +433,7 @@ SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SAggPhysiNode*
goto _error;
}
- SSDataBlock* pResBlock = createResDataBlock(pAggNode->node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pAggNode->node.pOutputDataBlockDesc);
initBasicInfo(&pInfo->binfo, pResBlock);
int32_t numOfScalarExpr = 0;
@@ -457,7 +458,7 @@ SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SAggPhysiNode*
int32_t num = 0;
SExprInfo* pExprInfo = createExprInfo(pAggNode->pAggFuncs, pAggNode->pGroupKeys, &num);
- code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, pInfo->groupKeyLen, pTaskInfo->id.str);
+ code = initAggSup(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, pInfo->groupKeyLen, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -470,8 +471,8 @@ SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SAggPhysiNode*
initResultRowInfo(&pInfo->binfo.resultRowInfo);
setOperatorInfo(pOperator, "GroupbyAggOperator", 0, true, OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, hashGroupbyAggregate, NULL, destroyGroupOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, hashGroupbyAggregate, NULL, destroyGroupOperatorInfo,
+ optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -698,7 +699,7 @@ static SSDataBlock* buildPartitionResult(SOperatorInfo* pOperator) {
releaseBufPage(pInfo->pBuf, page);
blockDataUpdateTsWindow(pInfo->binfo.pRes, 0);
- pInfo->binfo.pRes->info.groupId = pGroupInfo->groupId;
+ pInfo->binfo.pRes->info.id.groupId = pGroupInfo->groupId;
pOperator->resultInfo.totalRows += pInfo->binfo.pRes->info.rows;
return pInfo->binfo.pRes;
@@ -777,6 +778,12 @@ static void destroyPartitionOperatorInfo(void* param) {
taosArrayDestroy(pInfo->pGroupColVals);
taosMemoryFree(pInfo->keyBuf);
+
+ int32_t size = taosArrayGetSize(pInfo->sortedGroupArray);
+ for (int32_t i = 0; i < size; i++) {
+ SDataGroupInfo* pGp = taosArrayGet(pInfo->sortedGroupArray, i);
+ taosArrayDestroy(pGp->pPageList);
+ }
taosArrayDestroy(pInfo->sortedGroupArray);
void* pGroupIter = taosHashIterate(pInfo->pGroupSet, NULL);
@@ -824,7 +831,7 @@ SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartition
uint32_t defaultPgsz = 0;
uint32_t defaultBufsz = 0;
- pInfo->binfo.pRes = createResDataBlock(pPartNode->node.pOutputDataBlockDesc);
+ pInfo->binfo.pRes = createDataBlockFromDescNode(pPartNode->node.pOutputDataBlockDesc);
getBufferPgSize(pInfo->binfo.pRes->info.rowSize, &defaultPgsz, &defaultBufsz);
if (!osTempSpaceAvailable()) {
@@ -851,7 +858,8 @@ SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartition
pOperator->exprSupp.numOfExprs = numOfCols;
pOperator->exprSupp.pExprInfo = pExprInfo;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, hashPartition, NULL, destroyPartitionOperatorInfo, NULL);
+ pOperator->fpSet =
+ createOperatorFpSet(optrDummyOpenFn, hashPartition, NULL, destroyPartitionOperatorInfo, optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, &downstream, 1);
return pOperator;
@@ -915,36 +923,45 @@ static SSDataBlock* buildStreamPartitionResult(SOperatorInfo* pOperator) {
}
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) {
- memset(pDest->info.parTbName, 0, TSDB_TABLE_NAME_LEN);
- int32_t len = TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN - 1);
- memcpy(pDest->info.parTbName, varDataVal(pData), len);
- /*pDest->info.parTbName[len + 1] = 0;*/
+ void* tbname = NULL;
+ if (streamStateGetParName(pOperator->pTaskInfo->streamInfo.pState, pParInfo->groupId, &tbname) == 0) {
+ memcpy(pDest->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
+ tdbFree(tbname);
} else {
- pDest->info.parTbName[0] = 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) {
+ memset(pDest->info.parTbName, 0, TSDB_TABLE_NAME_LEN);
+ int32_t len = TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN - 1);
+ memcpy(pDest->info.parTbName, varDataVal(pData), len);
+ /*pDest->info.parTbName[len + 1] = 0;*/
+ } else {
+ pDest->info.parTbName[0] = 0;
+ }
+ if (pParInfo->groupId && pDest->info.parTbName[0]) {
+ streamStatePutParName(pOperator->pTaskInfo->streamInfo.pState, pParInfo->groupId, pDest->info.parTbName);
+ }
+ /*printf("\n\n set name %s\n\n", pDest->info.parTbName);*/
+ blockDataDestroy(pTmpBlock);
+ blockDataDestroy(pResBlock);
}
- /*printf("\n\n set name %s\n\n", pDest->info.parTbName);*/
- blockDataDestroy(pTmpBlock);
- blockDataDestroy(pResBlock);
}
}
taosArrayDestroy(pParInfo->rowIds);
pParInfo->rowIds = NULL;
blockDataUpdateTsWindow(pDest, pInfo->tsColIndex);
- pDest->info.groupId = pParInfo->groupId;
+ pDest->info.id.groupId = pParInfo->groupId;
pOperator->resultInfo.totalRows += pDest->info.rows;
pInfo->parIte = taosHashIterate(pInfo->pPartitions, pInfo->parIte);
ASSERT(pDest->info.rows > 0);
@@ -1111,7 +1128,7 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr
}
pInfo->partitionSup.needCalc = true;
- pInfo->binfo.pRes = createResDataBlock(pPartNode->part.node.pOutputDataBlockDesc);
+ pInfo->binfo.pRes = createDataBlockFromDescNode(pPartNode->part.node.pOutputDataBlockDesc);
if (pInfo->binfo.pRes == NULL) {
goto _error;
}
@@ -1133,8 +1150,8 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr
pInfo, pTaskInfo);
pOperator->exprSupp.numOfExprs = numOfCols;
pOperator->exprSupp.pExprInfo = pExprInfo;
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doStreamHashPartition, NULL, destroyStreamPartitionOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamHashPartition, NULL,
+ destroyStreamPartitionOperatorInfo, optrDefaultBufFn, NULL);
initParDownStream(downstream, &pInfo->partitionSup, &pInfo->scalarSup);
code = appendDownstream(pOperator, &downstream, 1);
diff --git a/source/libs/executor/src/joinoperator.c b/source/libs/executor/src/joinoperator.c
index 61dc7a1b76d7787b0796133fd02a5db5257227b0..d460af971c251957111f06ce951dc3fe7bc39ff8 100644
--- a/source/libs/executor/src/joinoperator.c
+++ b/source/libs/executor/src/joinoperator.c
@@ -54,22 +54,26 @@ static void extractTimeCondition(SJoinOperatorInfo* pInfo, SOperatorInfo** pDown
SColumnNode* col2 = (SColumnNode*)pNode->pRight;
SColumnNode* leftTsCol = NULL;
SColumnNode* rightTsCol = NULL;
- if (col1->dataBlockId == pDownstream[0]->resultDataBlockId) {
- ASSERT(col2->dataBlockId == pDownstream[1]->resultDataBlockId);
+ if (col1->dataBlockId == col2->dataBlockId ) {
leftTsCol = col1;
rightTsCol = col2;
} else {
- ASSERT(col1->dataBlockId == pDownstream[1]->resultDataBlockId);
- ASSERT(col2->dataBlockId == pDownstream[0]->resultDataBlockId);
- leftTsCol = col2;
- rightTsCol = col1;
+ if (col1->dataBlockId == pDownstream[0]->resultDataBlockId) {
+ ASSERT(col2->dataBlockId == pDownstream[1]->resultDataBlockId);
+ leftTsCol = col1;
+ rightTsCol = col2;
+ } else {
+ ASSERT(col1->dataBlockId == pDownstream[1]->resultDataBlockId);
+ ASSERT(col2->dataBlockId == pDownstream[0]->resultDataBlockId);
+ leftTsCol = col2;
+ rightTsCol = col1;
+ }
}
setJoinColumnInfo(&pInfo->leftCol, leftTsCol);
setJoinColumnInfo(&pInfo->rightCol, rightTsCol);
} else {
ASSERT(false);
- }
-}
+ }}
SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream,
SSortMergeJoinPhysiNode* pJoinNode, SExecTaskInfo* pTaskInfo) {
@@ -83,7 +87,7 @@ SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t
}
int32_t numOfCols = 0;
- SSDataBlock* pResBlock = createResDataBlock(pJoinNode->node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pJoinNode->node.pOutputDataBlockDesc);
SExprInfo* pExprInfo = createExprInfo(pJoinNode->pTargets, NULL, &numOfCols);
initResultSizeInfo(&pOperator->resultInfo, 4096);
@@ -132,7 +136,7 @@ SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t
pInfo->inputOrder = TSDB_ORDER_DESC;
}
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doMergeJoin, NULL, destroyMergeJoinOperator, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doMergeJoin, NULL, destroyMergeJoinOperator, optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, pDownstream, numOfDownstream);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -181,7 +185,7 @@ static void mergeJoinJoinLeftRight(struct SOperatorInfo* pOperator, SSDataBlock*
int32_t rowIndex = -1;
SColumnInfoData* pSrc = NULL;
- if (pLeftBlock->info.blockId == blockId) {
+ if (pLeftBlock->info.id.blockId == blockId) {
pSrc = taosArrayGet(pLeftBlock->pDataBlock, slotId);
rowIndex = leftPos;
} else {
diff --git a/source/libs/executor/src/projectoperator.c b/source/libs/executor/src/projectoperator.c
index ada7964c67d15d8968db606ebdb37f6df6f72f7f..65bb40b195b0b60b10b7a3bcca8414db9db6641e 100644
--- a/source/libs/executor/src/projectoperator.c
+++ b/source/libs/executor/src/projectoperator.c
@@ -85,7 +85,7 @@ SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhys
int32_t numOfCols = 0;
SExprInfo* pExprInfo = createExprInfo(pProjPhyNode->pProjections, NULL, &numOfCols);
- SSDataBlock* pResBlock = createResDataBlock(pProjPhyNode->node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pProjPhyNode->node.pOutputDataBlockDesc);
initLimitInfo(pProjPhyNode->node.pLimit, pProjPhyNode->node.pSlimit, &pInfo->limitInfo);
pInfo->binfo.pRes = pResBlock;
@@ -102,7 +102,7 @@ SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhys
}
initResultSizeInfo(&pOperator->resultInfo, numOfRows);
- code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
+ code = initAggSup(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -118,8 +118,8 @@ SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhys
pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pOperator->exprSupp.pCtx, numOfCols);
setOperatorInfo(pOperator, "ProjectOperator", QUERY_NODE_PHYSICAL_PLAN_PROJECT, false, OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doProjectOperation, NULL,
- destroyProjectOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doProjectOperation, NULL,
+ destroyProjectOperatorInfo, optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -138,13 +138,13 @@ _error:
static int32_t discardGroupDataBlock(SSDataBlock* pBlock, SLimitInfo* pLimitInfo) {
if (pLimitInfo->remainGroupOffset > 0) {
// it is the first group
- if (pLimitInfo->currentGroupId == 0 || pLimitInfo->currentGroupId == pBlock->info.groupId) {
- pLimitInfo->currentGroupId = pBlock->info.groupId;
+ if (pLimitInfo->currentGroupId == 0 || pLimitInfo->currentGroupId == pBlock->info.id.groupId) {
+ pLimitInfo->currentGroupId = pBlock->info.id.groupId;
return PROJECT_RETRIEVE_CONTINUE;
- } else if (pLimitInfo->currentGroupId != pBlock->info.groupId) {
+ } else if (pLimitInfo->currentGroupId != pBlock->info.id.groupId) {
// now it is the data from a new group
pLimitInfo->remainGroupOffset -= 1;
- pLimitInfo->currentGroupId = pBlock->info.groupId;
+ pLimitInfo->currentGroupId = pBlock->info.id.groupId;
// ignore data block in current group
if (pLimitInfo->remainGroupOffset > 0) {
@@ -153,7 +153,7 @@ static int32_t discardGroupDataBlock(SSDataBlock* pBlock, SLimitInfo* pLimitInfo
}
// set current group id of the project operator
- pLimitInfo->currentGroupId = pBlock->info.groupId;
+ pLimitInfo->currentGroupId = pBlock->info.id.groupId;
}
return PROJECT_RETRIEVE_DONE;
@@ -164,7 +164,7 @@ static int32_t setInfoForNewGroup(SSDataBlock* pBlock, SLimitInfo* pLimitInfo, S
// here check for a new group data, we need to handle the data of the previous group.
ASSERT(pLimitInfo->remainGroupOffset == 0 || pLimitInfo->remainGroupOffset == -1);
- if (pLimitInfo->currentGroupId != 0 && pLimitInfo->currentGroupId != pBlock->info.groupId) {
+ if (pLimitInfo->currentGroupId != 0 && pLimitInfo->currentGroupId != pBlock->info.id.groupId) {
pLimitInfo->numOfOutputGroups += 1;
if ((pLimitInfo->slimit.limit > 0) && (pLimitInfo->slimit.limit <= pLimitInfo->numOfOutputGroups)) {
setOperatorCompleted(pOperator);
@@ -306,7 +306,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) {
T_LONG_JMP(pTaskInfo->env, code);
}
- status = doIngroupLimitOffset(pLimitInfo, pBlock->info.groupId, pInfo->pRes, pOperator);
+ status = doIngroupLimitOffset(pLimitInfo, pBlock->info.id.groupId, pInfo->pRes, pOperator);
if (status == PROJECT_RETRIEVE_CONTINUE) {
continue;
}
@@ -316,7 +316,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) {
if (pProjectInfo->mergeDataBlocks) {
if (pRes->info.rows > 0) {
- pFinalRes->info.groupId = pRes->info.groupId;
+ pFinalRes->info.id.groupId = pRes->info.id.groupId;
pFinalRes->info.version = pRes->info.version;
// continue merge data, ignore the group id
@@ -385,7 +385,7 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy
}
}
- SSDataBlock* pResBlock = createResDataBlock(pPhyNode->node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->node.pOutputDataBlockDesc);
int32_t numOfRows = 4096;
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
@@ -400,7 +400,7 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy
initResultSizeInfo(&pOperator->resultInfo, numOfRows);
blockDataEnsureCapacity(pResBlock, numOfRows);
- int32_t code = initAggInfo(pSup, &pInfo->aggSup, pExprInfo, numOfExpr, keyBufSize, pTaskInfo->id.str);
+ int32_t code = initAggSup(pSup, &pInfo->aggSup, pExprInfo, numOfExpr, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -415,7 +415,7 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy
pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pSup->pCtx, numOfExpr);
setOperatorInfo(pOperator, "IndefinitOperator", QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC, false, OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doApplyIndefinitFunction, NULL, destroyIndefinitOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doApplyIndefinitFunction, NULL, destroyIndefinitOperatorInfo, optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -511,11 +511,11 @@ SSDataBlock* doApplyIndefinitFunction(SOperatorInfo* pOperator) {
break;
}
- if (pIndefInfo->groupId == 0 && pBlock->info.groupId != 0) {
- pIndefInfo->groupId = pBlock->info.groupId; // this is the initial group result
+ if (pIndefInfo->groupId == 0 && pBlock->info.id.groupId != 0) {
+ pIndefInfo->groupId = pBlock->info.id.groupId; // this is the initial group result
} else {
- if (pIndefInfo->groupId != pBlock->info.groupId) { // reset output buffer and computing status
- pIndefInfo->groupId = pBlock->info.groupId;
+ if (pIndefInfo->groupId != pBlock->info.id.groupId) { // reset output buffer and computing status
+ pIndefInfo->groupId = pBlock->info.id.groupId;
pIndefInfo->pNextGroupRes = pBlock;
break;
}
@@ -643,3 +643,182 @@ SSDataBlock* doGenerateSourceData(SOperatorInfo* pOperator) {
return (pRes->info.rows > 0) ? pRes : NULL;
}
+
+static void setPseudoOutputColInfo(SSDataBlock* pResult, SqlFunctionCtx* pCtx, SArray* pPseudoList) {
+ size_t num = (pPseudoList != NULL) ? taosArrayGetSize(pPseudoList) : 0;
+ for (int32_t i = 0; i < num; ++i) {
+ pCtx[i].pOutput = taosArrayGet(pResult->pDataBlock, i);
+ }
+}
+
+int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBlock* pSrcBlock, SqlFunctionCtx* pCtx,
+ int32_t numOfOutput, SArray* pPseudoList) {
+ setPseudoOutputColInfo(pResult, pCtx, pPseudoList);
+
+ if (pSrcBlock == NULL) {
+ for (int32_t k = 0; k < numOfOutput; ++k) {
+ int32_t outputSlotId = pExpr[k].base.resSchema.slotId;
+
+ ASSERT(pExpr[k].pExpr->nodeType == QUERY_NODE_VALUE);
+ SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId);
+
+ int32_t type = pExpr[k].base.pParam[0].param.nType;
+ if (TSDB_DATA_TYPE_NULL == type) {
+ colDataAppendNNULL(pColInfoData, 0, 1);
+ } else {
+ colDataAppend(pColInfoData, 0, taosVariantGet(&pExpr[k].base.pParam[0].param, type), false);
+ }
+ }
+
+ pResult->info.rows = 1;
+ return TSDB_CODE_SUCCESS;
+ }
+
+ if (pResult != pSrcBlock) {
+ pResult->info.id.groupId = pSrcBlock->info.id.groupId;
+ memcpy(pResult->info.parTbName, pSrcBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
+ }
+
+ // if the source equals to the destination, it is to create a new column as the result of scalar
+ // function or some operators.
+ bool createNewColModel = (pResult == pSrcBlock);
+ if (createNewColModel) {
+ blockDataEnsureCapacity(pResult, pResult->info.rows);
+ }
+
+ int32_t numOfRows = 0;
+
+ for (int32_t k = 0; k < numOfOutput; ++k) {
+ int32_t outputSlotId = pExpr[k].base.resSchema.slotId;
+ SqlFunctionCtx* pfCtx = &pCtx[k];
+ SInputColumnInfoData* pInputData = &pfCtx->input;
+
+ if (pExpr[k].pExpr->nodeType == QUERY_NODE_COLUMN) { // it is a project query
+ SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId);
+ if (pResult->info.rows > 0 && !createNewColModel) {
+ colDataMergeCol(pColInfoData, pResult->info.rows, (int32_t*)&pResult->info.capacity, pInputData->pData[0],
+ pInputData->numOfRows);
+ } else {
+ colDataAssign(pColInfoData, pInputData->pData[0], pInputData->numOfRows, &pResult->info);
+ }
+
+ numOfRows = pInputData->numOfRows;
+ } else if (pExpr[k].pExpr->nodeType == QUERY_NODE_VALUE) {
+ SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId);
+
+ int32_t offset = createNewColModel ? 0 : pResult->info.rows;
+
+ int32_t type = pExpr[k].base.pParam[0].param.nType;
+ if (TSDB_DATA_TYPE_NULL == type) {
+ colDataAppendNNULL(pColInfoData, offset, pSrcBlock->info.rows);
+ } else {
+ char* p = taosVariantGet(&pExpr[k].base.pParam[0].param, type);
+ for (int32_t i = 0; i < pSrcBlock->info.rows; ++i) {
+ colDataAppend(pColInfoData, i + offset, p, false);
+ }
+ }
+
+ numOfRows = pSrcBlock->info.rows;
+ } else if (pExpr[k].pExpr->nodeType == QUERY_NODE_OPERATOR) {
+ SArray* pBlockList = taosArrayInit(4, POINTER_BYTES);
+ taosArrayPush(pBlockList, &pSrcBlock);
+
+ SColumnInfoData* pResColData = taosArrayGet(pResult->pDataBlock, outputSlotId);
+ SColumnInfoData idata = {.info = pResColData->info, .hasNull = true};
+
+ SScalarParam dest = {.columnData = &idata};
+ int32_t code = scalarCalculate(pExpr[k].pExpr->_optrRoot.pRootNode, pBlockList, &dest);
+ if (code != TSDB_CODE_SUCCESS) {
+ taosArrayDestroy(pBlockList);
+ return code;
+ }
+
+ int32_t startOffset = createNewColModel ? 0 : pResult->info.rows;
+ ASSERT(pResult->info.capacity > 0);
+
+ colDataMergeCol(pResColData, startOffset, (int32_t*)&pResult->info.capacity, &idata, dest.numOfRows);
+ colDataDestroy(&idata);
+
+ numOfRows = dest.numOfRows;
+ taosArrayDestroy(pBlockList);
+ } else if (pExpr[k].pExpr->nodeType == QUERY_NODE_FUNCTION) {
+ // _rowts/_c0, not tbname column
+ if (fmIsPseudoColumnFunc(pfCtx->functionId) && (!fmIsScanPseudoColumnFunc(pfCtx->functionId))) {
+ // do nothing
+ } else if (fmIsIndefiniteRowsFunc(pfCtx->functionId)) {
+ SResultRowEntryInfo* pResInfo = GET_RES_INFO(pfCtx);
+ pfCtx->fpSet.init(pfCtx, pResInfo);
+
+ pfCtx->pOutput = taosArrayGet(pResult->pDataBlock, outputSlotId);
+ pfCtx->offset = createNewColModel ? 0 : pResult->info.rows; // set the start offset
+
+ // set the timestamp(_rowts) output buffer
+ if (taosArrayGetSize(pPseudoList) > 0) {
+ int32_t* outputColIndex = taosArrayGet(pPseudoList, 0);
+ pfCtx->pTsOutput = (SColumnInfoData*)pCtx[*outputColIndex].pOutput;
+ }
+
+ // link pDstBlock to set selectivity value
+ if (pfCtx->subsidiaries.num > 0) {
+ pfCtx->pDstBlock = pResult;
+ }
+
+ int32_t code = pfCtx->fpSet.process(pfCtx);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+ numOfRows = pResInfo->numOfRes;
+ } else if (fmIsAggFunc(pfCtx->functionId)) {
+ // selective value output should be set during corresponding function execution
+ if (fmIsSelectValueFunc(pfCtx->functionId)) {
+ continue;
+ }
+ // _group_key function for "partition by tbname" + csum(col_name) query
+ SColumnInfoData* pOutput = taosArrayGet(pResult->pDataBlock, outputSlotId);
+ int32_t slotId = pfCtx->param[0].pCol->slotId;
+
+ // todo handle the json tag
+ SColumnInfoData* pInput = taosArrayGet(pSrcBlock->pDataBlock, slotId);
+ for (int32_t f = 0; f < pSrcBlock->info.rows; ++f) {
+ bool isNull = colDataIsNull_s(pInput, f);
+ if (isNull) {
+ colDataAppendNULL(pOutput, pResult->info.rows + f);
+ } else {
+ char* data = colDataGetData(pInput, f);
+ colDataAppend(pOutput, pResult->info.rows + f, data, isNull);
+ }
+ }
+
+ } else {
+ SArray* pBlockList = taosArrayInit(4, POINTER_BYTES);
+ taosArrayPush(pBlockList, &pSrcBlock);
+
+ SColumnInfoData* pResColData = taosArrayGet(pResult->pDataBlock, outputSlotId);
+ SColumnInfoData idata = {.info = pResColData->info, .hasNull = true};
+
+ SScalarParam dest = {.columnData = &idata};
+ int32_t code = scalarCalculate((SNode*)pExpr[k].pExpr->_function.pFunctNode, pBlockList, &dest);
+ if (code != TSDB_CODE_SUCCESS) {
+ taosArrayDestroy(pBlockList);
+ return code;
+ }
+
+ int32_t startOffset = createNewColModel ? 0 : pResult->info.rows;
+ ASSERT(pResult->info.capacity > 0);
+ colDataMergeCol(pResColData, startOffset, (int32_t*)&pResult->info.capacity, &idata, dest.numOfRows);
+ colDataDestroy(&idata);
+
+ numOfRows = dest.numOfRows;
+ taosArrayDestroy(pBlockList);
+ }
+ } else {
+ return TSDB_CODE_OPS_NOT_SUPPORT;
+ }
+ }
+
+ if (!createNewColModel) {
+ pResult->info.rows += numOfRows;
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index de2a7b9daccf526aada12d74504b394a9defa554..eae2ff3c72f3889c7e2402481cf3d46b20c7e581 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -30,7 +30,6 @@
#include "tcompare.h"
#include "thash.h"
#include "ttypes.h"
-#include "vnode.h"
#define SET_REVERSE_SCAN_FLAG(_info) ((_info)->scanFlag = REVERSE_SCAN)
#define SWITCH_ORDER(n) (((n) = ((n) == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC))
@@ -163,8 +162,8 @@ static SResultRow* getTableGroupOutputBuf(SOperatorInfo* pOperator, uint64_t gro
STableScanInfo* pTableScanInfo = pOperator->info;
- SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet(pTableScanInfo->base.pdInfo.pAggSup->pResultRowHashTable, buf,
- GET_RES_WINDOW_KEY_LEN(sizeof(groupId)));
+ SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet(pTableScanInfo->base.pdInfo.pAggSup->pResultRowHashTable,
+ buf, GET_RES_WINDOW_KEY_LEN(sizeof(groupId)));
if (p1 == NULL) {
return NULL;
@@ -184,7 +183,7 @@ static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo*
SExprSupp* pSup1 = pTableScanInfo->base.pdInfo.pExprSup;
SFilePage* pPage = NULL;
- SResultRow* pRow = getTableGroupOutputBuf(pOperator, pBlockInfo->groupId, &pPage);
+ SResultRow* pRow = getTableGroupOutputBuf(pOperator, pBlockInfo->id.groupId, &pPage);
if (pRow == NULL) {
return TSDB_CODE_SUCCESS;
@@ -224,10 +223,8 @@ static bool doFilterByBlockSMA(SFilterInfo* pFilterInfo, SColumnDataAgg** pColsA
}
static bool doLoadBlockSMA(STableScanBase* pTableScanInfo, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo) {
- bool allColumnsHaveAgg = true;
- SColumnDataAgg** pColAgg = NULL;
-
- int32_t code = tsdbRetrieveDatablockSMA(pTableScanInfo->dataReader, &pColAgg, &allColumnsHaveAgg);
+ bool allColumnsHaveAgg = true;
+ int32_t code = tsdbRetrieveDatablockSMA(pTableScanInfo->dataReader, pBlock, &allColumnsHaveAgg);
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pTaskInfo->env, code);
}
@@ -236,6 +233,7 @@ static bool doLoadBlockSMA(STableScanBase* pTableScanInfo, SSDataBlock* pBlock,
return false;
}
+#if 0
// if (allColumnsHaveAgg == true) {
int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
@@ -256,6 +254,7 @@ static bool doLoadBlockSMA(STableScanBase* pTableScanInfo, SSDataBlock* pBlock,
pBlock->pBlockAgg[pColMatchInfo->dstSlotId] = pColAgg[i];
}
+#endif
return true;
}
@@ -285,7 +284,7 @@ void applyLimitOffset(SLimitInfo* pLimitInfo, SSDataBlock* pBlock, SExecTaskInfo
if (pLimit->offset > 0 && pLimitInfo->remainOffset > 0) {
if (pLimitInfo->remainOffset >= pBlock->info.rows) {
pLimitInfo->remainOffset -= pBlock->info.rows;
- pBlock->info.rows = 0;
+ blockDataEmpty(pBlock);
qDebug("current block ignore due to offset, current:%" PRId64 ", %s", pLimitInfo->remainOffset, id);
} else {
blockDataTrimFirstNRows(pBlock, pLimitInfo->remainOffset);
@@ -306,7 +305,7 @@ void applyLimitOffset(SLimitInfo* pLimitInfo, SSDataBlock* pBlock, SExecTaskInfo
static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableScanInfo, SSDataBlock* pBlock,
uint32_t* status) {
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SFileBlockLoadRecorder* pCost = &pTableScanInfo->readRecorder;
pCost->totalBlocks += 1;
@@ -385,12 +384,12 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
pCost->totalCheckedRows += pBlock->info.rows;
pCost->loadBlocks += 1;
- SArray* pCols = tsdbRetrieveDataBlock(pTableScanInfo->dataReader, NULL);
- if (pCols == NULL) {
+ SSDataBlock* p = tsdbRetrieveDataBlock(pTableScanInfo->dataReader, NULL);
+ if (p == NULL) {
return terrno;
}
- relocateColumnData(pBlock, pTableScanInfo->matchInfo.pList, pCols, true);
+ ASSERT(p == pBlock);
doSetTagColumnData(pTableScanInfo, pBlock, pTaskInfo, pBlock->info.rows);
// restore the previous value
@@ -484,13 +483,14 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int
// 1. check if it is existed in meta cache
if (pCache == NULL) {
metaReaderInit(&mr, pHandle->meta, 0);
- code = metaGetTableEntryByUid(&mr, pBlock->info.uid);
+ code = metaGetTableEntryByUidCache(&mr, pBlock->info.id.uid);
if (code != TSDB_CODE_SUCCESS) {
if (terrno == TSDB_CODE_PAR_TABLE_NOT_EXIST) {
- qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid,
- tstrerror(terrno), idStr);
+ qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s",
+ pBlock->info.id.uid, tstrerror(terrno), idStr);
} else {
- qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno), idStr);
+ qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.id.uid, tstrerror(terrno),
+ idStr);
}
metaReaderClear(&mr);
return terrno;
@@ -505,16 +505,16 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int
} else {
pCache->metaFetch += 1;
- h = taosLRUCacheLookup(pCache->pTableMetaEntryCache, &pBlock->info.uid, sizeof(pBlock->info.uid));
+ h = taosLRUCacheLookup(pCache->pTableMetaEntryCache, &pBlock->info.id.uid, sizeof(pBlock->info.id.uid));
if (h == NULL) {
metaReaderInit(&mr, pHandle->meta, 0);
- code = metaGetTableEntryByUid(&mr, pBlock->info.uid);
+ code = metaGetTableEntryByUidCache(&mr, pBlock->info.id.uid);
if (code != TSDB_CODE_SUCCESS) {
if (terrno == TSDB_CODE_PAR_TABLE_NOT_EXIST) {
qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s",
- pBlock->info.uid, tstrerror(terrno), idStr);
+ pBlock->info.id.uid, tstrerror(terrno), idStr);
} else {
- qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno),
+ qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.id.uid, tstrerror(terrno),
idStr);
}
metaReaderClear(&mr);
@@ -528,7 +528,7 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int
val = *pVal;
freeReader = true;
- int32_t ret = taosLRUCacheInsert(pCache->pTableMetaEntryCache, &pBlock->info.uid, sizeof(uint64_t), pVal,
+ int32_t ret = taosLRUCacheInsert(pCache->pTableMetaEntryCache, &pBlock->info.id.uid, sizeof(uint64_t), pVal,
sizeof(STableCachedVal), freeCachedMetaItem, NULL, TAOS_LRU_PRIORITY_LOW);
if (ret != TAOS_LRU_STATUS_OK) {
qError("failed to put meta into lru cache, code:%d, %s", ret, idStr);
@@ -629,7 +629,7 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
while (tsdbNextDataBlock(pTableScanInfo->base.dataReader)) {
if (isTaskKilled(pTaskInfo)) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
}
// process this data block based on the probabilities
@@ -638,17 +638,8 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
continue;
}
- blockDataCleanup(pBlock);
- SDataBlockInfo* pBInfo = &pBlock->info;
-
- int32_t rows = 0;
- tsdbRetrieveDataBlockInfo(pTableScanInfo->base.dataReader, &rows, &pBInfo->uid, &pBInfo->window);
-
- blockDataEnsureCapacity(pBlock, rows); // todo remove it latter
- pBInfo->rows = rows;
-
- ASSERT(pBInfo->uid != 0);
- pBlock->info.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.uid);
+ ASSERT(pBlock->info.id.uid != 0);
+ pBlock->info.id.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.id.uid);
uint32_t status = 0;
int32_t code = loadDataBlock(pOperator, &pTableScanInfo->base, pBlock, &status);
@@ -668,13 +659,13 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
pOperator->cost.totalCost = pTableScanInfo->base.readRecorder.elapsedTime;
// todo refactor
- /*pTableScanInfo->lastStatus.uid = pBlock->info.uid;*/
+ /*pTableScanInfo->lastStatus.uid = pBlock->info.id.uid;*/
/*pTableScanInfo->lastStatus.ts = pBlock->info.window.ekey;*/
pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__SNAPSHOT_DATA;
- pTaskInfo->streamInfo.lastStatus.uid = pBlock->info.uid;
+ pTaskInfo->streamInfo.lastStatus.uid = pBlock->info.id.uid;
pTaskInfo->streamInfo.lastStatus.ts = pBlock->info.window.ekey;
- ASSERT(pBlock->info.uid != 0);
+ ASSERT(pBlock->info.id.uid != 0);
return pBlock;
}
return NULL;
@@ -778,7 +769,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
ASSERT(pInfo->base.dataReader == NULL);
int32_t code = tsdbReaderOpen(pInfo->base.readHandle.vnode, &pInfo->base.cond, pList, num,
- (STsdbReader**)&pInfo->base.dataReader, GET_TASKID(pTaskInfo));
+ pInfo->pResBlock, (STsdbReader**)&pInfo->base.dataReader, GET_TASKID(pTaskInfo));
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pTaskInfo->env, code);
}
@@ -786,7 +777,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
SSDataBlock* result = doGroupedTableScan(pOperator);
if (result != NULL) {
- ASSERT(result->info.uid != 0);
+ ASSERT(result->info.id.uid != 0);
return result;
}
@@ -879,13 +870,13 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
pInfo->base.scanFlag = MAIN_SCAN;
pInfo->base.pdInfo.interval = extractIntervalInfo(pTableScanNode);
pInfo->base.readHandle = *readHandle;
+ pInfo->base.dataBlockLoadFlag = pTableScanNode->dataRequired;
+
pInfo->sample.sampleRatio = pTableScanNode->ratio;
pInfo->sample.seed = taosGetTimestampSec();
- pInfo->base.dataBlockLoadFlag = pTableScanNode->dataRequired;
-
initResultSizeInfo(&pOperator->resultInfo, 4096);
- pInfo->pResBlock = createResDataBlock(pDescNode);
+ pInfo->pResBlock = createDataBlockFromDescNode(pDescNode);
blockDataEnsureCapacity(pInfo->pResBlock, pOperator->resultInfo.capacity);
code = filterInitFromNode((SNode*)pTableScanNode->scan.node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
@@ -895,6 +886,7 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
pInfo->currentGroupId = -1;
pInfo->assignBlockUid = pTableScanNode->assignBlockUid;
+ pInfo->hasGroupByTag = pTableScanNode->pGroupTags ? true : false;
setOperatorInfo(pOperator, "TableScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, false, OP_NOT_OPENED, pInfo,
pTaskInfo);
@@ -907,8 +899,8 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
}
taosLRUCacheSetStrictCapacity(pInfo->base.metaCache.pTableMetaEntryCache, false);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScan, NULL, destroyTableScanOperatorInfo,
- getTableScannerExecInfo);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doTableScan, NULL, destroyTableScanOperatorInfo,
+ optrDefaultBufFn, getTableScannerExecInfo);
// for non-blocking operator, the open cost is always 0
pOperator->cost.openCost = 0;
@@ -933,7 +925,7 @@ SOperatorInfo* createTableSeqScanOperatorInfo(void* pReadHandle, SExecTaskInfo*
setOperatorInfo(pOperator, "TableSeqScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN, false, OP_NOT_OPENED,
pInfo, pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScanImpl, NULL, NULL, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doTableScanImpl, NULL, NULL, optrDefaultBufFn, NULL);
return pOperator;
}
@@ -993,10 +985,8 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
SExecTaskInfo* pTaskInfo = pTableScanOp->pTaskInfo;
SSDataBlock* pBlock = pTableScanInfo->pResBlock;
- blockDataCleanup(pBlock);
-
STsdbReader* pReader = NULL;
- int32_t code = tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &cond, &tblInfo, 1, (STsdbReader**)&pReader,
+ int32_t code = tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &cond, &tblInfo, 1, pBlock, (STsdbReader**)&pReader,
GET_TASKID(pTaskInfo));
if (code != TSDB_CODE_SUCCESS) {
terrno = code;
@@ -1004,21 +994,10 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
return NULL;
}
- bool hasBlock = tsdbNextDataBlock(pReader);
- if (hasBlock) {
- SDataBlockInfo* pBInfo = &pBlock->info;
-
- int32_t rows = 0;
- tsdbRetrieveDataBlockInfo(pReader, &rows, &pBInfo->uid, &pBInfo->window);
-
- SArray* pCols = tsdbRetrieveDataBlock(pReader, NULL);
- blockDataEnsureCapacity(pBlock, rows);
- pBlock->info.rows = rows;
-
- relocateColumnData(pBlock, pTableScanInfo->base.matchInfo.pList, pCols, true);
- doSetTagColumnData(&pTableScanInfo->base, pBlock, pTaskInfo, rows);
-
- pBlock->info.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBInfo->uid);
+ if (tsdbNextDataBlock(pReader)) {
+ /*SSDataBlock* p = */tsdbRetrieveDataBlock(pReader, NULL);
+ doSetTagColumnData(&pTableScanInfo->base, pBlock, pTaskInfo, pBlock->info.rows);
+ pBlock->info.id.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.id.uid);
}
tsdbReaderClose(pReader);
@@ -1051,6 +1030,9 @@ static uint64_t getGroupIdByData(SStreamScanInfo* pInfo, uint64_t uid, TSKEY ts,
}
static bool prepareRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_t* pRowIndex) {
+ if (pBlock->info.rows == 0) {
+ return false;
+ }
if ((*pRowIndex) == pBlock->info.rows) {
return false;
}
@@ -1109,7 +1091,7 @@ static STimeWindow getSlidingWindow(TSKEY* startTsCol, TSKEY* endTsCol, uint64_t
if (hasGroup) {
(*pRowIndex) += 1;
} else {
- while ((groupId == gpIdCol[(*pRowIndex)] && startTsCol[*pRowIndex] < endWin.ekey)) {
+ while ((groupId == gpIdCol[(*pRowIndex)] && startTsCol[*pRowIndex] <= endWin.ekey)) {
(*pRowIndex) += 1;
if ((*pRowIndex) == pDataBlockInfo->rows) {
break;
@@ -1175,7 +1157,7 @@ static SSDataBlock* doRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32
pResult->info.calWin = pInfo->updateWin;
return pResult;
}
- } else if (pResult->info.groupId == pInfo->groupId) {
+ } else if (pResult->info.id.groupId == pInfo->groupId) {
pResult->info.calWin = pInfo->updateWin;
return pResult;
}
@@ -1183,10 +1165,10 @@ static SSDataBlock* doRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32
}
static int32_t generateSessionScanRange(SStreamScanInfo* pInfo, SSDataBlock* pSrcBlock, SSDataBlock* pDestBlock) {
+ blockDataCleanup(pDestBlock);
if (pSrcBlock->info.rows == 0) {
return TSDB_CODE_SUCCESS;
}
- blockDataCleanup(pDestBlock);
int32_t code = blockDataEnsureCapacity(pDestBlock, pSrcBlock->info.rows);
if (code != TSDB_CODE_SUCCESS) {
return code;
@@ -1236,27 +1218,56 @@ static int32_t generateIntervalScanRange(SStreamScanInfo* pInfo, SSDataBlock* pS
if (rows == 0) {
return TSDB_CODE_SUCCESS;
}
- int32_t code = blockDataEnsureCapacity(pDestBlock, rows);
- if (code != TSDB_CODE_SUCCESS) {
- return code;
- }
SColumnInfoData* pSrcStartTsCol = (SColumnInfoData*)taosArrayGet(pSrcBlock->pDataBlock, START_TS_COLUMN_INDEX);
SColumnInfoData* pSrcEndTsCol = (SColumnInfoData*)taosArrayGet(pSrcBlock->pDataBlock, END_TS_COLUMN_INDEX);
SColumnInfoData* pSrcUidCol = taosArrayGet(pSrcBlock->pDataBlock, UID_COLUMN_INDEX);
- uint64_t* srcUidData = (uint64_t*)pSrcUidCol->pData;
SColumnInfoData* pSrcGpCol = taosArrayGet(pSrcBlock->pDataBlock, GROUPID_COLUMN_INDEX);
- uint64_t* srcGp = (uint64_t*)pSrcGpCol->pData;
+
+ uint64_t* srcUidData = (uint64_t*)pSrcUidCol->pData;
ASSERT(pSrcStartTsCol->info.type == TSDB_DATA_TYPE_TIMESTAMP);
- TSKEY* srcStartTsCol = (TSKEY*)pSrcStartTsCol->pData;
- TSKEY* srcEndTsCol = (TSKEY*)pSrcEndTsCol->pData;
+ TSKEY* srcStartTsCol = (TSKEY*)pSrcStartTsCol->pData;
+ TSKEY* srcEndTsCol = (TSKEY*)pSrcEndTsCol->pData;
+ int64_t version = pSrcBlock->info.version - 1;
+
+ if (pInfo->partitionSup.needCalc && srcStartTsCol[0] != srcEndTsCol[0]) {
+ uint64_t srcUid = srcUidData[0];
+ TSKEY startTs = srcStartTsCol[0];
+ TSKEY endTs = srcEndTsCol[0];
+ SSDataBlock* pPreRes = readPreVersionData(pInfo->pTableScanOp, srcUid, startTs, endTs, version);
+ printDataBlock(pPreRes, "pre res");
+ blockDataCleanup(pSrcBlock);
+ int32_t code = blockDataEnsureCapacity(pSrcBlock, pPreRes->info.rows);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+
+ SColumnInfoData* pTsCol = (SColumnInfoData*)taosArrayGet(pPreRes->pDataBlock, pInfo->primaryTsIndex);
+ rows = pPreRes->info.rows;
+
+ for (int32_t i = 0; i < rows; i++) {
+ uint64_t groupId = calGroupIdByData(&pInfo->partitionSup, pInfo->pPartScalarSup, pPreRes, i);
+ appendOneRowToStreamSpecialBlock(pSrcBlock, ((TSKEY*)pTsCol->pData) + i, ((TSKEY*)pTsCol->pData) + i, &srcUid,
+ &groupId, NULL);
+ }
+ printDataBlock(pSrcBlock, "new delete");
+ }
+ uint64_t* srcGp = (uint64_t*)pSrcGpCol->pData;
+ srcStartTsCol = (TSKEY*)pSrcStartTsCol->pData;
+ srcEndTsCol = (TSKEY*)pSrcEndTsCol->pData;
+ srcUidData = (uint64_t*)pSrcUidCol->pData;
+
+ int32_t code = blockDataEnsureCapacity(pDestBlock, rows);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+
SColumnInfoData* pStartTsCol = taosArrayGet(pDestBlock->pDataBlock, START_TS_COLUMN_INDEX);
SColumnInfoData* pEndTsCol = taosArrayGet(pDestBlock->pDataBlock, END_TS_COLUMN_INDEX);
SColumnInfoData* pDeUidCol = taosArrayGet(pDestBlock->pDataBlock, UID_COLUMN_INDEX);
SColumnInfoData* pGpCol = taosArrayGet(pDestBlock->pDataBlock, GROUPID_COLUMN_INDEX);
SColumnInfoData* pCalStartTsCol = taosArrayGet(pDestBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX);
SColumnInfoData* pCalEndTsCol = taosArrayGet(pDestBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX);
- int64_t version = pSrcBlock->info.version - 1;
for (int32_t i = 0; i < rows;) {
uint64_t srcUid = srcUidData[i];
uint64_t groupId = srcGp[i];
@@ -1312,6 +1323,7 @@ static int32_t generateDeleteResultBlock(SStreamScanInfo* pInfo, SSDataBlock* pS
memcpy(varDataVal(tbname), parTbname, TSDB_TABLE_NAME_LEN);
varDataSetLen(tbname, strlen(varDataVal(tbname)));
+ tdbFree(parTbname);
}
appendOneRowToStreamSpecialBlock(pDestBlock, srcStartTsCol + i, srcEndTsCol + i, srcUidData + i, &groupId,
tbname[0] == 0 ? NULL : tbname);
@@ -1334,30 +1346,6 @@ static int32_t generateScanRange(SStreamScanInfo* pInfo, SSDataBlock* pSrcBlock,
return code;
}
-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
- /*SArray* tagArray = taosArrayInit(0, sizeof(void*));*/
- /*STagVal tagVal = {*/
- /*.cid = 0,*/
- /*.type = 0,*/
- /*};*/
- // build STag
- // set STag
-
- blockDataDestroy(pSrcBlock);
-}
-
void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock) {
SExprSupp* pTbNameCalSup = &pInfo->tbnameCalSup;
SStreamState* pState = pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState;
@@ -1365,7 +1353,7 @@ void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock) {
if (pBlock == NULL || pBlock->info.rows == 0) return;
void* tbname = NULL;
- if (streamStateGetParName(pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ if (streamStateGetParName(pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname) < 0) {
pBlock->info.parTbName[0] = 0;
} else {
memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
@@ -1398,8 +1386,8 @@ void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock) {
pBlock->info.parTbName[0] = 0;
}
- if (pBlock->info.groupId && pBlock->info.parTbName[0]) {
- streamStatePutParName(pState, pBlock->info.groupId, pBlock->info.parTbName);
+ if (pBlock->info.id.groupId && pBlock->info.parTbName[0]) {
+ streamStatePutParName(pState, pBlock->info.id.groupId, pBlock->info.parTbName);
}
blockDataDestroy(pSrcBlock);
@@ -1433,7 +1421,7 @@ static void checkUpdateData(SStreamScanInfo* pInfo, bool invertible, SSDataBlock
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, pInfo->primaryTsIndex);
ASSERT(pColDataInfo->info.type == TSDB_DATA_TYPE_TIMESTAMP);
TSKEY* tsCol = (TSKEY*)pColDataInfo->pData;
- bool tableInserted = updateInfoIsTableInserted(pInfo->pUpdateInfo, pBlock->info.uid);
+ bool tableInserted = updateInfoIsTableInserted(pInfo->pUpdateInfo, pBlock->info.id.uid);
for (int32_t rowId = 0; rowId < pBlock->info.rows; rowId++) {
SResultRowInfo dumyInfo;
dumyInfo.cur.pageId = -1;
@@ -1444,19 +1432,19 @@ static void checkUpdateData(SStreamScanInfo* pInfo, bool invertible, SSDataBlock
isClosed = isCloseWindow(&win, &pInfo->twAggSup);
}
// must check update info first.
- bool update = updateInfoIsUpdated(pInfo->pUpdateInfo, pBlock->info.uid, tsCol[rowId]);
+ bool update = updateInfoIsUpdated(pInfo->pUpdateInfo, pBlock->info.id.uid, tsCol[rowId]);
bool closedWin = isClosed && isSignleIntervalWindow(pInfo) &&
- isDeletedStreamWindow(&win, pBlock->info.groupId,
+ isDeletedStreamWindow(&win, pBlock->info.id.groupId,
pInfo->pTableScanOp->pTaskInfo->streamInfo.pState, &pInfo->twAggSup);
if ((update || closedWin) && out) {
qDebug("stream update check not pass, update %d, closedWin %d", update, closedWin);
uint64_t gpId = 0;
- appendOneRowToStreamSpecialBlock(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.uid, &gpId,
+ appendOneRowToStreamSpecialBlock(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.id.uid, &gpId,
NULL);
if (closedWin && pInfo->partitionSup.needCalc) {
gpId = calGroupIdByData(&pInfo->partitionSup, pInfo->pPartScalarSup, pBlock, rowId);
- appendOneRowToStreamSpecialBlock(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.uid, &gpId,
- NULL);
+ appendOneRowToStreamSpecialBlock(pInfo->pUpdateDataRes, tsCol + rowId, tsCol + rowId, &pBlock->info.id.uid,
+ &gpId, NULL);
}
}
}
@@ -1475,11 +1463,11 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock
blockDataEnsureCapacity(pInfo->pRes, pBlock->info.rows);
pInfo->pRes->info.rows = pBlock->info.rows;
- pInfo->pRes->info.uid = pBlock->info.uid;
+ pInfo->pRes->info.id.uid = pBlock->info.id.uid;
pInfo->pRes->info.type = STREAM_NORMAL;
pInfo->pRes->info.version = pBlock->info.version;
- pInfo->pRes->info.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.uid);
+ pInfo->pRes->info.id.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.id.uid);
// todo extract method
for (int32_t i = 0; i < taosArrayGetSize(pInfo->matchInfo.pList); ++i) {
@@ -1510,10 +1498,14 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock
if (pInfo->numOfPseudoExpr > 0) {
int32_t code = addTagPseudoColumnData(&pInfo->readHandle, pInfo->pPseudoExpr, pInfo->numOfPseudoExpr, pInfo->pRes,
pInfo->pRes->info.rows, GET_TASKID(pTaskInfo), NULL);
- if (code != TSDB_CODE_SUCCESS) {
+ // ignore the table not exists error, since this table may have been dropped during the scan procedure.
+ if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_PAR_TABLE_NOT_EXIST) {
blockDataFreeRes((SSDataBlock*)pBlock);
T_LONG_JMP(pTaskInfo->env, code);
}
+
+ // reset the error code.
+ terrno = 0;
}
if (filter) {
@@ -1690,13 +1682,6 @@ static void setBlockGroupIdByUid(SStreamScanInfo* pInfo, SSDataBlock* pBlock) {
uint64_t groupId = getGroupIdByUid(pInfo, uidCol[i]);
colDataAppend(pGpCol, i, (const char*)&groupId, false);
}
- } else {
- // SSDataBlock* pPreRes = readPreVersionData(pInfo->pTableScanOp, uidCol[i], startTsCol, ts, maxVersion);
- // if (!pPreRes || pPreRes->info.rows == 0) {
- // return 0;
- // }
- // ASSERT(pPreRes->info.rows == 1);
- // return calGroupIdByData(&pInfo->partitionSup, pInfo->pPartScalarSup, pPreRes, 0);
}
}
@@ -1802,8 +1787,8 @@ FETCH_NEXT_BLOCK:
int32_t current = pInfo->validBlockIndex++;
SSDataBlock* pBlock = taosArrayGetP(pInfo->pBlockLists, current);
- if (pBlock->info.groupId && pBlock->info.parTbName[0]) {
- streamStatePutParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, pBlock->info.parTbName);
+ if (pBlock->info.id.groupId && pBlock->info.parTbName[0]) {
+ streamStatePutParName(pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, pBlock->info.parTbName);
}
// TODO move into scan
pBlock->info.calWin.skey = INT64_MIN;
@@ -1831,6 +1816,12 @@ FETCH_NEXT_BLOCK:
}
setBlockGroupIdByUid(pInfo, pDelBlock);
printDataBlock(pDelBlock, "stream scan delete recv filtered");
+ if (pDelBlock->info.rows == 0) {
+ if (pInfo->tqReader) {
+ blockDataDestroy(pDelBlock);
+ }
+ goto FETCH_NEXT_BLOCK;
+ }
if (!isIntervalWindow(pInfo) && !isSessionWindow(pInfo) && !isStateWindow(pInfo)) {
generateDeleteResultBlock(pInfo, pDelBlock, pInfo->pDeleteDataRes);
pInfo->pDeleteDataRes->info.type = STREAM_DELETE_RESULT;
@@ -1849,12 +1840,12 @@ FETCH_NEXT_BLOCK:
prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex);
copyDataBlock(pInfo->pDeleteDataRes, pInfo->pUpdateRes);
pInfo->pDeleteDataRes->info.type = STREAM_DELETE_DATA;
- pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE;
printDataBlock(pDelBlock, "stream scan delete data");
if (pInfo->tqReader) {
blockDataDestroy(pDelBlock);
}
if (pInfo->pDeleteDataRes->info.rows > 0) {
+ pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE;
return pInfo->pDeleteDataRes;
} else {
goto FETCH_NEXT_BLOCK;
@@ -1928,6 +1919,7 @@ FETCH_NEXT_BLOCK:
if (pInfo->validBlockIndex >= totBlockNum) {
updateInfoDestoryColseWinSBF(pInfo->pUpdateInfo);
doClearBufferedBlocks(pInfo);
+ qDebug("stream scan return empty, consume block %d", totBlockNum);
return NULL;
}
@@ -1954,7 +1946,7 @@ FETCH_NEXT_BLOCK:
setBlockIntoRes(pInfo, &block, false);
- if (updateInfoIgnore(pInfo->pUpdateInfo, &pInfo->pRes->info.window, pInfo->pRes->info.groupId,
+ if (updateInfoIgnore(pInfo->pUpdateInfo, &pInfo->pRes->info.window, pInfo->pRes->info.id.groupId,
pInfo->pRes->info.version)) {
printDataBlock(pInfo->pRes, "stream scan ignore");
blockDataCleanup(pInfo->pRes);
@@ -2036,26 +2028,19 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
qDebug("tmqsnap doRawScan called");
if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) {
- SSDataBlock* pBlock = &pInfo->pRes;
-
if (pInfo->dataReader && tsdbNextDataBlock(pInfo->dataReader)) {
if (isTaskKilled(pTaskInfo)) {
- longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ longjmp(pTaskInfo->env, pTaskInfo->code);
}
- int32_t rows = 0;
- tsdbRetrieveDataBlockInfo(pInfo->dataReader, &rows, &pBlock->info.uid, &pBlock->info.window);
- pBlock->info.rows = rows;
-
- SArray* pCols = tsdbRetrieveDataBlock(pInfo->dataReader, NULL);
- pBlock->pDataBlock = pCols;
- if (pCols == NULL) {
+ SSDataBlock* pBlock = tsdbRetrieveDataBlock(pInfo->dataReader, NULL);
+ if (pBlock == NULL) {
longjmp(pTaskInfo->env, terrno);
}
- qDebug("tmqsnap doRawScan get data uid:%" PRId64 "", pBlock->info.uid);
+ qDebug("tmqsnap doRawScan get data uid:%" PRId64 "", pBlock->info.id.uid);
pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__SNAPSHOT_DATA;
- pTaskInfo->streamInfo.lastStatus.uid = pBlock->info.uid;
+ pTaskInfo->streamInfo.lastStatus.uid = pBlock->info.id.uid;
pTaskInfo->streamInfo.lastStatus.ts = pBlock->info.window.ekey;
return pBlock;
}
@@ -2176,7 +2161,7 @@ SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, SExecTaskInfo* pT
setOperatorInfo(pOperator, "RawScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, false, OP_NOT_OPENED, pInfo,
pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(NULL, doRawScan, NULL, destroyRawScanOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(NULL, doRawScan, NULL, destroyRawScanOperatorInfo, optrDefaultBufFn, NULL);
return pOperator;
_end:
@@ -2220,7 +2205,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
if (pInfo == NULL || pOperator == NULL) {
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
goto _error;
}
@@ -2295,7 +2280,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
if (pHandle->initTableReader) {
pTSInfo->scanMode = TABLE_SCAN__TABLE_ORDER;
pTSInfo->base.dataReader = NULL;
- code = tsdbReaderOpen(pHandle->vnode, &pTSInfo->base.cond, pList, num, &pTSInfo->base.dataReader, NULL);
+ code = tsdbReaderOpen(pHandle->vnode, &pTSInfo->base.cond, pList, num, pTSInfo->pResBlock, &pTSInfo->base.dataReader, NULL);
if (code != 0) {
terrno = code;
destroyTableScanOperatorInfo(pTableScanOp);
@@ -2346,7 +2331,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
goto _error;
}
- pInfo->pRes = createResDataBlock(pDescNode);
+ pInfo->pRes = createDataBlockFromDescNode(pDescNode);
pInfo->pUpdateRes = createSpecialDataBlock(STREAM_CLEAR);
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
pInfo->windowSup = (SWindowSupporter){.pStreamAggSup = NULL, .gap = -1, .parentType = QUERY_NODE_PHYSICAL_PLAN};
@@ -2365,7 +2350,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
__optr_fn_t nextFn = pTaskInfo->execModel == OPTR_EXEC_MODEL_STREAM ? doStreamScan : doQueueScan;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, nextFn, NULL, destroyStreamScanOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, nextFn, NULL, destroyStreamScanOperatorInfo, optrDefaultBufFn, NULL);
return pOperator;
@@ -2471,7 +2456,7 @@ static void destroyTagScanOperatorInfo(void* param) {
}
SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysiNode* pPhyNode,
- STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo) {
+ SExecTaskInfo* pTaskInfo) {
STagScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STagScanInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
if (pInfo == NULL || pOperator == NULL) {
@@ -2493,7 +2478,7 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi
goto _error;
}
- pInfo->pRes = createResDataBlock(pDescNode);
+ pInfo->pRes = createDataBlockFromDescNode(pDescNode);
pInfo->readHandle = *pReadHandle;
pInfo->curPos = 0;
@@ -2502,7 +2487,7 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi
initResultSizeInfo(&pOperator->resultInfo, 4096);
blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTagScan, NULL, destroyTagScanOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doTagScan, NULL, destroyTagScanOperatorInfo, optrDefaultBufFn, NULL);
return pOperator;
@@ -2520,17 +2505,14 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
int32_t readIdx = source->readerIdx;
SSDataBlock* pBlock = source->inputBlock;
- STableMergeScanInfo* pTableScanInfo = pOperator->info;
- SQueryTableDataCond* pQueryCond = taosArrayGet(pTableScanInfo->queryConds, readIdx);
- blockDataCleanup(pBlock);
+ SQueryTableDataCond* pQueryCond = taosArrayGet(pInfo->queryConds, readIdx);
int64_t st = taosGetTimestampUs();
-
- void* p = tableListGetInfo(pTaskInfo->pTableInfoList, readIdx + pInfo->tableStartIndex);
+ void* p = tableListGetInfo(pTaskInfo->pTableInfoList, readIdx + pInfo->tableStartIndex);
SReadHandle* pHandle = &pInfo->base.readHandle;
- int32_t code = tsdbReaderOpen(pHandle->vnode, pQueryCond, p, 1, &pInfo->base.dataReader, GET_TASKID(pTaskInfo));
+ int32_t code = tsdbReaderOpen(pHandle->vnode, pQueryCond, p, 1, pBlock, &pInfo->base.dataReader, GET_TASKID(pTaskInfo));
if (code != 0) {
T_LONG_JMP(pTaskInfo->env, code);
}
@@ -2538,22 +2520,15 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
STsdbReader* reader = pInfo->base.dataReader;
while (tsdbNextDataBlock(reader)) {
if (isTaskKilled(pTaskInfo)) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
}
// process this data block based on the probabilities
- bool processThisBlock = processBlockWithProbability(&pTableScanInfo->sample);
+ bool processThisBlock = processBlockWithProbability(&pInfo->sample);
if (!processThisBlock) {
continue;
}
- blockDataCleanup(pBlock);
-
- int32_t rows = 0;
- tsdbRetrieveDataBlockInfo(reader, &rows, &pBlock->info.uid, &pBlock->info.window);
- blockDataEnsureCapacity(pBlock, rows);
- pBlock->info.rows = rows;
-
if (pQueryCond->order == TSDB_ORDER_ASC) {
pQueryCond->twindows.skey = pBlock->info.window.ekey + 1;
} else {
@@ -2561,8 +2536,8 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
}
uint32_t status = 0;
- loadDataBlock(pOperator, &pTableScanInfo->base, pBlock, &status);
-// code = loadDataBlockFromOneTable(pOperator, pTableScanInfo, pBlock, &status);
+ loadDataBlock(pOperator, &pInfo->base, pBlock, &status);
+ // code = loadDataBlockFromOneTable(pOperator, pTableScanInfo, pBlock, &status);
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pTaskInfo->env, code);
}
@@ -2572,10 +2547,10 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
continue;
}
- pBlock->info.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.uid);
+ pBlock->info.id.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.id.uid);
pOperator->resultInfo.totalRows += pBlock->info.rows;
- pTableScanInfo->base.readRecorder.elapsedTime += (taosGetTimestampUs() - st) / 1000.0;
+ pInfo->base.readRecorder.elapsedTime += (taosGetTimestampUs() - st) / 1000.0;
tsdbReaderClose(pInfo->base.dataReader);
pInfo->base.dataReader = NULL;
@@ -2607,7 +2582,7 @@ SArray* generateSortByTsInfo(SArray* colMatchInfo, int32_t order) {
return pList;
}
-int32_t dumpSQueryTableCond(const SQueryTableDataCond* src, SQueryTableDataCond* dst) {
+int32_t dumpQueryTableCond(const SQueryTableDataCond* src, SQueryTableDataCond* dst) {
memcpy((void*)dst, (void*)src, sizeof(SQueryTableDataCond));
dst->colList = taosMemoryCalloc(src->numOfCols, sizeof(SColumnInfo));
for (int i = 0; i < src->numOfCols; i++) {
@@ -2655,10 +2630,12 @@ int32_t startGroupTableMergeScan(SOperatorInfo* pOperator) {
param.readerIdx = i;
param.pOperator = pOperator;
param.inputBlock = createOneDataBlock(pInfo->pResBlock, false);
+ blockDataEnsureCapacity(param.inputBlock, pOperator->resultInfo.capacity);
+
taosArrayPush(pInfo->sortSourceParams, ¶m);
SQueryTableDataCond cond;
- dumpSQueryTableCond(&pInfo->base.cond, &cond);
+ dumpQueryTableCond(&pInfo->base.cond, &cond);
taosArrayPush(pInfo->queryConds, &cond);
}
@@ -2768,7 +2745,7 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
pBlock = getSortedTableMergeScanBlockData(pInfo->pSortHandle, pInfo->pResBlock, pOperator->resultInfo.capacity,
pOperator);
if (pBlock != NULL) {
- pBlock->info.groupId = pInfo->groupId;
+ pBlock->info.id.groupId = pInfo->groupId;
pOperator->resultInfo.totalRows += pBlock->info.rows;
return pBlock;
} else {
@@ -2893,9 +2870,8 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN
goto _error;
}
-
initResultSizeInfo(&pOperator->resultInfo, 1024);
- pInfo->pResBlock = createResDataBlock(pDescNode);
+ pInfo->pResBlock = createDataBlockFromDescNode(pDescNode);
blockDataEnsureCapacity(pInfo->pResBlock, pOperator->resultInfo.capacity);
pInfo->sortSourceParams = taosArrayInit(64, sizeof(STableMergeScanSortSourceParam));
@@ -2912,8 +2888,8 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN
pInfo, pTaskInfo);
pOperator->exprSupp.numOfExprs = numOfCols;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableMergeScan, NULL, destroyTableMergeScanOperatorInfo,
- getTableMergeScanExplainExecInfo);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doTableMergeScan, NULL, destroyTableMergeScanOperatorInfo,
+ optrDefaultBufFn, getTableMergeScanExplainExecInfo);
pOperator->cost.openCost = 0;
return pOperator;
@@ -2923,3 +2899,353 @@ _error:
taosMemoryFree(pOperator);
return NULL;
}
+
+// ====================================================================================================================
+// TableCountScanOperator
+static SSDataBlock* doTableCountScan(SOperatorInfo* pOperator);
+static void destoryTableCountScanOperator(void* param);
+static void buildVnodeGroupedStbTableCount(STableCountScanOperatorInfo* pInfo, STableCountScanSupp* pSupp,
+ SSDataBlock* pRes, char* dbName, tb_uid_t stbUid);
+static void buildVnodeGroupedNtbTableCount(STableCountScanOperatorInfo* pInfo, STableCountScanSupp* pSupp,
+ SSDataBlock* pRes, char* dbName);
+static void buildVnodeFilteredTbCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo,
+ STableCountScanSupp* pSupp, SSDataBlock* pRes, char* dbName);
+static void buildVnodeGroupedTableCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo,
+ STableCountScanSupp* pSupp, SSDataBlock* pRes, int32_t vgId, char* dbName);
+static SSDataBlock* buildVnodeDbTableCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo,
+ STableCountScanSupp* pSupp, SSDataBlock* pRes);
+static void buildSysDbGroupedTableCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo,
+ STableCountScanSupp* pSupp, SSDataBlock* pRes, size_t infodbTableNum,
+ size_t perfdbTableNum);
+static void buildSysDbFilterTableCount(SOperatorInfo* pOperator, STableCountScanSupp* pSupp, SSDataBlock* pRes,
+ size_t infodbTableNum, size_t perfdbTableNum);
+static const char* GROUP_TAG_DB_NAME = "db_name";
+static const char* GROUP_TAG_STABLE_NAME = "stable_name";
+
+int32_t tblCountScanGetGroupTagsSlotId(const SNodeList* scanCols, STableCountScanSupp* supp) {
+ if (scanCols != NULL) {
+ SNode* pNode = NULL;
+ FOREACH(pNode, scanCols) {
+ if (nodeType(pNode) != QUERY_NODE_TARGET) {
+ return TSDB_CODE_QRY_SYS_ERROR;
+ }
+ STargetNode* targetNode = (STargetNode*)pNode;
+ if (nodeType(targetNode->pExpr) != QUERY_NODE_COLUMN) {
+ return TSDB_CODE_QRY_SYS_ERROR;
+ }
+ SColumnNode* colNode = (SColumnNode*)(targetNode->pExpr);
+ if (strcmp(colNode->colName, GROUP_TAG_DB_NAME) == 0) {
+ supp->dbNameSlotId = targetNode->slotId;
+ } else if (strcmp(colNode->colName, GROUP_TAG_STABLE_NAME) == 0) {
+ supp->stbNameSlotId = targetNode->slotId;
+ }
+ }
+ }
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t tblCountScanGetCountSlotId(const SNodeList* pseudoCols, STableCountScanSupp* supp) {
+ if (pseudoCols != NULL) {
+ SNode* pNode = NULL;
+ FOREACH(pNode, pseudoCols) {
+ if (nodeType(pNode) != QUERY_NODE_TARGET) {
+ return TSDB_CODE_QRY_SYS_ERROR;
+ }
+ STargetNode* targetNode = (STargetNode*)pNode;
+ if (nodeType(targetNode->pExpr) != QUERY_NODE_FUNCTION) {
+ return TSDB_CODE_QRY_SYS_ERROR;
+ }
+ SFunctionNode* funcNode = (SFunctionNode*)(targetNode->pExpr);
+ if (funcNode->funcType == FUNCTION_TYPE_TABLE_COUNT) {
+ supp->tbCountSlotId = targetNode->slotId;
+ }
+ }
+ }
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t tblCountScanGetInputs(SNodeList* groupTags, SName* tableName, STableCountScanSupp* supp) {
+ if (groupTags != NULL) {
+ SNode* pNode = NULL;
+ FOREACH(pNode, groupTags) {
+ if (nodeType(pNode) != QUERY_NODE_COLUMN) {
+ return TSDB_CODE_QRY_SYS_ERROR;
+ }
+ SColumnNode* colNode = (SColumnNode*)pNode;
+ if (strcmp(colNode->colName, GROUP_TAG_DB_NAME) == 0) {
+ supp->groupByDbName = true;
+ }
+ if (strcmp(colNode->colName, GROUP_TAG_STABLE_NAME) == 0) {
+ supp->groupByStbName = true;
+ }
+ }
+ } else {
+ strncpy(supp->dbNameFilter, tNameGetDbNameP(tableName), TSDB_DB_NAME_LEN);
+ strncpy(supp->stbNameFilter, tNameGetTableName(tableName), TSDB_TABLE_NAME_LEN);
+ }
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t getTableCountScanSupp(SNodeList* groupTags, SName* tableName, SNodeList* scanCols, SNodeList* pseudoCols,
+ STableCountScanSupp* supp, SExecTaskInfo* taskInfo) {
+ int32_t code = 0;
+ code = tblCountScanGetInputs(groupTags, tableName, supp);
+ if (code != TSDB_CODE_SUCCESS) {
+ qError("%s get table count scan supp. get inputs error", GET_TASKID(taskInfo));
+ return code;
+ }
+ supp->dbNameSlotId = -1;
+ supp->stbNameSlotId = -1;
+ supp->tbCountSlotId = -1;
+
+ code = tblCountScanGetGroupTagsSlotId(scanCols, supp);
+ if (code != TSDB_CODE_SUCCESS) {
+ qError("%s get table count scan supp. get group tags slot id error", GET_TASKID(taskInfo));
+ return code;
+ }
+ code = tblCountScanGetCountSlotId(pseudoCols, supp);
+ if (code != TSDB_CODE_SUCCESS) {
+ qError("%s get table count scan supp. get count error", GET_TASKID(taskInfo));
+ return code;
+ }
+ return code;
+}
+
+SOperatorInfo* createTableCountScanOperatorInfo(SReadHandle* readHandle, STableCountScanPhysiNode* pTblCountScanNode,
+ SExecTaskInfo* pTaskInfo) {
+ int32_t code = TSDB_CODE_SUCCESS;
+
+ SScanPhysiNode* pScanNode = &pTblCountScanNode->scan;
+ STableCountScanOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(STableCountScanOperatorInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+
+ if (!pInfo || !pOperator) {
+ goto _error;
+ }
+
+ pInfo->readHandle = *readHandle;
+
+ SDataBlockDescNode* pDescNode = pScanNode->node.pOutputDataBlockDesc;
+ initResultSizeInfo(&pOperator->resultInfo, 1);
+ pInfo->pRes = createDataBlockFromDescNode(pDescNode);
+ blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
+
+ getTableCountScanSupp(pTblCountScanNode->pGroupTags, &pTblCountScanNode->scan.tableName,
+ pTblCountScanNode->scan.pScanCols, pTblCountScanNode->scan.pScanPseudoCols, &pInfo->supp,
+ pTaskInfo);
+
+ setOperatorInfo(pOperator, "TableCountScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN, false, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
+ pOperator->fpSet =
+ createOperatorFpSet(optrDummyOpenFn, doTableCountScan, NULL, destoryTableCountScanOperator, optrDefaultBufFn, NULL);
+ return pOperator;
+
+_error:
+ if (pInfo != NULL) {
+ destoryTableCountScanOperator(pInfo);
+ }
+ taosMemoryFreeClear(pOperator);
+ pTaskInfo->code = code;
+ return NULL;
+}
+
+void fillTableCountScanDataBlock(STableCountScanSupp* pSupp, char* dbName, char* stbName, int64_t count,
+ SSDataBlock* pRes) {
+ if (pSupp->dbNameSlotId != -1) {
+ ASSERT(strlen(dbName));
+ SColumnInfoData* colInfoData = taosArrayGet(pRes->pDataBlock, pSupp->dbNameSlotId);
+
+ char varDbName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
+ tstrncpy(varDataVal(varDbName), dbName, TSDB_DB_NAME_LEN);
+
+ varDataSetLen(varDbName, strlen(dbName));
+ colDataAppend(colInfoData, 0, varDbName, false);
+ }
+
+ if (pSupp->stbNameSlotId != -1) {
+ SColumnInfoData* colInfoData = taosArrayGet(pRes->pDataBlock, pSupp->stbNameSlotId);
+ if (strlen(stbName) != 0) {
+ char varStbName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
+ strncpy(varDataVal(varStbName), stbName, TSDB_TABLE_NAME_LEN);
+ varDataSetLen(varStbName, strlen(stbName));
+ colDataAppend(colInfoData, 0, varStbName, false);
+ } else {
+ colDataAppendNULL(colInfoData, 0);
+ }
+ }
+
+ if (pSupp->tbCountSlotId != -1) {
+ SColumnInfoData* colInfoData = taosArrayGet(pRes->pDataBlock, pSupp->tbCountSlotId);
+ colDataAppend(colInfoData, 0, (char*)&count, false);
+ }
+ pRes->info.rows = 1;
+}
+
+static SSDataBlock* buildSysDbTableCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo) {
+ STableCountScanSupp* pSupp = &pInfo->supp;
+ SSDataBlock* pRes = pInfo->pRes;
+
+ size_t infodbTableNum;
+ getInfosDbMeta(NULL, &infodbTableNum);
+ size_t perfdbTableNum;
+ getPerfDbMeta(NULL, &perfdbTableNum);
+
+ if (pSupp->groupByDbName) {
+ buildSysDbGroupedTableCount(pOperator, pInfo, pSupp, pRes, infodbTableNum, perfdbTableNum);
+ return (pRes->info.rows > 0) ? pRes : NULL;
+ } else {
+ buildSysDbFilterTableCount(pOperator, pSupp, pRes, infodbTableNum, perfdbTableNum);
+ return (pRes->info.rows > 0) ? pRes : NULL;
+ }
+}
+
+static void buildSysDbFilterTableCount(SOperatorInfo* pOperator, STableCountScanSupp* pSupp, SSDataBlock* pRes,
+ size_t infodbTableNum, size_t perfdbTableNum) {
+ if (strcmp(pSupp->dbNameFilter, TSDB_INFORMATION_SCHEMA_DB) == 0) {
+ fillTableCountScanDataBlock(pSupp, TSDB_INFORMATION_SCHEMA_DB, "", infodbTableNum, pRes);
+ } else if (strcmp(pSupp->dbNameFilter, TSDB_PERFORMANCE_SCHEMA_DB) == 0) {
+ fillTableCountScanDataBlock(pSupp, TSDB_PERFORMANCE_SCHEMA_DB, "", perfdbTableNum, pRes);
+ } else if (strlen(pSupp->dbNameFilter) == 0) {
+ fillTableCountScanDataBlock(pSupp, "", "", infodbTableNum + perfdbTableNum, pRes);
+ }
+ setOperatorCompleted(pOperator);
+}
+
+static void buildSysDbGroupedTableCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo,
+ STableCountScanSupp* pSupp, SSDataBlock* pRes, size_t infodbTableNum,
+ size_t perfdbTableNum) {
+ if (pInfo->currGrpIdx == 0) {
+ uint64_t groupId = calcGroupId(TSDB_INFORMATION_SCHEMA_DB, strlen(TSDB_INFORMATION_SCHEMA_DB));
+ pRes->info.id.groupId = groupId;
+ fillTableCountScanDataBlock(pSupp, TSDB_INFORMATION_SCHEMA_DB, "", infodbTableNum, pRes);
+ } else if (pInfo->currGrpIdx == 1) {
+ uint64_t groupId = calcGroupId(TSDB_PERFORMANCE_SCHEMA_DB, strlen(TSDB_PERFORMANCE_SCHEMA_DB));
+ pRes->info.id.groupId = groupId;
+ fillTableCountScanDataBlock(pSupp, TSDB_PERFORMANCE_SCHEMA_DB, "", perfdbTableNum, pRes);
+ } else {
+ setOperatorCompleted(pOperator);
+ }
+ pInfo->currGrpIdx++;
+}
+
+static SSDataBlock* doTableCountScan(SOperatorInfo* pOperator) {
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ STableCountScanOperatorInfo* pInfo = pOperator->info;
+ STableCountScanSupp* pSupp = &pInfo->supp;
+ SSDataBlock* pRes = pInfo->pRes;
+ blockDataCleanup(pRes);
+
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
+ if (pInfo->readHandle.mnd != NULL) {
+ return buildSysDbTableCount(pOperator, pInfo);
+ }
+
+ return buildVnodeDbTableCount(pOperator, pInfo, pSupp, pRes);
+}
+
+static SSDataBlock* buildVnodeDbTableCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo,
+ STableCountScanSupp* pSupp, SSDataBlock* pRes) {
+ const char* db = NULL;
+ int32_t vgId = 0;
+ char dbName[TSDB_DB_NAME_LEN] = {0};
+
+ // get dbname
+ vnodeGetInfo(pInfo->readHandle.vnode, &db, &vgId);
+ SName sn = {0};
+ tNameFromString(&sn, db, T_NAME_ACCT | T_NAME_DB);
+ tNameGetDbName(&sn, dbName);
+
+ if (pSupp->groupByDbName) {
+ buildVnodeGroupedTableCount(pOperator, pInfo, pSupp, pRes, vgId, dbName);
+ } else {
+ buildVnodeFilteredTbCount(pOperator, pInfo, pSupp, pRes, dbName);
+ }
+ return pRes->info.rows > 0 ? pRes : NULL;
+}
+
+static void buildVnodeGroupedTableCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo,
+ STableCountScanSupp* pSupp, SSDataBlock* pRes, int32_t vgId, char* dbName) {
+ if (pSupp->groupByStbName) {
+ if (pInfo->stbUidList == NULL) {
+ pInfo->stbUidList = taosArrayInit(16, sizeof(tb_uid_t));
+ if (vnodeGetStbIdList(pInfo->readHandle.vnode, 0, pInfo->stbUidList) < 0) {
+ qError("vgId:%d, failed to get stb id list error: %s", vgId, terrstr());
+ }
+ }
+ if (pInfo->currGrpIdx < taosArrayGetSize(pInfo->stbUidList)) {
+ tb_uid_t stbUid = *(tb_uid_t*)taosArrayGet(pInfo->stbUidList, pInfo->currGrpIdx);
+ buildVnodeGroupedStbTableCount(pInfo, pSupp, pRes, dbName, stbUid);
+
+ pInfo->currGrpIdx++;
+ } else if (pInfo->currGrpIdx == taosArrayGetSize(pInfo->stbUidList)) {
+ buildVnodeGroupedNtbTableCount(pInfo, pSupp, pRes, dbName);
+
+ pInfo->currGrpIdx++;
+ } else {
+ setOperatorCompleted(pOperator);
+ }
+ } else {
+ uint64_t groupId = calcGroupId(dbName, strlen(dbName));
+ pRes->info.id.groupId = groupId;
+ int64_t dbTableCount = metaGetTbNum(pInfo->readHandle.meta);
+ fillTableCountScanDataBlock(pSupp, dbName, "", dbTableCount, pRes);
+ setOperatorCompleted(pOperator);
+ }
+}
+
+static void buildVnodeFilteredTbCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo,
+ STableCountScanSupp* pSupp, SSDataBlock* pRes, char* dbName) {
+ if (strlen(pSupp->dbNameFilter) != 0) {
+ if (strlen(pSupp->stbNameFilter) != 0) {
+ tb_uid_t uid = metaGetTableEntryUidByName(pInfo->readHandle.meta, pSupp->stbNameFilter);
+ SMetaStbStats stats = {0};
+ metaGetStbStats(pInfo->readHandle.meta, uid, &stats);
+ int64_t ctbNum = stats.ctbNum;
+ fillTableCountScanDataBlock(pSupp, dbName, pSupp->stbNameFilter, ctbNum, pRes);
+ } else {
+ int64_t tbNumVnode = metaGetTbNum(pInfo->readHandle.meta);
+ fillTableCountScanDataBlock(pSupp, dbName, "", tbNumVnode, pRes);
+ }
+ } else {
+ int64_t tbNumVnode = metaGetTbNum(pInfo->readHandle.meta);
+ fillTableCountScanDataBlock(pSupp, dbName, "", tbNumVnode, pRes);
+ }
+ setOperatorCompleted(pOperator);
+}
+
+static void buildVnodeGroupedNtbTableCount(STableCountScanOperatorInfo* pInfo, STableCountScanSupp* pSupp,
+ SSDataBlock* pRes, char* dbName) {
+ char fullStbName[TSDB_TABLE_FNAME_LEN] = {0};
+ snprintf(fullStbName, TSDB_TABLE_FNAME_LEN, "%s.%s", dbName, "");
+ uint64_t groupId = calcGroupId(fullStbName, strlen(fullStbName));
+ pRes->info.id.groupId = groupId;
+ int64_t ntbNum = metaGetNtbNum(pInfo->readHandle.meta);
+ fillTableCountScanDataBlock(pSupp, dbName, "", ntbNum, pRes);
+}
+
+static void buildVnodeGroupedStbTableCount(STableCountScanOperatorInfo* pInfo, STableCountScanSupp* pSupp,
+ SSDataBlock* pRes, char* dbName, tb_uid_t stbUid) {
+ char stbName[TSDB_TABLE_NAME_LEN] = {0};
+ metaGetTableSzNameByUid(pInfo->readHandle.meta, stbUid, stbName);
+
+ char fullStbName[TSDB_TABLE_FNAME_LEN] = {0};
+ snprintf(fullStbName, TSDB_TABLE_FNAME_LEN, "%s.%s", dbName, stbName);
+ uint64_t groupId = calcGroupId(fullStbName, strlen(fullStbName));
+ pRes->info.id.groupId = groupId;
+
+ SMetaStbStats stats = {0};
+ metaGetStbStats(pInfo->readHandle.meta, stbUid, &stats);
+ int64_t ctbNum = stats.ctbNum;
+
+ fillTableCountScanDataBlock(pSupp, dbName, stbName, ctbNum, pRes);
+}
+
+static void destoryTableCountScanOperator(void* param) {
+ STableCountScanOperatorInfo* pTableCountScanInfo = param;
+ blockDataDestroy(pTableCountScanInfo->pRes);
+
+ taosArrayDestroy(pTableCountScanInfo->stbUidList);
+ taosMemoryFreeClear(param);
+}
diff --git a/source/libs/executor/src/sortoperator.c b/source/libs/executor/src/sortoperator.c
index 6201dfc9cbc5e010a6d9b15d108ca135600e00d5..005b794f0b905e6f4afb39b56b28afd5336085c9 100644
--- a/source/libs/executor/src/sortoperator.c
+++ b/source/libs/executor/src/sortoperator.c
@@ -47,7 +47,7 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode*
SDataBlockDescNode* pDescNode = pSortNode->node.pOutputDataBlockDesc;
int32_t numOfCols = 0;
- SSDataBlock* pResBlock = createResDataBlock(pDescNode);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pDescNode);
SExprInfo* pExprInfo = createExprInfo(pSortNode->pExprs, NULL, &numOfCols);
int32_t numOfOutputCols = 0;
@@ -75,7 +75,7 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode*
// TODO dynamic set the available sort buffer
pOperator->fpSet =
- createOperatorFpSet(doOpenSortOperator, doSort, NULL, destroySortOperatorInfo, getExplainExecInfo);
+ createOperatorFpSet(doOpenSortOperator, doSort, NULL, destroySortOperatorInfo, optrDefaultBufFn, getExplainExecInfo);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -359,7 +359,7 @@ SSDataBlock* fetchNextGroupSortDataBlock(void* param) {
SOperatorInfo* childOp = source->childOpInfo;
SSDataBlock* block = childOp->fpSet.getNextFn(childOp);
if (block != NULL) {
- if (block->info.groupId == grpSortOpInfo->currGroupId) {
+ if (block->info.id.groupId == grpSortOpInfo->currGroupId) {
grpSortOpInfo->childOpStatus = CHILD_OP_SAME_GROUP;
return block;
} else {
@@ -439,7 +439,7 @@ SSDataBlock* doGroupSort(SOperatorInfo* pOperator) {
setOperatorCompleted(pOperator);
return NULL;
}
- pInfo->currGroupId = pInfo->prefetchedSortInput->info.groupId;
+ pInfo->currGroupId = pInfo->prefetchedSortInput->info.id.groupId;
pInfo->childOpStatus = CHILD_OP_NEW_GROUP;
beginSortGroup(pOperator);
}
@@ -451,13 +451,13 @@ SSDataBlock* doGroupSort(SOperatorInfo* pOperator) {
pBlock = getGroupSortedBlockData(pInfo->pCurrSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity,
pInfo->matchInfo.pList, pInfo);
if (pBlock != NULL) {
- pBlock->info.groupId = pInfo->currGroupId;
+ pBlock->info.id.groupId = pInfo->currGroupId;
pOperator->resultInfo.totalRows += pBlock->info.rows;
return pBlock;
} else {
if (pInfo->childOpStatus == CHILD_OP_NEW_GROUP) {
finishSortGroup(pOperator);
- pInfo->currGroupId = pInfo->prefetchedSortInput->info.groupId;
+ pInfo->currGroupId = pInfo->prefetchedSortInput->info.id.groupId;
beginSortGroup(pOperator);
} else if (pInfo->childOpStatus == CHILD_OP_FINISHED) {
finishSortGroup(pOperator);
@@ -509,7 +509,7 @@ SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSort
initResultSizeInfo(&pOperator->resultInfo, 1024);
pOperator->exprSupp.pCtx = createSqlFunctionCtx(pExprInfo, numOfCols, &pOperator->exprSupp.rowEntryInfoOffset);
- pInfo->binfo.pRes = createResDataBlock(pDescNode);
+ pInfo->binfo.pRes = createDataBlockFromDescNode(pDescNode);
blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
int32_t numOfOutputCols = 0;
@@ -521,8 +521,8 @@ SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSort
pInfo->pSortInfo = createSortInfo(pSortPhyNode->pSortKeys);
setOperatorInfo(pOperator, "GroupSortOperator", QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT, false, OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doGroupSort, NULL, destroyGroupSortOperatorInfo,
- getGroupSortExplainExecInfo);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doGroupSort, NULL, destroyGroupSortOperatorInfo,
+ optrDefaultBufFn, getGroupSortExplainExecInfo);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -551,6 +551,7 @@ typedef struct SMultiwayMergeOperatorInfo {
SSortHandle* pSortHandle;
SColMatchInfo matchInfo;
SSDataBlock* pInputBlock;
+ SSDataBlock* pIntermediateBlock; // to hold the intermediate result
int64_t startTs; // sort start time
bool groupSort;
bool hasGroupId;
@@ -558,7 +559,7 @@ typedef struct SMultiwayMergeOperatorInfo {
STupleHandle* prefetchedTuple;
} SMultiwayMergeOperatorInfo;
-int32_t doOpenMultiwayMergeOperator(SOperatorInfo* pOperator) {
+int32_t openMultiwayMergeOperator(SOperatorInfo* pOperator) {
SMultiwayMergeOperatorInfo* pInfo = pOperator->info;
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
@@ -576,9 +577,15 @@ int32_t doOpenMultiwayMergeOperator(SOperatorInfo* pOperator) {
tsortSetCompareGroupId(pInfo->pSortHandle, pInfo->groupSort);
for (int32_t i = 0; i < pOperator->numOfDownstream; ++i) {
+ SOperatorInfo* pDownstream = pOperator->pDownstream[i];
+ if (pDownstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_EXCHANGE) {
+ pDownstream->fpSet._openFn(pDownstream);
+ }
+
SSortSource* ps = taosMemoryCalloc(1, sizeof(SSortSource));
- ps->param = pOperator->pDownstream[i];
+ ps->param = pDownstream;
ps->onlyRef = true;
+
tsortAddSource(pInfo->pSortHandle, ps);
}
@@ -651,12 +658,19 @@ SSDataBlock* getMultiwaySortedBlockData(SSortHandle* pHandle, SSDataBlock* pData
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
blockDataCleanup(pDataBlock);
- SSDataBlock* p = tsortGetSortedDataBlock(pHandle);
- if (p == NULL) {
- return NULL;
+ if (pInfo->pIntermediateBlock == NULL) {
+ pInfo->pIntermediateBlock = tsortGetSortedDataBlock(pHandle);
+ if (pInfo->pIntermediateBlock == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return NULL;
+ }
+ blockDataEnsureCapacity(pInfo->pIntermediateBlock, capacity);
+ } else {
+ blockDataCleanup(pInfo->pIntermediateBlock);
}
- blockDataEnsureCapacity(p, capacity);
+ SSDataBlock* p = pInfo->pIntermediateBlock;
+
while (1) {
doGetSortedBlockData(pInfo, pHandle, capacity, p);
if (p->info.rows == 0) {
@@ -683,11 +697,10 @@ SSDataBlock* getMultiwaySortedBlockData(SSortHandle* pHandle, SSDataBlock* pData
pInfo->limitInfo.numOfOutputRows += p->info.rows;
pDataBlock->info.rows = p->info.rows;
- pDataBlock->info.groupId = pInfo->groupId;
+ pDataBlock->info.id.groupId = pInfo->groupId;
}
- blockDataDestroy(p);
- qDebug("%s get sorted block, groupId:0x%" PRIx64 " rows:%d", GET_TASKID(pTaskInfo), pDataBlock->info.groupId,
+ qDebug("%s get sorted block, groupId:0x%" PRIx64 " rows:%d", GET_TASKID(pTaskInfo), pDataBlock->info.id.groupId,
pDataBlock->info.rows);
return (pDataBlock->info.rows > 0) ? pDataBlock : NULL;
@@ -707,7 +720,6 @@ SSDataBlock* doMultiwayMerge(SOperatorInfo* pOperator) {
}
qDebug("start to merge final sorted rows, %s", GET_TASKID(pTaskInfo));
-
SSDataBlock* pBlock = getMultiwaySortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pInfo->matchInfo.pList, pOperator);
if (pBlock != NULL) {
pOperator->resultInfo.totalRows += pBlock->info.rows;
@@ -722,6 +734,7 @@ void destroyMultiwayMergeOperatorInfo(void* param) {
SMultiwayMergeOperatorInfo* pInfo = (SMultiwayMergeOperatorInfo*)param;
pInfo->binfo.pRes = blockDataDestroy(pInfo->binfo.pRes);
pInfo->pInputBlock = blockDataDestroy(pInfo->pInputBlock);
+ pInfo->pIntermediateBlock = blockDataDestroy(pInfo->pIntermediateBlock);
tsortDestroySortHandle(pInfo->pSortHandle);
taosArrayDestroy(pInfo->pSortInfo);
@@ -732,12 +745,13 @@ void destroyMultiwayMergeOperatorInfo(void* param) {
int32_t getMultiwayMergeExplainExecInfo(SOperatorInfo* pOptr, void** pOptrExplain, uint32_t* len) {
ASSERT(pOptr != NULL);
- SSortExecInfo* pInfo = taosMemoryCalloc(1, sizeof(SSortExecInfo));
+ SSortExecInfo* pSortExecInfo = taosMemoryCalloc(1, sizeof(SSortExecInfo));
- SMultiwayMergeOperatorInfo* pOperatorInfo = (SMultiwayMergeOperatorInfo*)pOptr->info;
+ SMultiwayMergeOperatorInfo* pInfo = (SMultiwayMergeOperatorInfo*)pOptr->info;
+
+ *pSortExecInfo = tsortGetSortExecInfo(pInfo->pSortHandle);
+ *pOptrExplain = pSortExecInfo;
- *pInfo = tsortGetSortExecInfo(pOperatorInfo->pSortHandle);
- *pOptrExplain = pInfo;
*len = sizeof(SSortExecInfo);
return TSDB_CODE_SUCCESS;
}
@@ -757,7 +771,7 @@ SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** downStreams, size
}
initLimitInfo(pMergePhyNode->node.pLimit, pMergePhyNode->node.pSlimit, &pInfo->limitInfo);
- pInfo->binfo.pRes = createResDataBlock(pDescNode);
+ pInfo->binfo.pRes = createDataBlockFromDescNode(pDescNode);
int32_t rowSize = pInfo->binfo.pRes->info.rowSize;
ASSERT(rowSize < 100 * 1024 * 1024);
@@ -770,9 +784,9 @@ SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** downStreams, size
}
SPhysiNode* pChildNode = (SPhysiNode*)nodesListGetNode(pPhyNode->pChildren, 0);
- SSDataBlock* pInputBlock = createResDataBlock(pChildNode->pOutputDataBlockDesc);
+ SSDataBlock* pInputBlock = createDataBlockFromDescNode(pChildNode->pOutputDataBlockDesc);
- initResultSizeInfo(&pOperator->resultInfo, 4096);
+ initResultSizeInfo(&pOperator->resultInfo, 1024);
blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
pInfo->groupSort = pMergePhyNode->groupSort;
@@ -783,8 +797,8 @@ SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** downStreams, size
pInfo->sortBufSize = pInfo->bufPageSize * (numStreams + 1); // one additional is reserved for merged result.
setOperatorInfo(pOperator, "MultiwayMergeOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE, false, OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(doOpenMultiwayMergeOperator, doMultiwayMerge, NULL,
- destroyMultiwayMergeOperatorInfo, getMultiwayMergeExplainExecInfo);
+ pOperator->fpSet = createOperatorFpSet(openMultiwayMergeOperator, doMultiwayMerge, NULL,
+ destroyMultiwayMergeOperatorInfo, optrDefaultBufFn, getMultiwayMergeExplainExecInfo);
code = appendDownstream(pOperator, downStreams, numStreams);
if (code != TSDB_CODE_SUCCESS) {
diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c
index c5e1f2c2140ea74b84a0e0f72f132a0f3ab93f97..a88f673e0b33135f41c1fa5e868d61c66942ee9f 100644
--- a/source/libs/executor/src/sysscanoperator.c
+++ b/source/libs/executor/src/sysscanoperator.c
@@ -441,6 +441,9 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
int32_t code = metaGetTableEntryByName(&smrChildTable, condTableName);
if (code != TSDB_CODE_SUCCESS) {
// terrno has been set by metaGetTableEntryByName, therefore, return directly
+ metaReaderClear(&smrChildTable);
+ blockDataDestroy(dataBlock);
+ pInfo->loadInfo.totalRows = 0;
return NULL;
}
@@ -456,12 +459,16 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
code = metaGetTableEntryByUid(&smrSuperTable, smrChildTable.me.ctbEntry.suid);
if (code != TSDB_CODE_SUCCESS) {
// terrno has been set by metaGetTableEntryByUid
+ metaReaderClear(&smrSuperTable);
+ metaReaderClear(&smrChildTable);
+ blockDataDestroy(dataBlock);
return NULL;
}
sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &smrChildTable, dbname, tableName, &numOfRows, dataBlock);
metaReaderClear(&smrSuperTable);
metaReaderClear(&smrChildTable);
+
if (numOfRows > 0) {
relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock, pOperator->exprSupp.pFilterInfo);
numOfRows = 0;
@@ -1328,7 +1335,7 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (NULL == pMsgSendInfo) {
qError("%s prepare message %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
- pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
@@ -1404,7 +1411,7 @@ SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScan
pInfo->pUser = taosMemoryStrDup((void*)pUser);
pInfo->sysInfo = pScanPhyNode->sysInfo;
pInfo->showRewrite = pScanPhyNode->showRewrite;
- pInfo->pRes = createResDataBlock(pDescNode);
+ pInfo->pRes = createDataBlockFromDescNode(pDescNode);
pInfo->pCondition = pScanNode->node.pConditions;
code = filterInitFromNode(pScanNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
@@ -1430,7 +1437,7 @@ SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScan
setOperatorInfo(pOperator, "SysTableScanOperator", QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, false, OP_NOT_OPENED,
pInfo, pTaskInfo);
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doSysTableScan, NULL, destroySysScanOperator, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doSysTableScan, NULL, destroySysScanOperator, optrDefaultBufFn, NULL);
return pOperator;
_error:
@@ -1824,39 +1831,39 @@ static int32_t doGetTableRowSize(void* pMeta, uint64_t uid, int32_t* rowLen, con
}
static SSDataBlock* doBlockInfoScan(SOperatorInfo* pOperator) {
- if (pOperator->status == OP_EXEC_DONE) {
- return NULL;
- }
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
- SBlockDistInfo* pBlockScanInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SBlockDistInfo* pBlockScanInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
- int32_t code = doGetTableRowSize(pBlockScanInfo->readHandle.meta, pBlockScanInfo->uid,
- (int32_t*)&blockDistInfo.rowSize, GET_TASKID(pTaskInfo));
- if (code != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, code);
- }
+ STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
+ int32_t code = doGetTableRowSize(pBlockScanInfo->readHandle.meta, pBlockScanInfo->uid,
+ (int32_t*)&blockDistInfo.rowSize, GET_TASKID(pTaskInfo));
+ if (code != TSDB_CODE_SUCCESS) {
+ T_LONG_JMP(pTaskInfo->env, code);
+ }
- tsdbGetFileBlocksDistInfo(pBlockScanInfo->pHandle, &blockDistInfo);
- blockDistInfo.numOfInmemRows = (int32_t)tsdbGetNumOfRowsInMemTable(pBlockScanInfo->pHandle);
+ tsdbGetFileBlocksDistInfo(pBlockScanInfo->pHandle, &blockDistInfo);
+ blockDistInfo.numOfInmemRows = (int32_t)tsdbGetNumOfRowsInMemTable(pBlockScanInfo->pHandle);
- SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
+ SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
- int32_t slotId = pOperator->exprSupp.pExprInfo->base.resSchema.slotId;
- SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, slotId);
+ int32_t slotId = pOperator->exprSupp.pExprInfo->base.resSchema.slotId;
+ SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, slotId);
- int32_t len = tSerializeBlockDistInfo(NULL, 0, &blockDistInfo);
- char* p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
- tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo);
- varDataSetLen(p, len);
+ int32_t len = tSerializeBlockDistInfo(NULL, 0, &blockDistInfo);
+ char* p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
+ tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo);
+ varDataSetLen(p, len);
- colDataAppend(pColInfo, 0, p, false);
- taosMemoryFree(p);
+ colDataAppend(pColInfo, 0, p, false);
+ taosMemoryFree(p);
- pBlock->info.rows = 1;
- pOperator->status = OP_EXEC_DONE;
- return pBlock;
+ pBlock->info.rows = 1;
+ pOperator->status = OP_EXEC_DONE;
+ return pBlock;
}
static void destroyBlockDistScanOperatorInfo(void* param) {
@@ -1867,78 +1874,80 @@ static void destroyBlockDistScanOperatorInfo(void* param) {
}
static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pCond) {
- memset(pCond, 0, sizeof(SQueryTableDataCond));
-
- pCond->order = TSDB_ORDER_ASC;
- pCond->numOfCols = 1;
- pCond->colList = taosMemoryCalloc(1, sizeof(SColumnInfo));
- if (pCond->colList == NULL) {
- terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
- return terrno;
- }
+ memset(pCond, 0, sizeof(SQueryTableDataCond));
+
+ pCond->order = TSDB_ORDER_ASC;
+ pCond->numOfCols = 1;
+ pCond->colList = taosMemoryCalloc(1, sizeof(SColumnInfo));
+ pCond->pSlotList = taosMemoryMalloc(sizeof(int32_t));
+ if (pCond->colList == NULL || pCond->pSlotList == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return terrno;
+ }
- pCond->colList->colId = 1;
- pCond->colList->type = TSDB_DATA_TYPE_TIMESTAMP;
- pCond->colList->bytes = sizeof(TSKEY);
+ pCond->colList->colId = 1;
+ pCond->colList->type = TSDB_DATA_TYPE_TIMESTAMP;
+ pCond->colList->bytes = sizeof(TSKEY);
- pCond->twindows = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
- pCond->suid = uid;
- pCond->type = TIMEWINDOW_RANGE_CONTAINED;
- pCond->startVersion = -1;
- pCond->endVersion = -1;
+ pCond->pSlotList[0] = 0;
- return TSDB_CODE_SUCCESS;
+ pCond->twindows = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
+ pCond->suid = uid;
+ pCond->type = TIMEWINDOW_RANGE_CONTAINED;
+ pCond->startVersion = -1;
+ pCond->endVersion = -1;
+
+ return TSDB_CODE_SUCCESS;
}
SOperatorInfo* createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDistScanPhysiNode* pBlockScanNode,
SExecTaskInfo* pTaskInfo) {
- SBlockDistInfo* pInfo = taosMemoryCalloc(1, sizeof(SBlockDistInfo));
- SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- if (pInfo == NULL || pOperator == NULL) {
- pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
- goto _error;
- }
+ SBlockDistInfo* pInfo = taosMemoryCalloc(1, sizeof(SBlockDistInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ if (pInfo == NULL || pOperator == NULL) {
+ pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _error;
+ }
- {
- SQueryTableDataCond cond = {0};
+ pInfo->pResBlock = createDataBlockFromDescNode(pBlockScanNode->node.pOutputDataBlockDesc);
+ blockDataEnsureCapacity(pInfo->pResBlock, 1);
- int32_t code = initTableblockDistQueryCond(pBlockScanNode->suid, &cond);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
+ {
+ SQueryTableDataCond cond = {0};
+ int32_t code = initTableblockDistQueryCond(pBlockScanNode->suid, &cond);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
- STableListInfo* pTableListInfo = pTaskInfo->pTableInfoList;
- size_t num = tableListGetSize(pTableListInfo);
- void* pList = tableListGetInfo(pTableListInfo, 0);
+ STableListInfo* pTableListInfo = pTaskInfo->pTableInfoList;
+ size_t num = tableListGetSize(pTableListInfo);
+ void* pList = tableListGetInfo(pTableListInfo, 0);
- code = tsdbReaderOpen(readHandle->vnode, &cond, pList, num, &pInfo->pHandle, pTaskInfo->id.str);
- cleanupQueryTableDataCond(&cond);
- if (code != 0) {
- goto _error;
- }
+ code = tsdbReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock, &pInfo->pHandle, pTaskInfo->id.str);
+ cleanupQueryTableDataCond(&cond);
+ if (code != 0) {
+ goto _error;
}
+ }
- pInfo->readHandle = *readHandle;
- pInfo->uid = pBlockScanNode->suid;
-
- pInfo->pResBlock = createResDataBlock(pBlockScanNode->node.pOutputDataBlockDesc);
- blockDataEnsureCapacity(pInfo->pResBlock, 1);
+ pInfo->readHandle = *readHandle;
+ pInfo->uid = pBlockScanNode->suid;
- int32_t numOfCols = 0;
- SExprInfo* pExprInfo = createExprInfo(pBlockScanNode->pScanPseudoCols, NULL, &numOfCols);
- int32_t code = initExprSupp(&pOperator->exprSupp, pExprInfo, numOfCols);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
+ int32_t numOfCols = 0;
+ SExprInfo* pExprInfo = createExprInfo(pBlockScanNode->pScanPseudoCols, NULL, &numOfCols);
+ int32_t code = initExprSupp(&pOperator->exprSupp, pExprInfo, numOfCols);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
- setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false,
- OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doBlockInfoScan, NULL, destroyBlockDistScanOperatorInfo, NULL);
- return pOperator;
+ setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false,
+ OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->fpSet =
+ createOperatorFpSet(optrDummyOpenFn, doBlockInfoScan, NULL, destroyBlockDistScanOperatorInfo, optrDefaultBufFn, NULL);
+ return pOperator;
- _error:
- taosMemoryFreeClear(pInfo);
- taosMemoryFreeClear(pOperator);
- return NULL;
+_error:
+ taosMemoryFreeClear(pInfo);
+ taosMemoryFreeClear(pOperator);
+ return NULL;
}
\ No newline at end of file
diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c
index 9908f3581854f6d1e65b4ad3bbeb0c65b4858084..d30c1fbfa143f2cbe4bbdc4cc1e3cd981f0ba9de 100644
--- a/source/libs/executor/src/tfill.c
+++ b/source/libs/executor/src/tfill.c
@@ -35,22 +35,7 @@
#define DO_INTERPOLATION(_v1, _v2, _k1, _k2, _k) \
((_v1) + ((_v2) - (_v1)) * (((double)(_k)) - ((double)(_k1))) / (((double)(_k2)) - ((double)(_k1))))
-#define GET_DEST_SLOT_ID(_p) ((_p)->pExpr->base.resSchema.slotId)
-
-#define FILL_POS_INVALID 0
-#define FILL_POS_START 1
-#define FILL_POS_MID 2
-#define FILL_POS_END 3
-
-typedef struct STimeRange {
- TSKEY skey;
- TSKEY ekey;
- uint64_t groupId;
-} STimeRange;
-
static void doSetVal(SColumnInfoData* pDstColInfoData, int32_t rowIndex, const SGroupKeys* pKey);
-static bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData,
- int32_t rowIndex);
static void setNullRow(SSDataBlock* pBlock, SFillInfo* pFillInfo, int32_t rowIndex) {
for (int32_t i = 0; i < pFillInfo->numOfCols; ++i) {
@@ -60,8 +45,18 @@ static void setNullRow(SSDataBlock* pBlock, SFillInfo* pFillInfo, int32_t rowInd
if (pCol->notFillCol) {
bool filled = fillIfWindowPseudoColumn(pFillInfo, pCol, pDstColInfo, rowIndex);
if (!filled) {
- SArray* p = FILL_IS_ASC_FILL(pFillInfo) ? pFillInfo->prev.pRowVal : pFillInfo->next.pRowVal;
- SGroupKeys* pKey = taosArrayGet(p, i);
+ SRowVal* p = NULL;
+ if (FILL_IS_ASC_FILL(pFillInfo)) {
+ if (pFillInfo->prev.key != 0) {
+ p = &pFillInfo->prev; // prev has been set value
+ } else { // otherwise, use the value in the next row
+ p = &pFillInfo->next;
+ }
+ } else {
+ p = &pFillInfo->next;
+ }
+
+ SGroupKeys* pKey = taosArrayGet(p->pRowVal, i);
doSetVal(pDstColInfo, rowIndex, pKey);
}
} else {
@@ -91,8 +86,8 @@ static void doSetUserSpecifiedValue(SColumnInfoData* pDst, SVariant* pVar, int32
}
// fill windows pseudo column, _wstart, _wend, _wduration and return true, otherwise return false
-static bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData,
- int32_t rowIndex) {
+bool fillIfWindowPseudoColumn(SFillInfo* pFillInfo, SFillColInfo* pCol, SColumnInfoData* pDstColInfoData,
+ int32_t rowIndex) {
if (!pCol->notFillCol) {
return false;
}
@@ -261,7 +256,10 @@ static void initBeforeAfterDataBuf(SFillInfo* pFillInfo) {
static void saveColData(SArray* rowBuf, int32_t columnIndex, const char* src, bool isNull);
-static void copyCurrentRowIntoBuf(SFillInfo* pFillInfo, int32_t rowIndex, SArray* pRow) {
+static void copyCurrentRowIntoBuf(SFillInfo* pFillInfo, int32_t rowIndex, SRowVal* pRowVal) {
+ SColumnInfoData* pTsCol = taosArrayGet(pFillInfo->pSrcBlock->pDataBlock, pFillInfo->srcTsSlotId);
+ pRowVal->key = ((int64_t*)pTsCol->pData)[rowIndex];
+
for (int32_t i = 0; i < pFillInfo->numOfCols; ++i) {
int32_t type = pFillInfo->pFillCol[i].pExpr->pExpr->nodeType;
if (type == QUERY_NODE_COLUMN || type == QUERY_NODE_OPERATOR || type == QUERY_NODE_FUNCTION) {
@@ -272,7 +270,7 @@ static void copyCurrentRowIntoBuf(SFillInfo* pFillInfo, int32_t rowIndex, SArray
bool isNull = colDataIsNull_s(pSrcCol, rowIndex);
char* p = colDataGetData(pSrcCol, rowIndex);
- saveColData(pRow, i, p, isNull);
+ saveColData(pRowVal->pRowVal, i, p, isNull);
} else {
ASSERT(0);
}
@@ -296,7 +294,7 @@ static int32_t fillResultImpl(SFillInfo* pFillInfo, SSDataBlock* pBlock, int32_t
// set the next value for interpolation
if ((pFillInfo->currentKey < ts && ascFill) || (pFillInfo->currentKey > ts && !ascFill)) {
- copyCurrentRowIntoBuf(pFillInfo, pFillInfo->index, pFillInfo->next.pRowVal);
+ copyCurrentRowIntoBuf(pFillInfo, pFillInfo->index, &pFillInfo->next);
}
if (((pFillInfo->currentKey < ts && ascFill) || (pFillInfo->currentKey > ts && !ascFill)) &&
@@ -318,7 +316,7 @@ static int32_t fillResultImpl(SFillInfo* pFillInfo, SSDataBlock* pBlock, int32_t
if (pFillInfo->type == TSDB_FILL_NEXT && (pFillInfo->index + 1) < pFillInfo->numOfRows) {
int32_t nextRowIndex = pFillInfo->index + 1;
- copyCurrentRowIntoBuf(pFillInfo, nextRowIndex, pFillInfo->next.pRowVal);
+ copyCurrentRowIntoBuf(pFillInfo, nextRowIndex, &pFillInfo->next);
}
// copy rows to dst buffer
@@ -334,6 +332,9 @@ static int32_t fillResultImpl(SFillInfo* pFillInfo, SSDataBlock* pBlock, int32_t
if (!colDataIsNull_s(pSrc, pFillInfo->index)) {
colDataAppend(pDst, index, src, false);
saveColData(pFillInfo->prev.pRowVal, i, src, false);
+ if (pFillInfo->srcTsSlotId == dstSlotId) {
+ pFillInfo->prev.key = *(int64_t*)src;
+ }
} else { // the value is null
if (pDst->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
colDataAppend(pDst, index, (const char*)&pFillInfo->currentKey, false);
@@ -663,1059 +664,3 @@ SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprIn
return pFillCol;
}
-
-TSKEY getNextWindowTs(TSKEY ts, SInterval* pInterval) {
- STimeWindow win = {.skey = ts, .ekey = ts};
- getNextIntervalWindow(pInterval, &win, TSDB_ORDER_ASC);
- return win.skey;
-}
-
-TSKEY getPrevWindowTs(TSKEY ts, SInterval* pInterval) {
- STimeWindow win = {.skey = ts, .ekey = ts};
- getNextIntervalWindow(pInterval, &win, TSDB_ORDER_DESC);
- return win.skey;
-}
-
-void setRowCell(SColumnInfoData* pCol, int32_t rowId, const SResultCellData* pCell) {
- colDataAppend(pCol, rowId, pCell->pData, pCell->isNull);
-}
-
-SResultCellData* getResultCell(SResultRowData* pRaw, int32_t index) {
- if (!pRaw || !pRaw->pRowVal) {
- return NULL;
- }
- char* pData = (char*)pRaw->pRowVal;
- SResultCellData* pCell = pRaw->pRowVal;
- for (int32_t i = 0; i < index; i++) {
- pData += (pCell->bytes + sizeof(SResultCellData));
- pCell = (SResultCellData*)pData;
- }
- return pCell;
-}
-
-void* destroyFillColumnInfo(SFillColInfo* pFillCol, int32_t start, int32_t end) {
- for (int32_t i = start; i < end; i++) {
- destroyExprInfo(pFillCol[i].pExpr, 1);
- taosVariantDestroy(&pFillCol[i].fillVal);
- }
- taosMemoryFreeClear(pFillCol[start].pExpr);
- taosMemoryFree(pFillCol);
- return NULL;
-}
-
-void* destroyStreamFillSupporter(SStreamFillSupporter* pFillSup) {
- pFillSup->pAllColInfo = destroyFillColumnInfo(pFillSup->pAllColInfo, pFillSup->numOfFillCols, pFillSup->numOfAllCols);
- tSimpleHashCleanup(pFillSup->pResMap);
- pFillSup->pResMap = NULL;
- releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal);
- pFillSup->cur.pRowVal = NULL;
- cleanupExprSupp(&pFillSup->notFillExprSup);
-
- taosMemoryFree(pFillSup);
- return NULL;
-}
-
-void* destroyStreamFillLinearInfo(SStreamFillLinearInfo* pFillLinear) {
- taosArrayDestroy(pFillLinear->pDeltaVal);
- taosArrayDestroy(pFillLinear->pNextDeltaVal);
- taosMemoryFree(pFillLinear);
- return NULL;
-}
-void* destroyStreamFillInfo(SStreamFillInfo* pFillInfo) {
- if (pFillInfo->type == TSDB_FILL_SET_VALUE || pFillInfo->type == TSDB_FILL_NULL) {
- taosMemoryFreeClear(pFillInfo->pResRow->pRowVal);
- taosMemoryFreeClear(pFillInfo->pResRow);
- }
- pFillInfo->pLinearInfo = destroyStreamFillLinearInfo(pFillInfo->pLinearInfo);
- taosArrayDestroy(pFillInfo->delRanges);
- taosMemoryFree(pFillInfo);
- return NULL;
-}
-
-void destroyStreamFillOperatorInfo(void* param) {
- SStreamFillOperatorInfo* pInfo = (SStreamFillOperatorInfo*)param;
- pInfo->pFillInfo = destroyStreamFillInfo(pInfo->pFillInfo);
- pInfo->pFillSup = destroyStreamFillSupporter(pInfo->pFillSup);
- pInfo->pRes = blockDataDestroy(pInfo->pRes);
- pInfo->pSrcBlock = blockDataDestroy(pInfo->pSrcBlock);
- pInfo->pPrevSrcBlock = blockDataDestroy(pInfo->pPrevSrcBlock);
- pInfo->pDelRes = blockDataDestroy(pInfo->pDelRes);
- pInfo->matchInfo.pList = taosArrayDestroy(pInfo->matchInfo.pList);
- taosMemoryFree(pInfo);
-}
-
-static void resetFillWindow(SResultRowData* pRowData) {
- pRowData->key = INT64_MIN;
- pRowData->pRowVal = NULL;
-}
-
-void resetPrevAndNextWindow(SStreamFillSupporter* pFillSup, SStreamState* pState) {
- resetFillWindow(&pFillSup->prev);
- releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal);
- resetFillWindow(&pFillSup->cur);
- resetFillWindow(&pFillSup->next);
- resetFillWindow(&pFillSup->nextNext);
-}
-
-void getCurWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) {
- SStreamState* pState = pOperator->pTaskInfo->streamInfo.pState;
- resetPrevAndNextWindow(pFillSup, pState);
-
- SWinKey key = {.ts = ts, .groupId = groupId};
- // void* curVal = NULL;
- int32_t curVLen = 0;
- int32_t code = streamStateFillGet(pState, &key, (void**)&pFillSup->cur.pRowVal, &curVLen);
- ASSERT(code == TSDB_CODE_SUCCESS);
- pFillSup->cur.key = key.ts;
- // pFillSup->cur.pRowVal = curVal;
-}
-
-void getWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) {
- SStreamState* pState = pOperator->pTaskInfo->streamInfo.pState;
- resetPrevAndNextWindow(pFillSup, pState);
-
- SWinKey key = {.ts = ts, .groupId = groupId};
- void* curVal = NULL;
- int32_t curVLen = 0;
- int32_t code = streamStateFillGet(pState, &key, (void**)&curVal, &curVLen);
- ASSERT(code == TSDB_CODE_SUCCESS);
- pFillSup->cur.key = key.ts;
- pFillSup->cur.pRowVal = curVal;
-
- SStreamStateCur* pCur = streamStateFillSeekKeyPrev(pState, &key);
- SWinKey preKey = {.groupId = groupId};
- void* preVal = NULL;
- int32_t preVLen = 0;
- code = streamStateGetGroupKVByCur(pCur, &preKey, (const void**)&preVal, &preVLen);
-
- if (code == TSDB_CODE_SUCCESS) {
- pFillSup->prev.key = preKey.ts;
- pFillSup->prev.pRowVal = preVal;
-
- code = streamStateCurNext(pState, pCur);
- ASSERT(code == TSDB_CODE_SUCCESS);
-
- code = streamStateCurNext(pState, pCur);
- if (code != TSDB_CODE_SUCCESS) {
- streamStateFreeCur(pCur);
- pCur = NULL;
- }
- } else {
- streamStateFreeCur(pCur);
- pCur = streamStateFillSeekKeyNext(pState, &key);
- }
-
- SWinKey nextKey = {.groupId = groupId};
- void* nextVal = NULL;
- int32_t nextVLen = 0;
- code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextVLen);
- if (code == TSDB_CODE_SUCCESS) {
- pFillSup->next.key = nextKey.ts;
- pFillSup->next.pRowVal = nextVal;
- if (pFillSup->type == TSDB_FILL_PREV || pFillSup->type == TSDB_FILL_NEXT) {
- code = streamStateCurNext(pState, pCur);
- if (code == TSDB_CODE_SUCCESS) {
- SWinKey nextNextKey = {.groupId = groupId};
- void* nextNextVal = NULL;
- int32_t nextNextVLen = 0;
- code = streamStateGetGroupKVByCur(pCur, &nextNextKey, (const void**)&nextNextVal, &nextNextVLen);
- if (code == TSDB_CODE_SUCCESS) {
- pFillSup->nextNext.key = nextNextKey.ts;
- pFillSup->nextNext.pRowVal = nextNextVal;
- }
- }
- }
- }
- streamStateFreeCur(pCur);
-}
-
-static bool hasPrevWindow(SStreamFillSupporter* pFillSup) { return pFillSup->prev.key != INT64_MIN; }
-static bool hasNextWindow(SStreamFillSupporter* pFillSup) { return pFillSup->next.key != INT64_MIN; }
-static bool hasNextNextWindow(SStreamFillSupporter* pFillSup) {
- return pFillSup->nextNext.key != INT64_MIN;
- return false;
-}
-
-static void transBlockToResultRow(const SSDataBlock* pBlock, int32_t rowId, TSKEY ts, SResultRowData* pRowVal) {
- int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, i);
- SResultCellData* pCell = getResultCell(pRowVal, i);
- if (!colDataIsNull_s(pColData, rowId)) {
- pCell->isNull = false;
- pCell->type = pColData->info.type;
- pCell->bytes = pColData->info.bytes;
- char* val = colDataGetData(pColData, rowId);
- if (IS_VAR_DATA_TYPE(pCell->type)) {
- memcpy(pCell->pData, val, varDataTLen(val));
- } else {
- memcpy(pCell->pData, val, pCell->bytes);
- }
- } else {
- pCell->isNull = true;
- }
- }
- pRowVal->key = ts;
-}
-
-static void calcDeltaData(SSDataBlock* pBlock, int32_t rowId, SResultRowData* pRowVal, SArray* pDelta,
- SFillColInfo* pFillCol, int32_t numOfCol, int32_t winCount, int32_t order) {
- for (int32_t i = 0; i < numOfCol; i++) {
- if (!pFillCol[i].notFillCol) {
- int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i);
- SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, slotId);
- char* var = colDataGetData(pCol, rowId);
- double start = 0;
- GET_TYPED_DATA(start, double, pCol->info.type, var);
- SResultCellData* pCell = getResultCell(pRowVal, slotId);
- double end = 0;
- GET_TYPED_DATA(end, double, pCell->type, pCell->pData);
- double delta = 0;
- if (order == TSDB_ORDER_ASC) {
- delta = (end - start) / winCount;
- } else {
- delta = (start - end) / winCount;
- }
- taosArraySet(pDelta, slotId, &delta);
- }
- }
-}
-
-static void calcRowDeltaData(SResultRowData* pStartRow, SResultRowData* pEndRow, SArray* pDelta, SFillColInfo* pFillCol,
- int32_t numOfCol, int32_t winCount) {
- for (int32_t i = 0; i < numOfCol; i++) {
- if (!pFillCol[i].notFillCol) {
- int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i);
- SResultCellData* pSCell = getResultCell(pStartRow, slotId);
- double start = 0.0;
- GET_TYPED_DATA(start, double, pSCell->type, pSCell->pData);
- SResultCellData* pECell = getResultCell(pEndRow, slotId);
- double end = 0.0;
- GET_TYPED_DATA(end, double, pECell->type, pECell->pData);
- double delta = (end - start) / winCount;
- taosArraySet(pDelta, slotId, &delta);
- }
- }
-}
-
-static void setFillInfoStart(TSKEY ts, SInterval* pInterval, SStreamFillInfo* pFillInfo) {
- ts = taosTimeAdd(ts, pInterval->sliding, pInterval->slidingUnit, pInterval->precision);
- pFillInfo->start = ts;
-}
-
-static void setFillInfoEnd(TSKEY ts, SInterval* pInterval, SStreamFillInfo* pFillInfo) {
- ts = taosTimeAdd(ts, pInterval->sliding * -1, pInterval->slidingUnit, pInterval->precision);
- pFillInfo->end = ts;
-}
-
-static void setFillKeyInfo(TSKEY start, TSKEY end, SInterval* pInterval, SStreamFillInfo* pFillInfo) {
- setFillInfoStart(start, pInterval, pFillInfo);
- pFillInfo->current = pFillInfo->start;
- setFillInfoEnd(end, pInterval, pFillInfo);
-}
-
-void setDeleteFillValueInfo(TSKEY start, TSKEY end, SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo) {
- if (!hasPrevWindow(pFillSup) || !hasNextWindow(pFillSup)) {
- pFillInfo->needFill = false;
- return;
- }
-
- pFillInfo->needFill = true;
- pFillInfo->start = start;
- pFillInfo->current = pFillInfo->start;
- pFillInfo->end = end;
- pFillInfo->pos = FILL_POS_INVALID;
- switch (pFillInfo->type) {
- case TSDB_FILL_NULL:
- case TSDB_FILL_SET_VALUE:
- break;
- case TSDB_FILL_PREV:
- pFillInfo->pResRow = &pFillSup->prev;
- break;
- case TSDB_FILL_NEXT:
- pFillInfo->pResRow = &pFillSup->next;
- break;
- case TSDB_FILL_LINEAR: {
- setFillKeyInfo(pFillSup->prev.key, pFillSup->next.key, &pFillSup->interval, pFillInfo);
- pFillInfo->pLinearInfo->hasNext = false;
- pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
- int32_t numOfWins = taosTimeCountInterval(pFillSup->prev.key, pFillSup->next.key, pFillSup->interval.sliding,
- pFillSup->interval.slidingUnit, pFillSup->interval.precision);
- calcRowDeltaData(&pFillSup->prev, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
- pFillSup->numOfAllCols, numOfWins);
- pFillInfo->pResRow = &pFillSup->prev;
- pFillInfo->pLinearInfo->winIndex = 0;
- } break;
- default:
- ASSERT(0);
- break;
- }
-}
-
-void setFillValueInfo(SSDataBlock* pBlock, TSKEY ts, int32_t rowId, SStreamFillSupporter* pFillSup,
- SStreamFillInfo* pFillInfo) {
- pFillInfo->preRowKey = pFillSup->cur.key;
- if (!hasPrevWindow(pFillSup) && !hasNextWindow(pFillSup)) {
- pFillInfo->needFill = false;
- pFillInfo->pos = FILL_POS_START;
- return;
- }
- TSKEY prevWKey = INT64_MIN;
- TSKEY nextWKey = INT64_MIN;
- if (hasPrevWindow(pFillSup)) {
- prevWKey = pFillSup->prev.key;
- }
- if (hasNextWindow(pFillSup)) {
- nextWKey = pFillSup->next.key;
- }
-
- pFillInfo->needFill = true;
- pFillInfo->pos = FILL_POS_INVALID;
- switch (pFillInfo->type) {
- case TSDB_FILL_NULL:
- case TSDB_FILL_SET_VALUE: {
- if (pFillSup->prev.key == pFillInfo->preRowKey) {
- resetFillWindow(&pFillSup->prev);
- }
- if (hasPrevWindow(pFillSup) && hasNextWindow(pFillSup)) {
- if (pFillSup->next.key == pFillInfo->nextRowKey) {
- pFillInfo->preRowKey = INT64_MIN;
- setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_END;
- } else {
- pFillInfo->needFill = false;
- pFillInfo->pos = FILL_POS_START;
- }
- } else if (hasPrevWindow(pFillSup)) {
- setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_END;
- } else {
- setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_START;
- }
- } break;
- case TSDB_FILL_PREV: {
- if (hasNextWindow(pFillSup) && ((pFillSup->next.key != pFillInfo->nextRowKey) ||
- (pFillSup->next.key == pFillInfo->nextRowKey && hasNextNextWindow(pFillSup)) ||
- (pFillSup->next.key == pFillInfo->nextRowKey && !hasPrevWindow(pFillSup)))) {
- setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_START;
- pFillSup->prev.key = pFillSup->cur.key;
- pFillSup->prev.pRowVal = pFillSup->cur.pRowVal;
- } else if (hasPrevWindow(pFillSup)) {
- setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_END;
- pFillInfo->preRowKey = INT64_MIN;
- }
- pFillInfo->pResRow = &pFillSup->prev;
- } break;
- case TSDB_FILL_NEXT: {
- if (hasPrevWindow(pFillSup)) {
- setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_END;
- pFillSup->next.key = pFillSup->cur.key;
- pFillSup->next.pRowVal = pFillSup->cur.pRowVal;
- pFillInfo->preRowKey = INT64_MIN;
- } else {
- ASSERT(hasNextWindow(pFillSup));
- setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_START;
- }
- pFillInfo->pResRow = &pFillSup->next;
- } break;
- case TSDB_FILL_LINEAR: {
- pFillInfo->pLinearInfo->winIndex = 0;
- if (hasPrevWindow(pFillSup) && hasNextWindow(pFillSup)) {
- setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_MID;
- pFillInfo->pLinearInfo->nextEnd = nextWKey;
- int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding,
- pFillSup->interval.slidingUnit, pFillSup->interval.precision);
- calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
- pFillSup->numOfAllCols, numOfWins);
- pFillInfo->pResRow = &pFillSup->prev;
-
- numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
- pFillSup->interval.precision);
- calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pNextDeltaVal, pFillSup->pAllColInfo,
- pFillSup->numOfAllCols, numOfWins);
- pFillInfo->pLinearInfo->hasNext = true;
- } else if (hasPrevWindow(pFillSup)) {
- setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_END;
- pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
- int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding,
- pFillSup->interval.slidingUnit, pFillSup->interval.precision);
- calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
- pFillSup->numOfAllCols, numOfWins);
- pFillInfo->pResRow = &pFillSup->prev;
- pFillInfo->pLinearInfo->hasNext = false;
- } else {
- ASSERT(hasNextWindow(pFillSup));
- setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
- pFillInfo->pos = FILL_POS_START;
- pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
- int32_t numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding,
- pFillSup->interval.slidingUnit, pFillSup->interval.precision);
- calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
- pFillSup->numOfAllCols, numOfWins);
- pFillInfo->pResRow = &pFillSup->cur;
- pFillInfo->pLinearInfo->hasNext = false;
- }
- } break;
- default:
- ASSERT(0);
- break;
- }
- ASSERT(pFillInfo->pos != FILL_POS_INVALID);
-}
-
-static bool checkResult(SStreamFillSupporter* pFillSup, TSKEY ts, uint64_t groupId) {
- SWinKey key = {.groupId = groupId, .ts = ts};
- if (tSimpleHashGet(pFillSup->pResMap, &key, sizeof(SWinKey)) != NULL) {
- return false;
- }
- tSimpleHashPut(pFillSup->pResMap, &key, sizeof(SWinKey), NULL, 0);
- return true;
-}
-
-static void buildFillResult(SResultRowData* pResRow, SStreamFillSupporter* pFillSup, TSKEY ts, SSDataBlock* pBlock) {
- uint64_t groupId = pBlock->info.groupId;
- if (pFillSup->hasDelete && !checkResult(pFillSup, ts, groupId)) {
- return;
- }
- for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) {
- SFillColInfo* pFillCol = pFillSup->pAllColInfo + i;
- int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
- SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, slotId);
- SFillInfo tmpInfo = {
- .currentKey = ts,
- .order = TSDB_ORDER_ASC,
- .interval = pFillSup->interval,
- };
- bool filled = fillIfWindowPseudoColumn(&tmpInfo, pFillCol, pColData, pBlock->info.rows);
- if (!filled) {
- SResultCellData* pCell = getResultCell(pResRow, slotId);
- setRowCell(pColData, pBlock->info.rows, pCell);
- }
- }
- pBlock->info.rows++;
-}
-
-static bool hasRemainCalc(SStreamFillInfo* pFillInfo) {
- if (pFillInfo->current != INT64_MIN && pFillInfo->current <= pFillInfo->end) {
- return true;
- }
- return false;
-}
-
-static void doStreamFillNormal(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock) {
- while (hasRemainCalc(pFillInfo) && pBlock->info.rows < pBlock->info.capacity) {
- buildFillResult(pFillInfo->pResRow, pFillSup, pFillInfo->current, pBlock);
- pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
- pFillSup->interval.precision);
- }
-}
-
-static void doStreamFillLinear(SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock) {
- while (hasRemainCalc(pFillInfo) && pBlock->info.rows < pBlock->info.capacity) {
- uint64_t groupId = pBlock->info.groupId;
- SWinKey key = {.groupId = groupId, .ts = pFillInfo->current};
- if (pFillSup->hasDelete && !checkResult(pFillSup, pFillInfo->current, groupId)) {
- pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
- pFillSup->interval.precision);
- pFillInfo->pLinearInfo->winIndex++;
- continue;
- }
- pFillInfo->pLinearInfo->winIndex++;
- for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) {
- SFillColInfo* pFillCol = pFillSup->pAllColInfo + i;
- SFillInfo tmp = {
- .currentKey = pFillInfo->current,
- .order = TSDB_ORDER_ASC,
- .interval = pFillSup->interval,
- };
-
- int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
- SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, slotId);
- int16_t type = pColData->info.type;
- SResultCellData* pCell = getResultCell(pFillInfo->pResRow, slotId);
- int32_t index = pBlock->info.rows;
- if (pFillCol->notFillCol) {
- bool filled = fillIfWindowPseudoColumn(&tmp, pFillCol, pColData, index);
- if (!filled) {
- setRowCell(pColData, index, pCell);
- }
- } else {
- if (IS_VAR_DATA_TYPE(type) || type == TSDB_DATA_TYPE_BOOL || pCell->isNull) {
- colDataAppendNULL(pColData, index);
- continue;
- }
- double* pDelta = taosArrayGet(pFillInfo->pLinearInfo->pDeltaVal, slotId);
- double vCell = 0;
- GET_TYPED_DATA(vCell, double, pCell->type, pCell->pData);
- vCell += (*pDelta) * pFillInfo->pLinearInfo->winIndex;
- int64_t result = 0;
- SET_TYPED_DATA(&result, pCell->type, vCell);
- colDataAppend(pColData, index, (const char*)&result, false);
- }
- }
- pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
- pFillSup->interval.precision);
- pBlock->info.rows++;
- }
-}
-
-static void keepResultInDiscBuf(SOperatorInfo* pOperator, uint64_t groupId, SResultRowData* pRow, int32_t len) {
- SWinKey key = {.groupId = groupId, .ts = pRow->key};
- int32_t code = streamStateFillPut(pOperator->pTaskInfo->streamInfo.pState, &key, pRow->pRowVal, len);
- ASSERT(code == TSDB_CODE_SUCCESS);
-}
-
-static void doStreamFillRange(SStreamFillInfo* pFillInfo, SStreamFillSupporter* pFillSup, SSDataBlock* pRes) {
- if (pFillInfo->needFill == false) {
- buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes);
- return;
- }
-
- if (pFillInfo->pos == FILL_POS_START) {
- buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes);
- }
- if (pFillInfo->type != TSDB_FILL_LINEAR) {
- doStreamFillNormal(pFillSup, pFillInfo, pRes);
- } else {
- doStreamFillLinear(pFillSup, pFillInfo, pRes);
-
- if (pFillInfo->pos == FILL_POS_MID) {
- buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes);
- }
-
- if (pFillInfo->current > pFillInfo->end && pFillInfo->pLinearInfo->hasNext) {
- pFillInfo->pLinearInfo->hasNext = false;
- pFillInfo->pLinearInfo->winIndex = 0;
- taosArrayClear(pFillInfo->pLinearInfo->pDeltaVal);
- taosArrayAddAll(pFillInfo->pLinearInfo->pDeltaVal, pFillInfo->pLinearInfo->pNextDeltaVal);
- pFillInfo->pResRow = &pFillSup->cur;
- setFillKeyInfo(pFillSup->cur.key, pFillInfo->pLinearInfo->nextEnd, &pFillSup->interval, pFillInfo);
- doStreamFillLinear(pFillSup, pFillInfo, pRes);
- }
- }
- if (pFillInfo->pos == FILL_POS_END) {
- buildFillResult(&pFillSup->cur, pFillSup, pFillSup->cur.key, pRes);
- }
-}
-
-void keepBlockRowInDiscBuf(SOperatorInfo* pOperator, SStreamFillInfo* pFillInfo, SSDataBlock* pBlock, TSKEY* tsCol,
- int32_t rowId, uint64_t groupId, int32_t rowSize) {
- TSKEY ts = tsCol[rowId];
- pFillInfo->nextRowKey = ts;
- SResultRowData tmpNextRow = {.key = ts};
- tmpNextRow.pRowVal = taosMemoryCalloc(1, rowSize);
- transBlockToResultRow(pBlock, rowId, ts, &tmpNextRow);
- keepResultInDiscBuf(pOperator, groupId, &tmpNextRow, rowSize);
- taosMemoryFreeClear(tmpNextRow.pRowVal);
-}
-
-static void doFillResults(SOperatorInfo* pOperator, SStreamFillSupporter* pFillSup, SStreamFillInfo* pFillInfo,
- SSDataBlock* pBlock, TSKEY* tsCol, int32_t rowId, SSDataBlock* pRes) {
- uint64_t groupId = pBlock->info.groupId;
- getWindowFromDiscBuf(pOperator, tsCol[rowId], groupId, pFillSup);
- if (pFillSup->prev.key == pFillInfo->preRowKey) {
- resetFillWindow(&pFillSup->prev);
- }
- setFillValueInfo(pBlock, tsCol[rowId], rowId, pFillSup, pFillInfo);
- doStreamFillRange(pFillInfo, pFillSup, pRes);
-}
-
-static void doStreamFillImpl(SOperatorInfo* pOperator) {
- SStreamFillOperatorInfo* pInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- SStreamFillSupporter* pFillSup = pInfo->pFillSup;
- SStreamFillInfo* pFillInfo = pInfo->pFillInfo;
- SSDataBlock* pBlock = pInfo->pSrcBlock;
- uint64_t groupId = pBlock->info.groupId;
- SSDataBlock* pRes = pInfo->pRes;
- pRes->info.groupId = groupId;
- if (hasRemainCalc(pFillInfo)) {
- doStreamFillRange(pFillInfo, pFillSup, pRes);
- }
-
- SColumnInfoData* pTsCol = taosArrayGet(pInfo->pSrcBlock->pDataBlock, pInfo->primaryTsCol);
- TSKEY* tsCol = (TSKEY*)pTsCol->pData;
-
- if (pInfo->srcRowIndex == 0) {
- keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize);
- SSDataBlock* preBlock = pInfo->pPrevSrcBlock;
- if (preBlock->info.rows > 0) {
- int preRowId = preBlock->info.rows - 1;
- SColumnInfoData* pPreTsCol = taosArrayGet(preBlock->pDataBlock, pInfo->primaryTsCol);
- doFillResults(pOperator, pFillSup, pFillInfo, preBlock, (TSKEY*)pPreTsCol->pData, preRowId, pRes);
- }
- pInfo->srcRowIndex++;
- }
-
- while (pInfo->srcRowIndex < pBlock->info.rows) {
- TSKEY ts = tsCol[pInfo->srcRowIndex];
- keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize);
- doFillResults(pOperator, pFillSup, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex - 1, pRes);
- if (pInfo->pRes->info.rows == pInfo->pRes->info.capacity) {
- blockDataUpdateTsWindow(pRes, pInfo->primaryTsCol);
- return;
- }
- pInfo->srcRowIndex++;
- }
- blockDataUpdateTsWindow(pRes, pInfo->primaryTsCol);
- blockDataCleanup(pInfo->pPrevSrcBlock);
- copyDataBlock(pInfo->pPrevSrcBlock, pInfo->pSrcBlock);
- blockDataCleanup(pInfo->pSrcBlock);
-}
-
-static void buildDeleteRange(TSKEY start, TSKEY end, uint64_t groupId, SSDataBlock* delRes) {
- SSDataBlock* pBlock = delRes;
- SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
- SColumnInfoData* pEndCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX);
- SColumnInfoData* pUidCol = taosArrayGet(pBlock->pDataBlock, UID_COLUMN_INDEX);
- SColumnInfoData* pGroupCol = 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);
- colDataAppend(pStartCol, pBlock->info.rows, (const char*)&start, false);
- colDataAppend(pEndCol, pBlock->info.rows, (const char*)&end, false);
- colDataAppendNULL(pUidCol, pBlock->info.rows);
- colDataAppend(pGroupCol, pBlock->info.rows, (const char*)&groupId, false);
- colDataAppendNULL(pCalStartCol, pBlock->info.rows);
- colDataAppendNULL(pCalEndCol, pBlock->info.rows);
- pBlock->info.rows++;
-}
-
-static void buildDeleteResult(SStreamFillSupporter* pFillSup, TSKEY startTs, TSKEY endTs, uint64_t groupId,
- SSDataBlock* delRes) {
- if (hasPrevWindow(pFillSup)) {
- TSKEY start = getNextWindowTs(pFillSup->prev.key, &pFillSup->interval);
- buildDeleteRange(start, endTs, groupId, delRes);
- } else if (hasNextWindow(pFillSup)) {
- TSKEY end = getPrevWindowTs(pFillSup->next.key, &pFillSup->interval);
- buildDeleteRange(startTs, end, groupId, delRes);
- } else {
- buildDeleteRange(startTs, endTs, groupId, delRes);
- }
-}
-
-static void doDeleteFillResultImpl(SOperatorInfo* pOperator, TSKEY startTs, TSKEY endTs, uint64_t groupId) {
- SStreamFillOperatorInfo* pInfo = pOperator->info;
- getWindowFromDiscBuf(pOperator, startTs, groupId, pInfo->pFillSup);
- setDeleteFillValueInfo(startTs, endTs, pInfo->pFillSup, pInfo->pFillInfo);
- SWinKey key = {.ts = startTs, .groupId = groupId};
- if (!pInfo->pFillInfo->needFill) {
- streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &key);
- buildDeleteResult(pInfo->pFillSup, startTs, endTs, groupId, pInfo->pDelRes);
- } else {
- STimeRange tw = {
- .skey = startTs,
- .ekey = endTs,
- .groupId = groupId,
- };
- taosArrayPush(pInfo->pFillInfo->delRanges, &tw);
- while (key.ts <= endTs) {
- key.ts = taosTimeAdd(key.ts, pInfo->pFillSup->interval.sliding, pInfo->pFillSup->interval.slidingUnit,
- pInfo->pFillSup->interval.precision);
- tSimpleHashPut(pInfo->pFillSup->pResMap, &key, sizeof(SWinKey), NULL, 0);
- }
- }
-}
-
-static void doDeleteFillFinalize(SOperatorInfo* pOperator) {
- SStreamFillOperatorInfo* pInfo = pOperator->info;
- SStreamFillInfo* pFillInfo = pInfo->pFillInfo;
- int32_t size = taosArrayGetSize(pFillInfo->delRanges);
- tSimpleHashClear(pInfo->pFillSup->pResMap);
- for (; pFillInfo->delIndex < size; pFillInfo->delIndex++) {
- STimeRange* range = taosArrayGet(pFillInfo->delRanges, pFillInfo->delIndex);
- if (pInfo->pRes->info.groupId != 0 && pInfo->pRes->info.groupId != range->groupId) {
- return;
- }
- getWindowFromDiscBuf(pOperator, range->skey, range->groupId, pInfo->pFillSup);
- setDeleteFillValueInfo(range->skey, range->ekey, pInfo->pFillSup, pInfo->pFillInfo);
- if (pInfo->pFillInfo->needFill) {
- doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes);
- pInfo->pRes->info.groupId = range->groupId;
- }
- SWinKey key = {.ts = range->skey, .groupId = range->groupId};
- streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &key);
- }
-}
-
-static void doDeleteFillResult(SOperatorInfo* pOperator) {
- SStreamFillOperatorInfo* pInfo = pOperator->info;
- SStreamFillSupporter* pFillSup = pInfo->pFillSup;
- SStreamFillInfo* pFillInfo = pInfo->pFillInfo;
- SSDataBlock* pBlock = pInfo->pSrcDelBlock;
- SSDataBlock* pRes = pInfo->pRes;
- SSDataBlock* pDelRes = pInfo->pDelRes;
-
- SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
- TSKEY* tsStarts = (TSKEY*)pStartCol->pData;
- SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
- uint64_t* groupIds = (uint64_t*)pGroupCol->pData;
- while (pInfo->srcDelRowIndex < pBlock->info.rows) {
- TSKEY ts = tsStarts[pInfo->srcDelRowIndex];
- TSKEY endTs = ts;
- uint64_t groupId = groupIds[pInfo->srcDelRowIndex];
- SWinKey key = {.ts = ts, .groupId = groupId};
- SStreamStateCur* pCur = streamStateGetAndCheckCur(pOperator->pTaskInfo->streamInfo.pState, &key);
- if (!pCur) {
- pInfo->srcDelRowIndex++;
- continue;
- }
-
- SWinKey nextKey = {.groupId = groupId, .ts = ts};
- while (pInfo->srcDelRowIndex < pBlock->info.rows) {
- void* nextVal = NULL;
- int32_t nextLen = 0;
- TSKEY delTs = tsStarts[pInfo->srcDelRowIndex];
- uint64_t delGroupId = groupIds[pInfo->srcDelRowIndex];
- int32_t code = TSDB_CODE_SUCCESS;
- if (groupId != delGroupId) {
- break;
- }
- if (delTs > nextKey.ts) {
- break;
- }
- endTs = delTs;
- SWinKey delKey = {.groupId = delGroupId, .ts = delTs};
- if (delTs == nextKey.ts) {
- code = streamStateCurNext(pOperator->pTaskInfo->streamInfo.pState, pCur);
- if (code == TSDB_CODE_SUCCESS) {
- code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextLen);
- }
- if (delTs != ts) {
- streamStateFillDel(pOperator->pTaskInfo->streamInfo.pState, &delKey);
- }
- if (code != TSDB_CODE_SUCCESS) {
- break;
- }
- }
- pInfo->srcDelRowIndex++;
- }
- streamStateFreeCur(pCur);
- doDeleteFillResultImpl(pOperator, ts, endTs, groupId);
- }
- pFillInfo->current = pFillInfo->end + 1;
-}
-
-static void resetStreamFillInfo(SStreamFillOperatorInfo* pInfo) {
- blockDataCleanup(pInfo->pPrevSrcBlock);
- tSimpleHashClear(pInfo->pFillSup->pResMap);
- pInfo->pFillSup->hasDelete = false;
- taosArrayClear(pInfo->pFillInfo->delRanges);
- pInfo->pFillInfo->delIndex = 0;
-}
-
-static void doApplyStreamScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pSrcBlock, SSDataBlock* pDstBlock) {
- SStreamFillOperatorInfo* pInfo = pOperator->info;
- SExprSupp* pSup = &pOperator->exprSupp;
-
- blockDataCleanup(pDstBlock);
- blockDataEnsureCapacity(pDstBlock, pSrcBlock->info.rows);
- setInputDataBlock(pSup, pSrcBlock, TSDB_ORDER_ASC, MAIN_SCAN, false);
- projectApplyFunctions(pSup->pExprInfo, pDstBlock, pSrcBlock, pSup->pCtx, pSup->numOfExprs, NULL);
-
- pDstBlock->info.rows = 0;
- pSup = &pInfo->pFillSup->notFillExprSup;
- setInputDataBlock(pSup, pSrcBlock, TSDB_ORDER_ASC, MAIN_SCAN, false);
- projectApplyFunctions(pSup->pExprInfo, pDstBlock, pSrcBlock, pSup->pCtx, pSup->numOfExprs, NULL);
- pDstBlock->info.groupId = pSrcBlock->info.groupId;
-
- blockDataUpdateTsWindow(pDstBlock, pInfo->primaryTsCol);
-}
-
-static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
- SStreamFillOperatorInfo* pInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- if (pOperator->status == OP_EXEC_DONE) {
- return NULL;
- }
- blockDataCleanup(pInfo->pRes);
- if (pOperator->status == OP_RES_TO_RETURN) {
- if (hasRemainCalc(pInfo->pFillInfo)) {
- doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes);
- if (pInfo->pRes->info.rows > 0) {
- return pInfo->pRes;
- }
- }
- doDeleteFillFinalize(pOperator);
- if (pInfo->pRes->info.rows > 0) {
- printDataBlock(pInfo->pRes, "stream fill");
- return pInfo->pRes;
- }
- setOperatorCompleted(pOperator);
- resetStreamFillInfo(pInfo);
- return NULL;
- }
-
- SSDataBlock* fillResult = NULL;
- SOperatorInfo* downstream = pOperator->pDownstream[0];
- while (1) {
- if (pInfo->srcRowIndex >= pInfo->pSrcBlock->info.rows) {
- // If there are delete datablocks, we receive them first.
- SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
- if (pBlock == NULL) {
- pOperator->status = OP_RES_TO_RETURN;
- SSDataBlock* preBlock = pInfo->pPrevSrcBlock;
- if (preBlock->info.rows > 0) {
- int preRowId = preBlock->info.rows - 1;
- SColumnInfoData* pPreTsCol = taosArrayGet(preBlock->pDataBlock, pInfo->primaryTsCol);
- doFillResults(pOperator, pInfo->pFillSup, pInfo->pFillInfo, preBlock, (TSKEY*)pPreTsCol->pData, preRowId,
- pInfo->pRes);
- }
- pInfo->pFillInfo->preRowKey = INT64_MIN;
- if (pInfo->pRes->info.rows > 0) {
- printDataBlock(pInfo->pRes, "stream fill");
- return pInfo->pRes;
- }
- break;
- }
- printDataBlock(pBlock, "stream fill recv");
-
- switch (pBlock->info.type) {
- case STREAM_RETRIEVE:
- return pBlock;
- case STREAM_DELETE_RESULT: {
- pInfo->pSrcDelBlock = pBlock;
- pInfo->srcDelRowIndex = 0;
- blockDataCleanup(pInfo->pDelRes);
- pInfo->pFillSup->hasDelete = true;
- doDeleteFillResult(pOperator);
- if (pInfo->pDelRes->info.rows > 0) {
- printDataBlock(pInfo->pDelRes, "stream fill delete");
- return pInfo->pDelRes;
- }
- continue;
- } break;
- case STREAM_NORMAL:
- case STREAM_INVALID: {
- doApplyStreamScalarCalculation(pOperator, pBlock, pInfo->pSrcBlock);
- memcpy(pInfo->pSrcBlock->info.parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
- pInfo->srcRowIndex = 0;
- } break;
- default:
- ASSERT(0);
- break;
- }
- }
-
- doStreamFillImpl(pOperator);
- doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo);
- memcpy(pInfo->pRes->info.parTbName, pInfo->pSrcBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
- pOperator->resultInfo.totalRows += pInfo->pRes->info.rows;
- if (pInfo->pRes->info.rows > 0) {
- break;
- }
- }
- if (pOperator->status == OP_RES_TO_RETURN) {
- doDeleteFillFinalize(pOperator);
- }
-
- if (pInfo->pRes->info.rows == 0) {
- setOperatorCompleted(pOperator);
- resetStreamFillInfo(pInfo);
- return NULL;
- }
-
- pOperator->resultInfo.totalRows += pInfo->pRes->info.rows;
- printDataBlock(pInfo->pRes, "stream fill");
- return pInfo->pRes;
-}
-
-static int32_t initResultBuf(SStreamFillSupporter* pFillSup) {
- pFillSup->rowSize = sizeof(SResultCellData) * pFillSup->numOfAllCols;
- for (int i = 0; i < pFillSup->numOfAllCols; i++) {
- SFillColInfo* pCol = &pFillSup->pAllColInfo[i];
- SResSchema* pSchema = &pCol->pExpr->base.resSchema;
- pFillSup->rowSize += pSchema->bytes;
- }
- pFillSup->next.key = INT64_MIN;
- pFillSup->nextNext.key = INT64_MIN;
- pFillSup->prev.key = INT64_MIN;
- pFillSup->cur.key = INT64_MIN;
- pFillSup->next.pRowVal = NULL;
- pFillSup->nextNext.pRowVal = NULL;
- pFillSup->prev.pRowVal = NULL;
- pFillSup->cur.pRowVal = NULL;
-
- return TSDB_CODE_SUCCESS;
-}
-
-static SStreamFillSupporter* initStreamFillSup(SStreamFillPhysiNode* pPhyFillNode, SInterval* pInterval,
- SExprInfo* pFillExprInfo, int32_t numOfFillCols) {
- SStreamFillSupporter* pFillSup = taosMemoryCalloc(1, sizeof(SStreamFillSupporter));
- if (!pFillSup) {
- return NULL;
- }
- pFillSup->numOfFillCols = numOfFillCols;
- int32_t numOfNotFillCols = 0;
- SExprInfo* noFillExprInfo = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &numOfNotFillCols);
- pFillSup->pAllColInfo = createFillColInfo(pFillExprInfo, pFillSup->numOfFillCols, noFillExprInfo, numOfNotFillCols,
- (const SNodeListNode*)(pPhyFillNode->pValues));
- pFillSup->type = convertFillType(pPhyFillNode->mode);
- pFillSup->numOfAllCols = pFillSup->numOfFillCols + numOfNotFillCols;
- pFillSup->interval = *pInterval;
-
- int32_t code = initResultBuf(pFillSup);
- if (code != TSDB_CODE_SUCCESS) {
- destroyStreamFillSupporter(pFillSup);
- return NULL;
- }
-
- SExprInfo* noFillExpr = createExprInfo(pPhyFillNode->pNotFillExprs, NULL, &numOfNotFillCols);
- code = initExprSupp(&pFillSup->notFillExprSup, noFillExpr, numOfNotFillCols);
- if (code != TSDB_CODE_SUCCESS) {
- destroyStreamFillSupporter(pFillSup);
- return NULL;
- }
-
- _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
- pFillSup->pResMap = tSimpleHashInit(16, hashFn);
- pFillSup->hasDelete = false;
- return pFillSup;
-}
-
-SStreamFillInfo* initStreamFillInfo(SStreamFillSupporter* pFillSup, SSDataBlock* pRes) {
- SStreamFillInfo* pFillInfo = taosMemoryCalloc(1, sizeof(SStreamFillInfo));
- pFillInfo->start = INT64_MIN;
- pFillInfo->current = INT64_MIN;
- pFillInfo->end = INT64_MIN;
- pFillInfo->preRowKey = INT64_MIN;
- pFillInfo->needFill = false;
- pFillInfo->pLinearInfo = taosMemoryCalloc(1, sizeof(SStreamFillLinearInfo));
- pFillInfo->pLinearInfo->hasNext = false;
- pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
- pFillInfo->pLinearInfo->pDeltaVal = NULL;
- pFillInfo->pLinearInfo->pNextDeltaVal = NULL;
- if (pFillSup->type == TSDB_FILL_LINEAR) {
- pFillInfo->pLinearInfo->pDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double));
- pFillInfo->pLinearInfo->pNextDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double));
- for (int32_t i = 0; i < pFillSup->numOfAllCols; i++) {
- double value = 0.0;
- taosArrayPush(pFillInfo->pLinearInfo->pDeltaVal, &value);
- taosArrayPush(pFillInfo->pLinearInfo->pNextDeltaVal, &value);
- }
- }
- pFillInfo->pLinearInfo->winIndex = 0;
-
- pFillInfo->pResRow = NULL;
- if (pFillSup->type == TSDB_FILL_SET_VALUE || pFillSup->type == TSDB_FILL_NULL) {
- pFillInfo->pResRow = taosMemoryCalloc(1, sizeof(SResultRowData));
- pFillInfo->pResRow->key = INT64_MIN;
- pFillInfo->pResRow->pRowVal = taosMemoryCalloc(1, pFillSup->rowSize);
- for (int32_t i = 0; i < pFillSup->numOfAllCols; ++i) {
- SColumnInfoData* pColData = taosArrayGet(pRes->pDataBlock, i);
- SResultCellData* pCell = getResultCell(pFillInfo->pResRow, i);
- pCell->bytes = pColData->info.bytes;
- pCell->type = pColData->info.type;
- }
- }
-
- pFillInfo->type = pFillSup->type;
- pFillInfo->delRanges = taosArrayInit(16, sizeof(STimeRange));
- pFillInfo->delIndex = 0;
- return pFillInfo;
-}
-
-SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFillPhysiNode* pPhyFillNode,
- SExecTaskInfo* pTaskInfo) {
- SStreamFillOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamFillOperatorInfo));
- SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- if (pInfo == NULL || pOperator == NULL) {
- goto _error;
- }
-
- SInterval* pInterval = &((SStreamIntervalOperatorInfo*)downstream->info)->interval;
- int32_t numOfFillCols = 0;
- SExprInfo* pFillExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &numOfFillCols);
- pInfo->pFillSup = initStreamFillSup(pPhyFillNode, pInterval, pFillExprInfo, numOfFillCols);
- if (!pInfo->pFillSup) {
- goto _error;
- }
-
- initResultSizeInfo(&pOperator->resultInfo, 4096);
- pInfo->pRes = createResDataBlock(pPhyFillNode->node.pOutputDataBlockDesc);
- pInfo->pSrcBlock = createResDataBlock(pPhyFillNode->node.pOutputDataBlockDesc);
- pInfo->pPrevSrcBlock = createResDataBlock(pPhyFillNode->node.pOutputDataBlockDesc);
- blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
- blockDataEnsureCapacity(pInfo->pSrcBlock, pOperator->resultInfo.capacity);
- blockDataEnsureCapacity(pInfo->pPrevSrcBlock, pOperator->resultInfo.capacity);
-
- pInfo->pFillInfo = initStreamFillInfo(pInfo->pFillSup, pInfo->pRes);
- if (!pInfo->pFillInfo) {
- goto _error;
- }
-
- if (pInfo->pFillInfo->type == TSDB_FILL_SET_VALUE) {
- for (int32_t i = 0; i < pInfo->pFillSup->numOfAllCols; ++i) {
- SFillColInfo* pFillCol = pInfo->pFillSup->pAllColInfo + i;
- int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
- SResultCellData* pCell = getResultCell(pInfo->pFillInfo->pResRow, slotId);
- SVariant* pVar = &(pFillCol->fillVal);
- if (pCell->type == TSDB_DATA_TYPE_FLOAT) {
- float v = 0;
- GET_TYPED_DATA(v, float, pVar->nType, &pVar->i);
- SET_TYPED_DATA(pCell->pData, pCell->type, v);
- } else if (pCell->type == TSDB_DATA_TYPE_DOUBLE) {
- double v = 0;
- GET_TYPED_DATA(v, double, pVar->nType, &pVar->i);
- SET_TYPED_DATA(pCell->pData, pCell->type, v);
- } else if (IS_SIGNED_NUMERIC_TYPE(pCell->type)) {
- int64_t v = 0;
- GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i);
- SET_TYPED_DATA(pCell->pData, pCell->type, v);
- } else {
- pCell->isNull = true;
- }
- }
- } else if (pInfo->pFillInfo->type == TSDB_FILL_NULL) {
- for (int32_t i = 0; i < pInfo->pFillSup->numOfAllCols; ++i) {
- SFillColInfo* pFillCol = pInfo->pFillSup->pAllColInfo + i;
- int32_t slotId = GET_DEST_SLOT_ID(pFillCol);
- SResultCellData* pCell = getResultCell(pInfo->pFillInfo->pResRow, slotId);
- pCell->isNull = true;
- }
- }
-
- pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
- blockDataEnsureCapacity(pInfo->pDelRes, pOperator->resultInfo.capacity);
-
- pInfo->primaryTsCol = ((STargetNode*)pPhyFillNode->pWStartTs)->slotId;
- pInfo->primarySrcSlotId = ((SColumnNode*)((STargetNode*)pPhyFillNode->pWStartTs)->pExpr)->slotId;
-
- int32_t numOfOutputCols = 0;
- int32_t code = extractColMatchInfo(pPhyFillNode->pFillExprs, pPhyFillNode->node.pOutputDataBlockDesc,
- &numOfOutputCols, COL_MATCH_FROM_SLOT_ID, &pInfo->matchInfo);
-
- code = filterInitFromNode((SNode*)pPhyFillNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- code = initExprSupp(&pOperator->exprSupp, pFillExprInfo, numOfFillCols);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- pInfo->srcRowIndex = 0;
- setOperatorInfo(pOperator, "StreamFillOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL, false, OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doStreamFill, NULL, destroyStreamFillOperatorInfo, NULL);
-
- code = appendDownstream(pOperator, &downstream, 1);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
- return pOperator;
-
-_error:
- destroyStreamFillOperatorInfo(pInfo);
- taosMemoryFreeClear(pOperator);
- pTaskInfo->code = code;
- return NULL;
-}
diff --git a/source/libs/executor/src/timesliceoperator.c b/source/libs/executor/src/timesliceoperator.c
new file mode 100644
index 0000000000000000000000000000000000000000..efc9943b718272815e59ca665e9991c36de1e5c4
--- /dev/null
+++ b/source/libs/executor/src/timesliceoperator.c
@@ -0,0 +1,610 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+#include "executorimpl.h"
+#include "filter.h"
+#include "function.h"
+#include "functionMgt.h"
+#include "tcommon.h"
+#include "tcompare.h"
+#include "tdatablock.h"
+#include "tfill.h"
+#include "ttime.h"
+
+typedef struct STimeSliceOperatorInfo {
+ SSDataBlock* pRes;
+ STimeWindow win;
+ SInterval interval;
+ int64_t current;
+ SArray* pPrevRow; // SArray
+ SArray* pNextRow; // SArray
+ SArray* pLinearInfo; // SArray
+ bool isPrevRowSet;
+ bool isNextRowSet;
+ int32_t fillType; // fill type
+ SColumn tsCol; // primary timestamp column
+ SExprSupp scalarSup; // scalar calculation
+ struct SFillColInfo* pFillColInfo; // fill column info
+} STimeSliceOperatorInfo;
+
+static void destroyTimeSliceOperatorInfo(void* param);
+
+static void doKeepPrevRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex) {
+ int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
+
+ SGroupKeys* pkey = taosArrayGet(pSliceInfo->pPrevRow, i);
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
+ pkey->isNull = false;
+ char* val = colDataGetData(pColInfoData, rowIndex);
+ if (!IS_VAR_DATA_TYPE(pkey->type)) {
+ memcpy(pkey->pData, val, pkey->bytes);
+ } else {
+ memcpy(pkey->pData, val, varDataLen(val));
+ }
+ } else {
+ pkey->isNull = true;
+ }
+ }
+
+ pSliceInfo->isPrevRowSet = true;
+}
+
+static void doKeepNextRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex) {
+ int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
+
+ SGroupKeys* pkey = taosArrayGet(pSliceInfo->pNextRow, i);
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
+ pkey->isNull = false;
+ char* val = colDataGetData(pColInfoData, rowIndex);
+ if (!IS_VAR_DATA_TYPE(pkey->type)) {
+ memcpy(pkey->pData, val, pkey->bytes);
+ } else {
+ memcpy(pkey->pData, val, varDataLen(val));
+ }
+ } else {
+ pkey->isNull = true;
+ }
+ }
+
+ pSliceInfo->isNextRowSet = true;
+}
+
+static void doKeepLinearInfo(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex) {
+ int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
+ SColumnInfoData* pTsCol = taosArrayGet(pBlock->pDataBlock, pSliceInfo->tsCol.slotId);
+ SFillLinearInfo* pLinearInfo = taosArrayGet(pSliceInfo->pLinearInfo, i);
+
+ // null value is represented by using key = INT64_MIN for now.
+ // TODO: optimize to ignore null values for linear interpolation.
+ if (!pLinearInfo->isStartSet) {
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
+ ASSERT(IS_MATHABLE_TYPE(pColInfoData->info.type));
+
+ pLinearInfo->start.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
+ char* p = colDataGetData(pColInfoData, rowIndex);
+ if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
+ ASSERT(varDataTLen(p) <= pColInfoData->info.bytes);
+ memcpy(pLinearInfo->start.val, p, varDataTLen(p));
+ } else {
+ memcpy(pLinearInfo->start.val, p, pLinearInfo->bytes);
+ }
+ }
+ pLinearInfo->isStartSet = true;
+ } else if (!pLinearInfo->isEndSet) {
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
+ pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
+
+ char* p = colDataGetData(pColInfoData, rowIndex);
+ if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
+ ASSERT(varDataTLen(p) <= pColInfoData->info.bytes);
+ memcpy(pLinearInfo->start.val, p, varDataTLen(p));
+ } else {
+ memcpy(pLinearInfo->start.val, p, pLinearInfo->bytes);
+ }
+ }
+ pLinearInfo->isEndSet = true;
+ } else {
+ pLinearInfo->start.key = pLinearInfo->end.key;
+ memcpy(pLinearInfo->start.val, pLinearInfo->end.val, pLinearInfo->bytes);
+
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
+ pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
+
+ char* p = colDataGetData(pColInfoData, rowIndex);
+ if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
+ ASSERT(varDataTLen(p) <= pColInfoData->info.bytes);
+ memcpy(pLinearInfo->start.val, p, varDataTLen(p));
+ } else {
+ memcpy(pLinearInfo->start.val, p, pLinearInfo->bytes);
+ }
+
+ } else {
+ pLinearInfo->end.key = INT64_MIN;
+ }
+ }
+ }
+
+}
+
+static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp* pExprSup, SSDataBlock* pResBlock, bool beforeTs) {
+ int32_t rows = pResBlock->info.rows;
+ blockDataEnsureCapacity(pResBlock, rows + 1);
+ // todo set the correct primary timestamp column
+
+ // output the result
+ bool hasInterp = true;
+ for (int32_t j = 0; j < pExprSup->numOfExprs; ++j) {
+ SExprInfo* pExprInfo = &pExprSup->pExprInfo[j];
+
+ int32_t dstSlot = pExprInfo->base.resSchema.slotId;
+ SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot);
+
+ if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) {
+ colDataAppend(pDst, rows, (char*)&pSliceInfo->current, false);
+ continue;
+ }
+
+ int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
+ switch (pSliceInfo->fillType) {
+ case TSDB_FILL_NULL: {
+ colDataAppendNULL(pDst, rows);
+ break;
+ }
+
+ case TSDB_FILL_SET_VALUE: {
+ SVariant* pVar = &pSliceInfo->pFillColInfo[j].fillVal;
+
+ if (pDst->info.type == TSDB_DATA_TYPE_FLOAT) {
+ float v = 0;
+ GET_TYPED_DATA(v, float, pVar->nType, &pVar->i);
+ colDataAppend(pDst, rows, (char*)&v, false);
+ } else if (pDst->info.type == TSDB_DATA_TYPE_DOUBLE) {
+ double v = 0;
+ GET_TYPED_DATA(v, double, pVar->nType, &pVar->i);
+ colDataAppend(pDst, rows, (char*)&v, false);
+ } else if (IS_SIGNED_NUMERIC_TYPE(pDst->info.type)) {
+ int64_t v = 0;
+ GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i);
+ colDataAppend(pDst, rows, (char*)&v, false);
+ }
+ break;
+ }
+
+ case TSDB_FILL_LINEAR: {
+ SFillLinearInfo* pLinearInfo = taosArrayGet(pSliceInfo->pLinearInfo, srcSlot);
+
+ SPoint start = pLinearInfo->start;
+ SPoint end = pLinearInfo->end;
+ SPoint current = {.key = pSliceInfo->current};
+
+ // do not interpolate before ts range, only increate pSliceInfo->current
+ if (beforeTs && !pLinearInfo->isEndSet) {
+ return true;
+ }
+
+ if (!pLinearInfo->isStartSet || !pLinearInfo->isEndSet) {
+ hasInterp = false;
+ break;
+ }
+
+ if (start.key == INT64_MIN || end.key == INT64_MIN) {
+ colDataAppendNULL(pDst, rows);
+ break;
+ }
+
+ current.val = taosMemoryCalloc(pLinearInfo->bytes, 1);
+ taosGetLinearInterpolationVal(¤t, pLinearInfo->type, &start, &end, pLinearInfo->type);
+ colDataAppend(pDst, rows, (char*)current.val, false);
+
+ taosMemoryFree(current.val);
+ break;
+ }
+ case TSDB_FILL_PREV: {
+ if (!pSliceInfo->isPrevRowSet) {
+ hasInterp = false;
+ break;
+ }
+
+ SGroupKeys* pkey = taosArrayGet(pSliceInfo->pPrevRow, srcSlot);
+ if (pkey->isNull == false) {
+ colDataAppend(pDst, rows, pkey->pData, false);
+ } else {
+ colDataAppendNULL(pDst, rows);
+ }
+ break;
+ }
+
+ case TSDB_FILL_NEXT: {
+ if (!pSliceInfo->isNextRowSet) {
+ hasInterp = false;
+ break;
+ }
+
+ SGroupKeys* pkey = taosArrayGet(pSliceInfo->pNextRow, srcSlot);
+ if (pkey->isNull == false) {
+ colDataAppend(pDst, rows, pkey->pData, false);
+ } else {
+ colDataAppendNULL(pDst, rows);
+ }
+ break;
+ }
+
+ case TSDB_FILL_NONE:
+ default:
+ break;
+ }
+ }
+
+ if (hasInterp) {
+ pResBlock->info.rows += 1;
+ }
+
+ return hasInterp;
+}
+
+static void addCurrentRowToResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp* pExprSup, SSDataBlock* pResBlock,
+ SSDataBlock* pSrcBlock, int32_t index) {
+ blockDataEnsureCapacity(pResBlock, pResBlock->info.rows + 1);
+ for (int32_t j = 0; j < pExprSup->numOfExprs; ++j) {
+ SExprInfo* pExprInfo = &pExprSup->pExprInfo[j];
+
+ int32_t dstSlot = pExprInfo->base.resSchema.slotId;
+ SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot);
+
+ if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) {
+ colDataAppend(pDst, pResBlock->info.rows, (char*)&pSliceInfo->current, false);
+ } else {
+ int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
+ SColumnInfoData* pSrc = taosArrayGet(pSrcBlock->pDataBlock, srcSlot);
+
+ if (colDataIsNull_s(pSrc, index)) {
+ colDataAppendNULL(pDst, pResBlock->info.rows);
+ continue;
+ }
+
+ char* v = colDataGetData(pSrc, index);
+ colDataAppend(pDst, pResBlock->info.rows, v, false);
+ }
+ }
+
+ pResBlock->info.rows += 1;
+ return;
+}
+
+
+static int32_t initPrevRowsKeeper(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
+ if (pInfo->pPrevRow != NULL) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ pInfo->pPrevRow = taosArrayInit(4, sizeof(SGroupKeys));
+ if (pInfo->pPrevRow == NULL) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
+ int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, i);
+
+ SGroupKeys key = {0};
+ key.bytes = pColInfo->info.bytes;
+ key.type = pColInfo->info.type;
+ key.isNull = false;
+ key.pData = taosMemoryCalloc(1, pColInfo->info.bytes);
+ taosArrayPush(pInfo->pPrevRow, &key);
+ }
+
+ pInfo->isPrevRowSet = false;
+
+ return TSDB_CODE_SUCCESS;
+}
+
+static int32_t initNextRowsKeeper(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
+ if (pInfo->pNextRow != NULL) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ pInfo->pNextRow = taosArrayInit(4, sizeof(SGroupKeys));
+ if (pInfo->pNextRow == NULL) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
+ int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, i);
+
+ SGroupKeys key = {0};
+ key.bytes = pColInfo->info.bytes;
+ key.type = pColInfo->info.type;
+ key.isNull = false;
+ key.pData = taosMemoryCalloc(1, pColInfo->info.bytes);
+ taosArrayPush(pInfo->pNextRow, &key);
+ }
+
+ pInfo->isNextRowSet = false;
+
+ return TSDB_CODE_SUCCESS;
+}
+
+static int32_t initFillLinearInfo(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
+ if (pInfo->pLinearInfo != NULL) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ pInfo->pLinearInfo = taosArrayInit(4, sizeof(SFillLinearInfo));
+ if (pInfo->pLinearInfo == NULL) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
+ int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, i);
+
+ SFillLinearInfo linearInfo = {0};
+ linearInfo.start.key = INT64_MIN;
+ linearInfo.end.key = INT64_MIN;
+ linearInfo.start.val = taosMemoryCalloc(1, pColInfo->info.bytes);
+ linearInfo.end.val = taosMemoryCalloc(1, pColInfo->info.bytes);
+ linearInfo.isStartSet = false;
+ linearInfo.isEndSet = false;
+ linearInfo.type = pColInfo->info.type;
+ linearInfo.bytes = pColInfo->info.bytes;
+ taosArrayPush(pInfo->pLinearInfo, &linearInfo);
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+static int32_t initKeeperInfo(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
+ int32_t code;
+ code = initPrevRowsKeeper(pInfo, pBlock);
+ if (code != TSDB_CODE_SUCCESS) {
+ return TSDB_CODE_FAILED;
+ }
+
+ code = initNextRowsKeeper(pInfo, pBlock);
+ if (code != TSDB_CODE_SUCCESS) {
+ return TSDB_CODE_FAILED;
+ }
+
+ code = initFillLinearInfo(pInfo, pBlock);
+ if (code != TSDB_CODE_SUCCESS) {
+ return TSDB_CODE_FAILED;
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
+
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ STimeSliceOperatorInfo* pSliceInfo = pOperator->info;
+ SSDataBlock* pResBlock = pSliceInfo->pRes;
+ SExprSupp* pSup = &pOperator->exprSupp;
+
+ int32_t order = TSDB_ORDER_ASC;
+ SInterval* pInterval = &pSliceInfo->interval;
+ SOperatorInfo* downstream = pOperator->pDownstream[0];
+
+ blockDataCleanup(pResBlock);
+
+ while (1) {
+ SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
+ if (pBlock == NULL) {
+ break;
+ }
+
+ int32_t code = initKeeperInfo(pSliceInfo, pBlock);
+ if (code != TSDB_CODE_SUCCESS) {
+ T_LONG_JMP(pTaskInfo->env, code);
+ }
+
+ // the pDataBlock are always the same one, no need to call this again
+ setInputDataBlock(pSup, pBlock, order, MAIN_SCAN, true);
+
+ SColumnInfoData* pTsCol = taosArrayGet(pBlock->pDataBlock, pSliceInfo->tsCol.slotId);
+ for (int32_t i = 0; i < pBlock->info.rows; ++i) {
+ int64_t ts = *(int64_t*)colDataGetData(pTsCol, i);
+
+ if (pSliceInfo->current > pSliceInfo->win.ekey) {
+ setOperatorCompleted(pOperator);
+ break;
+ }
+
+ if (ts == pSliceInfo->current) {
+ addCurrentRowToResult(pSliceInfo, &pOperator->exprSupp, pResBlock, pBlock, i);
+
+ doKeepPrevRows(pSliceInfo, pBlock, i);
+ doKeepLinearInfo(pSliceInfo, pBlock, i);
+
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ if (pSliceInfo->current > pSliceInfo->win.ekey) {
+ setOperatorCompleted(pOperator);
+ break;
+ }
+ } else if (ts < pSliceInfo->current) {
+ // in case of interpolation window starts and ends between two datapoints, fill(prev) need to interpolate
+ doKeepPrevRows(pSliceInfo, pBlock, i);
+ doKeepLinearInfo(pSliceInfo, pBlock, i);
+
+ if (i < pBlock->info.rows - 1) {
+ // in case of interpolation window starts and ends between two datapoints, fill(next) need to interpolate
+ doKeepNextRows(pSliceInfo, pBlock, i + 1);
+ int64_t nextTs = *(int64_t*)colDataGetData(pTsCol, i + 1);
+ if (nextTs > pSliceInfo->current) {
+ while (pSliceInfo->current < nextTs && pSliceInfo->current <= pSliceInfo->win.ekey) {
+ if (!genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, false) && pSliceInfo->fillType == TSDB_FILL_LINEAR) {
+ break;
+ } else {
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ }
+ }
+
+ if (pSliceInfo->current > pSliceInfo->win.ekey) {
+ setOperatorCompleted(pOperator);
+ break;
+ }
+ } else {
+ // ignore current row, and do nothing
+ }
+ } else { // it is the last row of current block
+ doKeepPrevRows(pSliceInfo, pBlock, i);
+ }
+ } else { // ts > pSliceInfo->current
+ // in case of interpolation window starts and ends between two datapoints, fill(next) need to interpolate
+ doKeepNextRows(pSliceInfo, pBlock, i);
+ doKeepLinearInfo(pSliceInfo, pBlock, i);
+
+ while (pSliceInfo->current < ts && pSliceInfo->current <= pSliceInfo->win.ekey) {
+ if (!genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, true) && pSliceInfo->fillType == TSDB_FILL_LINEAR) {
+ break;
+ } else {
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ }
+ }
+
+ // add current row if timestamp match
+ if (ts == pSliceInfo->current && pSliceInfo->current <= pSliceInfo->win.ekey) {
+ addCurrentRowToResult(pSliceInfo, &pOperator->exprSupp, pResBlock, pBlock, i);
+
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ }
+ doKeepPrevRows(pSliceInfo, pBlock, i);
+
+ if (pSliceInfo->current > pSliceInfo->win.ekey) {
+ setOperatorCompleted(pOperator);
+ break;
+ }
+ }
+ }
+ }
+
+ // check if need to interpolate after last datablock
+ // except for fill(next), fill(linear)
+ while (pSliceInfo->current <= pSliceInfo->win.ekey && pSliceInfo->fillType != TSDB_FILL_NEXT &&
+ pSliceInfo->fillType != TSDB_FILL_LINEAR) {
+ genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, false);
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ }
+
+ // restore the value
+ setTaskStatus(pOperator->pTaskInfo, TASK_COMPLETED);
+ if (pResBlock->info.rows == 0) {
+ pOperator->status = OP_EXEC_DONE;
+ }
+
+ return pResBlock->info.rows == 0 ? NULL : pResBlock;
+}
+
+SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo) {
+ STimeSliceOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(STimeSliceOperatorInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ if (pOperator == NULL || pInfo == NULL) {
+ goto _error;
+ }
+
+ SInterpFuncPhysiNode* pInterpPhyNode = (SInterpFuncPhysiNode*)pPhyNode;
+ SExprSupp* pSup = &pOperator->exprSupp;
+
+ int32_t numOfExprs = 0;
+ SExprInfo* pExprInfo = createExprInfo(pInterpPhyNode->pFuncs, NULL, &numOfExprs);
+ int32_t code = initExprSupp(pSup, pExprInfo, numOfExprs);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ if (pInterpPhyNode->pExprs != NULL) {
+ int32_t num = 0;
+ SExprInfo* pScalarExprInfo = createExprInfo(pInterpPhyNode->pExprs, NULL, &num);
+ code = initExprSupp(&pInfo->scalarSup, pScalarExprInfo, num);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+ }
+
+ pInfo->tsCol = extractColumnFromColumnNode((SColumnNode*)pInterpPhyNode->pTimeSeries);
+ pInfo->fillType = convertFillType(pInterpPhyNode->fillMode);
+ initResultSizeInfo(&pOperator->resultInfo, 4096);
+
+ pInfo->pFillColInfo = createFillColInfo(pExprInfo, numOfExprs, NULL, 0, (SNodeListNode*)pInterpPhyNode->pFillValues);
+ pInfo->pLinearInfo = NULL;
+ pInfo->pRes = createDataBlockFromDescNode(pPhyNode->pOutputDataBlockDesc);
+ pInfo->win = pInterpPhyNode->timeRange;
+ pInfo->interval.interval = pInterpPhyNode->interval;
+ pInfo->current = pInfo->win.skey;
+
+ if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
+ STableScanInfo* pScanInfo = (STableScanInfo*)downstream->info;
+ pScanInfo->base.cond.twindows = pInfo->win;
+ pScanInfo->base.cond.type = TIMEWINDOW_RANGE_EXTERNAL;
+ }
+
+ setOperatorInfo(pOperator, "TimeSliceOperator", QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doTimeslice, NULL, destroyTimeSliceOperatorInfo, optrDefaultBufFn, NULL);
+
+ blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
+
+ code = appendDownstream(pOperator, &downstream, 1);
+ return pOperator;
+
+ _error:
+ taosMemoryFree(pInfo);
+ taosMemoryFree(pOperator);
+ pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
+ return NULL;
+}
+
+void destroyTimeSliceOperatorInfo(void* param) {
+ STimeSliceOperatorInfo* pInfo = (STimeSliceOperatorInfo*)param;
+
+ pInfo->pRes = blockDataDestroy(pInfo->pRes);
+
+ for (int32_t i = 0; i < taosArrayGetSize(pInfo->pPrevRow); ++i) {
+ SGroupKeys* pKey = taosArrayGet(pInfo->pPrevRow, i);
+ taosMemoryFree(pKey->pData);
+ }
+ taosArrayDestroy(pInfo->pPrevRow);
+
+ for (int32_t i = 0; i < taosArrayGetSize(pInfo->pNextRow); ++i) {
+ SGroupKeys* pKey = taosArrayGet(pInfo->pNextRow, i);
+ taosMemoryFree(pKey->pData);
+ }
+ taosArrayDestroy(pInfo->pNextRow);
+
+ for (int32_t i = 0; i < taosArrayGetSize(pInfo->pLinearInfo); ++i) {
+ SFillLinearInfo* pKey = taosArrayGet(pInfo->pLinearInfo, i);
+ taosMemoryFree(pKey->start.val);
+ taosMemoryFree(pKey->end.val);
+ }
+ taosArrayDestroy(pInfo->pLinearInfo);
+
+ taosMemoryFree(pInfo->pFillColInfo);
+ taosMemoryFreeClear(param);
+}
diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c
index dd02ce9cd443350cad61bf801af01d5333ed186c..2af551b832e9c28badfa455bf4f7f8cb13f3d288 100644
--- a/source/libs/executor/src/timewindowoperator.c
+++ b/source/libs/executor/src/timewindowoperator.c
@@ -22,16 +22,42 @@
#include "tfill.h"
#include "ttime.h"
+#define IS_FINAL_OP(op) ((op)->isFinal)
+#define DEAULT_DELETE_MARK (1000LL * 60LL * 60LL * 24LL * 365LL * 10LL);
+
+typedef struct SSessionAggOperatorInfo {
+ SOptrBasicInfo binfo;
+ SAggSupporter aggSup;
+ SGroupResInfo groupResInfo;
+ SWindowRowsSup winSup;
+ bool reptScan; // next round scan
+ int64_t gap; // session window gap
+ int32_t tsSlotId; // primary timestamp slot id
+ STimeWindowAggSupp twAggSup;
+} SSessionAggOperatorInfo;
+
+typedef struct SStateWindowOperatorInfo {
+ SOptrBasicInfo binfo;
+ SAggSupporter aggSup;
+ SExprSupp scalarSup;
+ SGroupResInfo groupResInfo;
+ SWindowRowsSup winSup;
+ SColumn stateCol; // start row index
+ bool hasKey;
+ SStateKeys stateKey;
+ int32_t tsSlotId; // primary timestamp column slot id
+ STimeWindowAggSupp twAggSup;
+} SStateWindowOperatorInfo;
+
typedef enum SResultTsInterpType {
RESULT_ROW_START_INTERP = 1,
RESULT_ROW_END_INTERP = 2,
} SResultTsInterpType;
-#define IS_FINAL_OP(op) ((op)->isFinal)
-
typedef struct SPullWindowInfo {
STimeWindow window;
uint64_t groupId;
+ STimeWindow calWin;
} SPullWindowInfo;
typedef struct SOpenWindowInfo {
@@ -624,14 +650,14 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num
int32_t ret = setTimeWindowOutputBuf(pResultRowInfo, &w, (scanFlag == MAIN_SCAN), &pResult, groupId, pSup->pCtx,
numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
ASSERT(!isResultRowInterpolated(pResult, RESULT_ROW_END_INTERP));
SGroupKeys* pTsKey = taosArrayGet(pInfo->pPrevValues, 0);
int64_t prevTs = *(int64_t*)pTsKey->pData;
- if (groupId == pBlock->info.groupId) {
+ if (groupId == pBlock->info.id.groupId) {
doTimeWindowInterpolation(pInfo->pPrevValues, pBlock->pDataBlock, prevTs, -1, tsCols[startPos], startPos, w.ekey,
RESULT_ROW_END_INTERP, pSup);
}
@@ -640,7 +666,7 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num
setNotInterpoWindowKey(pSup->pCtx, numOfExprs, RESULT_ROW_START_INTERP);
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &w, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, 0, pBlock->info.rows,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, 0, pBlock->info.rows,
numOfExprs);
if (isResultRowInterpolated(pResult, RESULT_ROW_END_INTERP)) {
@@ -653,16 +679,6 @@ static void doInterpUnclosedTimeWindow(SOperatorInfo* pOperatorInfo, int32_t num
}
}
-void printDataBlock(SSDataBlock* pBlock, const char* flag) {
- if (!pBlock || pBlock->info.rows == 0) {
- qDebug("===stream===printDataBlock: Block is Null or Empty");
- return;
- }
- char* pBuf = NULL;
- qDebug("%s", dumpBlockData(pBlock, flag, &pBuf));
- taosMemoryFree(pBuf);
-}
-
typedef int32_t (*__compare_fn_t)(void* pKey, void* data, int32_t index);
int32_t binarySearchCom(void* keyList, int num, void* pKey, int order, __compare_fn_t comparefn) {
@@ -779,17 +795,18 @@ int32_t comparePullWinKey(void* pKey, void* data, int32_t index) {
SArray* res = (SArray*)data;
SPullWindowInfo* pos = taosArrayGet(res, index);
SPullWindowInfo* pData = (SPullWindowInfo*)pKey;
- if (pData->window.skey == pos->window.skey) {
- if (pData->groupId > pos->groupId) {
- return 1;
- } else if (pData->groupId < pos->groupId) {
- return -1;
- }
- return 0;
- } else if (pData->window.skey > pos->window.skey) {
+ if (pData->groupId > pos->groupId) {
return 1;
+ } else if (pData->groupId < pos->groupId) {
+ return -1;
}
- return -1;
+
+ if (pData->window.skey > pos->window.ekey) {
+ return 1;
+ } else if (pData->window.ekey < pos->window.skey) {
+ return -1;
+ }
+ return 0;
}
static int32_t savePullWindow(SPullWindowInfo* pPullInfo, SArray* pPullWins) {
@@ -798,10 +815,16 @@ static int32_t savePullWindow(SPullWindowInfo* pPullInfo, SArray* pPullWins) {
if (index == -1) {
index = 0;
} else {
- if (comparePullWinKey(pPullInfo, pPullWins, index) > 0) {
- index++;
- } else {
+ int32_t code = comparePullWinKey(pPullInfo, pPullWins, index);
+ if (code == 0) {
+ SPullWindowInfo* pos = taosArrayGet(pPullWins ,index);
+ pos->window.skey = TMIN(pos->window.skey, pPullInfo->window.skey);
+ pos->window.ekey = TMAX(pos->window.ekey, pPullInfo->window.ekey);
+ pos->calWin.skey = TMIN(pos->calWin.skey, pPullInfo->calWin.skey);
+ pos->calWin.ekey = TMAX(pos->calWin.ekey, pPullInfo->calWin.ekey);
return TSDB_CODE_SUCCESS;
+ } else if (code > 0 ){
+ index++;
}
}
if (taosArrayInsert(pPullWins, index, pPullInfo) == NULL) {
@@ -849,19 +872,20 @@ static void removeResults(SArray* pWins, SHashObj* pUpdatedMap) {
int32_t compareWinRes(void* pKey, void* data, int32_t index) {
SArray* res = (SArray*)data;
- SWinKey* pos = taosArrayGet(res, index);
- SResKeyPos* pData = (SResKeyPos*)pKey;
- if (*(int64_t*)pData->key == pos->ts) {
- if (pData->groupId > pos->groupId) {
- return 1;
- } else if (pData->groupId < pos->groupId) {
- return -1;
- }
- return 0;
- } else if (*(int64_t*)pData->key > pos->ts) {
+ SWinKey* pDataPos = taosArrayGet(res, index);
+ SResKeyPos* pRKey = (SResKeyPos*)pKey;
+ if (pRKey->groupId > pDataPos->groupId) {
return 1;
+ } else if (pRKey->groupId < pDataPos->groupId) {
+ return -1;
}
- return -1;
+
+ if (*(int64_t*)pRKey->key > pDataPos->ts) {
+ return 1;
+ } else if (*(int64_t*)pRKey->key < pDataPos->ts){
+ return -1;
+ }
+ return 0;
}
static void removeDeleteResults(SHashObj* pUpdatedMap, SArray* pDelWins) {
@@ -903,7 +927,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
int32_t startPos = 0;
int32_t numOfOutput = pSup->numOfExprs;
int64_t* tsCols = extractTsCol(pBlock, pInfo);
- uint64_t tableGroupId = pBlock->info.groupId;
+ uint64_t tableGroupId = pBlock->info.id.groupId;
bool ascScan = (pInfo->inputOrder == TSDB_ORDER_ASC);
TSKEY ts = getStartTsKey(&pBlock->info.window, tsCols);
SResultRow* pResult = NULL;
@@ -913,7 +937,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
int32_t ret = setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId,
pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
TSKEY ekey = ascScan ? win.ekey : win.skey;
int32_t forwardRows =
@@ -929,7 +953,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
ret = setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pSup->pCtx,
numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
// window start key interpolation
@@ -937,7 +961,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
}
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &win, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, pBlock->info.rows,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, pBlock->info.rows,
numOfOutput);
doCloseWindow(pResultRowInfo, pInfo, pResult);
@@ -953,7 +977,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
int32_t code = setTimeWindowOutputBuf(pResultRowInfo, &nextWin, (scanFlag == MAIN_SCAN), &pResult, tableGroupId,
pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
ekey = ascScan ? nextWin.ekey : nextWin.skey;
@@ -972,7 +996,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
}
#endif
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, pBlock->info.rows,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, pBlock->info.rows,
numOfOutput);
doCloseWindow(pResultRowInfo, pInfo, pResult);
}
@@ -1035,14 +1059,14 @@ static int32_t doOpenIntervalAgg(SOperatorInfo* pOperator) {
return TSDB_CODE_SUCCESS;
}
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SOperatorInfo* downstream = pOperator->pDownstream[0];
+
SIntervalAggOperatorInfo* pInfo = pOperator->info;
SExprSupp* pSup = &pOperator->exprSupp;
int32_t scanFlag = MAIN_SCAN;
-
- int64_t st = taosGetTimestampUs();
- SOperatorInfo* downstream = pOperator->pDownstream[0];
+ int64_t st = taosGetTimestampUs();
while (1) {
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
@@ -1088,7 +1112,7 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
SExprSupp* pSup = &pOperator->exprSupp;
SColumnInfoData* pStateColInfoData = taosArrayGet(pBlock->pDataBlock, pInfo->stateCol.slotId);
- int64_t gid = pBlock->info.groupId;
+ int64_t gid = pBlock->info.id.groupId;
bool masterScan = true;
int32_t numOfOutput = pOperator->exprSupp.numOfExprs;
@@ -1136,11 +1160,11 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
int32_t ret = setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &window, masterScan, &pResult, gid, pSup->pCtx,
numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_APP_ERROR);
}
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &window, false);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, pRowSup->startRowIndex,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, pRowSup->startRowIndex,
pRowSup->numOfRows, pBlock->info.rows, numOfOutput);
// here we start a new session window
@@ -1161,11 +1185,11 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
int32_t ret = setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &pRowSup->win, masterScan, &pResult, gid,
pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_APP_ERROR);
}
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pRowSup->win, false);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, pRowSup->startRowIndex, pRowSup->numOfRows,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, pRowSup->startRowIndex, pRowSup->numOfRows,
pBlock->info.rows, numOfOutput);
}
@@ -1254,15 +1278,11 @@ static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) {
}
SSDataBlock* pBlock = pInfo->binfo.pRes;
-
- ASSERT(pInfo->execModel == OPTR_EXEC_MODEL_BATCH);
-
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
return NULL;
}
- blockDataEnsureCapacity(pBlock, pOperator->resultInfo.capacity);
while (1) {
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
@@ -1390,19 +1410,21 @@ static int32_t getAllIntervalWindow(SSHashObj* pHashMap, SHashObj* resWins) {
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) {
+ SWinKey* pDataPos = taosArrayGet(res, index);
+ SWinKey* pWKey = (SWinKey*)pKey;
+
+ if (pWKey->groupId > pDataPos->groupId) {
+ return 1;
+ } else if (pWKey->groupId < pDataPos->groupId) {
+ return -1;
+ }
+
+ if (pWKey->ts > pDataPos->ts) {
return 1;
+ } else if (pWKey->ts < pDataPos->ts) {
+ return -1;
}
- return -1;
+ return 0;
}
static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SInterval* pInterval,
@@ -1635,23 +1657,34 @@ static bool allInvertible(SqlFunctionCtx* pFCtx, int32_t numOfCols) {
static bool timeWindowinterpNeeded(SqlFunctionCtx* pCtx, int32_t numOfCols, SIntervalAggOperatorInfo* pInfo) {
// the primary timestamp column
bool needed = false;
- pInfo->pInterpCols = taosArrayInit(4, sizeof(SColumn));
- pInfo->pPrevValues = taosArrayInit(4, sizeof(SGroupKeys));
- { // ts column
- SColumn c = {0};
- c.colId = 1;
- c.slotId = pInfo->primaryTsIndex;
- c.type = TSDB_DATA_TYPE_TIMESTAMP;
- c.bytes = sizeof(int64_t);
- taosArrayPush(pInfo->pInterpCols, &c);
+ for(int32_t i = 0; i < numOfCols; ++i) {
+ SExprInfo* pExpr = pCtx[i].pExpr;
+ if (fmIsIntervalInterpoFunc(pCtx[i].functionId)) {
+ needed = true;
+ break;
+ }
+ }
+
+ if (needed) {
+ pInfo->pInterpCols = taosArrayInit(4, sizeof(SColumn));
+ pInfo->pPrevValues = taosArrayInit(4, sizeof(SGroupKeys));
- SGroupKeys key = {0};
- key.bytes = c.bytes;
- key.type = c.type;
- key.isNull = true; // to denote no value is assigned yet
- key.pData = taosMemoryCalloc(1, c.bytes);
- taosArrayPush(pInfo->pPrevValues, &key);
+ { // ts column
+ SColumn c = {0};
+ c.colId = 1;
+ c.slotId = pInfo->primaryTsIndex;
+ c.type = TSDB_DATA_TYPE_TIMESTAMP;
+ c.bytes = sizeof(int64_t);
+ taosArrayPush(pInfo->pInterpCols, &c);
+
+ SGroupKeys key;
+ key.bytes = c.bytes;
+ key.type = c.type;
+ key.isNull = true; // to denote no value is assigned yet
+ key.pData = taosMemoryCalloc(1, c.bytes);
+ taosArrayPush(pInfo->pPrevValues, &key);
+ }
}
for (int32_t i = 0; i < numOfCols; ++i) {
@@ -1662,7 +1695,6 @@ static bool timeWindowinterpNeeded(SqlFunctionCtx* pCtx, int32_t numOfCols, SInt
SColumn c = *pParam->pCol;
taosArrayPush(pInfo->pInterpCols, &c);
- needed = true;
SGroupKeys key = {0};
key.bytes = c.bytes;
@@ -1694,7 +1726,7 @@ void initIntervalDownStream(SOperatorInfo* downstream, uint16_t type, SAggSuppor
void initStreamFunciton(SqlFunctionCtx* pCtx, int32_t numOfExpr) {
for (int32_t i = 0; i < numOfExpr; i++) {
- pCtx[i].isStream = true;
+// pCtx[i].isStream = true;
}
}
@@ -1706,18 +1738,19 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SIntervalPh
goto _error;
}
- SSDataBlock* pResBlock = createResDataBlock(pPhyNode->window.node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->window.node.pOutputDataBlockDesc);
initBasicInfo(&pInfo->binfo, pResBlock);
SExprSupp* pSup = &pOperator->exprSupp;
pInfo->primaryTsIndex = ((SColumnNode*)pPhyNode->window.pTspk)->slotId;
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
- initResultSizeInfo(&pOperator->resultInfo, 4096);
+ initResultSizeInfo(&pOperator->resultInfo, 512);
+ blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
int32_t num = 0;
SExprInfo* pExprInfo = createExprInfo(pPhyNode->window.pFuncs, NULL, &num);
- int32_t code = initAggInfo(pSup, &pInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
+ int32_t code = initAggSup(pSup, &pInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -1741,7 +1774,6 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SIntervalPh
pInfo->inputOrder = (pPhyNode->window.inputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
pInfo->resultTsOrder = (pPhyNode->window.outputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
pInfo->interval = interval;
- pInfo->execModel = pTaskInfo->execModel;
pInfo->twAggSup = as;
pInfo->binfo.mergeResultBlock = pPhyNode->window.mergeDataBlock;
@@ -1759,11 +1791,6 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SIntervalPh
goto _error;
}
- if (isStream) {
- ASSERT(num > 0);
- initStreamFunciton(pSup->pCtx, pSup->numOfExprs);
- }
-
initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pInfo->win);
pInfo->timeWindowInterpo = timeWindowinterpNeeded(pSup->pCtx, num, pInfo);
if (pInfo->timeWindowInterpo) {
@@ -1778,7 +1805,7 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SIntervalPh
pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(doOpenIntervalAgg, doBuildIntervalResult, NULL, destroyIntervalOperatorInfo, NULL);
+ createOperatorFpSet(doOpenIntervalAgg, doBuildIntervalResult, NULL, destroyIntervalOperatorInfo, optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -1805,7 +1832,7 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperator
bool masterScan = true;
int32_t numOfOutput = pOperator->exprSupp.numOfExprs;
- int64_t gid = pBlock->info.groupId;
+ int64_t gid = pBlock->info.id.groupId;
int64_t gap = pInfo->gap;
@@ -1840,12 +1867,12 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperator
int32_t ret = setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &window, masterScan, &pResult, gid, pSup->pCtx,
numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_APP_ERROR);
}
// pInfo->numOfRows data belong to the current session window
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &window, false);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, pRowSup->startRowIndex,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, pRowSup->startRowIndex,
pRowSup->numOfRows, pBlock->info.rows, numOfOutput);
// here we start a new session window
@@ -1859,11 +1886,11 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperator
int32_t ret = setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &pRowSup->win, masterScan, &pResult, gid,
pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_APP_ERROR);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_APP_ERROR);
}
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pRowSup->win, false);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, pRowSup->startRowIndex, pRowSup->numOfRows,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, pRowSup->startRowIndex, pRowSup->numOfRows,
pBlock->info.rows, numOfOutput);
}
@@ -1938,552 +1965,6 @@ static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) {
return (pBInfo->pRes->info.rows == 0) ? NULL : pBInfo->pRes;
}
-static void doKeepPrevRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex) {
- int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
-
- SGroupKeys* pkey = taosArrayGet(pSliceInfo->pPrevRow, i);
- if (!colDataIsNull_s(pColInfoData, rowIndex)) {
- pkey->isNull = false;
- char* val = colDataGetData(pColInfoData, rowIndex);
- if (!IS_VAR_DATA_TYPE(pkey->type)) {
- memcpy(pkey->pData, val, pkey->bytes);
- } else {
- memcpy(pkey->pData, val, varDataLen(val));
- }
- } else {
- pkey->isNull = true;
- }
- }
-
- pSliceInfo->isPrevRowSet = true;
-}
-
-static void doKeepNextRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex) {
- int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
-
- SGroupKeys* pkey = taosArrayGet(pSliceInfo->pNextRow, i);
- if (!colDataIsNull_s(pColInfoData, rowIndex)) {
- pkey->isNull = false;
- char* val = colDataGetData(pColInfoData, rowIndex);
- if (!IS_VAR_DATA_TYPE(pkey->type)) {
- memcpy(pkey->pData, val, pkey->bytes);
- } else {
- memcpy(pkey->pData, val, varDataLen(val));
- }
- } else {
- pkey->isNull = true;
- }
- }
-
- pSliceInfo->isNextRowSet = true;
-}
-
-static void doKeepLinearInfo(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex) {
- int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
- SColumnInfoData* pTsCol = taosArrayGet(pBlock->pDataBlock, pSliceInfo->tsCol.slotId);
- SFillLinearInfo* pLinearInfo = taosArrayGet(pSliceInfo->pLinearInfo, i);
-
- // null value is represented by using key = INT64_MIN for now.
- // TODO: optimize to ignore null values for linear interpolation.
- if (!pLinearInfo->isStartSet) {
- if (!colDataIsNull_s(pColInfoData, rowIndex)) {
- pLinearInfo->start.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
- memcpy(pLinearInfo->start.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
- }
- pLinearInfo->isStartSet = true;
- } else if (!pLinearInfo->isEndSet) {
- if (!colDataIsNull_s(pColInfoData, rowIndex)) {
- pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
- memcpy(pLinearInfo->end.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
- }
- pLinearInfo->isEndSet = true;
- } else {
- pLinearInfo->start.key = pLinearInfo->end.key;
- memcpy(pLinearInfo->start.val, pLinearInfo->end.val, pLinearInfo->bytes);
-
- if (!colDataIsNull_s(pColInfoData, rowIndex)) {
- pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
- memcpy(pLinearInfo->end.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
- } else {
- pLinearInfo->end.key = INT64_MIN;
- }
- }
- }
-
-}
-
-static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp* pExprSup, SSDataBlock* pResBlock, bool beforeTs) {
- int32_t rows = pResBlock->info.rows;
- blockDataEnsureCapacity(pResBlock, rows + 1);
- // todo set the correct primary timestamp column
-
- // output the result
- bool hasInterp = true;
- for (int32_t j = 0; j < pExprSup->numOfExprs; ++j) {
- SExprInfo* pExprInfo = &pExprSup->pExprInfo[j];
-
- int32_t dstSlot = pExprInfo->base.resSchema.slotId;
- SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot);
-
- if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) {
- colDataAppend(pDst, rows, (char*)&pSliceInfo->current, false);
- continue;
- }
-
- int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
- switch (pSliceInfo->fillType) {
- case TSDB_FILL_NULL: {
- colDataAppendNULL(pDst, rows);
- break;
- }
-
- case TSDB_FILL_SET_VALUE: {
- SVariant* pVar = &pSliceInfo->pFillColInfo[j].fillVal;
-
- if (pDst->info.type == TSDB_DATA_TYPE_FLOAT) {
- float v = 0;
- GET_TYPED_DATA(v, float, pVar->nType, &pVar->i);
- colDataAppend(pDst, rows, (char*)&v, false);
- } else if (pDst->info.type == TSDB_DATA_TYPE_DOUBLE) {
- double v = 0;
- GET_TYPED_DATA(v, double, pVar->nType, &pVar->i);
- colDataAppend(pDst, rows, (char*)&v, false);
- } else if (IS_SIGNED_NUMERIC_TYPE(pDst->info.type)) {
- int64_t v = 0;
- GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i);
- colDataAppend(pDst, rows, (char*)&v, false);
- }
- break;
- }
-
- case TSDB_FILL_LINEAR: {
- SFillLinearInfo* pLinearInfo = taosArrayGet(pSliceInfo->pLinearInfo, srcSlot);
-
- SPoint start = pLinearInfo->start;
- SPoint end = pLinearInfo->end;
- SPoint current = {.key = pSliceInfo->current};
-
- // do not interpolate before ts range, only increate pSliceInfo->current
- if (beforeTs && !pLinearInfo->isEndSet) {
- return true;
- }
-
- if (!pLinearInfo->isStartSet || !pLinearInfo->isEndSet) {
- hasInterp = false;
- break;
- }
-
- if (start.key == INT64_MIN || end.key == INT64_MIN) {
- colDataAppendNULL(pDst, rows);
- break;
- }
-
- current.val = taosMemoryCalloc(pLinearInfo->bytes, 1);
- taosGetLinearInterpolationVal(¤t, pLinearInfo->type, &start, &end, pLinearInfo->type);
- colDataAppend(pDst, rows, (char*)current.val, false);
-
- taosMemoryFree(current.val);
- break;
- }
- case TSDB_FILL_PREV: {
- if (!pSliceInfo->isPrevRowSet) {
- hasInterp = false;
- break;
- }
-
- SGroupKeys* pkey = taosArrayGet(pSliceInfo->pPrevRow, srcSlot);
- if (pkey->isNull == false) {
- colDataAppend(pDst, rows, pkey->pData, false);
- } else {
- colDataAppendNULL(pDst, rows);
- }
- break;
- }
-
- case TSDB_FILL_NEXT: {
- if (!pSliceInfo->isNextRowSet) {
- hasInterp = false;
- break;
- }
-
- SGroupKeys* pkey = taosArrayGet(pSliceInfo->pNextRow, srcSlot);
- if (pkey->isNull == false) {
- colDataAppend(pDst, rows, pkey->pData, false);
- } else {
- colDataAppendNULL(pDst, rows);
- }
- break;
- }
-
- case TSDB_FILL_NONE:
- default:
- break;
- }
- }
-
- if (hasInterp) {
- pResBlock->info.rows += 1;
- }
-
- return hasInterp;
-}
-
-static void addCurrentRowToResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp* pExprSup, SSDataBlock* pResBlock,
- SSDataBlock* pSrcBlock, int32_t index) {
- blockDataEnsureCapacity(pResBlock, pResBlock->info.rows + 1);
- for (int32_t j = 0; j < pExprSup->numOfExprs; ++j) {
- SExprInfo* pExprInfo = &pExprSup->pExprInfo[j];
-
- int32_t dstSlot = pExprInfo->base.resSchema.slotId;
- SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot);
-
- if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) {
- colDataAppend(pDst, pResBlock->info.rows, (char*)&pSliceInfo->current, false);
- } else {
- int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
- SColumnInfoData* pSrc = taosArrayGet(pSrcBlock->pDataBlock, srcSlot);
-
- if (colDataIsNull_s(pSrc, index)) {
- colDataAppendNULL(pDst, pResBlock->info.rows);
- continue;
- }
-
- char* v = colDataGetData(pSrc, index);
- colDataAppend(pDst, pResBlock->info.rows, v, false);
- }
- }
-
- pResBlock->info.rows += 1;
- return;
-}
-
-
-static int32_t initPrevRowsKeeper(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
- if (pInfo->pPrevRow != NULL) {
- return TSDB_CODE_SUCCESS;
- }
-
- pInfo->pPrevRow = taosArrayInit(4, sizeof(SGroupKeys));
- if (pInfo->pPrevRow == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
-
- int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, i);
-
- SGroupKeys key = {0};
- key.bytes = pColInfo->info.bytes;
- key.type = pColInfo->info.type;
- key.isNull = false;
- key.pData = taosMemoryCalloc(1, pColInfo->info.bytes);
- taosArrayPush(pInfo->pPrevRow, &key);
- }
-
- pInfo->isPrevRowSet = false;
-
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t initNextRowsKeeper(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
- if (pInfo->pNextRow != NULL) {
- return TSDB_CODE_SUCCESS;
- }
-
- pInfo->pNextRow = taosArrayInit(4, sizeof(SGroupKeys));
- if (pInfo->pNextRow == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
-
- int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, i);
-
- SGroupKeys key = {0};
- key.bytes = pColInfo->info.bytes;
- key.type = pColInfo->info.type;
- key.isNull = false;
- key.pData = taosMemoryCalloc(1, pColInfo->info.bytes);
- taosArrayPush(pInfo->pNextRow, &key);
- }
-
- pInfo->isNextRowSet = false;
-
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t initFillLinearInfo(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
- if (pInfo->pLinearInfo != NULL) {
- return TSDB_CODE_SUCCESS;
- }
-
- pInfo->pLinearInfo = taosArrayInit(4, sizeof(SFillLinearInfo));
- if (pInfo->pLinearInfo == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
-
- int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, i);
-
- SFillLinearInfo linearInfo = {0};
- linearInfo.start.key = INT64_MIN;
- linearInfo.end.key = INT64_MIN;
- linearInfo.start.val = taosMemoryCalloc(1, pColInfo->info.bytes);
- linearInfo.end.val = taosMemoryCalloc(1, pColInfo->info.bytes);
- linearInfo.isStartSet = false;
- linearInfo.isEndSet = false;
- linearInfo.type = pColInfo->info.type;
- linearInfo.bytes = pColInfo->info.bytes;
- taosArrayPush(pInfo->pLinearInfo, &linearInfo);
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t initKeeperInfo(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
- int32_t code;
- code = initPrevRowsKeeper(pInfo, pBlock);
- if (code != TSDB_CODE_SUCCESS) {
- return TSDB_CODE_FAILED;
- }
-
- code = initNextRowsKeeper(pInfo, pBlock);
- if (code != TSDB_CODE_SUCCESS) {
- return TSDB_CODE_FAILED;
- }
-
- code = initFillLinearInfo(pInfo, pBlock);
- if (code != TSDB_CODE_SUCCESS) {
- return TSDB_CODE_FAILED;
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
-static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
- if (pOperator->status == OP_EXEC_DONE) {
- return NULL;
- }
-
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- STimeSliceOperatorInfo* pSliceInfo = pOperator->info;
- SSDataBlock* pResBlock = pSliceInfo->pRes;
- SExprSupp* pSup = &pOperator->exprSupp;
-
- int32_t order = TSDB_ORDER_ASC;
- SInterval* pInterval = &pSliceInfo->interval;
- SOperatorInfo* downstream = pOperator->pDownstream[0];
-
- blockDataCleanup(pResBlock);
-
- while (1) {
- SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
- if (pBlock == NULL) {
- break;
- }
-
- int32_t code = initKeeperInfo(pSliceInfo, pBlock);
- if (code != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, code);
- }
-
- // the pDataBlock are always the same one, no need to call this again
- setInputDataBlock(pSup, pBlock, order, MAIN_SCAN, true);
-
- SColumnInfoData* pTsCol = taosArrayGet(pBlock->pDataBlock, pSliceInfo->tsCol.slotId);
- for (int32_t i = 0; i < pBlock->info.rows; ++i) {
- int64_t ts = *(int64_t*)colDataGetData(pTsCol, i);
-
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- setOperatorCompleted(pOperator);
- break;
- }
-
- if (ts == pSliceInfo->current) {
- addCurrentRowToResult(pSliceInfo, &pOperator->exprSupp, pResBlock, pBlock, i);
-
- doKeepPrevRows(pSliceInfo, pBlock, i);
- doKeepLinearInfo(pSliceInfo, pBlock, i);
-
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- setOperatorCompleted(pOperator);
- break;
- }
- } else if (ts < pSliceInfo->current) {
- // in case of interpolation window starts and ends between two datapoints, fill(prev) need to interpolate
- doKeepPrevRows(pSliceInfo, pBlock, i);
- doKeepLinearInfo(pSliceInfo, pBlock, i);
-
- if (i < pBlock->info.rows - 1) {
- // in case of interpolation window starts and ends between two datapoints, fill(next) need to interpolate
- doKeepNextRows(pSliceInfo, pBlock, i + 1);
- int64_t nextTs = *(int64_t*)colDataGetData(pTsCol, i + 1);
- if (nextTs > pSliceInfo->current) {
- while (pSliceInfo->current < nextTs && pSliceInfo->current <= pSliceInfo->win.ekey) {
- if (!genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, false) && pSliceInfo->fillType == TSDB_FILL_LINEAR) {
- break;
- } else {
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- }
- }
-
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- setOperatorCompleted(pOperator);
- break;
- }
- } else {
- // ignore current row, and do nothing
- }
- } else { // it is the last row of current block
- doKeepPrevRows(pSliceInfo, pBlock, i);
- }
- } else { // ts > pSliceInfo->current
- // in case of interpolation window starts and ends between two datapoints, fill(next) need to interpolate
- doKeepNextRows(pSliceInfo, pBlock, i);
- doKeepLinearInfo(pSliceInfo, pBlock, i);
-
- while (pSliceInfo->current < ts && pSliceInfo->current <= pSliceInfo->win.ekey) {
- if (!genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, true) && pSliceInfo->fillType == TSDB_FILL_LINEAR) {
- break;
- } else {
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- }
- }
-
- // add current row if timestamp match
- if (ts == pSliceInfo->current && pSliceInfo->current <= pSliceInfo->win.ekey) {
- addCurrentRowToResult(pSliceInfo, &pOperator->exprSupp, pResBlock, pBlock, i);
- doKeepPrevRows(pSliceInfo, pBlock, i);
-
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- }
-
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- setOperatorCompleted(pOperator);
- break;
- }
- }
- }
- }
-
- // check if need to interpolate after last datablock
- // except for fill(next), fill(linear)
- while (pSliceInfo->current <= pSliceInfo->win.ekey && pSliceInfo->fillType != TSDB_FILL_NEXT &&
- pSliceInfo->fillType != TSDB_FILL_LINEAR) {
- genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, false);
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- }
-
- // restore the value
- setTaskStatus(pOperator->pTaskInfo, TASK_COMPLETED);
- if (pResBlock->info.rows == 0) {
- pOperator->status = OP_EXEC_DONE;
- }
-
- return pResBlock->info.rows == 0 ? NULL : pResBlock;
-}
-
-void destroyTimeSliceOperatorInfo(void* param) {
- STimeSliceOperatorInfo* pInfo = (STimeSliceOperatorInfo*)param;
-
- pInfo->pRes = blockDataDestroy(pInfo->pRes);
-
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->pPrevRow); ++i) {
- SGroupKeys* pKey = taosArrayGet(pInfo->pPrevRow, i);
- taosMemoryFree(pKey->pData);
- }
- taosArrayDestroy(pInfo->pPrevRow);
-
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->pNextRow); ++i) {
- SGroupKeys* pKey = taosArrayGet(pInfo->pNextRow, i);
- taosMemoryFree(pKey->pData);
- }
- taosArrayDestroy(pInfo->pNextRow);
-
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->pLinearInfo); ++i) {
- SFillLinearInfo* pKey = taosArrayGet(pInfo->pLinearInfo, i);
- taosMemoryFree(pKey->start.val);
- taosMemoryFree(pKey->end.val);
- }
- taosArrayDestroy(pInfo->pLinearInfo);
-
- taosMemoryFree(pInfo->pFillColInfo);
- taosMemoryFreeClear(param);
-}
-
-SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo) {
- STimeSliceOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(STimeSliceOperatorInfo));
- SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- if (pOperator == NULL || pInfo == NULL) {
- goto _error;
- }
-
- SInterpFuncPhysiNode* pInterpPhyNode = (SInterpFuncPhysiNode*)pPhyNode;
- SExprSupp* pSup = &pOperator->exprSupp;
-
- int32_t numOfExprs = 0;
- SExprInfo* pExprInfo = createExprInfo(pInterpPhyNode->pFuncs, NULL, &numOfExprs);
- int32_t code = initExprSupp(pSup, pExprInfo, numOfExprs);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- if (pInterpPhyNode->pExprs != NULL) {
- int32_t num = 0;
- SExprInfo* pScalarExprInfo = createExprInfo(pInterpPhyNode->pExprs, NULL, &num);
- code = initExprSupp(&pInfo->scalarSup, pScalarExprInfo, num);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
- }
-
- pInfo->tsCol = extractColumnFromColumnNode((SColumnNode*)pInterpPhyNode->pTimeSeries);
- pInfo->fillType = convertFillType(pInterpPhyNode->fillMode);
- initResultSizeInfo(&pOperator->resultInfo, 4096);
-
- pInfo->pFillColInfo = createFillColInfo(pExprInfo, numOfExprs, NULL, 0, (SNodeListNode*)pInterpPhyNode->pFillValues);
- pInfo->pLinearInfo = NULL;
- pInfo->pRes = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
- pInfo->win = pInterpPhyNode->timeRange;
- pInfo->interval.interval = pInterpPhyNode->interval;
- pInfo->current = pInfo->win.skey;
-
- if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
- STableScanInfo* pScanInfo = (STableScanInfo*)downstream->info;
- pScanInfo->base.cond.twindows = pInfo->win;
- pScanInfo->base.cond.type = TIMEWINDOW_RANGE_EXTERNAL;
- }
-
- setOperatorInfo(pOperator, "TimeSliceOperator", QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC, false, OP_NOT_OPENED, pInfo,
- pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTimeslice, NULL, destroyTimeSliceOperatorInfo, NULL);
-
- blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
-
- code = appendDownstream(pOperator, &downstream, 1);
- return pOperator;
-
-_error:
- taosMemoryFree(pInfo);
- taosMemoryFree(pOperator);
- pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
- return NULL;
-}
-
SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode,
SExecTaskInfo* pTaskInfo) {
SStateWindowOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStateWindowOperatorInfo));
@@ -2523,12 +2004,12 @@ SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWi
SExprInfo* pExprInfo = createExprInfo(pStateNode->window.pFuncs, NULL, &num);
initResultSizeInfo(&pOperator->resultInfo, 4096);
- code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
+ code = initAggSup(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
- SSDataBlock* pResBlock = createResDataBlock(pStateNode->window.node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pStateNode->window.node.pOutputDataBlockDesc);
initBasicInfo(&pInfo->binfo, pResBlock);
initResultRowInfo(&pInfo->binfo.resultRowInfo);
@@ -2542,7 +2023,7 @@ SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWi
setOperatorInfo(pOperator, "StateWindowOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE, true, OP_NOT_OPENED, pInfo,
pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(openStateWindowAggOptr, doStateWindowAgg, NULL, destroyStateWindowOperatorInfo, NULL);
+ createOperatorFpSet(openStateWindowAggOptr, doStateWindowAgg, NULL, destroyStateWindowOperatorInfo, optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -2588,10 +2069,10 @@ SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionW
int32_t numOfCols = 0;
SExprInfo* pExprInfo = createExprInfo(pSessionNode->window.pFuncs, NULL, &numOfCols);
- SSDataBlock* pResBlock = createResDataBlock(pSessionNode->window.node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pSessionNode->window.node.pOutputDataBlockDesc);
initBasicInfo(&pInfo->binfo, pResBlock);
- int32_t code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
+ int32_t code = initAggSup(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -2615,7 +2096,7 @@ SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionW
setOperatorInfo(pOperator, "SessionWindowAggOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION, true, OP_NOT_OPENED,
pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doSessionWindowAgg, NULL, destroySWindowOperatorInfo, NULL);
+ createOperatorFpSet(optrDummyOpenFn, doSessionWindowAgg, NULL, destroySWindowOperatorInfo, optrDefaultBufFn, NULL);
pOperator->pTaskInfo = pTaskInfo;
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -2695,7 +2176,7 @@ static void rebuildIntervalWindow(SOperatorInfo* pOperator, SArray* pWinArray, S
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);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
}
num++;
@@ -2765,26 +2246,6 @@ static void clearSpecialDataBlock(SSDataBlock* pBlock) {
blockDataCleanup(pBlock);
}
-void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsColIndex) {
- // ASSERT(pDest->info.capacity >= pSource->info.rows);
- blockDataEnsureCapacity(pDest, pSource->info.rows);
- clearSpecialDataBlock(pDest);
- SColumnInfoData* pDestCol = taosArrayGet(pDest->pDataBlock, 0);
- SColumnInfoData* pSourceCol = taosArrayGet(pSource->pDataBlock, tsColIndex);
-
- // copy timestamp column
- colDataAssign(pDestCol, pSourceCol, pSource->info.rows, &pDest->info);
- for (int32_t i = 1; i < taosArrayGetSize(pDest->pDataBlock); i++) {
- SColumnInfoData* pCol = taosArrayGet(pDest->pDataBlock, i);
- colDataAppendNNULL(pCol, 0, pSource->info.rows);
- }
-
- pDest->info.rows = pSource->info.rows;
- pDest->info.groupId = pSource->info.groupId;
- pDest->info.type = pSource->info.type;
- blockDataUpdateTsWindow(pDest, 0);
-}
-
static void doBuildPullDataBlock(SArray* array, int32_t* pIndex, SSDataBlock* pBlock) {
clearSpecialDataBlock(pBlock);
int32_t size = taosArrayGetSize(array);
@@ -2803,8 +2264,8 @@ static void doBuildPullDataBlock(SArray* array, int32_t* pIndex, SSDataBlock* pB
colDataAppend(pStartTs, pBlock->info.rows, (const char*)&pWin->window.skey, false);
colDataAppend(pEndTs, pBlock->info.rows, (const char*)&pWin->window.ekey, false);
colDataAppend(pGroupId, pBlock->info.rows, (const char*)&pWin->groupId, false);
- colDataAppend(pCalStartTs, pBlock->info.rows, (const char*)&pWin->window.skey, false);
- colDataAppend(pCalEndTs, pBlock->info.rows, (const char*)&pWin->window.ekey, false);
+ colDataAppend(pCalStartTs, pBlock->info.rows, (const char*)&pWin->calWin.skey, false);
+ colDataAppend(pCalEndTs, pBlock->info.rows, (const char*)&pWin->calWin.ekey, false);
pBlock->info.rows++;
}
if ((*pIndex) == size) {
@@ -2814,27 +2275,33 @@ static void doBuildPullDataBlock(SArray* array, int32_t* pIndex, SSDataBlock* pB
blockDataUpdateTsWindow(pBlock, 0);
}
-void processPullOver(SSDataBlock* pBlock, SHashObj* pMap) {
+void processPullOver(SSDataBlock* pBlock, SHashObj* pMap, SInterval* pInterval) {
SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
TSKEY* tsData = (TSKEY*)pStartCol->pData;
+ SColumnInfoData* pEndCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX);
+ TSKEY* tsEndData = (TSKEY*)pEndCol->pData;
SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
uint64_t* groupIdData = (uint64_t*)pGroupCol->pData;
int32_t chId = getChildIndex(pBlock);
for (int32_t i = 0; i < pBlock->info.rows; i++) {
- SWinKey winRes = {.ts = tsData[i], .groupId = groupIdData[i]};
- void* chIds = taosHashGet(pMap, &winRes, sizeof(SWinKey));
- if (chIds) {
- SArray* chArray = *(SArray**)chIds;
- int32_t index = taosArraySearchIdx(chArray, &chId, compareInt32Val, TD_EQ);
- if (index != -1) {
- qDebug("===stream===window %" PRId64 " delete child id %d", winRes.ts, chId);
- taosArrayRemove(chArray, index);
- if (taosArrayGetSize(chArray) == 0) {
- // pull data is over
- taosArrayDestroy(chArray);
- taosHashRemove(pMap, &winRes, sizeof(SWinKey));
+ TSKEY winTs = tsData[i];
+ while (winTs < tsEndData[i]) {
+ SWinKey winRes = {.ts = winTs, .groupId = groupIdData[i]};
+ void* chIds = taosHashGet(pMap, &winRes, sizeof(SWinKey));
+ if (chIds) {
+ SArray* chArray = *(SArray**)chIds;
+ int32_t index = taosArraySearchIdx(chArray, &chId, compareInt32Val, TD_EQ);
+ if (index != -1) {
+ qDebug("===stream===window %" PRId64 " delete child id %d", winRes.ts, chId);
+ taosArrayRemove(chArray, index);
+ if (taosArrayGetSize(chArray) == 0) {
+ // pull data is over
+ taosArrayDestroy(chArray);
+ taosHashRemove(pMap, &winRes, sizeof(SWinKey));
+ }
}
}
+ winTs = taosTimeAdd(winTs, pInterval->sliding, pInterval->slidingUnit, pInterval->precision);
}
}
}
@@ -2847,12 +2314,13 @@ static void addRetriveWindow(SArray* wins, SStreamIntervalOperatorInfo* pInfo) {
if (needDeleteWindowBuf(&nextWin, &pInfo->twAggSup) && !pInfo->ignoreExpiredData) {
void* chIds = taosHashGet(pInfo->pPullDataMap, winKey, sizeof(SWinKey));
if (!chIds) {
- SPullWindowInfo pull = {.window = nextWin, .groupId = winKey->groupId};
+ SPullWindowInfo pull = {.window = nextWin, .groupId = winKey->groupId, .calWin.skey = nextWin.skey, .calWin.ekey = nextWin.skey};
// add pull data request
- savePullWindow(&pull, pInfo->pPullWins);
- int32_t size1 = taosArrayGetSize(pInfo->pChildren);
- addPullWindow(pInfo->pPullDataMap, winKey, size1);
- qDebug("===stream===prepare retrive for delete %" PRId64 ", size:%d", winKey->ts, size1);
+ if (savePullWindow(&pull, pInfo->pPullWins) == TSDB_CODE_SUCCESS) {
+ int32_t size1 = taosArrayGetSize(pInfo->pChildren);
+ addPullWindow(pInfo->pPullDataMap, winKey, size1);
+ qDebug("===stream===prepare retrive for delete %" PRId64 ", size:%d", winKey->ts, size1);
+ }
}
}
}
@@ -2875,7 +2343,7 @@ void doBuildResult(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock*
}
// clear the existed group id
- pBlock->info.groupId = 0;
+ pBlock->info.id.groupId = 0;
buildDataBlockFromGroupRes(pOperator, pState, pBlock, &pOperator->exprSupp, pGroupResInfo);
}
@@ -2922,12 +2390,13 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p
};
void* chIds = taosHashGet(pInfo->pPullDataMap, &winRes, sizeof(SWinKey));
if (isDeletedStreamWindow(&nextWin, groupId, pInfo->pState, &pInfo->twAggSup) && !chIds) {
- SPullWindowInfo pull = {.window = nextWin, .groupId = groupId};
+ SPullWindowInfo pull = {.window = nextWin, .groupId = groupId, .calWin.skey = nextWin.skey, .calWin.ekey = nextWin.skey};
// add pull data request
- savePullWindow(&pull, pInfo->pPullWins);
- int32_t size = taosArrayGetSize(pInfo->pChildren);
- addPullWindow(pInfo->pPullDataMap, &winRes, size);
- qDebug("===stream===prepare retrive %" PRId64 ", size:%d", winRes.ts, size);
+ if (savePullWindow(&pull, pInfo->pPullWins) == TSDB_CODE_SUCCESS) {
+ int32_t size = taosArrayGetSize(pInfo->pChildren);
+ addPullWindow(pInfo->pPullDataMap, &winRes, size);
+ qDebug("===stream===prepare retrive %" PRId64 ", size:%d", winRes.ts, size);
+ }
} else {
int32_t index = -1;
SArray* chArray = NULL;
@@ -2954,7 +2423,7 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p
int32_t code = setOutputBuf(pInfo->pState, &nextWin, &pResult, groupId, pSup->pCtx, numOfOutput,
pSup->rowEntryInfoOffset, &pInfo->aggSup);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
if (IS_FINAL_OP(pInfo)) {
@@ -2975,7 +2444,7 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p
tSimpleHashPut(pInfo->aggSup.pResultRowHashTable, &key, sizeof(SWinKey), NULL, 0);
}
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows,
pSDataBlock->info.rows, numOfOutput);
SWinKey key = {
.ts = nextWin.skey,
@@ -3068,9 +2537,11 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
if (pBlock == NULL) {
pOperator->status = OP_RES_TO_RETURN;
- qDebug("%s return data", IS_FINAL_OP(pInfo) ? "interval final" : "interval semi");
+ qDebug("===stream===return data:%s. recv datablock num:%" PRIu64 , IS_FINAL_OP(pInfo) ? "interval final" : "interval semi", pInfo->numOfDatapack);
+ pInfo->numOfDatapack = 0;
break;
}
+ pInfo->numOfDatapack++;
printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "interval final recv" : "interval semi recv");
ASSERT(pBlock->info.type != STREAM_INVERT);
@@ -3106,7 +2577,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
}
continue;
} else if (pBlock->info.type == STREAM_PULL_OVER && IS_FINAL_OP(pInfo)) {
- processPullOver(pBlock, pInfo->pPullDataMap);
+ processPullOver(pBlock, pInfo->pPullDataMap, &pInfo->interval);
continue;
}
@@ -3115,7 +2586,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
projectApplyFunctions(pExprSup->pExprInfo, pBlock, pBlock, pExprSup->pCtx, pExprSup->numOfExprs, NULL);
}
setInputDataBlock(pSup, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true);
- doStreamIntervalAggImpl(pOperator, pBlock, pBlock->info.groupId, pUpdatedMap);
+ doStreamIntervalAggImpl(pOperator, pBlock, pBlock->info.id.groupId, pUpdatedMap);
if (IS_FINAL_OP(pInfo)) {
int32_t chIndex = getChildIndex(pBlock);
int32_t size = taosArrayGetSize(pInfo->pChildren);
@@ -3123,7 +2594,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
for (int32_t i = 0; i < chIndex + 1 - size; i++) {
SOperatorInfo* pChildOp = createStreamFinalIntervalOperatorInfo(NULL, pInfo->pPhyNode, pOperator->pTaskInfo, 0);
if (!pChildOp) {
- T_LONG_JMP(pOperator->pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pOperator->pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
SStreamIntervalOperatorInfo* pTmpInfo = pChildOp->info;
pTmpInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE;
@@ -3133,7 +2604,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, chIndex);
SStreamIntervalOperatorInfo* pChInfo = pChildOp->info;
setInputDataBlock(&pChildOp->exprSupp, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true);
- doStreamIntervalAggImpl(pChildOp, pBlock, pBlock->info.groupId, NULL);
+ doStreamIntervalAggImpl(pChildOp, pBlock, pBlock->info.id.groupId, NULL);
}
maxTs = TMAX(maxTs, pBlock->info.window.ekey);
maxTs = TMAX(maxTs, pBlock->info.watermark);
@@ -3184,6 +2655,15 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
return NULL;
}
+int64_t getDeleteMark(SIntervalPhysiNode* pIntervalPhyNode) {
+ if (pIntervalPhyNode->window.deleteMark <= 0) {
+ return DEAULT_DELETE_MARK;
+ }
+ int64_t deleteMark = TMAX(pIntervalPhyNode->window.deleteMark,pIntervalPhyNode->window.watermark);
+ deleteMark = TMAX(deleteMark, pIntervalPhyNode->interval);
+ return deleteMark;
+}
+
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
SExecTaskInfo* pTaskInfo, int32_t numOfChild) {
SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode;
@@ -3205,9 +2685,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
.calTrigger = pIntervalPhyNode->window.triggerType,
.maxTs = INT64_MIN,
.minTs = INT64_MAX,
- // for test 315360000000
- .deleteMark = 1000LL * 60LL * 60LL * 24LL * 365LL * 10LL,
- // .deleteMark = INT64_MAX,
+ .deleteMark = getDeleteMark(pIntervalPhyNode),
.deleteMarkSaved = 0,
.calTriggerSaved = 0,
};
@@ -3226,10 +2704,10 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
int32_t numOfCols = 0;
SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &numOfCols);
- SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->pOutputDataBlockDesc);
initBasicInfo(&pInfo->binfo, pResBlock);
- int32_t code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
+ int32_t code = initAggSup(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -3286,6 +2764,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
pInfo->pDelWins = taosArrayInit(4, sizeof(SWinKey));
pInfo->delKey.ts = INT64_MAX;
pInfo->delKey.groupId = 0;
+ pInfo->numOfDatapack = 0;
pOperator->operatorType = pPhyNode->type;
pOperator->blocking = true;
@@ -3293,7 +2772,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
pOperator->info = pInfo;
pOperator->fpSet =
- createOperatorFpSet(NULL, doStreamFinalIntervalAgg, NULL, destroyStreamFinalIntervalOperatorInfo, NULL);
+ createOperatorFpSet(NULL, doStreamFinalIntervalAgg, NULL, destroyStreamFinalIntervalOperatorInfo, optrDefaultBufFn, NULL);
if (pPhyNode->type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL) {
initIntervalDownStream(downstream, pPhyNode->type, &pInfo->aggSup, &pInfo->interval, &pInfo->twAggSup);
}
@@ -3364,22 +2843,23 @@ void initDummyFunction(SqlFunctionCtx* pDummy, SqlFunctionCtx* pCtx, int32_t num
}
}
-void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int64_t waterMark, uint16_t type,
- int32_t tsColIndex) {
+void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, uint16_t type, int32_t tsColIndex,
+ STimeWindowAggSupp* pTwSup) {
if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION) {
SStreamPartitionOperatorInfo* pScanInfo = downstream->info;
pScanInfo->tsColIndex = tsColIndex;
}
if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
- initDownStream(downstream->pDownstream[0], pAggSup, waterMark, type, tsColIndex);
+ initDownStream(downstream->pDownstream[0], pAggSup, type, tsColIndex, pTwSup);
return;
}
SStreamScanInfo* pScanInfo = downstream->info;
pScanInfo->windowSup = (SWindowSupporter){.pStreamAggSup = pAggSup, .gap = pAggSup->gap, .parentType = type};
if (!pScanInfo->pUpdateInfo) {
- pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, waterMark);
+ pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, pTwSup->waterMark);
}
+ pScanInfo->twAggSup = *pTwSup;
}
int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, int64_t gap,
@@ -3547,10 +3027,10 @@ static int32_t doOneWindowAggImpl(SColumnInfoData* pTimeWindowData, SResultWindo
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
int32_t code = initSessionOutputBuf(pCurWin, pResult, pSup->pCtx, numOutput, pSup->rowEntryInfoOffset);
if (code != TSDB_CODE_SUCCESS || (*pResult) == NULL) {
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
updateTimeWindowInfo(pTimeWindowData, &pCurWin->sessionWin.win, false);
- doApplyFunctions(pTaskInfo, pSup->pCtx, pTimeWindowData, startIndex, winRows, rows, numOutput);
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, pTimeWindowData, startIndex, winRows, rows, numOutput);
return TSDB_CODE_SUCCESS;
}
@@ -3627,7 +3107,7 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
int32_t numOfOutput = pOperator->exprSupp.numOfExprs;
- uint64_t groupId = pSDataBlock->info.groupId;
+ uint64_t groupId = pSDataBlock->info.id.groupId;
int64_t code = TSDB_CODE_SUCCESS;
SResultRow* pResult = NULL;
int32_t rows = pSDataBlock->info.rows;
@@ -3654,10 +3134,15 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
setSessionWinOutputInfo(pStUpdated, &winInfo);
winRows = updateSessionWindowInfo(&winInfo, startTsCols, endTsCols, groupId, rows, i, pAggSup->gap,
pAggSup->pResultRows, pStUpdated, pStDeleted);
+ // coverity scan error
+ if (!winInfo.pOutputBuf) {
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
+ }
+
code = doOneWindowAggImpl(&pInfo->twAggSup.timeWindowData, &winInfo, &pResult, i, winRows, rows, numOfOutput,
pOperator);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
compactSessionWindow(pOperator, &winInfo, pStUpdated, pStDeleted);
saveSessionOutputBuf(pAggSup, &winInfo);
@@ -3665,7 +3150,7 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pStUpdated) {
code = saveResult(winInfo, pStUpdated);
if (code != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
}
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_WINDOW_CLOSE) {
@@ -3778,8 +3263,8 @@ void doBuildDeleteDataBlock(SOperatorInfo* pOp, SSHashObj* pStDeleted, SSDataBlo
char parTbName[VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN];
STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName));
colDataAppend(pTableCol, pBlock->info.rows, (const char*)parTbName, false);
+ tdbFree(tbname);
}
- tdbFree(tbname);
pBlock->info.rows += 1;
}
if ((*Ite) == NULL) {
@@ -3913,7 +3398,7 @@ void doBuildSessionResult(SOperatorInfo* pOperator, SStreamState* pState, SGroup
}
// clear the existed group id
- pBlock->info.groupId = 0;
+ pBlock->info.id.groupId = 0;
buildSessionResultDataBlock(pOperator, pState, pBlock, &pOperator->exprSupp, pGroupResInfo);
}
@@ -3989,7 +3474,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
SOperatorInfo* pChildOp =
createStreamFinalSessionAggOperatorInfo(NULL, pInfo->pPhyNode, pOperator->pTaskInfo, 0);
if (!pChildOp) {
- T_LONG_JMP(pOperator->pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pOperator->pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
taosArrayPush(pInfo->pChildren, &pChildOp);
}
@@ -4060,7 +3545,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
SExprSupp* pSup = &pOperator->exprSupp;
SExprInfo* pExprInfo = createExprInfo(pSessionNode->window.pFuncs, NULL, &numOfCols);
- SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->pOutputDataBlockDesc);
code = initBasicInfoEx(&pInfo->binfo, pSup, pExprInfo, numOfCols, pResBlock);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -4099,11 +3584,10 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
setOperatorInfo(pOperator, "StreamSessionWindowAggOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION, true,
OP_NOT_OPENED, pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doStreamSessionAgg, NULL, destroyStreamSessionAggOperatorInfo, NULL);
+ createOperatorFpSet(optrDummyOpenFn, doStreamSessionAgg, NULL, destroyStreamSessionAggOperatorInfo, optrDefaultBufFn, NULL);
if (downstream) {
- initDownStream(downstream, &pInfo->streamAggSup, pInfo->twAggSup.waterMark, pOperator->operatorType,
- pInfo->primaryTsIndex);
+ initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex, &pInfo->twAggSup);
code = appendDownstream(pOperator, &downstream, 1);
}
return pOperator;
@@ -4244,8 +3728,8 @@ SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream
if (pPhyNode->type != QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
pInfo->pUpdateRes = createSpecialDataBlock(STREAM_CLEAR);
blockDataEnsureCapacity(pInfo->pUpdateRes, 128);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamSessionSemiAgg, NULL,
- destroyStreamSessionAggOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamSessionSemiAgg, NULL,
+ destroyStreamSessionAggOperatorInfo, optrDefaultBufFn, NULL);
}
setOperatorInfo(pOperator, name, pPhyNode->type, false, OP_NOT_OPENED, pInfo, pTaskInfo);
@@ -4391,7 +3875,7 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
int32_t numOfOutput = pOperator->exprSupp.numOfExprs;
- int64_t groupId = pSDataBlock->info.groupId;
+ uint64_t groupId = pSDataBlock->info.id.groupId;
int64_t code = TSDB_CODE_SUCCESS;
TSKEY* tsCols = NULL;
SResultRow* pResult = NULL;
@@ -4433,14 +3917,14 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
code = doOneWindowAggImpl(&pInfo->twAggSup.timeWindowData, &curWin.winInfo, &pResult, i, winRows, rows, numOfOutput,
pOperator);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
saveSessionOutputBuf(pAggSup, &curWin.winInfo);
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE) {
code = saveResult(curWin.winInfo, pSeUpdated);
if (code != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
}
@@ -4581,7 +4065,7 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
SExprSupp* pSup = &pOperator->exprSupp;
int32_t numOfCols = 0;
SExprInfo* pExprInfo = createExprInfo(pStateNode->window.pFuncs, NULL, &numOfCols);
- SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->pOutputDataBlockDesc);
code = initBasicInfoEx(&pInfo->binfo, pSup, pExprInfo, numOfCols, pResBlock);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -4605,9 +4089,8 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
setOperatorInfo(pOperator, "StreamStateAggOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE, true, OP_NOT_OPENED,
pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doStreamStateAgg, NULL, destroyStreamStateOperatorInfo, NULL);
- initDownStream(downstream, &pInfo->streamAggSup, pInfo->twAggSup.waterMark, pOperator->operatorType,
- pInfo->primaryTsIndex);
+ createOperatorFpSet(optrDummyOpenFn, doStreamStateAgg, NULL, destroyStreamStateOperatorInfo, optrDefaultBufFn, NULL);
+ initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex, &pInfo->twAggSup);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -4691,7 +4174,7 @@ static void doMergeAlignedIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultR
}
updateTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &currWin, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &iaInfo->twAggSup.timeWindowData, startPos, currPos - startPos,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &iaInfo->twAggSup.timeWindowData, startPos, currPos - startPos,
pBlock->info.rows, pSup->numOfExprs);
finalizeResultRows(iaInfo->aggSup.pResultBuf, &pResultRowInfo->cur, pSup, pResultBlock, pTaskInfo);
@@ -4711,12 +4194,12 @@ static void doMergeAlignedIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultR
}
updateTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &currWin, true);
- doApplyFunctions(pTaskInfo, pSup->pCtx, &iaInfo->twAggSup.timeWindowData, startPos, currPos - startPos,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pSup->pCtx, &iaInfo->twAggSup.timeWindowData, startPos, currPos - startPos,
pBlock->info.rows, pSup->numOfExprs);
}
static void cleanupAfterGroupResultGen(SMergeAlignedIntervalAggOperatorInfo* pMiaInfo, SSDataBlock* pRes) {
- pRes->info.groupId = pMiaInfo->groupId;
+ pRes->info.id.groupId = pMiaInfo->groupId;
pMiaInfo->curTs = INT64_MIN;
pMiaInfo->groupId = 0;
}
@@ -4741,7 +4224,7 @@ static void doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) {
pBlock = pMiaInfo->prefetchedBlock;
pMiaInfo->prefetchedBlock = NULL;
- pMiaInfo->groupId = pBlock->info.groupId;
+ pMiaInfo->groupId = pBlock->info.id.groupId;
}
// no data exists, all query processing is done
@@ -4758,12 +4241,12 @@ static void doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) {
}
if (pMiaInfo->groupId == 0) {
- if (pMiaInfo->groupId != pBlock->info.groupId) {
- pMiaInfo->groupId = pBlock->info.groupId;
- pRes->info.groupId = pMiaInfo->groupId;
+ if (pMiaInfo->groupId != pBlock->info.id.groupId) {
+ pMiaInfo->groupId = pBlock->info.id.groupId;
+ pRes->info.id.groupId = pMiaInfo->groupId;
}
} else {
- if (pMiaInfo->groupId != pBlock->info.groupId) {
+ if (pMiaInfo->groupId != pBlock->info.id.groupId) {
// if there are unclosed time window, close it firstly.
ASSERT(pMiaInfo->curTs != INT64_MIN);
finalizeResultRows(pIaInfo->aggSup.pResultBuf, &pResultRowInfo->cur, pSup, pRes, pTaskInfo);
@@ -4774,7 +4257,7 @@ static void doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) {
break;
} else {
// continue
- pRes->info.groupId = pMiaInfo->groupId;
+ pRes->info.id.groupId = pMiaInfo->groupId;
}
}
@@ -4854,22 +4337,21 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream,
iaInfo->win = pTaskInfo->window;
iaInfo->inputOrder = TSDB_ORDER_ASC;
iaInfo->interval = interval;
- iaInfo->execModel = pTaskInfo->execModel;
iaInfo->primaryTsIndex = ((SColumnNode*)pNode->window.pTspk)->slotId;
iaInfo->binfo.mergeResultBlock = pNode->window.mergeDataBlock;
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
- initResultSizeInfo(&pOperator->resultInfo, 4096);
+ initResultSizeInfo(&pOperator->resultInfo, 512);
int32_t num = 0;
SExprInfo* pExprInfo = createExprInfo(pNode->window.pFuncs, NULL, &num);
- code = initAggInfo(&pOperator->exprSupp, &iaInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
+ code = initAggSup(&pOperator->exprSupp, &iaInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
- SSDataBlock* pResBlock = createResDataBlock(pNode->window.node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pNode->window.node.pOutputDataBlockDesc);
initBasicInfo(&iaInfo->binfo, pResBlock);
initExecTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &iaInfo->win);
@@ -4884,7 +4366,7 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream,
false, OP_NOT_OPENED, miaInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, mergeAlignedIntervalAgg, NULL, destroyMAIOperatorInfo, NULL);
+ createOperatorFpSet(optrDummyOpenFn, mergeAlignedIntervalAgg, NULL, destroyMAIOperatorInfo, optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -4981,7 +4463,7 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo*
int32_t startPos = 0;
int32_t numOfOutput = pExprSup->numOfExprs;
int64_t* tsCols = extractTsCol(pBlock, iaInfo);
- uint64_t tableGroupId = pBlock->info.groupId;
+ uint64_t tableGroupId = pBlock->info.id.groupId;
bool ascScan = (iaInfo->inputOrder == TSDB_ORDER_ASC);
TSKEY blockStartTs = getStartTsKey(&pBlock->info.window, tsCols);
SResultRow* pResult = NULL;
@@ -4993,7 +4475,7 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo*
setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pExprSup->pCtx,
numOfOutput, pExprSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
TSKEY ekey = ascScan ? win.ekey : win.skey;
@@ -5010,7 +4492,7 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo*
ret = setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pExprSup->pCtx,
numOfOutput, pExprSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
if (ret != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
// window start key interpolation
@@ -5018,7 +4500,7 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo*
}
updateTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &win, true);
- doApplyFunctions(pTaskInfo, pExprSup->pCtx, &iaInfo->twAggSup.timeWindowData, startPos, forwardRows,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pExprSup->pCtx, &iaInfo->twAggSup.timeWindowData, startPos, forwardRows,
pBlock->info.rows, numOfOutput);
doCloseWindow(pResultRowInfo, iaInfo, pResult);
@@ -5039,7 +4521,7 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo*
setTimeWindowOutputBuf(pResultRowInfo, &nextWin, (scanFlag == MAIN_SCAN), &pResult, tableGroupId,
pExprSup->pCtx, numOfOutput, pExprSup->rowEntryInfoOffset, &iaInfo->aggSup, pTaskInfo);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ T_LONG_JMP(pTaskInfo->env, TSDB_CODE_OUT_OF_MEMORY);
}
ekey = ascScan ? nextWin.ekey : nextWin.skey;
@@ -5050,7 +4532,7 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo*
doWindowBorderInterpolation(iaInfo, pBlock, pResult, &nextWin, startPos, forwardRows, pExprSup);
updateTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &nextWin, true);
- doApplyFunctions(pTaskInfo, pExprSup->pCtx, &iaInfo->twAggSup.timeWindowData, startPos, forwardRows,
+ applyAggFunctionOnPartialTuples(pTaskInfo, pExprSup->pCtx, &iaInfo->twAggSup.timeWindowData, startPos, forwardRows,
pBlock->info.rows, numOfOutput);
doCloseWindow(pResultRowInfo, iaInfo, pResult);
@@ -5087,7 +4569,7 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
pBlock = downstream->fpSet.getNextFn(downstream);
} else {
pBlock = miaInfo->prefetchedBlock;
- miaInfo->groupId = pBlock->info.groupId;
+ miaInfo->groupId = pBlock->info.id.groupId;
miaInfo->prefetchedBlock = NULL;
}
@@ -5099,8 +4581,8 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
if (!miaInfo->hasGroupId) {
miaInfo->hasGroupId = true;
- miaInfo->groupId = pBlock->info.groupId;
- } else if (miaInfo->groupId != pBlock->info.groupId) {
+ miaInfo->groupId = pBlock->info.id.groupId;
+ } else if (miaInfo->groupId != pBlock->info.id.groupId) {
miaInfo->prefetchedBlock = pBlock;
break;
}
@@ -5114,7 +4596,7 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
}
}
- pRes->info.groupId = miaInfo->groupId;
+ pRes->info.id.groupId = miaInfo->groupId;
}
if (miaInfo->inputBlocksFinished) {
@@ -5123,7 +4605,7 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
if (listNode != NULL) {
SGroupTimeWindow* grpWin = (SGroupTimeWindow*)(listNode->data);
// finalizeWindowResult(pOperator, grpWin->groupId, &grpWin->window, pRes);
- pRes->info.groupId = grpWin->groupId;
+ pRes->info.id.groupId = grpWin->groupId;
}
}
@@ -5160,7 +4642,6 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMerge
pIntervalInfo->win = pTaskInfo->window;
pIntervalInfo->inputOrder = TSDB_ORDER_ASC;
pIntervalInfo->interval = interval;
- pIntervalInfo->execModel = pTaskInfo->execModel;
pIntervalInfo->binfo.mergeResultBlock = pIntervalPhyNode->window.mergeDataBlock;
pIntervalInfo->primaryTsIndex = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId;
@@ -5169,12 +4650,12 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMerge
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
initResultSizeInfo(&pOperator->resultInfo, 4096);
- int32_t code = initAggInfo(pExprSupp, &pIntervalInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
+ int32_t code = initAggSup(pExprSupp, &pIntervalInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
- SSDataBlock* pResBlock = createResDataBlock(pIntervalPhyNode->window.node.pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pIntervalPhyNode->window.node.pOutputDataBlockDesc);
initBasicInfo(&pIntervalInfo->binfo, pResBlock);
initExecTimeWindowInfo(&pIntervalInfo->twAggSup.timeWindowData, &pIntervalInfo->win);
@@ -5190,7 +4671,7 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMerge
setOperatorInfo(pOperator, "TimeMergeIntervalAggOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL, false,
OP_NOT_OPENED, pMergeIntervalInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doMergeIntervalAgg, NULL, destroyMergeIntervalOperatorInfo, NULL);
+ createOperatorFpSet(optrDummyOpenFn, doMergeIntervalAgg, NULL, destroyMergeIntervalOperatorInfo, optrDefaultBufFn, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -5248,8 +4729,11 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
while (1) {
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
if (pBlock == NULL) {
+ qDebug("===stream===return data:single interval. recv datablock num:%" PRIu64, pInfo->numOfDatapack);
+ pInfo->numOfDatapack = 0;
break;
}
+ pInfo->numOfDatapack++;
printDataBlock(pBlock, "single interval recv");
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
@@ -5282,7 +4766,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
maxTs = TMAX(maxTs, pBlock->info.window.ekey);
minTs = TMIN(minTs, pBlock->info.window.skey);
- doStreamIntervalAggImpl(pOperator, pBlock, pBlock->info.groupId, pUpdatedMap);
+ doStreamIntervalAggImpl(pOperator, pBlock, pBlock->info.id.groupId, pUpdatedMap);
}
pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs);
pInfo->twAggSup.minTs = TMIN(pInfo->twAggSup.minTs, minTs);
@@ -5330,7 +4814,7 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &numOfCols);
ASSERT(numOfCols > 0);
- SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
+ SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->pOutputDataBlockDesc);
SInterval interval = {
.interval = pIntervalPhyNode->interval,
.sliding = pIntervalPhyNode->sliding,
@@ -5345,7 +4829,7 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
.calTrigger = pIntervalPhyNode->window.triggerType,
.maxTs = INT64_MIN,
.minTs = INT64_MAX,
- .deleteMark = INT64_MAX,
+ .deleteMark = getDeleteMark(pIntervalPhyNode),
};
ASSERT(twAggSupp.calTrigger != STREAM_TRIGGER_MAX_DELAY);
@@ -5365,7 +4849,7 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
initResultSizeInfo(&pOperator->resultInfo, 4096);
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
- code = initAggInfo(pSup, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
+ code = initAggSup(pSup, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -5399,11 +4883,12 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
pInfo->pChildren = NULL;
pInfo->delKey.ts = INT64_MAX;
pInfo->delKey.groupId = 0;
+ pInfo->numOfDatapack = 0;
setOperatorInfo(pOperator, "StreamIntervalOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL, true, OP_NOT_OPENED,
pInfo, pTaskInfo);
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doStreamIntervalAgg, NULL, destroyStreamFinalIntervalOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamIntervalAgg, NULL,
+ destroyStreamFinalIntervalOperatorInfo, optrDefaultBufFn, NULL);
initIntervalDownStream(downstream, pPhyNode->type, &pInfo->aggSup, &pInfo->interval, &pInfo->twAggSup);
code = appendDownstream(pOperator, &downstream, 1);
@@ -5419,3 +4904,4 @@ _error:
pTaskInfo->code = code;
return NULL;
}
+
diff --git a/source/libs/executor/src/tlinearhash.c b/source/libs/executor/src/tlinearhash.c
index 42046925142f2d4957493679f3e0c62bcb31a943..d97f81c9946db6928f87a83d0a12896c85b6054a 100644
--- a/source/libs/executor/src/tlinearhash.c
+++ b/source/libs/executor/src/tlinearhash.c
@@ -17,6 +17,7 @@
#include "taoserror.h"
#include "tdef.h"
#include "tpagedbuf.h"
+#include "tlog.h"
#define LHASH_CAP_RATIO 0.85
diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c
index 1c31b550c64223b2afaf10499ff5512685b2ca68..30911887bbb42dd9e116f8c3cea2e587bc456144 100644
--- a/source/libs/executor/src/tsort.c
+++ b/source/libs/executor/src/tsort.c
@@ -34,14 +34,12 @@ struct SSortHandle {
int32_t pageSize;
int32_t numOfPages;
SDiskbasedBuf* pBuf;
-
- SArray* pSortInfo;
- SArray* pOrderedSource;
-
- int32_t loops;
- uint64_t sortElapsed;
- int64_t startTs;
- uint64_t totalElapsed;
+ SArray* pSortInfo;
+ SArray* pOrderedSource;
+ int32_t loops;
+ uint64_t sortElapsed;
+ int64_t startTs;
+ uint64_t totalElapsed;
int32_t sourceId;
SSDataBlock* pDataBlock;
@@ -99,9 +97,9 @@ SSortHandle* tsortCreateSortHandle(SArray* pSortInfo, int32_t type, int32_t page
}
static int32_t sortComparCleanup(SMsortComparParam* cmpParam) {
+ // NOTICE: pSource may be, if it is SORT_MULTISOURCE_MERGE
for (int32_t i = 0; i < cmpParam->numOfSources; ++i) {
- SSortSource* pSource =
- cmpParam->pSources[i]; // NOTICE: pSource may be SGenericSource *, if it is SORT_MULTISOURCE_MERGE
+ SSortSource* pSource = cmpParam->pSources[i];
blockDataDestroy(pSource->src.pBlock);
taosMemoryFreeClear(pSource);
}
@@ -116,9 +114,12 @@ void tsortClearOrderdSource(SArray *pOrderedSource) {
if (NULL == *pSource) {
continue;
}
-
+ // release pageIdList
+ if ((*pSource)->pageIdList) {
+ taosArrayDestroy((*pSource)->pageIdList);
+ }
if ((*pSource)->param && !(*pSource)->onlyRef) {
- taosMemoryFree((*pSource)->param);
+ taosMemoryFree((*pSource)->param);
}
taosMemoryFreeClear(*pSource);
}
@@ -155,7 +156,7 @@ static int32_t doAddNewExternalMemSource(SDiskbasedBuf* pBuf, SArray* pAllSource
SSortSource* pSource = taosMemoryCalloc(1, sizeof(SSortSource));
if (pSource == NULL) {
taosArrayDestroy(pPageIdList);
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
pSource->src.pBlock = pBlock;
@@ -228,15 +229,15 @@ static int32_t doAddToBuf(SSDataBlock* pDataBlock, SSortHandle* pHandle) {
return doAddNewExternalMemSource(pHandle->pBuf, pHandle->pOrderedSource, pBlock, &pHandle->sourceId, pPageIdList);
}
-static void setCurrentSourceIsDone(SSortSource* pSource, SSortHandle* pHandle) {
+static void setCurrentSourceDone(SSortSource* pSource, SSortHandle* pHandle) {
pSource->src.rowIndex = -1;
++pHandle->numOfCompletedSources;
}
-static int32_t sortComparInit(SMsortComparParam* cmpParam, SArray* pSources, int32_t startIndex, int32_t endIndex,
+static int32_t sortComparInit(SMsortComparParam* pParam, SArray* pSources, int32_t startIndex, int32_t endIndex,
SSortHandle* pHandle) {
- cmpParam->pSources = taosArrayGet(pSources, startIndex);
- cmpParam->numOfSources = (endIndex - startIndex + 1);
+ pParam->pSources = taosArrayGet(pSources, startIndex);
+ pParam->numOfSources = (endIndex - startIndex + 1);
int32_t code = 0;
@@ -244,7 +245,7 @@ static int32_t sortComparInit(SMsortComparParam* cmpParam, SArray* pSources, int
if (pHandle->pBuf == NULL) {
if (!osTempSpaceAvailable()) {
code = TSDB_CODE_NO_AVAIL_DISK;
- qError("Sort compare init failed since %s", terrstr(code));
+ qError("Sort compare init failed since %s, %s", terrstr(code), pHandle->idStr);
return code;
}
@@ -257,12 +258,12 @@ static int32_t sortComparInit(SMsortComparParam* cmpParam, SArray* pSources, int
}
if (pHandle->type == SORT_SINGLESOURCE_SORT) {
- for (int32_t i = 0; i < cmpParam->numOfSources; ++i) {
- SSortSource* pSource = cmpParam->pSources[i];
+ for (int32_t i = 0; i < pParam->numOfSources; ++i) {
+ SSortSource* pSource = pParam->pSources[i];
// set current source is done
if (taosArrayGetSize(pSource->pageIdList) == 0) {
- setCurrentSourceIsDone(pSource, pHandle);
+ setCurrentSourceDone(pSource, pHandle);
continue;
}
@@ -277,15 +278,21 @@ static int32_t sortComparInit(SMsortComparParam* cmpParam, SArray* pSources, int
releaseBufPage(pHandle->pBuf, pPage);
}
} else {
- for (int32_t i = 0; i < cmpParam->numOfSources; ++i) {
- SSortSource* pSource = cmpParam->pSources[i];
+ qDebug("start init for the multiway merge sort, %s", pHandle->idStr);
+ int64_t st = taosGetTimestampUs();
+
+ for (int32_t i = 0; i < pParam->numOfSources; ++i) {
+ SSortSource* pSource = pParam->pSources[i];
pSource->src.pBlock = pHandle->fetchfp(pSource->param);
// set current source is done
if (pSource->src.pBlock == NULL) {
- setCurrentSourceIsDone(pSource, pHandle);
+ setCurrentSourceDone(pSource, pHandle);
}
}
+
+ int64_t et = taosGetTimestampUs();
+ qDebug("init for merge sort completed, elapsed time:%.2f ms, %s", (et - st) / 1000.0, pHandle->idStr);
}
return code;
@@ -417,8 +424,8 @@ int32_t msortComparFn(const void* pLeft, const void* pRight, void* param) {
SSDataBlock* pRightBlock = pRightSource->src.pBlock;
if (pParam->cmpGroupId) {
- if (pLeftBlock->info.groupId != pRightBlock->info.groupId) {
- return pLeftBlock->info.groupId < pRightBlock->info.groupId ? -1 : 1;
+ if (pLeftBlock->info.id.groupId != pRightBlock->info.id.groupId) {
+ return pLeftBlock->info.id.groupId < pRightBlock->info.id.groupId ? -1 : 1;
}
}
@@ -801,7 +808,7 @@ STupleHandle* tsortNextTuple(SSortHandle* pHandle) {
index = tMergeTreeGetChosenIndex(pHandle->pMergeTree);
pSource = pHandle->cmpParam.pSources[index];
- assert(pSource->src.pBlock != NULL);
+ ASSERT(pSource->src.pBlock != NULL);
pHandle->tupleHandle.rowIndex = pSource->src.rowIndex;
pHandle->tupleHandle.pBlock = pSource->src.pBlock;
@@ -826,19 +833,24 @@ void* tsortGetValue(STupleHandle* pVHandle, int32_t colIndex) {
}
}
-uint64_t tsortGetGroupId(STupleHandle* pVHandle) { return pVHandle->pBlock->info.groupId; }
+uint64_t tsortGetGroupId(STupleHandle* pVHandle) { return pVHandle->pBlock->info.id.groupId; }
SSortExecInfo tsortGetSortExecInfo(SSortHandle* pHandle) {
SSortExecInfo info = {0};
- info.sortBuffer = pHandle->pageSize * pHandle->numOfPages;
- info.sortMethod = pHandle->inMemSort ? SORT_QSORT_T : SORT_SPILLED_MERGE_SORT_T;
- info.loops = pHandle->loops;
-
- if (pHandle->pBuf != NULL) {
- SDiskbasedBufStatis st = getDBufStatis(pHandle->pBuf);
- info.writeBytes = st.flushBytes;
- info.readBytes = st.loadBytes;
+ if (pHandle == NULL) {
+ info.sortMethod = SORT_QSORT_T; // by default
+ info.sortBuffer = 2 * 1048576; // 2mb by default
+ } else {
+ info.sortBuffer = pHandle->pageSize * pHandle->numOfPages;
+ info.sortMethod = pHandle->inMemSort ? SORT_QSORT_T : SORT_SPILLED_MERGE_SORT_T;
+ info.loops = pHandle->loops;
+
+ if (pHandle->pBuf != NULL) {
+ SDiskbasedBufStatis st = getDBufStatis(pHandle->pBuf);
+ info.writeBytes = st.flushBytes;
+ info.readBytes = st.loadBytes;
+ }
}
return info;
diff --git a/source/libs/function/CMakeLists.txt b/source/libs/function/CMakeLists.txt
index fa241dc6efe919b5b351186013e4dae81c622587..9d11d7b376b0de0e3f8b8fb5ad533cab72c90c19 100644
--- a/source/libs/function/CMakeLists.txt
+++ b/source/libs/function/CMakeLists.txt
@@ -1,6 +1,7 @@
aux_source_directory(src FUNCTION_SRC)
+aux_source_directory(src/detail FUNCTION_SRC_DETAIL)
list(REMOVE_ITEM FUNCTION_SRC src/udfd.c)
-add_library(function STATIC ${FUNCTION_SRC})
+add_library(function STATIC ${FUNCTION_SRC} ${FUNCTION_SRC_DETAIL})
target_include_directories(
function
PUBLIC
diff --git a/source/libs/function/inc/builtinsimpl.h b/source/libs/function/inc/builtinsimpl.h
index 89e9673b066b0a7353f36414c78e4c4de7d78bfa..307a82e256f694416a3bc386e510613bf8bc313b 100644
--- a/source/libs/function/inc/builtinsimpl.h
+++ b/source/libs/function/inc/builtinsimpl.h
@@ -23,6 +23,32 @@ extern "C" {
#include "function.h"
#include "functionMgt.h"
+typedef struct SSumRes {
+ union {
+ int64_t isum;
+ uint64_t usum;
+ double dsum;
+ };
+ int16_t type;
+ int64_t prevTs;
+ bool isPrevTsSet;
+} SSumRes;
+
+typedef struct SMinmaxResInfo {
+ bool assign; // assign the first value or not
+ int64_t v;
+ STuplePos tuplePos;
+
+ STuplePos nullTuplePos;
+ bool nullTupleSaved;
+ int16_t type;
+} SMinmaxResInfo;
+int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc);
+
+STuplePos saveTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, const STupleKey* pKey);
+int32_t updateTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, STuplePos* pPos);
+const char* loadTupleData(SqlFunctionCtx* pCtx, const STuplePos* pPos);
+
bool functionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo);
int32_t functionFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock);
int32_t functionFinalizeWithResultBuf(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, char* finalResult);
@@ -119,15 +145,10 @@ EFuncDataRequired lastDynDataReq(void* pRes, STimeWindow* pTimeWindow);
int32_t lastRowFunction(SqlFunctionCtx* pCtx);
bool getTopBotFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv);
-bool getTopBotMergeFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv);
bool topBotFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo);
int32_t topFunction(SqlFunctionCtx* pCtx);
-int32_t topFunctionMerge(SqlFunctionCtx* pCtx);
int32_t bottomFunction(SqlFunctionCtx* pCtx);
-int32_t bottomFunctionMerge(SqlFunctionCtx* pCtx);
int32_t topBotFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock);
-int32_t topBotPartialFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock);
-int32_t topBotMergeFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock);
int32_t topCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx);
int32_t bottomCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx);
int32_t getTopBotInfoSize(int64_t numOfItems);
diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c
index fe010786ebdcb12d9df1350fbe565c6fb1494e3f..07e480ee1d5b6c5c5cad3c8a56472ae5f262e94e 100644
--- a/source/libs/function/src/builtins.c
+++ b/source/libs/function/src/builtins.c
@@ -1924,7 +1924,8 @@ static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int
}
static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
- if (2 != LIST_LENGTH(pFunc->pParameterList)) {
+ int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
+ if (2 != numOfParams && 3 != numOfParams) {
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
}
@@ -1935,9 +1936,7 @@ static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
}
- // add database precision as param
uint8_t dbPrec = pFunc->node.resType.precision;
-
int32_t ret = validateTimeUnitParam(dbPrec, (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1));
if (ret == TIME_UNIT_TOO_SMALL) {
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
@@ -1948,11 +1947,30 @@ static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_
"TIMETRUNCATE function time unit parameter should be one of the following: [1b, 1u, 1a, 1s, 1m, 1h, 1d, 1w]");
}
+ if (3 == numOfParams) {
+ uint8_t para3Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 2))->resType.type;
+ if (!IS_INTEGER_TYPE(para3Type)) {
+ return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
+ }
+ SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 2);
+ if (pValue->datum.i != 0 && pValue->datum.i != 1) {
+ return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
+ }
+ }
+
+ // add database precision as param
+
int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
+ // add client timezone as param
+ code = addTimezoneParam(pFunc->pParameterList);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+
pFunc->node.resType =
(SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
return TSDB_CODE_SUCCESS;
@@ -2080,6 +2098,11 @@ static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, in
return TSDB_CODE_SUCCESS;
}
+static int32_t translateTableCountPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
+ pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
+ return TSDB_CODE_SUCCESS;
+}
+
// clang-format off
const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
@@ -3241,6 +3264,16 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.sprocessFunc = NULL,
.finalizeFunc = NULL
},
+ {
+ .name = "_table_count",
+ .type = FUNCTION_TYPE_TABLE_COUNT,
+ .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_SCAN_PC_FUNC,
+ .translateFunc = translateTableCountPseudoColumn,
+ .getEnvFunc = NULL,
+ .initFunc = NULL,
+ .sprocessFunc = NULL,
+ .finalizeFunc = NULL
+ },
};
// clang-format on
diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c
index 4d69b4d45cb9e5d4c1c3792903830a7b237e3092..111da6d6ba563b6b9b3166de7940f919b1581326 100644
--- a/source/libs/function/src/builtinsimpl.c
+++ b/source/libs/function/src/builtinsimpl.c
@@ -41,34 +41,15 @@
#define HLL_BUCKET_MASK (HLL_BUCKETS - 1)
#define HLL_ALPHA_INF 0.721347520444481703680 // constant for 0.5/ln(2)
-typedef struct SSumRes {
- union {
- int64_t isum;
- uint64_t usum;
- double dsum;
- };
- int16_t type;
- int64_t prevTs; // used for csum only
- bool isPrevTsSet; // used for csum only
-
-} SSumRes;
-
-typedef struct SAvgRes {
- double result;
- SSumRes sum;
- int64_t count;
- int16_t type; // store the original input type, used in merge function
-} SAvgRes;
-
-typedef struct SMinmaxResInfo {
- bool assign; // assign the first value or not
- int64_t v;
- STuplePos tuplePos;
-
- STuplePos nullTuplePos;
- bool nullTupleSaved;
- int16_t type;
-} SMinmaxResInfo;
+//typedef struct SMinmaxResInfo {
+// bool assign; // assign the first value or not
+// int64_t v;
+// STuplePos tuplePos;
+//
+// STuplePos nullTuplePos;
+// bool nullTupleSaved;
+// int16_t type;
+//} SMinmaxResInfo;
typedef struct STopBotResItem {
SVariant v;
@@ -369,19 +350,19 @@ typedef struct SGroupKeyInfo {
} \
} while (0)
-#define LIST_AVG_N(sumT, T) \
- do { \
- T* plist = (T*)pCol->pData; \
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) { \
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) { \
- continue; \
- } \
- \
- numOfElem += 1; \
- pAvgRes->count -= 1; \
- sumT -= plist[i]; \
- } \
- } while (0)
+//#define LIST_AVG_N(sumT, T) \
+// do { \
+// T* plist = (T*)pCol->pData; \
+// for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) { \
+// if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) { \
+// continue; \
+// } \
+// \
+// numOfElem += 1; \
+// pAvgRes->count -= 1; \
+// sumT -= plist[i]; \
+// } \
+// } while (0)
#define LIST_STDDEV_SUB_N(sumT, T) \
do { \
@@ -442,6 +423,8 @@ typedef struct SGroupKeyInfo {
(_p).val = (_v); \
} while (0)
+static int32_t firstLastTransferInfoImpl(SFirstLastRes* pInput, SFirstLastRes* pOutput, bool isFirst);
+
bool functionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
if (pResultInfo->initialized) {
return false;
@@ -476,11 +459,12 @@ int32_t firstCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) {
SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
SFirstLastRes* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
- if (pSResInfo->numOfRes != 0 && (pDResInfo->numOfRes == 0 || pDBuf->ts > pSBuf->ts)) {
- memcpy(pDBuf->buf, pSBuf->buf, bytes);
- pDBuf->ts = pSBuf->ts;
- pDResInfo->numOfRes = 1;
+ if (TSDB_CODE_SUCCESS == firstLastTransferInfoImpl(pSBuf, pDBuf, true)) {
+ pDBuf->hasResult = true;
}
+
+ pDResInfo->numOfRes = TMAX(pDResInfo->numOfRes, pSResInfo->numOfRes);
+ pDResInfo->isNullRes &= pSResInfo->isNullRes;
return TSDB_CODE_SUCCESS;
}
@@ -514,13 +498,13 @@ static int32_t getNumOfElems(SqlFunctionCtx* pCtx) {
int32_t numOfElem = 0;
/*
- * 1. column data missing (schema modified) causes pInputCol->hasNull == true. pInput->colDataAggIsSet == true;
- * 2. for general non-primary key columns, pInputCol->hasNull may be true or false, pInput->colDataAggIsSet == true;
- * 3. for primary key column, pInputCol->hasNull always be false, pInput->colDataAggIsSet == false;
+ * 1. column data missing (schema modified) causes pInputCol->hasNull == true. pInput->colDataSMAIsSet == true;
+ * 2. for general non-primary key columns, pInputCol->hasNull may be true or false, pInput->colDataSMAIsSet == true;
+ * 3. for primary key column, pInputCol->hasNull always be false, pInput->colDataSMAIsSet == false;
*/
SInputColumnInfoData* pInput = &pCtx->input;
SColumnInfoData* pInputCol = pInput->pData[0];
- if (pInput->colDataAggIsSet && pInput->totalRows == pInput->numOfRows) {
+ if (pInput->colDataSMAIsSet && pInput->totalRows == pInput->numOfRows && !IS_VAR_DATA_TYPE(pInputCol->info.type)) {
numOfElem = pInput->numOfRows - pInput->pColumnDataAgg[0]->numOfNull;
ASSERT(numOfElem >= 0);
} else {
@@ -545,7 +529,7 @@ static int32_t getNumOfElems(SqlFunctionCtx* pCtx) {
* count function does not use the pCtx->interResBuf to keep the intermediate buffer
*/
int32_t countFunction(SqlFunctionCtx* pCtx) {
- int32_t numOfElem = getNumOfElems(pCtx);
+ int32_t numOfElem = 0;
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
SInputColumnInfoData* pInput = &pCtx->input;
@@ -558,6 +542,7 @@ int32_t countFunction(SqlFunctionCtx* pCtx) {
numOfElem = 1;
*((int64_t*)buf) = 0;
} else {
+ numOfElem = getNumOfElems(pCtx);
*((int64_t*)buf) += numOfElem;
}
@@ -609,7 +594,7 @@ int32_t sumFunction(SqlFunctionCtx* pCtx) {
goto _sum_over;
}
- if (pInput->colDataAggIsSet) {
+ if (pInput->colDataSMAIsSet) {
numOfElem = pInput->numOfRows - pAgg->numOfNull;
ASSERT(numOfElem >= 0);
@@ -674,7 +659,7 @@ int32_t sumInvertFunction(SqlFunctionCtx* pCtx) {
SSumRes* pSumRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
- if (pInput->colDataAggIsSet) {
+ if (pInput->colDataSMAIsSet) {
numOfElem = pInput->numOfRows - pAgg->numOfNull;
ASSERT(numOfElem >= 0);
@@ -748,378 +733,6 @@ bool getSumFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
return true;
}
-int32_t getAvgInfoSize() { return (int32_t)sizeof(SAvgRes); }
-
-bool getAvgFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
- pEnv->calcMemSize = sizeof(SAvgRes);
- return true;
-}
-
-bool avgFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
- if (!functionSetup(pCtx, pResultInfo)) {
- return false;
- }
-
- SAvgRes* pRes = GET_ROWCELL_INTERBUF(pResultInfo);
- memset(pRes, 0, sizeof(SAvgRes));
- return true;
-}
-
-int32_t avgFunction(SqlFunctionCtx* pCtx) {
- int32_t numOfElem = 0;
-
- SInputColumnInfoData* pInput = &pCtx->input;
- SColumnDataAgg* pAgg = pInput->pColumnDataAgg[0];
- int32_t type = pInput->pData[0]->info.type;
-
- SAvgRes* pAvgRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
- pAvgRes->type = type;
-
- // computing based on the true data block
- SColumnInfoData* pCol = pInput->pData[0];
-
- int32_t start = pInput->startRowIndex;
- int32_t numOfRows = pInput->numOfRows;
-
- if (IS_NULL_TYPE(type)) {
- numOfElem = 0;
- goto _avg_over;
- }
-
- if (pInput->colDataAggIsSet) {
- numOfElem = numOfRows - pAgg->numOfNull;
- ASSERT(numOfElem >= 0);
-
- pAvgRes->count += numOfElem;
- if (IS_SIGNED_NUMERIC_TYPE(type)) {
- pAvgRes->sum.isum += pAgg->sum;
- } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
- pAvgRes->sum.usum += pAgg->sum;
- } else if (IS_FLOAT_TYPE(type)) {
- pAvgRes->sum.dsum += GET_DOUBLE_VAL((const char*)&(pAgg->sum));
- }
- } else { // computing based on the true data block
- switch (type) {
- case TSDB_DATA_TYPE_TINYINT: {
- int8_t* plist = (int8_t*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.isum += plist[i];
- }
-
- break;
- }
-
- case TSDB_DATA_TYPE_SMALLINT: {
- int16_t* plist = (int16_t*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.isum += plist[i];
- }
- break;
- }
-
- case TSDB_DATA_TYPE_INT: {
- int32_t* plist = (int32_t*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.isum += plist[i];
- }
-
- break;
- }
-
- case TSDB_DATA_TYPE_BIGINT: {
- int64_t* plist = (int64_t*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.isum += plist[i];
- }
- break;
- }
-
- case TSDB_DATA_TYPE_UTINYINT: {
- uint8_t* plist = (uint8_t*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.usum += plist[i];
- }
-
- break;
- }
-
- case TSDB_DATA_TYPE_USMALLINT: {
- uint16_t* plist = (uint16_t*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.usum += plist[i];
- }
- break;
- }
-
- case TSDB_DATA_TYPE_UINT: {
- uint32_t* plist = (uint32_t*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.usum += plist[i];
- }
-
- break;
- }
-
- case TSDB_DATA_TYPE_UBIGINT: {
- uint64_t* plist = (uint64_t*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.usum += plist[i];
- }
- break;
- }
-
- case TSDB_DATA_TYPE_FLOAT: {
- float* plist = (float*)pCol->pData;
- // float val = 0;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.dsum += plist[i];
- }
- // pAvgRes->sum.dsum = val;
- break;
- }
-
- case TSDB_DATA_TYPE_DOUBLE: {
- double* plist = (double*)pCol->pData;
- for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
- if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- numOfElem += 1;
- pAvgRes->count += 1;
- pAvgRes->sum.dsum += plist[i];
- }
- break;
- }
-
- default:
- break;
- }
- }
-
-_avg_over:
- // data in the check operation are all null, not output
- SET_VAL(GET_RES_INFO(pCtx), numOfElem, 1);
- return TSDB_CODE_SUCCESS;
-}
-
-static void avgTransferInfo(SAvgRes* pInput, SAvgRes* pOutput) {
- pOutput->type = pInput->type;
- if (IS_SIGNED_NUMERIC_TYPE(pOutput->type)) {
- pOutput->sum.isum += pInput->sum.isum;
- } else if (IS_UNSIGNED_NUMERIC_TYPE(pOutput->type)) {
- pOutput->sum.usum += pInput->sum.usum;
- } else {
- pOutput->sum.dsum += pInput->sum.dsum;
- }
-
- pOutput->count += pInput->count;
-
- return;
-}
-
-int32_t avgFunctionMerge(SqlFunctionCtx* pCtx) {
- SInputColumnInfoData* pInput = &pCtx->input;
- SColumnInfoData* pCol = pInput->pData[0];
- ASSERT(pCol->info.type == TSDB_DATA_TYPE_BINARY);
-
- SAvgRes* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
-
- int32_t start = pInput->startRowIndex;
-
- for (int32_t i = start; i < start + pInput->numOfRows; ++i) {
- char* data = colDataGetData(pCol, i);
- SAvgRes* pInputInfo = (SAvgRes*)varDataVal(data);
- avgTransferInfo(pInputInfo, pInfo);
- }
-
- SET_VAL(GET_RES_INFO(pCtx), 1, 1);
-
- return TSDB_CODE_SUCCESS;
-}
-
-int32_t avgInvertFunction(SqlFunctionCtx* pCtx) {
- int32_t numOfElem = 0;
-
- // Only the pre-computing information loaded and actual data does not loaded
- SInputColumnInfoData* pInput = &pCtx->input;
- int32_t type = pInput->pData[0]->info.type;
-
- SAvgRes* pAvgRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
-
- // computing based on the true data block
- SColumnInfoData* pCol = pInput->pData[0];
-
- int32_t start = pInput->startRowIndex;
- int32_t numOfRows = pInput->numOfRows;
-
- switch (type) {
- case TSDB_DATA_TYPE_TINYINT: {
- LIST_AVG_N(pAvgRes->sum.isum, int8_t);
- break;
- }
- case TSDB_DATA_TYPE_SMALLINT: {
- LIST_AVG_N(pAvgRes->sum.isum, int16_t);
- break;
- }
- case TSDB_DATA_TYPE_INT: {
- LIST_AVG_N(pAvgRes->sum.isum, int32_t);
- break;
- }
- case TSDB_DATA_TYPE_BIGINT: {
- LIST_AVG_N(pAvgRes->sum.isum, int64_t);
- break;
- }
- case TSDB_DATA_TYPE_UTINYINT: {
- LIST_AVG_N(pAvgRes->sum.usum, uint8_t);
- break;
- }
- case TSDB_DATA_TYPE_USMALLINT: {
- LIST_AVG_N(pAvgRes->sum.usum, uint16_t);
- break;
- }
- case TSDB_DATA_TYPE_UINT: {
- LIST_AVG_N(pAvgRes->sum.usum, uint32_t);
- break;
- }
- case TSDB_DATA_TYPE_UBIGINT: {
- LIST_AVG_N(pAvgRes->sum.usum, uint64_t);
- break;
- }
- case TSDB_DATA_TYPE_FLOAT: {
- LIST_AVG_N(pAvgRes->sum.dsum, float);
- break;
- }
- case TSDB_DATA_TYPE_DOUBLE: {
- LIST_AVG_N(pAvgRes->sum.dsum, double);
- break;
- }
- default:
- break;
- }
-
- // data in the check operation are all null, not output
- SET_VAL(GET_RES_INFO(pCtx), numOfElem, 1);
- return TSDB_CODE_SUCCESS;
-}
-
-int32_t avgCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) {
- SResultRowEntryInfo* pDResInfo = GET_RES_INFO(pDestCtx);
- SAvgRes* pDBuf = GET_ROWCELL_INTERBUF(pDResInfo);
-
- SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
- SAvgRes* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
- int16_t type = pDBuf->type == TSDB_DATA_TYPE_NULL ? pSBuf->type : pDBuf->type;
-
- if (IS_SIGNED_NUMERIC_TYPE(type)) {
- pDBuf->sum.isum += pSBuf->sum.isum;
- } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
- pDBuf->sum.usum += pSBuf->sum.usum;
- } else {
- pDBuf->sum.dsum += pSBuf->sum.dsum;
- }
- pDBuf->count += pSBuf->count;
-
- return TSDB_CODE_SUCCESS;
-}
-
-int32_t avgFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
- SInputColumnInfoData* pInput = &pCtx->input;
-
- SAvgRes* pAvgRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
- int32_t type = pAvgRes->type;
-
- if (pAvgRes->count == 0) {
- // [ASAN] runtime error: division by zero
- GET_RES_INFO(pCtx)->numOfRes = 0;
- } else if (IS_SIGNED_NUMERIC_TYPE(type)) {
- pAvgRes->result = pAvgRes->sum.isum / ((double)pAvgRes->count);
- } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
- pAvgRes->result = pAvgRes->sum.usum / ((double)pAvgRes->count);
- } else {
- pAvgRes->result = pAvgRes->sum.dsum / ((double)pAvgRes->count);
- }
-
- // check for overflow
- if (isinf(pAvgRes->result) || isnan(pAvgRes->result)) {
- GET_RES_INFO(pCtx)->numOfRes = 0;
- }
-
- return functionFinalize(pCtx, pBlock);
-}
-
-int32_t avgPartialFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
- SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
- SAvgRes* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
- int32_t resultBytes = getAvgInfoSize();
- char* res = taosMemoryCalloc(resultBytes + VARSTR_HEADER_SIZE, sizeof(char));
-
- memcpy(varDataVal(res), pInfo, resultBytes);
- varDataSetLen(res, resultBytes);
-
- int32_t slotId = pCtx->pExpr->base.resSchema.slotId;
- SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, slotId);
-
- colDataAppend(pCol, pBlock->info.rows, res, false);
-
- taosMemoryFree(res);
- return pResInfo->numOfRes;
-}
-
EFuncDataRequired statisDataRequired(SFunctionNode* pFunc, STimeWindow* pTimeWindow) {
return FUNC_DATA_REQUIRED_SMA_LOAD;
}
@@ -1143,534 +756,6 @@ bool getMinmaxFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
return true;
}
-static STuplePos saveTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock,
- const STupleKey* pKey);
-static int32_t updateTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, STuplePos* pPos);
-static const char* loadTupleData(SqlFunctionCtx* pCtx, const STuplePos* pPos);
-
-static int32_t findRowIndex(int32_t start, int32_t num, SColumnInfoData* pCol, const char* tval) {
- // the data is loaded, not only the block SMA value
- for (int32_t i = start; i < num + start; ++i) {
- char* p = colDataGetData(pCol, i);
- if (memcmp((void*)tval, p, pCol->info.bytes) == 0) {
- return i;
- }
- }
-
- // if reach here means real data of block SMA is not set in pCtx->input.
- return -1;
-}
-
-int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
- int32_t numOfElems = 0;
-
- SInputColumnInfoData* pInput = &pCtx->input;
- SColumnDataAgg* pAgg = pInput->pColumnDataAgg[0];
-
- SColumnInfoData* pCol = pInput->pData[0];
- int32_t type = pCol->info.type;
-
- SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
- SMinmaxResInfo* pBuf = GET_ROWCELL_INTERBUF(pResInfo);
- pBuf->type = type;
-
- if (IS_NULL_TYPE(type)) {
- numOfElems = 0;
- goto _min_max_over;
- }
-
- // data in current data block are qualified to the query
- if (pInput->colDataAggIsSet) {
- numOfElems = pInput->numOfRows - pAgg->numOfNull;
- ASSERT(pInput->numOfRows == pInput->totalRows && numOfElems >= 0);
- if (numOfElems == 0) {
- return numOfElems;
- }
-
- void* tval = NULL;
- int16_t index = 0;
-
- if (isMinFunc) {
- tval = &pInput->pColumnDataAgg[0]->min;
- } else {
- tval = &pInput->pColumnDataAgg[0]->max;
- }
-
- if (!pBuf->assign) {
- if (type == TSDB_DATA_TYPE_FLOAT) {
- *(float*)&pBuf->v = GET_DOUBLE_VAL(tval);
- } else {
- pBuf->v = *(int64_t*)tval;
- }
- if (pCtx->subsidiaries.num > 0) {
- index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- if (index >= 0) {
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
- }
- }
- } else {
- if (IS_SIGNED_NUMERIC_TYPE(type)) {
- int64_t prev = 0;
- GET_TYPED_DATA(prev, int64_t, type, &pBuf->v);
-
- int64_t val = GET_INT64_VAL(tval);
- if ((prev < val) ^ isMinFunc) {
- *(int64_t*)&pBuf->v = val;
- if (pCtx->subsidiaries.num > 0) {
- index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- if (index >= 0) {
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
- }
- }
- }
- } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
- uint64_t prev = 0;
- GET_TYPED_DATA(prev, uint64_t, type, &pBuf->v);
-
- uint64_t val = GET_UINT64_VAL(tval);
- if ((prev < val) ^ isMinFunc) {
- *(uint64_t*)&pBuf->v = val;
- if (pCtx->subsidiaries.num > 0) {
- index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- if (index >= 0) {
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
- }
- }
- }
- } else if (type == TSDB_DATA_TYPE_DOUBLE) {
- double prev = 0;
- GET_TYPED_DATA(prev, double, type, &pBuf->v);
-
- double val = GET_DOUBLE_VAL(tval);
- if ((prev < val) ^ isMinFunc) {
- *(double*)&pBuf->v = val;
- if (pCtx->subsidiaries.num > 0) {
- index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- if (index >= 0) {
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
- }
- }
- }
- } else if (type == TSDB_DATA_TYPE_FLOAT) {
- float prev = 0;
- GET_TYPED_DATA(prev, float, type, &pBuf->v);
-
- float val = GET_DOUBLE_VAL(tval);
- if ((prev < val) ^ isMinFunc) {
- *(float*)&pBuf->v = val;
- }
-
- if (pCtx->subsidiaries.num > 0) {
- index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- if (index >= 0) {
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
- }
- }
- }
- }
-
- pBuf->assign = true;
- return numOfElems;
- }
-
- int32_t start = pInput->startRowIndex;
- int32_t numOfRows = pInput->numOfRows;
-
- if (IS_SIGNED_NUMERIC_TYPE(type) || type == TSDB_DATA_TYPE_BOOL) {
- if (type == TSDB_DATA_TYPE_TINYINT || type == TSDB_DATA_TYPE_BOOL) {
- int8_t* pData = (int8_t*)pCol->pData;
- int8_t* val = (int8_t*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- } else if (type == TSDB_DATA_TYPE_SMALLINT) {
- int16_t* pData = (int16_t*)pCol->pData;
- int16_t* val = (int16_t*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- } else if (type == TSDB_DATA_TYPE_INT) {
- int32_t* pData = (int32_t*)pCol->pData;
- int32_t* val = (int32_t*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- } else if (type == TSDB_DATA_TYPE_BIGINT) {
- int64_t* pData = (int64_t*)pCol->pData;
- int64_t* val = (int64_t*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- }
- } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
- if (type == TSDB_DATA_TYPE_UTINYINT) {
- uint8_t* pData = (uint8_t*)pCol->pData;
- uint8_t* val = (uint8_t*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- } else if (type == TSDB_DATA_TYPE_USMALLINT) {
- uint16_t* pData = (uint16_t*)pCol->pData;
- uint16_t* val = (uint16_t*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- } else if (type == TSDB_DATA_TYPE_UINT) {
- uint32_t* pData = (uint32_t*)pCol->pData;
- uint32_t* val = (uint32_t*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- } else if (type == TSDB_DATA_TYPE_UBIGINT) {
- uint64_t* pData = (uint64_t*)pCol->pData;
- uint64_t* val = (uint64_t*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- }
- } else if (type == TSDB_DATA_TYPE_DOUBLE) {
- double* pData = (double*)pCol->pData;
- double* val = (double*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
- // ignore the equivalent data value
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- } else if (type == TSDB_DATA_TYPE_FLOAT) {
- float* pData = (float*)pCol->pData;
- float* val = (float*)&pBuf->v;
-
- for (int32_t i = start; i < start + numOfRows; ++i) {
- if ((pCol->hasNull) && colDataIsNull_f(pCol->nullbitmap, i)) {
- continue;
- }
-
- if (!pBuf->assign) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
- }
- pBuf->assign = true;
- } else {
-#if 0
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
-#endif
- // NOTE: An faster version to avoid one additional comparison with FPU.
- if (isMinFunc) { // min
- if (*val > pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- } else { // max
- if (*val < pData[i]) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
- }
- }
- }
- }
-
- numOfElems += 1;
- }
- }
-
-_min_max_over:
- if (numOfElems == 0 && pCtx->subsidiaries.num > 0 && !pBuf->nullTupleSaved) {
- pBuf->nullTuplePos = saveTupleData(pCtx, pInput->startRowIndex, pCtx->pSrcBlock, NULL);
- pBuf->nullTupleSaved = true;
- }
- return numOfElems;
-}
-
int32_t minFunction(SqlFunctionCtx* pCtx) {
int32_t numOfElems = doMinMaxHelper(pCtx, 1);
SET_VAL(GET_RES_INFO(pCtx), numOfElems, 1);
@@ -2192,17 +1277,8 @@ int32_t stddevCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) {
SStddevRes* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
int16_t type = pDBuf->type == TSDB_DATA_TYPE_NULL ? pSBuf->type : pDBuf->type;
- if (IS_SIGNED_NUMERIC_TYPE(type)) {
- pDBuf->isum += pSBuf->isum;
- pDBuf->quadraticISum += pSBuf->quadraticISum;
- } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
- pDBuf->usum += pSBuf->usum;
- pDBuf->quadraticUSum += pSBuf->quadraticUSum;
- } else {
- pDBuf->dsum += pSBuf->dsum;
- pDBuf->quadraticDSum += pSBuf->quadraticDSum;
- }
- pDBuf->count += pSBuf->count;
+ stddevTransferInfo(pSBuf, pDBuf);
+
pDResInfo->numOfRes = TMAX(pDResInfo->numOfRes, pSResInfo->numOfRes);
pDResInfo->isNullRes &= pSResInfo->isNullRes;
return TSDB_CODE_SUCCESS;
@@ -2418,7 +1494,7 @@ int32_t leastSQRFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
param12 /= param[1][1];
- char buf[64] = {0};
+ char buf[512] = {0};
size_t len =
snprintf(varDataVal(buf), sizeof(buf) - VARSTR_HEADER_SIZE, "{slop:%.6lf, intercept:%.6lf}", param02, param12);
varDataSetLen(buf, len);
@@ -2499,7 +1575,7 @@ int32_t percentileFunction(SqlFunctionCtx* pCtx) {
// the first stage, only acquire the min/max value
if (pInfo->stage == 0) {
- if (pCtx->input.colDataAggIsSet) {
+ if (pCtx->input.colDataSMAIsSet) {
double tmin = 0.0, tmax = 0.0;
if (IS_SIGNED_NUMERIC_TYPE(type)) {
tmin = (double)GET_INT64_VAL(&pAgg->min);
@@ -2962,15 +2038,19 @@ int32_t firstFunction(SqlFunctionCtx* pCtx) {
pInfo->bytes = pInputCol->info.bytes;
+ if (IS_NULL_TYPE(pInputCol->info.type)) {
+ return TSDB_CODE_SUCCESS;
+ }
+
// All null data column, return directly.
- if (pInput->colDataAggIsSet && (pInput->pColumnDataAgg[0]->numOfNull == pInput->totalRows)) {
+ if (pInput->colDataSMAIsSet && (pInput->pColumnDataAgg[0]->numOfNull == pInput->totalRows)) {
ASSERT(pInputCol->hasNull == true);
// save selectivity value for column consisted of all null values
firstlastSaveTupleData(pCtx->pSrcBlock, pInput->startRowIndex, pCtx, pInfo);
- return 0;
+ return TSDB_CODE_SUCCESS;
}
- SColumnDataAgg* pColAgg = (pInput->colDataAggIsSet) ? pInput->pColumnDataAgg[0] : NULL;
+ SColumnDataAgg* pColAgg = (pInput->colDataSMAIsSet) ? pInput->pColumnDataAgg[0] : NULL;
TSKEY startKey = getRowPTs(pInput->pPTS, 0);
TSKEY endKey = getRowPTs(pInput->pPTS, pInput->totalRows - 1);
@@ -3066,15 +2146,19 @@ int32_t lastFunction(SqlFunctionCtx* pCtx) {
int32_t bytes = pInputCol->info.bytes;
pInfo->bytes = bytes;
+ if (IS_NULL_TYPE(type)) {
+ return TSDB_CODE_SUCCESS;
+ }
+
// All null data column, return directly.
- if (pInput->colDataAggIsSet && (pInput->pColumnDataAgg[0]->numOfNull == pInput->totalRows)) {
+ if (pInput->colDataSMAIsSet && (pInput->pColumnDataAgg[0]->numOfNull == pInput->totalRows)) {
ASSERT(pInputCol->hasNull == true);
// save selectivity value for column consisted of all null values
firstlastSaveTupleData(pCtx->pSrcBlock, pInput->startRowIndex, pCtx, pInfo);
- return 0;
+ return TSDB_CODE_SUCCESS;
}
- SColumnDataAgg* pColAgg = (pInput->colDataAggIsSet) ? pInput->pColumnDataAgg[0] : NULL;
+ SColumnDataAgg* pColAgg = (pInput->colDataSMAIsSet) ? pInput->pColumnDataAgg[0] : NULL;
TSKEY startKey = getRowPTs(pInput->pPTS, 0);
TSKEY endKey = getRowPTs(pInput->pPTS, pInput->totalRows - 1);
@@ -3138,10 +2222,9 @@ int32_t lastFunction(SqlFunctionCtx* pCtx) {
int32_t round = pInput->numOfRows >> 2;
int32_t reminder = pInput->numOfRows & 0x03;
- int32_t tick = 0;
- for (int32_t i = pInput->startRowIndex; tick < round; i += 4, tick += 1) {
- int64_t cts = pts[i];
- int32_t chosen = i;
+ for (int32_t i = pInput->startRowIndex, tick = 0; tick < round; i += 4, tick += 1) {
+ int64_t cts = pts[i];
+ int32_t chosen = i;
if (cts < pts[i + 1]) {
cts = pts[i + 1];
@@ -3165,18 +2248,18 @@ int32_t lastFunction(SqlFunctionCtx* pCtx) {
}
}
- for (int32_t i = pInput->startRowIndex + round * 4; i < pInput->startRowIndex + pInput->numOfRows; ++i) {
- if (pResInfo->numOfRes == 0 || pInfo->ts < pts[i]) {
- char* data = colDataGetData(pInputCol, i);
- doSaveCurrentVal(pCtx, i, pts[i], type, data);
- pResInfo->numOfRes = 1;
- }
- }
- } else {
- for (int32_t i = pInput->startRowIndex; i < pInput->startRowIndex + pInput->numOfRows; ++i) {
- if (pInputCol->hasNull && colDataIsNull(pInputCol, pInput->totalRows, i, pColAgg)) {
- continue;
+ for (int32_t i = pInput->startRowIndex + round * 4; i < pInput->startRowIndex + pInput->numOfRows; ++i) {
+ if (pResInfo->numOfRes == 0 || pInfo->ts < pts[i]) {
+ char* data = colDataGetData(pInputCol, i);
+ doSaveCurrentVal(pCtx, i, pts[i], type, data);
+ pResInfo->numOfRes = 1;
+ }
}
+ } else {
+ for (int32_t i = pInput->startRowIndex; i < pInput->startRowIndex + pInput->numOfRows; ++i) {
+ if (colDataIsNull(pInputCol, pInput->totalRows, i, pColAgg)) {
+ continue;
+ }
numOfElems++;
@@ -3200,16 +2283,15 @@ int32_t lastFunction(SqlFunctionCtx* pCtx) {
return TSDB_CODE_SUCCESS;
}
-static void firstLastTransferInfo(SqlFunctionCtx* pCtx, SFirstLastRes* pInput, SFirstLastRes* pOutput, bool isFirst,
- int32_t rowIndex) {
+static int32_t firstLastTransferInfoImpl(SFirstLastRes* pInput, SFirstLastRes* pOutput, bool isFirst) {
if (pOutput->hasResult) {
if (isFirst) {
if (pInput->ts > pOutput->ts) {
- return;
+ return TSDB_CODE_FAILED;
}
} else {
if (pInput->ts < pOutput->ts) {
- return;
+ return TSDB_CODE_FAILED;
}
}
}
@@ -3219,9 +2301,15 @@ static void firstLastTransferInfo(SqlFunctionCtx* pCtx, SFirstLastRes* pInput, S
pOutput->bytes = pInput->bytes;
memcpy(pOutput->buf, pInput->buf, pOutput->bytes);
- firstlastSaveTupleData(pCtx->pSrcBlock, rowIndex, pCtx, pOutput);
+ return TSDB_CODE_SUCCESS;
+}
- pOutput->hasResult = true;
+static void firstLastTransferInfo(SqlFunctionCtx* pCtx, SFirstLastRes* pInput, SFirstLastRes* pOutput, bool isFirst,
+ int32_t rowIndex) {
+ if (TSDB_CODE_SUCCESS == firstLastTransferInfoImpl(pInput, pOutput, isFirst)) {
+ firstlastSaveTupleData(pCtx->pSrcBlock, rowIndex, pCtx, pOutput);
+ pOutput->hasResult = true;
+ }
}
static int32_t firstLastFunctionMergeImpl(SqlFunctionCtx* pCtx, bool isFirstQuery) {
@@ -3289,7 +2377,6 @@ int32_t firstLastPartialFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
return 1;
}
-// todo rewrite:
int32_t lastCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) {
SResultRowEntryInfo* pDResInfo = GET_RES_INFO(pDestCtx);
SFirstLastRes* pDBuf = GET_ROWCELL_INTERBUF(pDResInfo);
@@ -3298,11 +2385,12 @@ int32_t lastCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) {
SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
SFirstLastRes* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
- if (pSResInfo->numOfRes != 0 && (pDResInfo->numOfRes == 0 || pDBuf->ts < pSBuf->ts)) {
- memcpy(pDBuf->buf, pSBuf->buf, bytes);
- pDBuf->ts = pSBuf->ts;
- pDResInfo->numOfRes = 1;
+ if (TSDB_CODE_SUCCESS == firstLastTransferInfoImpl(pSBuf, pDBuf, false)) {
+ pDBuf->hasResult = true;
}
+
+ pDResInfo->numOfRes = TMAX(pDResInfo->numOfRes, pSResInfo->numOfRes);
+ pDResInfo->isNullRes &= pSResInfo->isNullRes;
return TSDB_CODE_SUCCESS;
}
@@ -3337,9 +2425,14 @@ int32_t lastRowFunction(SqlFunctionCtx* pCtx) {
SInputColumnInfoData* pInput = &pCtx->input;
SColumnInfoData* pInputCol = pInput->pData[0];
+ int32_t type = pInputCol->info.type;
int32_t bytes = pInputCol->info.bytes;
pInfo->bytes = bytes;
+ if (IS_NULL_TYPE(type)) {
+ return TSDB_CODE_SUCCESS;
+ }
+
TSKEY startKey = getRowPTs(pInput->pPTS, 0);
TSKEY endKey = getRowPTs(pInput->pPTS, pInput->totalRows - 1);
@@ -3376,7 +2469,8 @@ int32_t lastRowFunction(SqlFunctionCtx* pCtx) {
int64_t* pts = (int64_t*)pInput->pPTS->pData;
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
- char* data = colDataGetData(pInputCol, i);
+ bool isNull = colDataIsNull(pInputCol, pInput->numOfRows, i, NULL);
+ char* data = isNull ? NULL : colDataGetData(pInputCol, i);
TSKEY cts = pts[i];
numOfElems++;
@@ -3894,7 +2988,7 @@ static int32_t doUpdateTupleData(SSerializeDataHandle* pHandle, const void* pBuf
return TSDB_CODE_SUCCESS;
}
-static int32_t updateTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, STuplePos* pPos) {
+int32_t updateTupleData(SqlFunctionCtx* pCtx, int32_t rowIndex, const SSDataBlock* pSrcBlock, STuplePos* pPos) {
char* buf = serializeTupleData(pSrcBlock, rowIndex, &pCtx->subsidiaries, pCtx->subsidiaries.buf);
doUpdateTupleData(&pCtx->saveHandle, buf, pCtx->subsidiaries.rowLen, pPos);
return TSDB_CODE_SUCCESS;
@@ -3914,7 +3008,7 @@ static char* doLoadTupleData(SSerializeDataHandle* pHandle, const STuplePos* pPo
}
}
-static const char* loadTupleData(SqlFunctionCtx* pCtx, const STuplePos* pPos) {
+const char* loadTupleData(SqlFunctionCtx* pCtx, const STuplePos* pPos) {
return doLoadTupleData(&pCtx->saveHandle, pPos);
}
@@ -4035,7 +3129,7 @@ int32_t spreadFunction(SqlFunctionCtx* pCtx) {
SSpreadInfo* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
- if (pInput->colDataAggIsSet) {
+ if (pInput->colDataSMAIsSet) {
numOfElems = pInput->numOfRows - pAgg->numOfNull;
if (numOfElems == 0) {
goto _spread_over;
@@ -4210,7 +3304,7 @@ int32_t elapsedFunction(SqlFunctionCtx* pCtx) {
goto _elapsed_over;
}
- if (pInput->colDataAggIsSet) {
+ if (pInput->colDataSMAIsSet) {
if (pInfo->min == TSKEY_MAX) {
pInfo->min = GET_INT64_VAL(&pAgg->min);
pInfo->max = GET_INT64_VAL(&pAgg->max);
@@ -4532,6 +3626,7 @@ bool histogramFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultIn
char* binDesc = strndup(varDataVal(pCtx->param[2].param.pz), varDataLen(pCtx->param[2].param.pz));
int64_t normalized = pCtx->param[3].param.i;
if (normalized != 0 && normalized != 1) {
+ taosMemoryFree(binDesc);
return false;
}
if (!getHistogramBinDesc(pInfo, binDesc, binType, (bool)normalized)) {
@@ -4787,6 +3882,10 @@ int32_t hllFunction(SqlFunctionCtx* pCtx) {
int32_t numOfRows = pInput->numOfRows;
int32_t numOfElems = 0;
+ if (IS_NULL_TYPE(type)) {
+ goto _hll_over;
+ }
+
for (int32_t i = start; i < numOfRows + start; ++i) {
if (pCol->hasNull && colDataIsNull_s(pCol, i)) {
continue;
@@ -4808,6 +3907,7 @@ int32_t hllFunction(SqlFunctionCtx* pCtx) {
}
}
+_hll_over:
pInfo->totalCount += numOfElems;
if (pInfo->totalCount == 0 && !tsCountAlwaysReturnValue) {
@@ -4831,12 +3931,16 @@ static void hllTransferInfo(SHLLInfo* pInput, SHLLInfo* pOutput) {
int32_t hllFunctionMerge(SqlFunctionCtx* pCtx) {
SInputColumnInfoData* pInput = &pCtx->input;
SColumnInfoData* pCol = pInput->pData[0];
- ASSERT(pCol->info.type == TSDB_DATA_TYPE_BINARY);
+
+ if (pCol->info.type != TSDB_DATA_TYPE_BINARY) {
+ return TSDB_CODE_SUCCESS;
+ }
SHLLInfo* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
int32_t start = pInput->startRowIndex;
+
for (int32_t i = start; i < start + pInput->numOfRows; ++i) {
char* data = colDataGetData(pCol, i);
SHLLInfo* pInputInfo = (SHLLInfo*)varDataVal(data);
@@ -5672,12 +4776,12 @@ int32_t modeFunction(SqlFunctionCtx* pCtx) {
int32_t numOfElems = 0;
int32_t startOffset = pCtx->offset;
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
- char* data = colDataGetData(pInputCol, i);
if (colDataIsNull_s(pInputCol, i)) {
continue;
}
-
numOfElems++;
+
+ char* data = colDataGetData(pInputCol, i);
doModeAdd(pInfo, i, pCtx, data);
if (sizeof(SModeInfo) + pInfo->numOfPoints * (sizeof(SModeItem) + pInfo->colBytes) >= MODE_MAX_RESULT_SIZE) {
diff --git a/source/libs/function/src/detail/tavgfunction.c b/source/libs/function/src/detail/tavgfunction.c
new file mode 100644
index 0000000000000000000000000000000000000000..1c74d22a820c964cfbc94a4f920bd3bf5757682d
--- /dev/null
+++ b/source/libs/function/src/detail/tavgfunction.c
@@ -0,0 +1,796 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#include "builtinsimpl.h"
+#include "function.h"
+#include "tdatablock.h"
+#include "tfunctionInt.h"
+#include "tglobal.h"
+
+#define SET_VAL(_info, numOfElem, res) \
+ do { \
+ if ((numOfElem) <= 0) { \
+ break; \
+ } \
+ (_info)->numOfRes = (res); \
+ } while (0)
+
+#define LIST_AVG_N(sumT, T) \
+ do { \
+ T* plist = (T*)pCol->pData; \
+ for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) { \
+ if (colDataIsNull_f(pCol->nullbitmap, i)) { \
+ continue; \
+ } \
+ \
+ numOfElem += 1; \
+ pAvgRes->count -= 1; \
+ sumT -= plist[i]; \
+ } \
+ } while (0)
+
+typedef struct SAvgRes {
+ double result;
+ SSumRes sum;
+ int64_t count;
+ int16_t type; // store the original input type, used in merge function
+} SAvgRes;
+
+static void floatVectorSumAVX(const float* plist, int32_t numOfRows, SAvgRes* pRes) {
+ const int32_t bitWidth = 256;
+
+#if __AVX__
+ // find the start position that are aligned to 32bytes address in memory
+ int32_t width = (bitWidth>>3u) / sizeof(float);
+
+ int32_t remainder = numOfRows % width;
+ int32_t rounds = numOfRows / width;
+
+ const float* p = plist;
+
+ __m256 val;
+ __m256 sum = _mm256_setzero_ps();
+
+ for (int32_t i = 0; i < rounds; ++i) {
+ val = _mm256_loadu_ps(p);
+ sum = _mm256_add_ps(sum, val);
+ p += width;
+ }
+
+ // let sum up the final results
+ const float* q = (const float*)∑
+ pRes->sum.dsum += q[0] + q[1] + q[2] + q[3] + q[4] + q[5] + q[6] + q[7];
+
+ int32_t startIndex = rounds * width;
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.dsum += plist[j + startIndex];
+ }
+#endif
+}
+
+static void doubleVectorSumAVX(const double* plist, int32_t numOfRows, SAvgRes* pRes) {
+ const int32_t bitWidth = 256;
+
+#if __AVX__
+ // find the start position that are aligned to 32bytes address in memory
+ int32_t width = (bitWidth>>3u) / sizeof(int64_t);
+
+ int32_t remainder = numOfRows % width;
+ int32_t rounds = numOfRows / width;
+
+ const double* p = plist;
+
+ __m256d val;
+ __m256d sum = _mm256_setzero_pd();
+
+ for (int32_t i = 0; i < rounds; ++i) {
+ val = _mm256_loadu_pd(p);
+ sum = _mm256_add_pd(sum, val);
+ p += width;
+ }
+
+ // let sum up the final results
+ const double* q = (const double*)∑
+ pRes->sum.dsum += q[0] + q[1] + q[2] + q[3];
+
+ int32_t startIndex = rounds * width;
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.dsum += plist[j + startIndex];
+ }
+#endif
+}
+
+static void i8VectorSumAVX2(const int8_t* plist, int32_t numOfRows, int32_t type, SAvgRes* pRes) {
+ const int32_t bitWidth = 256;
+
+#if __AVX2__
+ // find the start position that are aligned to 32bytes address in memory
+ int32_t width = (bitWidth>>3u) / sizeof(int64_t);
+
+ int32_t remainder = numOfRows % width;
+ int32_t rounds = numOfRows / width;
+
+ __m256i sum = _mm256_setzero_si256();
+
+ if (type == TSDB_DATA_TYPE_TINYINT) {
+ const int8_t* p = plist;
+
+ for (int32_t i = 0; i < rounds; ++i) {
+ __m128i val = _mm_lddqu_si128((__m128i*)p);
+ __m256i extVal = _mm256_cvtepi8_epi64(val); // only four items will be converted into __m256i
+ sum = _mm256_add_epi64(sum, extVal);
+ p += width;
+ }
+
+ // let sum up the final results
+ const int64_t* q = (const int64_t*)∑
+ pRes->sum.isum += q[0] + q[1] + q[2] + q[3];
+
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.isum += plist[j + rounds * width];
+ }
+ } else {
+ const uint8_t* p = (const uint8_t*)plist;
+
+ for(int32_t i = 0; i < rounds; ++i) {
+ __m128i val = _mm_lddqu_si128((__m128i*)p);
+ __m256i extVal = _mm256_cvtepu8_epi64(val); // only four items will be converted into __m256i
+ sum = _mm256_add_epi64(sum, extVal);
+ p += width;
+ }
+
+ // let sum up the final results
+ const uint64_t* q = (const uint64_t*)∑
+ pRes->sum.usum += q[0] + q[1] + q[2] + q[3];
+
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.usum += (uint8_t)plist[j + rounds * width];
+ }
+ }
+
+#endif
+}
+
+static void i16VectorSumAVX2(const int16_t* plist, int32_t numOfRows, int32_t type, SAvgRes* pRes) {
+ const int32_t bitWidth = 256;
+
+#if __AVX2__
+ // find the start position that are aligned to 32bytes address in memory
+ int32_t width = (bitWidth>>3u) / sizeof(int64_t);
+
+ int32_t remainder = numOfRows % width;
+ int32_t rounds = numOfRows / width;
+
+ __m256i sum = _mm256_setzero_si256();
+
+ if (type == TSDB_DATA_TYPE_SMALLINT) {
+ const int16_t* p = plist;
+
+ for (int32_t i = 0; i < rounds; ++i) {
+ __m128i val = _mm_lddqu_si128((__m128i*)p);
+ __m256i extVal = _mm256_cvtepi16_epi64(val); // only four items will be converted into __m256i
+ sum = _mm256_add_epi64(sum, extVal);
+ p += width;
+ }
+
+ // let sum up the final results
+ const int64_t* q = (const int64_t*)∑
+ pRes->sum.isum += q[0] + q[1] + q[2] + q[3];
+
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.isum += plist[j + rounds * width];
+ }
+ } else {
+ const uint16_t* p = (const uint16_t*)plist;
+
+ for(int32_t i = 0; i < rounds; ++i) {
+ __m128i val = _mm_lddqu_si128((__m128i*)p);
+ __m256i extVal = _mm256_cvtepu16_epi64(val); // only four items will be converted into __m256i
+ sum = _mm256_add_epi64(sum, extVal);
+ p += width;
+ }
+
+ // let sum up the final results
+ const uint64_t* q = (const uint64_t*)∑
+ pRes->sum.usum += q[0] + q[1] + q[2] + q[3];
+
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.usum += (uint16_t)plist[j + rounds * width];
+ }
+ }
+
+#endif
+}
+
+static void i32VectorSumAVX2(const int32_t* plist, int32_t numOfRows, int32_t type, SAvgRes* pRes) {
+ const int32_t bitWidth = 256;
+
+#if __AVX2__
+ // find the start position that are aligned to 32bytes address in memory
+ int32_t width = (bitWidth>>3u) / sizeof(int64_t);
+
+ int32_t remainder = numOfRows % width;
+ int32_t rounds = numOfRows / width;
+
+ __m256i sum = _mm256_setzero_si256();
+
+ if (type == TSDB_DATA_TYPE_INT) {
+ const int32_t* p = plist;
+
+ for (int32_t i = 0; i < rounds; ++i) {
+ __m128i val = _mm_lddqu_si128((__m128i*)p);
+ __m256i extVal = _mm256_cvtepi32_epi64(val); // only four items will be converted into __m256i
+ sum = _mm256_add_epi64(sum, extVal);
+ p += width;
+ }
+
+ // let sum up the final results
+ const int64_t* q = (const int64_t*)∑
+ pRes->sum.isum += q[0] + q[1] + q[2] + q[3];
+
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.isum += plist[j + rounds * width];
+ }
+ } else {
+ const uint32_t* p = (const uint32_t*)plist;
+
+ for(int32_t i = 0; i < rounds; ++i) {
+ __m128i val = _mm_lddqu_si128((__m128i*)p);
+ __m256i extVal = _mm256_cvtepu32_epi64(val); // only four items will be converted into __m256i
+ sum = _mm256_add_epi64(sum, extVal);
+ p += width;
+ }
+
+ // let sum up the final results
+ const uint64_t* q = (const uint64_t*)∑
+ pRes->sum.usum += q[0] + q[1] + q[2] + q[3];
+
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.usum += (uint32_t)plist[j + rounds * width];
+ }
+ }
+
+#endif
+}
+
+static void i64VectorSumAVX2(const int64_t* plist, int32_t numOfRows, SAvgRes* pRes) {
+ const int32_t bitWidth = 256;
+
+#if __AVX2__
+ // find the start position that are aligned to 32bytes address in memory
+ int32_t width = (bitWidth >> 3u) / sizeof(int64_t);
+
+ int32_t remainder = numOfRows % width;
+ int32_t rounds = numOfRows / width;
+
+ __m256i sum = _mm256_setzero_si256();
+
+ const int64_t* p = plist;
+
+ for (int32_t i = 0; i < rounds; ++i) {
+ __m256i val = _mm256_lddqu_si256((__m256i*)p);
+ sum = _mm256_add_epi64(sum, val);
+ p += width;
+ }
+
+ // let sum up the final results
+ const int64_t* q = (const int64_t*)∑
+ pRes->sum.isum += q[0] + q[1] + q[2] + q[3];
+
+ for (int32_t j = 0; j < remainder; ++j) {
+ pRes->sum.isum += plist[j + rounds * width];
+ }
+
+#endif
+}
+
+int32_t getAvgInfoSize() { return (int32_t)sizeof(SAvgRes); }
+
+bool getAvgFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
+ pEnv->calcMemSize = sizeof(SAvgRes);
+ return true;
+}
+
+bool avgFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
+ if (!functionSetup(pCtx, pResultInfo)) {
+ return false;
+ }
+
+ SAvgRes* pRes = GET_ROWCELL_INTERBUF(pResultInfo);
+ memset(pRes, 0, sizeof(SAvgRes));
+ return true;
+}
+
+static int32_t calculateAvgBySMAInfo(SAvgRes* pRes, int32_t numOfRows, int32_t type, const SColumnDataAgg* pAgg) {
+ int32_t numOfElem = numOfRows - pAgg->numOfNull;
+ ASSERT(numOfElem >= 0);
+
+ pRes->count += numOfElem;
+ if (IS_SIGNED_NUMERIC_TYPE(type)) {
+ pRes->sum.isum += pAgg->sum;
+ } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
+ pRes->sum.usum += pAgg->sum;
+ } else if (IS_FLOAT_TYPE(type)) {
+ pRes->sum.dsum += GET_DOUBLE_VAL((const char*)&(pAgg->sum));
+ }
+
+ return numOfElem;
+}
+
+static int32_t doAddNumericVector(SColumnInfoData* pCol, int32_t type, SInputColumnInfoData *pInput, SAvgRes* pRes) {
+ int32_t start = pInput->startRowIndex;
+ int32_t numOfRows = pInput->numOfRows;
+ int32_t numOfElems = 0;
+
+ switch (type) {
+ case TSDB_DATA_TYPE_TINYINT: {
+ int8_t* plist = (int8_t*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.isum += plist[i];
+ }
+
+ break;
+ }
+
+ case TSDB_DATA_TYPE_SMALLINT: {
+ int16_t* plist = (int16_t*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.isum += plist[i];
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_INT: {
+ int32_t* plist = (int32_t*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.isum += plist[i];
+ }
+
+ break;
+ }
+
+ case TSDB_DATA_TYPE_BIGINT: {
+ int64_t* plist = (int64_t*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.isum += plist[i];
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UTINYINT: {
+ uint8_t* plist = (uint8_t*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.usum += plist[i];
+ }
+
+ break;
+ }
+
+ case TSDB_DATA_TYPE_USMALLINT: {
+ uint16_t* plist = (uint16_t*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.usum += plist[i];
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UINT: {
+ uint32_t* plist = (uint32_t*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.usum += plist[i];
+ }
+
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UBIGINT: {
+ uint64_t* plist = (uint64_t*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.usum += plist[i];
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_FLOAT: {
+ float* plist = (float*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.dsum += plist[i];
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_DOUBLE: {
+ double* plist = (double*)pCol->pData;
+ for (int32_t i = start; i < numOfRows + start; ++i) {
+ if (colDataIsNull_f(pCol->nullbitmap, i)) {
+ continue;
+ }
+
+ numOfElems += 1;
+ pRes->count += 1;
+ pRes->sum.dsum += plist[i];
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return numOfElems;
+}
+
+int32_t avgFunction(SqlFunctionCtx* pCtx) {
+ int32_t numOfElem = 0;
+ const int32_t THRESHOLD_SIZE = 8;
+
+ SInputColumnInfoData* pInput = &pCtx->input;
+ SColumnDataAgg* pAgg = pInput->pColumnDataAgg[0];
+ int32_t type = pInput->pData[0]->info.type;
+
+ SAvgRes* pAvgRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
+
+ // computing based on the true data block
+ SColumnInfoData* pCol = pInput->pData[0];
+
+ int32_t start = pInput->startRowIndex;
+ int32_t numOfRows = pInput->numOfRows;
+
+ if (IS_NULL_TYPE(type)) {
+ goto _over;
+ }
+
+ pAvgRes->type = type;
+
+ if (pInput->colDataSMAIsSet) { // try to use SMA if available
+ numOfElem = calculateAvgBySMAInfo(pAvgRes, numOfRows, type, pAgg);
+ } else if (!pCol->hasNull) { // try to employ the simd instructions to speed up the loop
+ numOfElem = pInput->numOfRows;
+ pAvgRes->count += pInput->numOfRows;
+
+ bool simdAvailable = tsAVXEnable && tsSIMDEnable && (numOfRows > THRESHOLD_SIZE);
+
+ switch(type) {
+ case TSDB_DATA_TYPE_UTINYINT:
+ case TSDB_DATA_TYPE_TINYINT: {
+ const int8_t* plist = (const int8_t*) pCol->pData;
+
+ // 1. If the CPU supports AVX, let's employ AVX instructions to speedup this loop
+ if (simdAvailable) {
+ i8VectorSumAVX2(plist, numOfRows, type, pAvgRes);
+ } else {
+ for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
+ if (type == TSDB_DATA_TYPE_TINYINT) {
+ pAvgRes->sum.isum += plist[i];
+ } else {
+ pAvgRes->sum.usum += (uint8_t)plist[i];
+ }
+ }
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_USMALLINT:
+ case TSDB_DATA_TYPE_SMALLINT: {
+ const int16_t* plist = (const int16_t*)pCol->pData;
+
+ // 1. If the CPU supports AVX, let's employ AVX instructions to speedup this loop
+ if (simdAvailable) {
+ i16VectorSumAVX2(plist, numOfRows, type, pAvgRes);
+ } else {
+ for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
+ if (type == TSDB_DATA_TYPE_SMALLINT) {
+ pAvgRes->sum.isum += plist[i];
+ } else {
+ pAvgRes->sum.usum += (uint16_t)plist[i];
+ }
+ }
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UINT:
+ case TSDB_DATA_TYPE_INT: {
+ const int32_t* plist = (const int32_t*) pCol->pData;
+
+ // 1. If the CPU supports AVX, let's employ AVX instructions to speedup this loop
+ if (simdAvailable) {
+ i32VectorSumAVX2(plist, numOfRows, type, pAvgRes);
+ } else {
+ for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
+ if (type == TSDB_DATA_TYPE_INT) {
+ pAvgRes->sum.isum += plist[i];
+ } else {
+ pAvgRes->sum.usum += (uint32_t)plist[i];
+ }
+ }
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UBIGINT:
+ case TSDB_DATA_TYPE_BIGINT: {
+ const int64_t* plist = (const int64_t*) pCol->pData;
+
+ // 1. If the CPU supports AVX, let's employ AVX instructions to speedup this loop
+ if (simdAvailable && type == TSDB_DATA_TYPE_BIGINT) {
+ i64VectorSumAVX2(plist, numOfRows, pAvgRes);
+ } else {
+ for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
+ if (type == TSDB_DATA_TYPE_BIGINT) {
+ pAvgRes->sum.isum += plist[i];
+ } else {
+ pAvgRes->sum.usum += (uint64_t)plist[i];
+ }
+ }
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_FLOAT: {
+ const float* plist = (const float*) pCol->pData;
+
+ // 1. If the CPU supports AVX, let's employ AVX instructions to speedup this loop
+ if (simdAvailable) {
+ floatVectorSumAVX(plist, numOfRows, pAvgRes);
+ } else {
+ for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
+ pAvgRes->sum.dsum += plist[i];
+ }
+ }
+ break;
+ }
+ case TSDB_DATA_TYPE_DOUBLE: {
+ const double* plist = (const double*)pCol->pData;
+
+ // 1. If the CPU supports AVX, let's employ AVX instructions to speedup this loop
+ if (simdAvailable) {
+ doubleVectorSumAVX(plist, numOfRows, pAvgRes);
+ } else {
+ for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
+ pAvgRes->sum.dsum += plist[i];
+ }
+ }
+ break;
+ }
+ default:
+ ASSERT(0);
+ }
+ } else {
+ numOfElem = doAddNumericVector(pCol, type, pInput, pAvgRes);
+ }
+
+_over:
+ // data in the check operation are all null, not output
+ SET_VAL(GET_RES_INFO(pCtx), numOfElem, 1);
+ return TSDB_CODE_SUCCESS;
+}
+
+static void avgTransferInfo(SAvgRes* pInput, SAvgRes* pOutput) {
+ if (IS_NULL_TYPE(pInput->type)) {
+ return;
+ }
+
+ pOutput->type = pInput->type;
+ if (IS_SIGNED_NUMERIC_TYPE(pOutput->type)) {
+ pOutput->sum.isum += pInput->sum.isum;
+ } else if (IS_UNSIGNED_NUMERIC_TYPE(pOutput->type)) {
+ pOutput->sum.usum += pInput->sum.usum;
+ } else {
+ pOutput->sum.dsum += pInput->sum.dsum;
+ }
+
+ pOutput->count += pInput->count;
+}
+
+int32_t avgFunctionMerge(SqlFunctionCtx* pCtx) {
+ SInputColumnInfoData* pInput = &pCtx->input;
+ SColumnInfoData* pCol = pInput->pData[0];
+ ASSERT(pCol->info.type == TSDB_DATA_TYPE_BINARY);
+
+ SAvgRes* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
+
+ int32_t start = pInput->startRowIndex;
+
+ for (int32_t i = start; i < start + pInput->numOfRows; ++i) {
+ char* data = colDataGetData(pCol, i);
+ SAvgRes* pInputInfo = (SAvgRes*)varDataVal(data);
+ avgTransferInfo(pInputInfo, pInfo);
+ }
+
+ SET_VAL(GET_RES_INFO(pCtx), 1, 1);
+
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t avgInvertFunction(SqlFunctionCtx* pCtx) {
+ int32_t numOfElem = 0;
+
+ // Only the pre-computing information loaded and actual data does not loaded
+ SInputColumnInfoData* pInput = &pCtx->input;
+ SAvgRes* pAvgRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
+
+ // computing based on the true data block
+ SColumnInfoData* pCol = pInput->pData[0];
+
+ int32_t start = pInput->startRowIndex;
+ int32_t numOfRows = pInput->numOfRows;
+
+ switch (pCol->info.type) {
+ case TSDB_DATA_TYPE_TINYINT: {
+ LIST_AVG_N(pAvgRes->sum.isum, int8_t);
+ break;
+ }
+ case TSDB_DATA_TYPE_SMALLINT: {
+ LIST_AVG_N(pAvgRes->sum.isum, int16_t);
+ break;
+ }
+ case TSDB_DATA_TYPE_INT: {
+ LIST_AVG_N(pAvgRes->sum.isum, int32_t);
+ break;
+ }
+ case TSDB_DATA_TYPE_BIGINT: {
+ LIST_AVG_N(pAvgRes->sum.isum, int64_t);
+ break;
+ }
+ case TSDB_DATA_TYPE_UTINYINT: {
+ LIST_AVG_N(pAvgRes->sum.usum, uint8_t);
+ break;
+ }
+ case TSDB_DATA_TYPE_USMALLINT: {
+ LIST_AVG_N(pAvgRes->sum.usum, uint16_t);
+ break;
+ }
+ case TSDB_DATA_TYPE_UINT: {
+ LIST_AVG_N(pAvgRes->sum.usum, uint32_t);
+ break;
+ }
+ case TSDB_DATA_TYPE_UBIGINT: {
+ LIST_AVG_N(pAvgRes->sum.usum, uint64_t);
+ break;
+ }
+ case TSDB_DATA_TYPE_FLOAT: {
+ LIST_AVG_N(pAvgRes->sum.dsum, float);
+ break;
+ }
+ case TSDB_DATA_TYPE_DOUBLE: {
+ LIST_AVG_N(pAvgRes->sum.dsum, double);
+ break;
+ }
+ default:
+ break;
+ }
+
+ // data in the check operation are all null, not output
+ SET_VAL(GET_RES_INFO(pCtx), numOfElem, 1);
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t avgCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) {
+ SResultRowEntryInfo* pDResInfo = GET_RES_INFO(pDestCtx);
+ SAvgRes* pDBuf = GET_ROWCELL_INTERBUF(pDResInfo);
+
+ SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
+ SAvgRes* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
+ int16_t type = pDBuf->type == TSDB_DATA_TYPE_NULL ? pSBuf->type : pDBuf->type;
+
+ if (IS_SIGNED_NUMERIC_TYPE(type)) {
+ pDBuf->sum.isum += pSBuf->sum.isum;
+ } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
+ pDBuf->sum.usum += pSBuf->sum.usum;
+ } else {
+ pDBuf->sum.dsum += pSBuf->sum.dsum;
+ }
+ pDBuf->count += pSBuf->count;
+
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t avgFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
+ SResultRowEntryInfo* pEntryInfo = GET_RES_INFO(pCtx);
+
+ SAvgRes* pRes = GET_ROWCELL_INTERBUF(pEntryInfo);
+ int32_t type = pRes->type;
+
+ if (pRes->count > 0) {
+ if (IS_SIGNED_NUMERIC_TYPE(type)) {
+ pRes->result = pRes->sum.isum / ((double)pRes->count);
+ } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
+ pRes->result = pRes->sum.usum / ((double)pRes->count);
+ } else {
+ pRes->result = pRes->sum.dsum / ((double)pRes->count);
+ }
+ }
+
+ if (pRes->count == 0 || isinf(pRes->result) || isnan(pRes->result)) {
+ pEntryInfo->numOfRes = 0;
+ } else {
+ pEntryInfo->numOfRes = 1;
+ }
+
+ return functionFinalize(pCtx, pBlock);
+}
+
+int32_t avgPartialFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
+ SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
+ SAvgRes* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
+ int32_t resultBytes = getAvgInfoSize();
+ char* res = taosMemoryCalloc(resultBytes + VARSTR_HEADER_SIZE, sizeof(char));
+
+ memcpy(varDataVal(res), pInfo, resultBytes);
+ varDataSetLen(res, resultBytes);
+
+ int32_t slotId = pCtx->pExpr->base.resSchema.slotId;
+ SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, slotId);
+
+ colDataAppend(pCol, pBlock->info.rows, res, false);
+
+ taosMemoryFree(res);
+ return pResInfo->numOfRes;
+}
diff --git a/source/libs/function/src/detail/tminmax.c b/source/libs/function/src/detail/tminmax.c
new file mode 100644
index 0000000000000000000000000000000000000000..b2cb36cba07d5414994ecd98683b63188b835a60
--- /dev/null
+++ b/source/libs/function/src/detail/tminmax.c
@@ -0,0 +1,891 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#include "builtinsimpl.h"
+#include "function.h"
+#include "tdatablock.h"
+#include "tfunctionInt.h"
+#include "tglobal.h"
+
+#define __COMPARE_ACQUIRED_MAX(i, end, bm, _data, ctx, val, pos) \
+ for (; i < (end); ++i) { \
+ if (colDataIsNull_f(bm, i)) { \
+ continue; \
+ } \
+ \
+ if ((val) < (_data)[i]) { \
+ (val) = (_data)[i]; \
+ if ((ctx)->subsidiaries.num > 0) { \
+ updateTupleData((ctx), i, (ctx)->pSrcBlock, pos); \
+ } \
+ } \
+ }
+
+#define __COMPARE_ACQUIRED_MIN(i, end, bm, _data, ctx, val, pos) \
+ for (; i < (end); ++i) { \
+ if (colDataIsNull_f(bm, i)) { \
+ continue; \
+ } \
+ \
+ if ((val) > (_data)[i]) { \
+ (val) = (_data)[i]; \
+ if ((ctx)->subsidiaries.num > 0) { \
+ updateTupleData((ctx), i, (ctx)->pSrcBlock, pos); \
+ } \
+ } \
+ }
+
+#define __COMPARE_EXTRACT_MIN(start, end, val, _data) \
+ for (int32_t i = (start); i < (end); ++i) { \
+ if ((val) > (_data)[i]) { \
+ (val) = (_data)[i]; \
+ } \
+ }
+
+#define __COMPARE_EXTRACT_MAX(start, end, val, _data) \
+ for (int32_t i = (start); i < (end); ++i) { \
+ if ((val) < (_data)[i]) { \
+ (val) = (_data)[i]; \
+ } \
+ }
+
+static void calculateRounds(int32_t numOfRows, int32_t bytes, int32_t* remainder, int32_t* rounds, int32_t* width) {
+ const int32_t bitWidth = 256;
+
+ *width = (bitWidth>>3u) / bytes;
+ *remainder = numOfRows % (*width);
+ *rounds = numOfRows / (*width);
+}
+
+#define EXTRACT_MAX_VAL(_first, _sec, _width, _remain, _v) \
+ (_v) = TMAX((_first)[0], (_first)[1]); \
+ for (int32_t k = 1; k < (_width); ++k) { \
+ (_v) = TMAX((_v), (_first)[k]); \
+ } \
+ \
+ for (int32_t j = 0; j < (_remain); ++j) { \
+ if ((_v) < (_sec)[j]) { \
+ (_v) = (_sec)[j]; \
+ } \
+ }
+
+#define EXTRACT_MIN_VAL(_first, _sec, _width, _remain, _v) \
+ (_v) = TMIN((_first)[0], (_first)[1]); \
+ for (int32_t k = 1; k < (_width); ++k) { \
+ (_v) = TMIN((_v), (_first)[k]); \
+ } \
+ \
+ for (int32_t j = 0; j < (_remain); ++j) { \
+ if ((_v) > (_sec)[j]) { \
+ (_v) = (_sec)[j]; \
+ } \
+ }
+
+
+static int8_t i8VectorCmpAVX2(const void* pData, int32_t numOfRows, bool isMinFunc, bool signVal) {
+ int8_t v = 0;
+ const int8_t* p = pData;
+
+ int32_t width, remain, rounds;
+ calculateRounds(numOfRows, sizeof(int8_t), &remain, &rounds, &width);
+
+#if __AVX2__
+ __m256i next;
+ __m256i initVal = _mm256_lddqu_si256((__m256i*)p);
+ p += width;
+
+ if (!isMinFunc) { // max function
+ if (signVal) {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_max_epi8(initVal, next);
+ p += width;
+ }
+
+ const int8_t* q = (const int8_t*)&initVal;
+ EXTRACT_MAX_VAL(q, p, width, remain, v)
+ } else { // unsigned value
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_max_epu8(initVal, next);
+ p += width;
+ }
+
+ const uint8_t* q = (const uint8_t*)&initVal;
+ EXTRACT_MAX_VAL(q, p, width, remain, v)
+ }
+
+ } else { // min function
+ if (signVal) {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_min_epi8(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const int8_t* q = (const int8_t*)&initVal;
+ EXTRACT_MIN_VAL(q, p, width, remain, v)
+ } else {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_min_epu8(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const uint8_t* q = (const uint8_t*)&initVal;
+ EXTRACT_MIN_VAL(q, p, width, remain, v)
+ }
+ }
+#endif
+
+ return v;
+}
+
+static int16_t i16VectorCmpAVX2(const int16_t* pData, int32_t numOfRows, bool isMinFunc, bool signVal) {
+ int16_t v = 0;
+ const int16_t* p = pData;
+
+ int32_t width, remain, rounds;
+ calculateRounds(numOfRows, sizeof(int16_t), &remain, &rounds, &width);
+
+#if __AVX2__
+ __m256i next;
+ __m256i initVal = _mm256_lddqu_si256((__m256i*)p);
+ p += width;
+
+ if (!isMinFunc) { // max function
+ if (signVal) {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_max_epi16(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const int16_t* q = (const int16_t*)&initVal;
+ EXTRACT_MAX_VAL(q, p, width, remain, v)
+ } else {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_max_epu16(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const uint16_t* q = (const uint16_t*)&initVal;
+ EXTRACT_MAX_VAL(q, p, width, remain, v)
+ }
+
+ } else { // min function
+ if (signVal) {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_min_epi16(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const int16_t* q = (const int16_t*)&initVal;
+ EXTRACT_MIN_VAL(q, p, width, remain, v)
+ } else {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_min_epi16(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const uint16_t* q = (const uint16_t*)&initVal;
+ EXTRACT_MIN_VAL(q, p, width, remain, v)
+ }
+ }
+#endif
+
+ return v;
+}
+
+static int32_t i32VectorCmpAVX2(const int32_t* pData, int32_t numOfRows, bool isMinFunc, bool signVal) {
+ int32_t v = 0;
+ const int32_t* p = pData;
+
+ int32_t width, remain, rounds;
+ calculateRounds(numOfRows, sizeof(int32_t), &remain, &rounds, &width);
+
+#if __AVX2__
+ __m256i next;
+ __m256i initVal = _mm256_lddqu_si256((__m256i*)p);
+ p += width;
+
+ if (!isMinFunc) { // max function
+ if (signVal) {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_max_epi32(initVal, next);
+ p += width;
+ }
+
+ // let compare the final results
+ const int32_t* q = (const int32_t*)&initVal;
+ EXTRACT_MAX_VAL(q, p, width, remain, v)
+ } else { // unsigned value
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_max_epi32(initVal, next);
+ p += width;
+ }
+
+ // let compare the final results
+ const uint32_t* q = (const uint32_t*)&initVal;
+ EXTRACT_MAX_VAL(q, p, width, remain, v)
+ }
+ } else { // min function
+ if (signVal) {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_min_epi32(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const int32_t* q = (const int32_t*)&initVal;
+ EXTRACT_MIN_VAL(q, p, width, remain, v)
+ } else {
+ for (int32_t i = 0; i < rounds; ++i) {
+ next = _mm256_lddqu_si256((__m256i*)p);
+ initVal = _mm256_min_epu32(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const uint32_t* q = (const uint32_t*)&initVal;
+ EXTRACT_MIN_VAL(q, p, width, remain, v)
+ }
+ }
+#endif
+
+ return v;
+}
+
+static float floatVectorCmpAVX(const float* pData, int32_t numOfRows, bool isMinFunc) {
+ float v = 0;
+ const float* p = pData;
+
+ int32_t width, remain, rounds;
+ calculateRounds(numOfRows, sizeof(float), &remain, &rounds, &width);
+
+#if __AVX__
+
+ __m256 next;
+ __m256 initVal = _mm256_loadu_ps(p);
+ p += width;
+
+ if (!isMinFunc) { // max function
+ for (int32_t i = 1; i < rounds; ++i) {
+ next = _mm256_loadu_ps(p);
+ initVal = _mm256_max_ps(initVal, next);
+ p += width;
+ }
+
+ const float* q = (const float*)&initVal;
+ EXTRACT_MAX_VAL(q, p, width, remain, v)
+ } else { // min function
+ for (int32_t i = 1; i < rounds; ++i) {
+ next = _mm256_loadu_ps(p);
+ initVal = _mm256_min_ps(initVal, next);
+ p += width;
+ }
+
+ const float* q = (const float*)&initVal;
+ EXTRACT_MIN_VAL(q, p, width, remain, v)
+ }
+#endif
+
+ return v;
+}
+
+static double doubleVectorCmpAVX(const double* pData, int32_t numOfRows, bool isMinFunc) {
+ double v = 0;
+ const double* p = pData;
+
+ int32_t width, remain, rounds;
+ calculateRounds(numOfRows, sizeof(double), &remain, &rounds, &width);
+
+#if __AVX__
+
+ __m256d next;
+ __m256d initVal = _mm256_loadu_pd(p);
+ p += width;
+
+ if (!isMinFunc) { // max function
+ for (int32_t i = 1; i < rounds; ++i) {
+ next = _mm256_loadu_pd(p);
+ initVal = _mm256_max_pd(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const double* q = (const double*)&initVal;
+ EXTRACT_MAX_VAL(q, p, width, remain, v)
+ } else { // min function
+ for (int32_t i = 1; i < rounds; ++i) {
+ next = _mm256_loadu_pd(p);
+ initVal = _mm256_min_pd(initVal, next);
+ p += width;
+ }
+
+ // let sum up the final results
+ const double* q = (const double*)&initVal;
+ EXTRACT_MIN_VAL(q, p, width, remain, v)
+ }
+#endif
+
+ return v;
+}
+
+static int32_t findFirstValPosition(const SColumnInfoData* pCol, int32_t start, int32_t numOfRows) {
+ int32_t i = start;
+
+ while (i < (start + numOfRows) && (colDataIsNull_f(pCol->nullbitmap, i) == true)) {
+ i += 1;
+ }
+
+ return i;
+}
+
+static void handleInt8Col(const void* data, int32_t start, int32_t numOfRows, SMinmaxResInfo* pBuf, bool isMinFunc,
+ bool signVal) {
+ // AVX2 version to speedup the loop
+ if (tsAVX2Enable && tsSIMDEnable) {
+ pBuf->v = i8VectorCmpAVX2(data, numOfRows, isMinFunc, signVal);
+ } else {
+ if (!pBuf->assign) {
+ pBuf->v = ((int8_t*)data)[0];
+ }
+
+ if (signVal) {
+ const int8_t* p = (const int8_t*)data;
+ int8_t* v = (int8_t*)&pBuf->v;
+
+ if (isMinFunc) {
+ __COMPARE_EXTRACT_MIN(start, start + numOfRows, *v, p);
+ } else {
+ __COMPARE_EXTRACT_MAX(start, start + numOfRows, *v, p);
+ }
+ } else {
+ const uint8_t* p = (const uint8_t*)data;
+ uint8_t* v = (uint8_t*)&pBuf->v;
+
+ if (isMinFunc) {
+ __COMPARE_EXTRACT_MIN(start, start + numOfRows, *v, p);
+ } else {
+ __COMPARE_EXTRACT_MAX(start, start + numOfRows, *v, p);
+ }
+ }
+ }
+
+ pBuf->assign = true;
+}
+
+static void handleInt16Col(const void* data, int32_t start, int32_t numOfRows, SMinmaxResInfo* pBuf, bool isMinFunc,
+ bool signVal) {
+ // AVX2 version to speedup the loop
+ if (tsAVX2Enable && tsSIMDEnable) {
+ pBuf->v = i16VectorCmpAVX2(data, numOfRows, isMinFunc, signVal);
+ } else {
+ if (!pBuf->assign) {
+ pBuf->v = ((int16_t*)data)[0];
+ }
+
+ if (signVal) {
+ const int16_t* p = (const int16_t*)data;
+ int16_t* v = (int16_t*)&pBuf->v;
+
+ if (isMinFunc) {
+ __COMPARE_EXTRACT_MIN(start, start + numOfRows, *v, p);
+ } else {
+ __COMPARE_EXTRACT_MAX(start, start + numOfRows, *v, p);
+ }
+ } else {
+ const uint16_t* p = (const uint16_t*)data;
+ uint16_t* v = (uint16_t*)&pBuf->v;
+
+ if (isMinFunc) {
+ __COMPARE_EXTRACT_MIN(start, start + numOfRows, *v, p);
+ } else {
+ __COMPARE_EXTRACT_MAX(start, start + numOfRows, *v, p);
+ }
+ }
+ }
+
+ pBuf->assign = true;
+}
+
+static void handleInt32Col(const void* data, int32_t start, int32_t numOfRows, SMinmaxResInfo* pBuf, bool isMinFunc,
+ bool signVal) {
+ // AVX2 version to speedup the loop
+ if (tsAVX2Enable && tsSIMDEnable) {
+ pBuf->v = i32VectorCmpAVX2(data, numOfRows, isMinFunc, signVal);
+ } else {
+ if (!pBuf->assign) {
+ pBuf->v = ((int32_t*)data)[0];
+ }
+
+ if (signVal) {
+ const int32_t* p = (const int32_t*)data;
+ int32_t* v = (int32_t*)&pBuf->v;
+
+ if (isMinFunc) {
+ __COMPARE_EXTRACT_MIN(start, start + numOfRows, *v, p);
+ } else {
+ __COMPARE_EXTRACT_MAX(start, start + numOfRows, *v, p);
+ }
+ } else {
+ const uint32_t* p = (const uint32_t*)data;
+ uint32_t* v = (uint32_t*)&pBuf->v;
+
+ if (isMinFunc) {
+ __COMPARE_EXTRACT_MIN(start, start + numOfRows, *v, p);
+ } else {
+ __COMPARE_EXTRACT_MAX(start, start + numOfRows, *v, p);
+ }
+ }
+ }
+
+ pBuf->assign = true;
+}
+
+static void handleInt64Col(const void* data, int32_t start, int32_t numOfRows, SMinmaxResInfo* pBuf, bool isMinFunc,
+ bool signVal) {
+ if (!pBuf->assign) {
+ pBuf->v = ((int64_t*)data)[0];
+ }
+
+ if (signVal) {
+ const int64_t* p = (const int64_t*)data;
+ int64_t* v = &pBuf->v;
+
+ if (isMinFunc) {
+ __COMPARE_EXTRACT_MIN(start, start + numOfRows, *v, p);
+ } else {
+ __COMPARE_EXTRACT_MAX(start, start + numOfRows, *v, p);
+ }
+ } else {
+ const uint64_t* p = (const uint64_t*)data;
+ uint64_t* v = (uint64_t*)&pBuf->v;
+
+ if (isMinFunc) {
+ __COMPARE_EXTRACT_MIN(start, start + numOfRows, *v, p);
+ } else {
+ __COMPARE_EXTRACT_MAX(start, start + numOfRows, *v, p);
+ }
+ }
+}
+
+static void handleFloatCol(SColumnInfoData* pCol, int32_t start, int32_t numOfRows, SMinmaxResInfo* pBuf, bool isMinFunc) {
+ float* pData = (float*)pCol->pData;
+ float* val = (float*)&pBuf->v;
+
+ // AVX version to speedup the loop
+ if (tsAVXEnable && tsSIMDEnable) {
+ *val = floatVectorCmpAVX(pData, numOfRows, isMinFunc);
+ } else {
+ if (!pBuf->assign) {
+ *val = pData[0];
+ }
+
+ if (isMinFunc) { // min
+ for (int32_t i = start; i < start + numOfRows; ++i) {
+ if (*val > pData[i]) {
+ *val = pData[i];
+ }
+ }
+ } else { // max
+ for (int32_t i = start; i < start + numOfRows; ++i) {
+ if (*val < pData[i]) {
+ *val = pData[i];
+ }
+ }
+ }
+ }
+
+ pBuf->assign = true;
+}
+
+static void handleDoubleCol(SColumnInfoData* pCol, int32_t start, int32_t numOfRows, SMinmaxResInfo* pBuf, bool isMinFunc) {
+ double* pData = (double*)pCol->pData;
+ double* val = (double*)&pBuf->v;
+
+ // AVX version to speedup the loop
+ if (tsAVXEnable && tsSIMDEnable) {
+ *val = (double)doubleVectorCmpAVX(pData, numOfRows, isMinFunc);
+ } else {
+ if (!pBuf->assign) {
+ *val = pData[0];
+ }
+
+ if (isMinFunc) { // min
+ for (int32_t i = start; i < start + numOfRows; ++i) {
+ if (*val > pData[i]) {
+ *val = pData[i];
+ }
+ }
+ } else { // max
+ for (int32_t i = start; i < start + numOfRows; ++i) {
+ if (*val < pData[i]) {
+ *val = pData[i];
+ }
+ }
+ }
+ }
+
+ pBuf->assign = true;
+}
+
+static int32_t findRowIndex(int32_t start, int32_t num, SColumnInfoData* pCol, const char* tval) {
+ // the data is loaded, not only the block SMA value
+ for (int32_t i = start; i < num + start; ++i) {
+ char* p = colDataGetData(pCol, i);
+ if (memcmp((void*)tval, p, pCol->info.bytes) == 0) {
+ return i;
+ }
+ }
+
+ // if reach here means real data of block SMA is not set in pCtx->input.
+ return -1;
+}
+
+static void doExtractVal(SColumnInfoData* pCol, int32_t i, int32_t end, SqlFunctionCtx* pCtx, SMinmaxResInfo* pBuf,
+ bool isMinFunc) {
+ if (isMinFunc) {
+ switch (pCol->info.type) {
+ case TSDB_DATA_TYPE_BOOL:
+ case TSDB_DATA_TYPE_TINYINT: {
+ const int8_t* pData = (const int8_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(int8_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_SMALLINT: {
+ const int16_t* pData = (const int16_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(int16_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_INT: {
+ const int32_t* pData = (const int32_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(int32_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_BIGINT: {
+ const int64_t* pData = (const int64_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, (pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UTINYINT: {
+ const uint8_t* pData = (const uint8_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(uint8_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_USMALLINT: {
+ const uint16_t* pData = (const uint16_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(uint16_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UINT: {
+ const uint32_t* pData = (const uint32_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(uint32_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UBIGINT: {
+ const uint64_t* pData = (const uint64_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(uint64_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_FLOAT: {
+ const float* pData = (const float*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(float*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_DOUBLE: {
+ const double* pData = (const double*)pCol->pData;
+ __COMPARE_ACQUIRED_MIN(i, end, pCol->nullbitmap, pData, pCtx, *(double*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+ }
+ } else {
+ switch (pCol->info.type) {
+ case TSDB_DATA_TYPE_BOOL:
+ case TSDB_DATA_TYPE_TINYINT: {
+ const int8_t* pData = (const int8_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(int8_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_SMALLINT: {
+ const int16_t* pData = (const int16_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(int16_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_INT: {
+ const int32_t* pData = (const int32_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(int32_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_BIGINT: {
+ const int64_t* pData = (const int64_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, (pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UTINYINT: {
+ const uint8_t* pData = (const uint8_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(uint8_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_USMALLINT: {
+ const uint16_t* pData = (const uint16_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(uint16_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UINT: {
+ const uint32_t* pData = (const uint32_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(uint32_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_UBIGINT: {
+ const uint64_t* pData = (const uint64_t*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(uint64_t*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_FLOAT: {
+ const float* pData = (const float*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(float*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+
+ case TSDB_DATA_TYPE_DOUBLE: {
+ const double* pData = (const double*)pCol->pData;
+ __COMPARE_ACQUIRED_MAX(i, end, pCol->nullbitmap, pData, pCtx, *(double*)&(pBuf->v), &pBuf->tuplePos)
+ break;
+ }
+ }
+ }
+}
+
+int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
+ int32_t numOfElems = 0;
+
+ SInputColumnInfoData* pInput = &pCtx->input;
+ SColumnDataAgg* pAgg = pInput->pColumnDataAgg[0];
+
+ SColumnInfoData* pCol = pInput->pData[0];
+ int32_t type = pCol->info.type;
+
+ SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
+ SMinmaxResInfo* pBuf = GET_ROWCELL_INTERBUF(pResInfo);
+ pBuf->type = type;
+
+ if (IS_NULL_TYPE(type)) {
+ numOfElems = 0;
+ goto _over;
+ }
+
+ // data in current data block are qualified to the query
+ if (pInput->colDataSMAIsSet) {
+ numOfElems = pInput->numOfRows - pAgg->numOfNull;
+ ASSERT(pInput->numOfRows == pInput->totalRows && numOfElems >= 0);
+
+ if (numOfElems == 0) {
+ goto _over;
+ }
+
+ void* tval = NULL;
+ int16_t index = 0;
+
+ if (isMinFunc) {
+ tval = &pInput->pColumnDataAgg[0]->min;
+ } else {
+ tval = &pInput->pColumnDataAgg[0]->max;
+ }
+
+ if (!pBuf->assign) {
+ pBuf->v = *(int64_t*)tval;
+ if (pCtx->subsidiaries.num > 0) {
+ index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
+ }
+ } else {
+ if (IS_SIGNED_NUMERIC_TYPE(type)) {
+ int64_t prev = 0;
+ GET_TYPED_DATA(prev, int64_t, type, &pBuf->v);
+
+ int64_t val = GET_INT64_VAL(tval);
+ if ((prev < val) ^ isMinFunc) {
+ *(int64_t*)&pBuf->v = val;
+ if (pCtx->subsidiaries.num > 0) {
+ index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
+ }
+ }
+ } else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
+ uint64_t prev = 0;
+ GET_TYPED_DATA(prev, uint64_t, type, &pBuf->v);
+
+ uint64_t val = GET_UINT64_VAL(tval);
+ if ((prev < val) ^ isMinFunc) {
+ *(uint64_t*)&pBuf->v = val;
+ if (pCtx->subsidiaries.num > 0) {
+ index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
+ }
+ }
+ } else if (type == TSDB_DATA_TYPE_DOUBLE) {
+ double prev = 0;
+ GET_TYPED_DATA(prev, double, type, &pBuf->v);
+
+ double val = GET_DOUBLE_VAL(tval);
+ if ((prev < val) ^ isMinFunc) {
+ *(double*)&pBuf->v = val;
+ if (pCtx->subsidiaries.num > 0) {
+ index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
+ }
+ }
+ } else if (type == TSDB_DATA_TYPE_FLOAT) {
+ float prev = 0;
+ GET_TYPED_DATA(prev, float, type, &pBuf->v);
+
+ float val = GET_DOUBLE_VAL(tval);
+ if ((prev < val) ^ isMinFunc) {
+ *(float*)&pBuf->v = val;
+ }
+
+ if (pCtx->subsidiaries.num > 0) {
+ index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
+ }
+ }
+ }
+
+ pBuf->assign = true;
+ return numOfElems;
+ }
+
+ int32_t start = pInput->startRowIndex;
+ int32_t numOfRows = pInput->numOfRows;
+ int32_t end = start + numOfRows;
+
+ if (pCol->hasNull || numOfRows < 32 || pCtx->subsidiaries.num > 0) {
+ int32_t i = findFirstValPosition(pCol, start, numOfRows);
+
+ if ((i < end) && (!pBuf->assign)) {
+ memcpy(&pBuf->v, pCol->pData + (pCol->info.bytes * i), pCol->info.bytes);
+
+ if (pCtx->subsidiaries.num > 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, i, pCtx->pSrcBlock, NULL);
+ }
+ pBuf->assign = true;
+ numOfElems = 1;
+ }
+
+ if (i >= end) {
+ ASSERT(numOfElems == 0);
+ goto _over;
+ }
+
+ doExtractVal(pCol, i, end, pCtx, pBuf, isMinFunc);
+ } else {
+ numOfElems = numOfRows;
+
+ switch (pCol->info.type) {
+ case TSDB_DATA_TYPE_BOOL:
+ case TSDB_DATA_TYPE_TINYINT: {
+ handleInt8Col(pCol->pData, start, numOfRows, pBuf, isMinFunc, true);
+ break;
+ }
+ case TSDB_DATA_TYPE_SMALLINT: {
+ handleInt16Col(pCol->pData, start, numOfRows, pBuf, isMinFunc, true);
+ break;
+ }
+ case TSDB_DATA_TYPE_INT: {
+ handleInt32Col(pCol->pData, start, numOfRows, pBuf, isMinFunc, true);
+ break;
+ }
+ case TSDB_DATA_TYPE_BIGINT: {
+ handleInt64Col(pCol->pData, start, numOfRows, pBuf, isMinFunc, true);
+ break;
+ }
+ case TSDB_DATA_TYPE_UTINYINT: {
+ handleInt8Col(pCol->pData, start, numOfRows, pBuf, isMinFunc, false);
+ break;
+ }
+ case TSDB_DATA_TYPE_USMALLINT: {
+ handleInt16Col(pCol->pData, start, numOfRows, pBuf, isMinFunc, false);
+ break;
+ }
+ case TSDB_DATA_TYPE_UINT: {
+ handleInt32Col(pCol->pData, start, numOfRows, pBuf, isMinFunc, false);
+ break;
+ }
+ case TSDB_DATA_TYPE_UBIGINT: {
+ handleInt64Col(pCol->pData, start, numOfRows, pBuf, isMinFunc, false);
+ break;
+ }
+ case TSDB_DATA_TYPE_FLOAT: {
+ handleFloatCol(pCol, start, numOfRows, pBuf, isMinFunc);
+ break;
+ }
+ case TSDB_DATA_TYPE_DOUBLE: {
+ handleDoubleCol(pCol, start, numOfRows, pBuf, isMinFunc);
+ break;
+ }
+ }
+
+ pBuf->assign = true;
+ }
+
+_over:
+ if (numOfElems == 0 && pCtx->subsidiaries.num > 0 && !pBuf->nullTupleSaved) {
+ pBuf->nullTuplePos = saveTupleData(pCtx, pInput->startRowIndex, pCtx->pSrcBlock, NULL);
+ pBuf->nullTupleSaved = true;
+ }
+
+ return numOfElems;
+}
\ No newline at end of file
diff --git a/source/libs/function/src/tpercentile.c b/source/libs/function/src/tpercentile.c
index 092410647691546e8bfea5daf7a49cfdae8e183d..9c3e1f560471940112c1fd22b49016b49e86cdc8 100644
--- a/source/libs/function/src/tpercentile.c
+++ b/source/libs/function/src/tpercentile.c
@@ -22,6 +22,7 @@
#include "tpagedbuf.h"
#include "tpercentile.h"
#include "ttypes.h"
+#include "tlog.h"
#define DEFAULT_NUM_OF_SLOT 1024
@@ -367,11 +368,13 @@ int32_t tMemBucketPut(tMemBucket *pBucket, const void *data, size_t size) {
pSlot->info.data = NULL;
}
- SArray *pPageIdList = (SArray *)taosHashGet(pBucket->groupPagesMap, &groupId, sizeof(groupId));
- if (pPageIdList == NULL) {
- SArray *pList = taosArrayInit(4, sizeof(int32_t));
- taosHashPut(pBucket->groupPagesMap, &groupId, sizeof(groupId), &pList, POINTER_BYTES);
- pPageIdList = pList;
+ SArray *pPageIdList;
+ void *p = taosHashGet(pBucket->groupPagesMap, &groupId, sizeof(groupId));
+ if (p == NULL) {
+ pPageIdList = taosArrayInit(4, sizeof(int32_t));
+ taosHashPut(pBucket->groupPagesMap, &groupId, sizeof(groupId), &pPageIdList, POINTER_BYTES);
+ } else {
+ pPageIdList = *(SArray **)p;
}
pSlot->info.data = getNewBufPage(pBucket->pBuffer, &pageId);
@@ -494,7 +497,7 @@ double getPercentileImpl(tMemBucket *pMemBucket, int32_t count, double fraction)
resetSlotInfo(pMemBucket);
int32_t groupId = getGroupId(pMemBucket->numOfSlots, i, pMemBucket->times - 1);
- SIDList list = taosHashGet(pMemBucket->groupPagesMap, &groupId, sizeof(groupId));
+ SArray* list = taosHashGet(pMemBucket->groupPagesMap, &groupId, sizeof(groupId));
ASSERT(list != NULL && list->size > 0);
for (int32_t f = 0; f < list->size; ++f) {
diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c
index 8715aa0be18a547e22e865b8325ee23901bccabd..32e57565d4b94d1aa71ed9cc434983e96c309a9a 100644
--- a/source/libs/function/src/tudf.c
+++ b/source/libs/function/src/tudf.c
@@ -88,11 +88,13 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) {
}
#ifdef WINDOWS
if (strlen(path) == 0) {
- strcat(path, "udfd.exe");
- } else {
- strcat(path, "\\udfd.exe");
+ strcat(path, "C:\\TDengine");
}
+ strcat(path, "\\udfd.exe");
#else
+ if (strlen(path) == 0) {
+ strcat(path, "/usr/bin");
+ }
strcat(path, "/udfd");
#endif
char *argsUdfd[] = {path, "-c", configDir, NULL};
@@ -1096,7 +1098,7 @@ int32_t udfAggProcess(struct SqlFunctionCtx *pCtx) {
SSDataBlock *pTempBlock = createDataBlock();
pTempBlock->info.rows = pInput->totalRows;
- pTempBlock->info.uid = pInput->uid;
+ pTempBlock->info.id.uid = pInput->uid;
for (int32_t i = 0; i < numOfCols; ++i) {
blockDataAppendColInfo(pTempBlock, pInput->pData[i]);
}
diff --git a/source/libs/function/src/udfd.c b/source/libs/function/src/udfd.c
index f5682b69bff956985caf1231784cb6e440659f79..2f3db636c801277bc6e4809f1a9c3b6dd50283ed 100644
--- a/source/libs/function/src/udfd.c
+++ b/source/libs/function/src/udfd.c
@@ -27,6 +27,7 @@
#include "tglobal.h"
#include "tmsg.h"
#include "trpc.h"
+#include "tmisce.h"
// clang-foramt on
typedef struct SUdfdContext {
@@ -418,7 +419,7 @@ void udfdProcessRpcRsp(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
if (connectRsp.epSet.numOfEps == 0) {
- msgInfo->code = TSDB_CODE_MND_APP_ERROR;
+ msgInfo->code = TSDB_CODE_APP_ERROR;
goto _return;
}
@@ -597,9 +598,10 @@ int32_t udfdLoadUdf(char *udfName, SUdf *udf) {
return 0;
}
static bool udfdRpcRfp(int32_t code, tmsg_t msgType) {
- if (code == TSDB_CODE_RPC_REDIRECT || code == TSDB_CODE_RPC_NETWORK_UNAVAIL || code == TSDB_CODE_NODE_NOT_DEPLOYED ||
- code == TSDB_CODE_SYN_NOT_LEADER || code == TSDB_CODE_APP_NOT_READY || code == TSDB_CODE_RPC_BROKEN_LINK) {
- if (msgType == TDMT_SCH_QUERY || msgType == TDMT_SCH_MERGE_QUERY || msgType == TDMT_SCH_FETCH || msgType == TDMT_SCH_MERGE_FETCH) {
+ if (code == TSDB_CODE_RPC_NETWORK_UNAVAIL || code == TSDB_CODE_RPC_BROKEN_LINK || code == TSDB_CODE_SYN_NOT_LEADER ||
+ code == TSDB_CODE_SYN_RESTORING || code == TSDB_CODE_MNODE_NOT_FOUND || code == TSDB_CODE_APP_IS_STARTING ||
+ code == TSDB_CODE_APP_IS_STOPPING) {
+ if (msgType == TDMT_SCH_QUERY || msgType == TDMT_SCH_MERGE_QUERY || msgType == TDMT_SCH_FETCH || msgType == TDMT_SCH_MERGE_FETCH) {
return false;
}
return true;
@@ -1017,8 +1019,8 @@ int main(int argc, char *argv[]) {
}
if (udfdInitLog() != 0) {
+ // ignore create log failed, because this error no matter
printf("failed to start since init log error\n");
- return -1;
}
if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 0) != 0) {
diff --git a/source/libs/index/src/indexFilter.c b/source/libs/index/src/indexFilter.c
index 075408f1b34954c215cc9fc11fbc08b384014001..5a86bc86780544fff62e8b5a5513da731ed56804 100644
--- a/source/libs/index/src/indexFilter.c
+++ b/source/libs/index/src/indexFilter.c
@@ -195,7 +195,7 @@ static FORCE_INLINE int32_t sifGetValueFromNode(SNode *node, char **value) {
}
char *tv = taosMemoryCalloc(1, valLen + 1);
if (tv == NULL) {
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
memcpy(tv, pData, valLen);
@@ -231,8 +231,10 @@ static int32_t sifInitParam(SNode *node, SIFParam *param, SIFCtx *ctx) {
SIF_ERR_RET(sifGetValueFromNode(node, ¶m->condValue));
param->colId = -1;
param->colValType = (uint8_t)(vn->node.resType.type);
- if (strlen(vn->literal) <= sizeof(param->colName)) {
+ if (vn->literal != NULL && strlen(vn->literal) <= sizeof(param->colName)) {
memcpy(param->colName, vn->literal, strlen(vn->literal));
+ } else {
+ param->status = SFLT_NOT_INDEX;
}
break;
}
@@ -257,7 +259,7 @@ static int32_t sifInitParam(SNode *node, SIFParam *param, SIFCtx *ctx) {
if (taosHashPut(ctx->pRes, &node, POINTER_BYTES, param, sizeof(*param))) {
taosHashCleanup(param->pFilter);
indexError("taosHashPut nodeList failed, size:%d", (int32_t)sizeof(*param));
- SIF_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ SIF_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
break;
}
@@ -267,7 +269,7 @@ static int32_t sifInitParam(SNode *node, SIFParam *param, SIFCtx *ctx) {
SIFParam *res = (SIFParam *)taosHashGet(ctx->pRes, &node, POINTER_BYTES);
if (NULL == res) {
indexError("no result for node, type:%d, node:%p", nodeType(node), node);
- SIF_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ SIF_ERR_RET(TSDB_CODE_APP_ERROR);
}
*param = *res;
break;
@@ -298,7 +300,7 @@ static int32_t sifInitOperParams(SIFParam **params, SOperatorNode *node, SIFCtx
SIFParam *paramList = taosMemoryCalloc(nParam, sizeof(SIFParam));
if (NULL == paramList) {
- SIF_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ SIF_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
if (nodeType(node->pLeft) == QUERY_NODE_OPERATOR &&
@@ -317,7 +319,7 @@ static int32_t sifInitOperParams(SIFParam **params, SOperatorNode *node, SIFCtx
SIF_ERR_JRET(sifInitParam(node->pRight, ¶mList[1], ctx));
// if (paramList[0].colValType == TSDB_DATA_TYPE_JSON &&
// ((SOperatorNode *)(node))->opType == OP_TYPE_JSON_CONTAINS) {
- // return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ // return TSDB_CODE_OUT_OF_MEMORY;
//}
}
*params = paramList;
@@ -333,7 +335,7 @@ static int32_t sifInitParamList(SIFParam **params, SNodeList *nodeList, SIFCtx *
SIFParam *tParams = taosMemoryCalloc(nodeList->length, sizeof(SIFParam));
if (tParams == NULL) {
indexError("failed to calloc, nodeList: %p", nodeList);
- SIF_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ SIF_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
SListCell *cell = nodeList->pHead;
@@ -462,7 +464,7 @@ static int32_t sifDoIndex(SIFParam *left, SIFParam *right, int8_t operType, SIFP
SIndexTerm *tm = indexTermCreate(arg->suid, DEFAULT, right->colValType, left->colName, strlen(left->colName),
right->condValue, strlen(right->condValue));
if (tm == NULL) {
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
SIndexMultiTermQuery *mtm = indexMultiTermQueryCreate(MUST);
@@ -699,8 +701,8 @@ static int32_t sifExecLogic(SLogicConditionNode *node, SIFCtx *ctx, SIFParam *ou
} else {
for (int32_t m = 0; m < node->pParameterList->length; m++) {
output->status = sifMergeCond(node->condType, output->status, params[m].status);
- taosArrayDestroy(params[m].result);
- params[m].result = NULL;
+ // taosArrayDestroy(params[m].result);
+ // params[m].result = NULL;
}
}
_return:
@@ -720,7 +722,7 @@ static EDealRes sifWalkFunction(SNode *pNode, void *context) {
}
if (taosHashPut(ctx->pRes, &pNode, POINTER_BYTES, &output, sizeof(output))) {
- ctx->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ ctx->code = TSDB_CODE_OUT_OF_MEMORY;
return DEAL_RES_ERROR;
}
return DEAL_RES_CONTINUE;
@@ -738,7 +740,7 @@ static EDealRes sifWalkLogic(SNode *pNode, void *context) {
}
if (taosHashPut(ctx->pRes, &pNode, POINTER_BYTES, &output, sizeof(output))) {
- ctx->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ ctx->code = TSDB_CODE_OUT_OF_MEMORY;
return DEAL_RES_ERROR;
}
return DEAL_RES_CONTINUE;
@@ -754,7 +756,7 @@ static EDealRes sifWalkOper(SNode *pNode, void *context) {
return DEAL_RES_ERROR;
}
if (taosHashPut(ctx->pRes, &pNode, POINTER_BYTES, &output, sizeof(output))) {
- ctx->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ ctx->code = TSDB_CODE_OUT_OF_MEMORY;
return DEAL_RES_ERROR;
}
@@ -805,7 +807,7 @@ static int32_t sifCalculate(SNode *pNode, SIFParam *pDst) {
if (NULL == ctx.pRes) {
indexError("index-filter failed to taosHashInit");
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
nodesWalkExprPostOrder(pNode, sifCalcWalker, &ctx);
@@ -819,7 +821,7 @@ static int32_t sifCalculate(SNode *pNode, SIFParam *pDst) {
SIFParam *res = (SIFParam *)taosHashGet(ctx.pRes, (void *)&pNode, POINTER_BYTES);
if (res == NULL) {
indexError("no valid res in hash, node:(%p), type(%d)", (void *)&pNode, nodeType(pNode));
- SIF_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ SIF_ERR_RET(TSDB_CODE_APP_ERROR);
}
if (res->result != NULL) {
taosArrayAddAll(pDst->result, res->result);
@@ -842,7 +844,7 @@ static int32_t sifGetFltHint(SNode *pNode, SIdxFltStatus *status) {
ctx.pRes = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
if (NULL == ctx.pRes) {
indexError("index-filter failed to taosHashInit");
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
nodesWalkExprPostOrder(pNode, sifCalcWalker, &ctx);
@@ -854,12 +856,18 @@ static int32_t sifGetFltHint(SNode *pNode, SIdxFltStatus *status) {
SIFParam *res = (SIFParam *)taosHashGet(ctx.pRes, (void *)&pNode, POINTER_BYTES);
if (res == NULL) {
indexError("no valid res in hash, node:(%p), type(%d)", (void *)&pNode, nodeType(pNode));
- SIF_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ SIF_ERR_RET(TSDB_CODE_APP_ERROR);
}
*status = res->status;
-
sifFreeParam(res);
taosHashRemove(ctx.pRes, (void *)&pNode, POINTER_BYTES);
+
+ void *iter = taosHashIterate(ctx.pRes, NULL);
+ while (iter != NULL) {
+ SIFParam *data = (SIFParam *)iter;
+ sifFreeParam(data);
+ iter = taosHashIterate(ctx.pRes, iter);
+ }
taosHashCleanup(ctx.pRes);
return code;
}
diff --git a/source/libs/index/src/indexTfile.c b/source/libs/index/src/indexTfile.c
index e002ff9c32a42580300ea134dc764bd03283a693..b34d05d297e26f03d5af40e8b440241cf55ed714 100644
--- a/source/libs/index/src/indexTfile.c
+++ b/source/libs/index/src/indexTfile.c
@@ -269,7 +269,7 @@ static int32_t tfSearchPrefix(void* reader, SIndexTerm* tem, SIdxTRslt* tr) {
if (ret != 0) {
taosArrayDestroy(offsets);
indexError("failed to find target tablelist");
- return TSDB_CODE_TDB_FILE_CORRUPTED;
+ return TSDB_CODE_FILE_CORRUPTED;
}
}
taosArrayDestroy(offsets);
diff --git a/source/libs/index/test/index_executor_tests.cpp b/source/libs/index/test/index_executor_tests.cpp
index bcc474dc8b9e93f564d53b9b82000edf55110371..c8a7ca98f0bda6fea1ce0539d33f594370c78e8f 100644
--- a/source/libs/index/test/index_executor_tests.cpp
+++ b/source/libs/index/test/index_executor_tests.cpp
@@ -78,7 +78,7 @@ void sifAppendReservedSlot(SArray *pBlockList, int16_t *dataBlockId, int16_t *sl
blockDataEnsureCapacity(res, rows);
*dataBlockId = taosArrayGetSize(pBlockList) - 1;
- res->info.blockId = *dataBlockId;
+ res->info.id.blockId = *dataBlockId;
*slotId = 0;
} else {
SSDataBlock *res = *(SSDataBlock **)taosArrayGetLast(pBlockList);
diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c
index 70792ee6111e60e6ba002aa1100f898add979d07..b3ca0fa4528682f024cb2c101e2c99e1235ae164 100644
--- a/source/libs/monitor/src/monMain.c
+++ b/source/libs/monitor/src/monMain.c
@@ -36,7 +36,7 @@ void monRecordLog(int64_t ts, ELogLevel level, const char *content) {
int32_t monGetLogs(SMonLogs *logs) {
taosThreadMutexLock(&tsMonitor.lock);
- logs->logs = taosArrayDup(tsMonitor.logs);
+ logs->logs = taosArrayDup(tsMonitor.logs, NULL);
logs->numOfInfoLogs = tsNumOfInfoLogs;
logs->numOfErrorLogs = tsNumOfErrorLogs;
logs->numOfDebugLogs = tsNumOfDebugLogs;
diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c
index b9b365fb42c62ec9400b85450c3bca40ac920730..5d20dbd7644c18295a18e4ee51faf2abfd6d36da 100644
--- a/source/libs/nodes/src/nodesCloneFuncs.c
+++ b/source/libs/nodes/src/nodesCloneFuncs.c
@@ -378,6 +378,7 @@ static int32_t logicScanCopy(const SScanLogicNode* pSrc, SScanLogicNode* pDst) {
CLONE_NODE_FIELD(pTagIndexCond);
COPY_SCALAR_FIELD(triggerType);
COPY_SCALAR_FIELD(watermark);
+ COPY_SCALAR_FIELD(deleteMark);
COPY_SCALAR_FIELD(igExpired);
CLONE_NODE_LIST_FIELD(pGroupTags);
COPY_SCALAR_FIELD(groupSort);
@@ -434,6 +435,7 @@ static int32_t logicExchangeCopy(const SExchangeLogicNode* pSrc, SExchangeLogicN
COPY_BASE_OBJECT_FIELD(node, logicNodeCopy);
COPY_SCALAR_FIELD(srcStartGroupId);
COPY_SCALAR_FIELD(srcEndGroupId);
+ COPY_SCALAR_FIELD(seqRecvData);
return TSDB_CODE_SUCCESS;
}
@@ -462,6 +464,7 @@ static int32_t logicWindowCopy(const SWindowLogicNode* pSrc, SWindowLogicNode* p
CLONE_NODE_FIELD(pStateExpr);
COPY_SCALAR_FIELD(triggerType);
COPY_SCALAR_FIELD(watermark);
+ COPY_SCALAR_FIELD(deleteMark);
COPY_SCALAR_FIELD(igExpired);
COPY_SCALAR_FIELD(windowAlgo);
COPY_SCALAR_FIELD(inputTsOrder);
diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c
index 172c7694334d9a5199716434d169724c449eb037..d062ed34c4810f94cd0c7ced202ac7e472a243fc 100644
--- a/source/libs/nodes/src/nodesCodeFuncs.c
+++ b/source/libs/nodes/src/nodesCodeFuncs.c
@@ -221,6 +221,8 @@ const char* nodesNodeName(ENodeType type) {
return "PhysiTableScan";
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
return "PhysiTableSeqScan";
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
+ return "PhysiTableMergeScan";
case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
return "PhysiSreamScan";
case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
@@ -229,8 +231,8 @@ const char* nodesNodeName(ENodeType type) {
return "PhysiBlockDistScan";
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
return "PhysiLastRowScan";
- case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
- return "PhysiTableMergeScan";
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
+ return "PhysiTableCountScan";
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
return "PhysiProject";
case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
@@ -817,6 +819,7 @@ static const char* jkWindowLogicPlanTspk = "Tspk";
static const char* jkWindowLogicPlanStateExpr = "StateExpr";
static const char* jkWindowLogicPlanTriggerType = "TriggerType";
static const char* jkWindowLogicPlanWatermark = "Watermark";
+static const char* jkWindowLogicPlanDeleteMark = "DeleteMark";
static int32_t logicWindowNodeToJson(const void* pObj, SJson* pJson) {
const SWindowLogicNode* pNode = (const SWindowLogicNode*)pObj;
@@ -858,6 +861,9 @@ static int32_t logicWindowNodeToJson(const void* pObj, SJson* pJson) {
if (TSDB_CODE_SUCCESS == code) {
code = tjsonAddIntegerToObject(pJson, jkWindowLogicPlanWatermark, pNode->watermark);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tjsonAddIntegerToObject(pJson, jkWindowLogicPlanDeleteMark, pNode->deleteMark);
+ }
return code;
}
@@ -902,6 +908,9 @@ static int32_t jsonToLogicWindowNode(const SJson* pJson, void* pObj) {
if (TSDB_CODE_SUCCESS == code) {
code = tjsonGetBigIntValue(pJson, jkWindowLogicPlanWatermark, &pNode->watermark);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tjsonGetBigIntValue(pJson, jkWindowLogicPlanDeleteMark, &pNode->deleteMark);
+ }
return code;
}
@@ -1864,6 +1873,7 @@ static int32_t jsonToPhysiAggNode(const SJson* pJson, void* pObj) {
static const char* jkExchangePhysiPlanSrcStartGroupId = "SrcStartGroupId";
static const char* jkExchangePhysiPlanSrcEndGroupId = "SrcEndGroupId";
static const char* jkExchangePhysiPlanSrcEndPoints = "SrcEndPoints";
+static const char* jkExchangePhysiPlanSeqRecvData = "SeqRecvData";
static int32_t physiExchangeNodeToJson(const void* pObj, SJson* pJson) {
const SExchangePhysiNode* pNode = (const SExchangePhysiNode*)pObj;
@@ -1878,6 +1888,9 @@ static int32_t physiExchangeNodeToJson(const void* pObj, SJson* pJson) {
if (TSDB_CODE_SUCCESS == code) {
code = nodeListToJson(pJson, jkExchangePhysiPlanSrcEndPoints, pNode->pSrcEndPoints);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tjsonAddBoolToObject(pJson, jkExchangePhysiPlanSeqRecvData, pNode->seqRecvData);
+ }
return code;
}
@@ -1895,6 +1908,9 @@ static int32_t jsonToPhysiExchangeNode(const SJson* pJson, void* pObj) {
if (TSDB_CODE_SUCCESS == code) {
code = jsonToNodeList(pJson, jkExchangePhysiPlanSrcEndPoints, &pNode->pSrcEndPoints);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tjsonGetBoolValue(pJson, jkExchangePhysiPlanSeqRecvData, &pNode->seqRecvData);
+ }
return code;
}
@@ -1995,6 +2011,7 @@ static const char* jkWindowPhysiPlanTsPk = "TsPk";
static const char* jkWindowPhysiPlanTsEnd = "TsEnd";
static const char* jkWindowPhysiPlanTriggerType = "TriggerType";
static const char* jkWindowPhysiPlanWatermark = "Watermark";
+static const char* jkWindowPhysiPlanDeleteMark = "DeleteMark";
static const char* jkWindowPhysiPlanIgnoreExpired = "IgnoreExpired";
static const char* jkWindowPhysiPlanInputTsOrder = "InputTsOrder";
static const char* jkWindowPhysiPlanOutputTsOrder = "outputTsOrder";
@@ -2022,6 +2039,9 @@ static int32_t physiWindowNodeToJson(const void* pObj, SJson* pJson) {
if (TSDB_CODE_SUCCESS == code) {
code = tjsonAddIntegerToObject(pJson, jkWindowPhysiPlanWatermark, pNode->watermark);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tjsonAddIntegerToObject(pJson, jkWindowPhysiPlanDeleteMark, pNode->deleteMark);
+ }
if (TSDB_CODE_SUCCESS == code) {
code = tjsonAddIntegerToObject(pJson, jkWindowPhysiPlanIgnoreExpired, pNode->igExpired);
}
@@ -2060,6 +2080,9 @@ static int32_t jsonToPhysiWindowNode(const SJson* pJson, void* pObj) {
if (TSDB_CODE_SUCCESS == code) {
code = tjsonGetBigIntValue(pJson, jkWindowPhysiPlanWatermark, &pNode->watermark);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tjsonGetBigIntValue(pJson, jkWindowPhysiPlanDeleteMark, &pNode->deleteMark);
+ }
if (TSDB_CODE_SUCCESS == code) {
code = tjsonGetTinyIntValue(pJson, jkWindowPhysiPlanIgnoreExpired, &pNode->igExpired);
}
@@ -2945,6 +2968,7 @@ static const char* jkValueDuration = "Duration";
static const char* jkValueTranslate = "Translate";
static const char* jkValueNotReserved = "NotReserved";
static const char* jkValueIsNull = "IsNull";
+static const char* jkValueUnit = "Unit";
static const char* jkValueDatum = "Datum";
static int32_t datumToJson(const void* pObj, SJson* pJson) {
@@ -3034,6 +3058,9 @@ static int32_t valueNodeToJson(const void* pObj, SJson* pJson) {
if (TSDB_CODE_SUCCESS == code) {
code = tjsonAddBoolToObject(pJson, jkValueIsNull, pNode->isNull);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tjsonAddIntegerToObject(pJson, jkValueUnit, pNode->unit);
+ }
if (TSDB_CODE_SUCCESS == code && pNode->translate && !pNode->isNull) {
code = datumToJson(pNode, pJson);
}
@@ -3184,6 +3211,9 @@ static int32_t jsonToValueNode(const SJson* pJson, void* pObj) {
if (TSDB_CODE_SUCCESS == code) {
code = tjsonGetBoolValue(pJson, jkValueIsNull, &pNode->isNull);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tjsonGetTinyIntValue(pJson, jkValueUnit, &pNode->unit);
+ }
if (TSDB_CODE_SUCCESS == code && pNode->translate && !pNode->isNull) {
code = jsonToDatum(pJson, pNode);
}
@@ -3516,6 +3546,18 @@ static int32_t groupingSetNodeToJson(const void* pObj, SJson* pJson) {
return code;
}
+static int32_t jsonToGroupingSetNode(const SJson* pJson, void* pObj) {
+ SGroupingSetNode* pNode = (SGroupingSetNode*)pObj;
+
+ int32_t code = TSDB_CODE_SUCCESS;
+ tjsonGetNumberValue(pJson, jkGroupingSetType, pNode->groupingSetType, code);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = jsonToNodeList(pJson, jkGroupingSetParameter, &pNode->pParameterList);
+ }
+
+ return code;
+}
+
static const char* jkOrderByExprExpr = "Expr";
static const char* jkOrderByExprOrder = "Order";
static const char* jkOrderByExprNullOrder = "NullOrder";
@@ -4632,6 +4674,7 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
return physiScanNodeToJson(pObj, pJson);
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
return physiLastRowScanNodeToJson(pObj, pJson);
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
@@ -4712,6 +4755,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
return jsonToRealTableNode(pJson, pObj);
case QUERY_NODE_TEMP_TABLE:
return jsonToTempTableNode(pJson, pObj);
+ case QUERY_NODE_GROUPING_SET:
+ return jsonToGroupingSetNode(pJson, pObj);
case QUERY_NODE_ORDER_BY_EXPR:
return jsonToOrderByExprNode(pJson, pObj);
case QUERY_NODE_LIMIT:
@@ -4786,6 +4831,7 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
return jsonToLogicPlan(pJson, pObj);
case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
return jsonToPhysiScanNode(pJson, pObj);
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
return jsonToPhysiLastRowScanNode(pJson, pObj);
diff --git a/source/libs/nodes/src/nodesMsgFuncs.c b/source/libs/nodes/src/nodesMsgFuncs.c
index 2879d55167f82821399b5296c16514af306d8dd6..cc9cb31d181404f2c4dfb0807d22b117a24c5b82 100644
--- a/source/libs/nodes/src/nodesMsgFuncs.c
+++ b/source/libs/nodes/src/nodesMsgFuncs.c
@@ -2428,7 +2428,8 @@ enum {
PHY_EXCHANGE_CODE_SRC_START_GROUP_ID,
PHY_EXCHANGE_CODE_SRC_END_GROUP_ID,
PHY_EXCHANGE_CODE_SINGLE_CHANNEL,
- PHY_EXCHANGE_CODE_SRC_ENDPOINTS
+ PHY_EXCHANGE_CODE_SRC_ENDPOINTS,
+ PHY_EXCHANGE_CODE_SEQ_RECV_DATA
};
static int32_t physiExchangeNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
@@ -2447,6 +2448,9 @@ static int32_t physiExchangeNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
if (TSDB_CODE_SUCCESS == code) {
code = tlvEncodeObj(pEncoder, PHY_EXCHANGE_CODE_SRC_ENDPOINTS, nodeListToMsg, pNode->pSrcEndPoints);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tlvEncodeBool(pEncoder, PHY_EXCHANGE_CODE_SEQ_RECV_DATA, pNode->seqRecvData);
+ }
return code;
}
@@ -2473,6 +2477,9 @@ static int32_t msgToPhysiExchangeNode(STlvDecoder* pDecoder, void* pObj) {
case PHY_EXCHANGE_CODE_SRC_ENDPOINTS:
code = msgToNodeListFromTlv(pTlv, (void**)&pNode->pSrcEndPoints);
break;
+ case PHY_EXCHANGE_CODE_SEQ_RECV_DATA:
+ code = tlvDecodeBool(pTlv, &pNode->seqRecvData);
+ break;
default:
break;
}
@@ -2600,6 +2607,7 @@ enum {
PHY_WINDOW_CODE_TS_END,
PHY_WINDOW_CODE_TRIGGER_TYPE,
PHY_WINDOW_CODE_WATERMARK,
+ PHY_WINDOW_CODE_DELETE_MARK,
PHY_WINDOW_CODE_IG_EXPIRED,
PHY_WINDOW_CODE_INPUT_TS_ORDER,
PHY_WINDOW_CODE_OUTPUT_TS_ORDER,
@@ -2628,6 +2636,9 @@ static int32_t physiWindowNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
if (TSDB_CODE_SUCCESS == code) {
code = tlvEncodeI64(pEncoder, PHY_WINDOW_CODE_WATERMARK, pNode->watermark);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = tlvEncodeI64(pEncoder, PHY_WINDOW_CODE_DELETE_MARK, pNode->deleteMark);
+ }
if (TSDB_CODE_SUCCESS == code) {
code = tlvEncodeI8(pEncoder, PHY_WINDOW_CODE_IG_EXPIRED, pNode->igExpired);
}
@@ -2672,6 +2683,9 @@ static int32_t msgToPhysiWindowNode(STlvDecoder* pDecoder, void* pObj) {
case PHY_WINDOW_CODE_WATERMARK:
code = tlvDecodeI64(pTlv, &pNode->watermark);
break;
+ case PHY_WINDOW_CODE_DELETE_MARK:
+ code = tlvDecodeI64(pTlv, &pNode->deleteMark);
+ break;
case PHY_WINDOW_CODE_IG_EXPIRED:
code = tlvDecodeI8(pTlv, &pNode->igExpired);
break;
@@ -3633,6 +3647,7 @@ static int32_t specificNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
code = physiScanNodeToMsg(pObj, pEncoder);
break;
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
code = physiLastRowScanNodeToMsg(pObj, pEncoder);
break;
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
@@ -3771,6 +3786,7 @@ static int32_t msgToSpecificNode(STlvDecoder* pDecoder, void* pObj) {
code = msgToPhysiScanNode(pDecoder, pObj);
break;
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
code = msgToPhysiLastRowScanNode(pDecoder, pObj);
break;
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
diff --git a/source/libs/nodes/src/nodesToSQLFuncs.c b/source/libs/nodes/src/nodesToSQLFuncs.c
index 9325d0288636ca7e22fe4fdd3a8e50ff90cdf0de..0181da92a9e7eeb5387a68ed18b0b20470979101 100644
--- a/source/libs/nodes/src/nodesToSQLFuncs.c
+++ b/source/libs/nodes/src/nodesToSQLFuncs.c
@@ -132,7 +132,7 @@ int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len) {
char *t = nodesGetStrValueFromNode(colNode);
if (NULL == t) {
nodesError("fail to get str value from valueNode");
- NODES_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ NODES_ERR_RET(TSDB_CODE_APP_ERROR);
}
int32_t tlen = strlen(t);
@@ -229,5 +229,5 @@ int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len) {
}
nodesError("nodesNodeToSQL unknown node = %s", nodesNodeName(pNode->type));
- NODES_RET(TSDB_CODE_QRY_APP_ERROR);
+ NODES_RET(TSDB_CODE_APP_ERROR);
}
diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c
index 8c1a85b101da641ba33e7f64e834617bd9e30f7f..cd5ae7ad6e2b1e917b5b2842172b95b09ec49d20 100644
--- a/source/libs/nodes/src/nodesUtilFuncs.c
+++ b/source/libs/nodes/src/nodesUtilFuncs.c
@@ -424,6 +424,7 @@ SNode* nodesMakeNode(ENodeType type) {
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
case QUERY_NODE_SHOW_TAGS_STMT:
+ case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
return makeNode(type, sizeof(SShowStmt));
case QUERY_NODE_SHOW_TABLE_TAGS_STMT:
return makeNode(type, sizeof(SShowTableTagsStmt));
@@ -493,6 +494,8 @@ SNode* nodesMakeNode(ENodeType type) {
return makeNode(type, sizeof(SBlockDistScanPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
return makeNode(type, sizeof(SLastRowScanPhysiNode));
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
+ return makeNode(type, sizeof(STableCountScanPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
return makeNode(type, sizeof(SProjectPhysiNode));
case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
@@ -593,6 +596,13 @@ static void destroyWinodwPhysiNode(SWinodwPhysiNode* pNode) {
nodesDestroyNode(pNode->pTsEnd);
}
+static void destroyPartitionPhysiNode(SPartitionPhysiNode* pNode) {
+ destroyPhysiNode((SPhysiNode*)pNode);
+ nodesDestroyList(pNode->pExprs);
+ nodesDestroyList(pNode->pPartitionKeys);
+ nodesDestroyList(pNode->pTargets);
+}
+
static void destroyScanPhysiNode(SScanPhysiNode* pNode) {
destroyPhysiNode((SPhysiNode*)pNode);
nodesDestroyList(pNode->pScanCols);
@@ -730,6 +740,7 @@ void nodesDestroyNode(SNode* pNode) {
nodesDestroyList(pOptions->pWatermark);
nodesDestroyList(pOptions->pRollupFuncs);
nodesDestroyList(pOptions->pSma);
+ nodesDestroyList(pOptions->pDeleteMark);
break;
}
case QUERY_NODE_INDEX_OPTIONS: {
@@ -747,6 +758,7 @@ void nodesDestroyNode(SNode* pNode) {
SStreamOptions* pOptions = (SStreamOptions*)pNode;
nodesDestroyNode(pOptions->pDelay);
nodesDestroyNode(pOptions->pWatermark);
+ nodesDestroyNode(pOptions->pDeleteMark);
break;
}
case QUERY_NODE_LEFT_VALUE: // no pointer field
@@ -902,6 +914,8 @@ void nodesDestroyNode(SNode* pNode) {
SCreateStreamStmt* pStmt = (SCreateStreamStmt*)pNode;
nodesDestroyNode((SNode*)pStmt->pOptions);
nodesDestroyNode(pStmt->pQuery);
+ nodesDestroyList(pStmt->pTags);
+ nodesDestroyNode(pStmt->pSubtable);
break;
}
case QUERY_NODE_DROP_STREAM_STMT: // no pointer field
@@ -943,7 +957,8 @@ void nodesDestroyNode(SNode* pNode) {
case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
- case QUERY_NODE_SHOW_TAGS_STMT: {
+ case QUERY_NODE_SHOW_TAGS_STMT:
+ case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT: {
SShowStmt* pStmt = (SShowStmt*)pNode;
nodesDestroyNode(pStmt->pDbName);
nodesDestroyNode(pStmt->pTbName);
@@ -1016,6 +1031,8 @@ void nodesDestroyNode(SNode* pNode) {
nodesDestroyNode(pLogicNode->pTagIndexCond);
taosArrayDestroyEx(pLogicNode->pSmaIndexes, destroySmaIndex);
nodesDestroyList(pLogicNode->pGroupTags);
+ nodesDestroyList(pLogicNode->pTags);
+ nodesDestroyNode(pLogicNode->pSubtable);
break;
}
case QUERY_NODE_LOGIC_PLAN_JOIN: {
@@ -1088,6 +1105,8 @@ void nodesDestroyNode(SNode* pNode) {
SPartitionLogicNode* pLogicNode = (SPartitionLogicNode*)pNode;
destroyLogicNode((SLogicNode*)pLogicNode);
nodesDestroyList(pLogicNode->pPartitionKeys);
+ nodesDestroyList(pLogicNode->pTags);
+ nodesDestroyNode(pLogicNode->pSubtable);
break;
}
case QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC: {
@@ -1120,7 +1139,8 @@ void nodesDestroyNode(SNode* pNode) {
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
destroyScanPhysiNode((SScanPhysiNode*)pNode);
break;
- case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: {
+ case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
+ case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
SLastRowScanPhysiNode* pPhyNode = (SLastRowScanPhysiNode*)pNode;
destroyScanPhysiNode((SScanPhysiNode*)pNode);
nodesDestroyList(pPhyNode->pGroupTags);
@@ -1134,6 +1154,8 @@ void nodesDestroyNode(SNode* pNode) {
destroyScanPhysiNode((SScanPhysiNode*)pNode);
nodesDestroyList(pPhyNode->pDynamicScanFuncs);
nodesDestroyList(pPhyNode->pGroupTags);
+ nodesDestroyList(pPhyNode->pTags);
+ nodesDestroyNode(pPhyNode->pSubtable);
break;
}
case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
@@ -1210,13 +1232,15 @@ void nodesDestroyNode(SNode* pNode) {
nodesDestroyNode(pPhyNode->pStateKey);
break;
}
- case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
+ case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
+ destroyPartitionPhysiNode((SPartitionPhysiNode*)pNode);
+ break;
+ }
case QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION: {
- SPartitionPhysiNode* pPhyNode = (SPartitionPhysiNode*)pNode;
- destroyPhysiNode((SPhysiNode*)pPhyNode);
- nodesDestroyList(pPhyNode->pExprs);
- nodesDestroyList(pPhyNode->pPartitionKeys);
- nodesDestroyList(pPhyNode->pTargets);
+ SStreamPartitionPhysiNode* pPhyNode = (SStreamPartitionPhysiNode*)pNode;
+ destroyPartitionPhysiNode((SPartitionPhysiNode*)pPhyNode);
+ nodesDestroyList(pPhyNode->pTags);
+ nodesDestroyNode(pPhyNode->pSubtable);
break;
}
case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: {
@@ -1558,7 +1582,7 @@ int32_t nodesSetValueNodeValue(SValueNode* pNode, void* value) {
pNode->datum.p = (char*)value;
break;
default:
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
return TSDB_CODE_SUCCESS;
diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h
index a6c56f3ae4239c936747fde5094ea57fe9dcba7f..ef67c7536f7cd90de232185b5f8e661ebea53d00 100644
--- a/source/libs/parser/inc/parAst.h
+++ b/source/libs/parser/inc/parAst.h
@@ -72,7 +72,8 @@ typedef enum ETableOptionType {
TABLE_OPTION_WATERMARK,
TABLE_OPTION_ROLLUP,
TABLE_OPTION_TTL,
- TABLE_OPTION_SMA
+ TABLE_OPTION_SMA,
+ TABLE_OPTION_DELETE_MARK
} ETableOptionType;
typedef struct SAlterOption {
diff --git a/source/libs/parser/inc/parInsertUtil.h b/source/libs/parser/inc/parInsertUtil.h
index 09d55d369fc0d711b4a4301c74a0cb0d7002c347..5cc72f86923762454c8cae66ef9bbc7828b9ef05 100644
--- a/source/libs/parser/inc/parInsertUtil.h
+++ b/source/libs/parser/inc/parInsertUtil.h
@@ -135,7 +135,7 @@ int32_t insAllocateMemForSize(STableDataBlocks *pDataBlock, int32_t allSize);
int32_t insCreateSName(SName *pName, struct SToken *pTableName, int32_t acctId, const char *dbName, SMsgBuf *pMsgBuf);
int32_t insFindCol(struct SToken *pColname, int32_t start, int32_t end, SSchema *pSchema);
void insBuildCreateTbReq(SVCreateTbReq *pTbReq, const char *tname, STag *pTag, int64_t suid, const char *sname,
- SArray *tagName, uint8_t tagNum);
+ SArray *tagName, uint8_t tagNum, int32_t ttl);
int32_t insMemRowAppend(SMsgBuf *pMsgBuf, const void *value, int32_t len, void *param);
int32_t insCheckTimestamp(STableDataBlocks *pDataBlocks, const char *start);
int32_t insBuildOutput(SHashObj *pVgroupsHashObj, SArray *pVgDataBlocks, SArray **pDataBlocks);
diff --git a/source/libs/parser/inc/parUtil.h b/source/libs/parser/inc/parUtil.h
index c53d3f932020d6de7bd4d7923370a0cc5abb31a2..ce5a63f5d07d35fb7a432e878d60372b9bab6cf9 100644
--- a/source/libs/parser/inc/parUtil.h
+++ b/source/libs/parser/inc/parUtil.h
@@ -86,7 +86,7 @@ STableComInfo getTableInfo(const STableMeta* pTableMeta);
STableMeta* tableMetaDup(const STableMeta* pTableMeta);
int32_t trimString(const char* src, int32_t len, char* dst, int32_t dlen);
-int32_t getInsTagsTableTargetName(int32_t acctId, SNode* pWhere, SName* pName);
+int32_t getVnodeSysTableTargetName(int32_t acctId, SNode* pWhere, SName* pName);
int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq);
int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache);
diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y
index ec5bb765db938e279378b032bbe45ca5f46554f9..b060f7fc830536f5e03b307ecb924ef9313c20ee 100644
--- a/source/libs/parser/inc/sql.y
+++ b/source/libs/parser/inc/sql.y
@@ -101,6 +101,7 @@ cmd ::= REVOKE privileges(A) ON priv_level(B) FROM user_name(C).
%destructor privileges { }
privileges(A) ::= ALL. { A = PRIVILEGE_TYPE_ALL; }
privileges(A) ::= priv_type_list(B). { A = B; }
+privileges(A) ::= SUBSCRIBE. { A = PRIVILEGE_TYPE_SUBSCRIBE; }
%type priv_type_list { int64_t }
%destructor priv_type_list { }
@@ -116,6 +117,7 @@ priv_type(A) ::= WRITE.
%destructor priv_level { }
priv_level(A) ::= NK_STAR(B) NK_DOT NK_STAR. { A = B; }
priv_level(A) ::= db_name(B) NK_DOT NK_STAR. { A = B; }
+priv_level(A) ::= topic_name(B). { A = B; }
/************************************************ create/drop/alter dnode *********************************************/
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); }
@@ -360,6 +362,7 @@ table_options(A) ::= table_options(B) WATERMARK duration_list(C).
table_options(A) ::= table_options(B) ROLLUP NK_LP rollup_func_list(C) NK_RP. { A = setTableOption(pCxt, B, TABLE_OPTION_ROLLUP, C); }
table_options(A) ::= table_options(B) TTL NK_INTEGER(C). { A = setTableOption(pCxt, B, TABLE_OPTION_TTL, &C); }
table_options(A) ::= table_options(B) SMA NK_LP col_name_list(C) NK_RP. { A = setTableOption(pCxt, B, TABLE_OPTION_SMA, C); }
+table_options(A) ::= table_options(B) DELETE_MARK duration_list(C). { A = setTableOption(pCxt, B, TABLE_OPTION_DELETE_MARK, C); }
alter_table_options(A) ::= alter_table_option(B). { A = createAlterTableOptions(pCxt); A = setTableOption(pCxt, A, B.type, &B.val); }
alter_table_options(A) ::= alter_table_options(B) alter_table_option(C). { A = setTableOption(pCxt, B, C.type, &C.val); }
@@ -393,6 +396,7 @@ col_name(A) ::= column_name(B).
/************************************************ show ****************************************************************/
cmd ::= SHOW DNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); }
cmd ::= SHOW USERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); }
+cmd ::= SHOW USER PRIVILEGES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USER_PRIVILEGES_STMT); }
cmd ::= SHOW DATABASES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); }
cmd ::= SHOW db_name_cond_opt(A) TABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, A, B, OP_TYPE_LIKE); }
cmd ::= SHOW db_name_cond_opt(A) STABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, A, B, OP_TYPE_LIKE); }
@@ -472,8 +476,9 @@ func_list(A) ::= func_list(B) NK_COMMA func(C).
func(A) ::= function_name(B) NK_LP expression_list(C) NK_RP. { A = createFunctionNode(pCxt, &B, C); }
sma_stream_opt(A) ::= . { A = createStreamOptions(pCxt); }
-sma_stream_opt(A) ::= stream_options(B) WATERMARK duration_literal(C). { ((SStreamOptions*)B)->pWatermark = releaseRawExprNode(pCxt, C); A = B; }
-sma_stream_opt(A) ::= stream_options(B) MAX_DELAY duration_literal(C). { ((SStreamOptions*)B)->pDelay = releaseRawExprNode(pCxt, C); A = B; }
+sma_stream_opt(A) ::= sma_stream_opt(B) WATERMARK duration_literal(C). { ((SStreamOptions*)B)->pWatermark = releaseRawExprNode(pCxt, C); A = B; }
+sma_stream_opt(A) ::= sma_stream_opt(B) MAX_DELAY duration_literal(C). { ((SStreamOptions*)B)->pDelay = releaseRawExprNode(pCxt, C); A = B; }
+sma_stream_opt(A) ::= sma_stream_opt(B) DELETE_MARK duration_literal(C). { ((SStreamOptions*)B)->pDeleteMark = releaseRawExprNode(pCxt, C); A = B; }
/************************************************ create/drop topic ***************************************************/
cmd ::= CREATE TOPIC not_exists_opt(A) topic_name(B) AS query_or_subquery(C). { pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, A, &B, C); }
@@ -654,7 +659,7 @@ cgroup_name(A) ::= NK_ID(B).
/************************************************ expression **********************************************************/
expr_or_subquery(A) ::= expression(B). { A = B; }
-expr_or_subquery(A) ::= subquery(B). { A = B; }
+//expr_or_subquery(A) ::= subquery(B). { A = createTempTableNode(pCxt, releaseRawExprNode(pCxt, B), NULL); }
expression(A) ::= literal(B). { A = B; }
expression(A) ::= pseudo_column(B). { A = B; }
diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c
index 1db52c123c692e821918d80e97608f6f2b073561..b23adaabb55497979fa200fd9f67a5d528754117 100644
--- a/source/libs/parser/src/parAstCreater.c
+++ b/source/libs/parser/src/parAstCreater.c
@@ -1124,6 +1124,9 @@ SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType
case TABLE_OPTION_SMA:
((STableOptions*)pOptions)->pSma = pVal;
break;
+ case TABLE_OPTION_DELETE_MARK:
+ ((STableOptions*)pOptions)->pDeleteMark = pVal;
+ break;
default:
break;
}
@@ -1407,7 +1410,7 @@ SNode* createShowTableTagsStmt(SAstCreateContext* pCxt, SNode* pTbName, SNode* p
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo) {
CHECK_PARSER_STATUS(pCxt);
- char password[TSDB_USET_PASSWORD_LEN] = {0};
+ char password[TSDB_USET_PASSWORD_LEN + 3] = {0};
if (!checkUserName(pCxt, pUserName) || !checkPassword(pCxt, pPassword, password)) {
return NULL;
}
@@ -1815,7 +1818,7 @@ SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbN
SGrantStmt* pStmt = (SGrantStmt*)nodesMakeNode(QUERY_NODE_GRANT_STMT);
CHECK_OUT_OF_MEM(pStmt);
pStmt->privileges = privileges;
- COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName);
+ COPY_STRING_FORM_ID_TOKEN(pStmt->objName, pDbName);
COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName);
return (SNode*)pStmt;
}
@@ -1828,7 +1831,7 @@ SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDb
SRevokeStmt* pStmt = (SRevokeStmt*)nodesMakeNode(QUERY_NODE_REVOKE_STMT);
CHECK_OUT_OF_MEM(pStmt);
pStmt->privileges = privileges;
- COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName);
+ COPY_STRING_FORM_ID_TOKEN(pStmt->objName, pDbName);
COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName);
return (SNode*)pStmt;
}
diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c
index 5aa87d780ddd05c980ab6c8dfe50d2397ba1239f..f90a42add34c47dbbcc77ccff64a9c8b18956939 100644
--- a/source/libs/parser/src/parAstParser.c
+++ b/source/libs/parser/src/parAstParser.c
@@ -140,7 +140,7 @@ static int32_t collectMetaKeyFromInsTagsImpl(SCollectMetaKeyCxt* pCxt, SName* pN
static int32_t collectMetaKeyFromInsTags(SCollectMetaKeyCxt* pCxt) {
SSelectStmt* pSelect = (SSelectStmt*)pCxt->pStmt;
SName name = {0};
- int32_t code = getInsTagsTableTargetName(pCxt->pParseCxt->acctId, pSelect->pWhere, &name);
+ int32_t code = getVnodeSysTableTargetName(pCxt->pParseCxt->acctId, pSelect->pWhere, &name);
if (TSDB_CODE_SUCCESS == code) {
code = collectMetaKeyFromInsTagsImpl(pCxt, &name);
}
@@ -165,7 +165,8 @@ static int32_t collectMetaKeyFromRealTableImpl(SCollectMetaKeyCxt* pCxt, const c
if (TSDB_CODE_SUCCESS == code && (0 == strcmp(pTable, TSDB_INS_TABLE_DNODE_VARIABLES))) {
code = reserveDnodeRequiredInCache(pCxt->pMetaCache);
}
- if (TSDB_CODE_SUCCESS == code && (0 == strcmp(pTable, TSDB_INS_TABLE_TAGS)) &&
+ if (TSDB_CODE_SUCCESS == code &&
+ (0 == strcmp(pTable, TSDB_INS_TABLE_TAGS) || 0 == strcmp(pTable, TSDB_INS_TABLE_TABLES)) &&
QUERY_NODE_SELECT_STMT == nodeType(pCxt->pStmt)) {
code = collectMetaKeyFromInsTags(pCxt);
}
@@ -504,6 +505,11 @@ static int32_t collectMetaKeyFromShowVnodes(SCollectMetaKeyCxt* pCxt, SShowVnode
pCxt->pMetaCache);
}
+static int32_t collectMetaKeyFromShowUserPrivileges(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
+ return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_PRIVILEGES,
+ pCxt->pMetaCache);
+}
+
static int32_t collectMetaKeyFromShowCreateDatabase(SCollectMetaKeyCxt* pCxt, SShowCreateDatabaseStmt* pStmt) {
return reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache);
}
@@ -648,6 +654,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
return collectMetaKeyFromShowDnodeVariables(pCxt, (SShowDnodeVariablesStmt*)pStmt);
case QUERY_NODE_SHOW_VNODES_STMT:
return collectMetaKeyFromShowVnodes(pCxt, (SShowVnodesStmt*)pStmt);
+ case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
+ return collectMetaKeyFromShowUserPrivileges(pCxt, (SShowStmt*)pStmt);
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
return collectMetaKeyFromShowCreateDatabase(pCxt, (SShowCreateDatabaseStmt*)pStmt);
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
diff --git a/source/libs/parser/src/parCalcConst.c b/source/libs/parser/src/parCalcConst.c
index efc9d77e67b8865b16409894920609277b38c1db..d4f4949df06a79d7b67806d2c3bb760a45695d2a 100644
--- a/source/libs/parser/src/parCalcConst.c
+++ b/source/libs/parser/src/parCalcConst.c
@@ -169,7 +169,7 @@ static int32_t calcConstStmtCondition(SCalcConstContext* pCxt, SNode** pCond, bo
static int32_t calcConstProject(SNode* pProject, bool dual, SNode** pNew) {
SArray* pAssociation = NULL;
if (NULL != ((SExprNode*)pProject)->pAssociation) {
- pAssociation = taosArrayDup(((SExprNode*)pProject)->pAssociation);
+ pAssociation = taosArrayDup(((SExprNode*)pProject)->pAssociation, NULL);
if (NULL == pAssociation) {
return TSDB_CODE_OUT_OF_MEMORY;
}
@@ -372,14 +372,42 @@ static bool isEmptyResultQuery(SNode* pStmt) {
return isEmptyResult;
}
+static void resetProjectNullTypeImpl(SNodeList* pProjects) {
+ SNode* pProj = NULL;
+ FOREACH(pProj, pProjects) {
+ SExprNode* pExpr = (SExprNode*)pProj;
+ if (TSDB_DATA_TYPE_NULL == pExpr->resType.type) {
+ pExpr->resType.type = TSDB_DATA_TYPE_VARCHAR;
+ pExpr->resType.bytes = 0;
+ }
+ }
+}
+
+static void resetProjectNullType(SNode* pStmt) {
+ switch (nodeType(pStmt)) {
+ case QUERY_NODE_SELECT_STMT:
+ resetProjectNullTypeImpl(((SSelectStmt*)pStmt)->pProjectionList);
+ break;
+ case QUERY_NODE_SET_OPERATOR: {
+ resetProjectNullTypeImpl(((SSetOperator*)pStmt)->pProjectionList);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
int32_t calculateConstant(SParseContext* pParseCxt, SQuery* pQuery) {
SCalcConstContext cxt = {.pParseCxt = pParseCxt,
.msgBuf.buf = pParseCxt->pMsg,
.msgBuf.len = pParseCxt->msgLen,
.code = TSDB_CODE_SUCCESS};
int32_t code = calcConstQuery(&cxt, pQuery->pRoot, false);
- if (TSDB_CODE_SUCCESS == code && isEmptyResultQuery(pQuery->pRoot)) {
- pQuery->execMode = QUERY_EXEC_MODE_EMPTY_RESULT;
+ if (TSDB_CODE_SUCCESS == code) {
+ resetProjectNullType(pQuery->pRoot);
+ if (isEmptyResultQuery(pQuery->pRoot)) {
+ pQuery->execMode = QUERY_EXEC_MODE_EMPTY_RESULT;
+ }
}
return code;
}
diff --git a/source/libs/parser/src/parInsertSml.c b/source/libs/parser/src/parInsertSml.c
index d18b11ad57e25a863c7a507d95da92ef05d19cc3..358baa74cb3932887894bda79a6e26e9a888c797 100644
--- a/source/libs/parser/src/parInsertSml.c
+++ b/source/libs/parser/src/parInsertSml.c
@@ -114,7 +114,7 @@ static int32_t smlBoundColumnData(SArray* cols, SParsedDataColInfo* pColList, SS
if (!isOrdered) {
pColList->colIdxInfo = taosMemoryCalloc(pColList->numOfBound, sizeof(SBoundIdxInfo));
if (NULL == pColList->colIdxInfo) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
SBoundIdxInfo* pColIdx = pColList->colIdxInfo;
for (col_id_t i = 0; i < pColList->numOfBound; ++i) {
@@ -150,11 +150,11 @@ static int32_t smlBuildTagRow(SArray* cols, SParsedDataColInfo* tags, SSchema* p
SMsgBuf* msg) {
SArray* pTagArray = taosArrayInit(tags->numOfBound, sizeof(STagVal));
if (!pTagArray) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
*tagName = taosArrayInit(8, TSDB_COL_NAME_LEN);
if (!*tagName) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
int32_t code = TSDB_CODE_SUCCESS;
@@ -208,7 +208,7 @@ end:
}
int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols, bool format, STableMeta* pTableMeta,
- char* tableName, const char* sTableName, int32_t sTableNameLen, char* msgBuf, int16_t msgBufLen) {
+ char* tableName, const char* sTableName, int32_t sTableNameLen, int32_t ttl, char* msgBuf, int16_t msgBufLen) {
SMsgBuf pBuf = {.buf = msgBuf, .len = msgBufLen};
SSmlExecHandle* smlHandle = (SSmlExecHandle*)handle;
@@ -229,7 +229,7 @@ int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols
}
insBuildCreateTbReq(&smlHandle->tableExecHandle.createTblReq, tableName, pTag, pTableMeta->suid, NULL, tagName,
- pTableMeta->tableInfo.numOfTags);
+ pTableMeta->tableInfo.numOfTags, ttl);
taosArrayDestroy(tagName);
smlHandle->tableExecHandle.createTblReq.ctb.stbName = taosMemoryMalloc(sTableNameLen + 1);
@@ -303,9 +303,9 @@ int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols
if (kv) {
int32_t colLen = kv->length;
if (pColSchema->type == TSDB_DATA_TYPE_TIMESTAMP) {
- // uError("SML:data before:%" PRId64 ", precision:%d", kv->i, pTableMeta->tableInfo.precision);
+ uDebug("SML:data before:%" PRId64 ", precision:%d", kv->i, pTableMeta->tableInfo.precision);
kv->i = convertTimePrecision(kv->i, TSDB_TIME_PRECISION_NANO, pTableMeta->tableInfo.precision);
- // uError("SML:data after:%" PRId64 ", precision:%d", kv->i, pTableMeta->tableInfo.precision);
+ uDebug("SML:data after:%" PRId64 ", precision:%d", kv->i, pTableMeta->tableInfo.precision);
}
if (IS_VAR_DATA_TYPE(kv->type)) {
diff --git a/source/libs/parser/src/parInsertSql.c b/source/libs/parser/src/parInsertSql.c
index 411adc680c87f6d92780e351a920221927ddca1c..36420599b3823339bd5fb5f53d0c4a9c93c47ea4 100644
--- a/source/libs/parser/src/parInsertSql.c
+++ b/source/libs/parser/src/parInsertSql.c
@@ -44,6 +44,7 @@ typedef struct SInsertParseContext {
SParsedDataColInfo tags; // for stmt
bool missCache;
bool usingDuplicateTable;
+ bool forceUpdate;
} SInsertParseContext;
typedef int32_t (*_row_append_fn_t)(SMsgBuf* pMsgBuf, const void* value, int32_t len, void* param);
@@ -172,8 +173,8 @@ static int32_t parseDuplicateUsingClause(SInsertParseContext* pCxt, SVnodeModifO
}
// pStmt->pSql -> field1_name, ...)
-static int32_t parseBoundColumns(SInsertParseContext* pCxt, const char** pSql, SParsedDataColInfo* pColList,
- SSchema* pSchema) {
+static int32_t parseBoundColumns(SInsertParseContext* pCxt, const char** pSql, bool isTags,
+ SParsedDataColInfo* pColList, SSchema* pSchema) {
col_id_t nCols = pColList->numOfCols;
pColList->numOfBound = 0;
@@ -227,12 +228,16 @@ static int32_t parseBoundColumns(SInsertParseContext* pCxt, const char** pSql, S
}
}
+ if (!isTags && pColList->cols[0].valStat == VAL_STAT_NONE) {
+ return buildInvalidOperationMsg(&pCxt->msg, "primary timestamp column can not be null");
+ }
+
pColList->orderStatus = isOrdered ? ORDER_STATUS_ORDERED : ORDER_STATUS_DISORDERED;
if (!isOrdered) {
pColList->colIdxInfo = taosMemoryCalloc(pColList->numOfBound, sizeof(SBoundIdxInfo));
if (NULL == pColList->colIdxInfo) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
SBoundIdxInfo* pColIdx = pColList->colIdxInfo;
for (col_id_t i = 0; i < pColList->numOfBound; ++i) {
@@ -525,7 +530,7 @@ static int32_t parseBoundTagsClause(SInsertParseContext* pCxt, SVnodeModifOpStmt
}
pStmt->pSql += index;
- return parseBoundColumns(pCxt, &pStmt->pSql, &pCxt->tags, pTagsSchema);
+ return parseBoundColumns(pCxt, &pStmt->pSql, true, &pCxt->tags, pTagsSchema);
}
static int32_t parseTagValue(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SSchema* pTagSchema, SToken* pToken,
@@ -558,7 +563,8 @@ static int32_t parseTagValue(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt
static void buildCreateTbReq(SVnodeModifOpStmt* pStmt, STag* pTag, SArray* pTagName) {
insBuildCreateTbReq(&pStmt->createTblReq, pStmt->targetTableName.tname, pTag, pStmt->pTableMeta->suid,
- pStmt->usingTableName.tname, pTagName, pStmt->pTableMeta->tableInfo.numOfTags);
+ pStmt->usingTableName.tname, pTagName, pStmt->pTableMeta->tableInfo.numOfTags,
+ TSDB_DEFAULT_TABLE_TTL);
}
static int32_t checkAndTrimValue(SToken* pToken, char* tmpTokenBuf, SMsgBuf* pMsgBuf) {
@@ -792,6 +798,8 @@ static int32_t getTableMeta(SInsertParseContext* pCxt, SName* pTbName, bool isSt
*pMissCache = true;
} else if (isStb && TSDB_SUPER_TABLE != (*pTableMeta)->tableType) {
code = buildInvalidOperationMsg(&pCxt->msg, "create table only from super table is allowed");
+ } else if (!isStb && TSDB_SUPER_TABLE == (*pTableMeta)->tableType) {
+ code = buildInvalidOperationMsg(&pCxt->msg, "insert data into super table is not supported");
}
}
return code;
@@ -822,14 +830,69 @@ static int32_t getTableVgroup(SParseContext* pCxt, SVnodeModifOpStmt* pStmt, boo
return code;
}
+static int32_t getTableMetaAndVgroupImpl(SParseContext* pCxt, SVnodeModifOpStmt* pStmt, bool* pMissCache) {
+ SVgroupInfo vg;
+ int32_t code = catalogGetCachedTableVgMeta(pCxt->pCatalog, &pStmt->targetTableName, &vg, &pStmt->pTableMeta);
+ if (TSDB_CODE_SUCCESS == code) {
+ if (NULL != pStmt->pTableMeta) {
+ code = taosHashPut(pStmt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg));
+ }
+ *pMissCache = (NULL == pStmt->pTableMeta);
+ }
+ return code;
+}
+
+static int32_t getTableMetaAndVgroup(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, bool* pMissCache) {
+ SParseContext* pComCxt = pCxt->pComCxt;
+ int32_t code = TSDB_CODE_SUCCESS;
+ if (pComCxt->async) {
+ code = getTableMetaAndVgroupImpl(pComCxt, pStmt, pMissCache);
+ } else {
+ code = getTableMeta(pCxt, &pStmt->targetTableName, false, &pStmt->pTableMeta, pMissCache);
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = getTableVgroup(pCxt->pComCxt, pStmt, false, &pCxt->missCache);
+ }
+ }
+ return code;
+}
+
+static int32_t collectUseTable(const SName* pName, SHashObj* pTable) {
+ char fullName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(pName, fullName);
+ return taosHashPut(pTable, fullName, strlen(fullName), pName, sizeof(SName));
+}
+
+static int32_t collectUseDatabase(const SName* pName, SHashObj* pDbs) {
+ char dbFName[TSDB_DB_FNAME_LEN] = {0};
+ tNameGetFullDbName(pName, dbFName);
+ return taosHashPut(pDbs, dbFName, strlen(dbFName), dbFName, sizeof(dbFName));
+}
+
static int32_t getTargetTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ if (pCxt->forceUpdate) {
+ pCxt->missCache = true;
+ return TSDB_CODE_SUCCESS;
+ }
+
int32_t code = checkAuth(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache);
+#if 0
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
code = getTableMeta(pCxt, &pStmt->targetTableName, false, &pStmt->pTableMeta, &pCxt->missCache);
}
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
code = getTableVgroup(pCxt->pComCxt, pStmt, false, &pCxt->missCache);
}
+#else
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = getTableMetaAndVgroup(pCxt, pStmt, &pCxt->missCache);
+ }
+#endif
+ if (TSDB_CODE_SUCCESS == code && !pCxt->pComCxt->async) {
+ code = collectUseDatabase(&pStmt->targetTableName, pStmt->pDbFNameHashObj);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = collectUseTable(&pStmt->targetTableName, pStmt->pTableNameHashObj);
+ }
+ }
return code;
}
@@ -838,6 +901,11 @@ static int32_t preParseUsingTableName(SInsertParseContext* pCxt, SVnodeModifOpSt
}
static int32_t getUsingTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ if (pCxt->forceUpdate) {
+ pCxt->missCache = true;
+ return TSDB_CODE_SUCCESS;
+ }
+
int32_t code = checkAuth(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache);
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
code = getTableMeta(pCxt, &pStmt->usingTableName, true, &pStmt->pTableMeta, &pCxt->missCache);
@@ -845,6 +913,12 @@ static int32_t getUsingTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt*
if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
code = getTableVgroup(pCxt->pComCxt, pStmt, true, &pCxt->missCache);
}
+ if (TSDB_CODE_SUCCESS == code && !pCxt->pComCxt->async) {
+ code = collectUseDatabase(&pStmt->usingTableName, pStmt->pDbFNameHashObj);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = collectUseTable(&pStmt->usingTableName, pStmt->pTableNameHashObj);
+ }
+ }
return code;
}
@@ -912,10 +986,14 @@ static int32_t preParseBoundColumnsClause(SInsertParseContext* pCxt, SVnodeModif
static int32_t getTableDataBlocks(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, STableDataBlocks** pDataBuf) {
if (pCxt->pComCxt->async) {
- return insGetDataBlockFromList(pStmt->pTableBlockHashObj, &pStmt->pTableMeta->uid, sizeof(pStmt->pTableMeta->uid),
- TSDB_DEFAULT_PAYLOAD_SIZE, sizeof(SSubmitBlk),
- getTableInfo(pStmt->pTableMeta).rowSize, pStmt->pTableMeta, pDataBuf, NULL,
- &pStmt->createTblReq);
+ uint64_t uid = pStmt->pTableMeta->uid;
+ if (pStmt->usingTableProcessing) {
+ pStmt->pTableMeta->uid = 0;
+ }
+
+ return insGetDataBlockFromList(
+ pStmt->pTableBlockHashObj, &uid, sizeof(pStmt->pTableMeta->uid), TSDB_DEFAULT_PAYLOAD_SIZE, sizeof(SSubmitBlk),
+ getTableInfo(pStmt->pTableMeta).rowSize, pStmt->pTableMeta, pDataBuf, NULL, &pStmt->createTblReq);
}
char tbFName[TSDB_TABLE_FNAME_LEN];
tNameExtractFullName(&pStmt->targetTableName, tbFName);
@@ -935,11 +1013,12 @@ static int32_t parseBoundColumnsClause(SInsertParseContext* pCxt, SVnodeModifOpS
return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is expected", token.z);
}
// pStmt->pSql -> field1_name, ...)
- return parseBoundColumns(pCxt, &pStmt->pSql, &pDataBuf->boundColumnInfo, getTableColumnSchema(pStmt->pTableMeta));
+ return parseBoundColumns(pCxt, &pStmt->pSql, false, &pDataBuf->boundColumnInfo,
+ getTableColumnSchema(pStmt->pTableMeta));
}
if (NULL != pStmt->pBoundCols) {
- return parseBoundColumns(pCxt, &pStmt->pBoundCols, &pDataBuf->boundColumnInfo,
+ return parseBoundColumns(pCxt, &pStmt->pBoundCols, false, &pDataBuf->boundColumnInfo,
getTableColumnSchema(pStmt->pTableMeta));
}
@@ -1249,7 +1328,7 @@ static int32_t allocateMemIfNeed(STableDataBlocks* pDataBlock, int32_t rowSize,
// do nothing, if allocate more memory failed
pDataBlock->nAllocSize = nAllocSizeOld;
*numOfRows = (int32_t)(pDataBlock->nAllocSize - pDataBlock->headerSize) / rowSize;
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
}
@@ -1512,15 +1591,14 @@ static int32_t checkTableClauseFirstToken(SInsertParseContext* pCxt, SVnodeModif
static int32_t setStmtInfo(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
SParsedDataColInfo* tags = taosMemoryMalloc(sizeof(pCxt->tags));
if (NULL == tags) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
memcpy(tags, &pCxt->tags, sizeof(pCxt->tags));
SStmtCallback* pStmtCb = pCxt->pComCxt->pStmtCb;
- char tbFName[TSDB_TABLE_FNAME_LEN];
- tNameExtractFullName(&pStmt->targetTableName, tbFName);
- int32_t code = (*pStmtCb->setInfoFn)(pStmtCb->pStmt, pStmt->pTableMeta, tags, tbFName, pStmt->usingTableProcessing,
- pStmt->pVgroupsHashObj, pStmt->pTableBlockHashObj, pStmt->usingTableName.tname);
+ int32_t code = (*pStmtCb->setInfoFn)(pStmtCb->pStmt, pStmt->pTableMeta, tags, &pStmt->targetTableName,
+ pStmt->usingTableProcessing, pStmt->pVgroupsHashObj, pStmt->pTableBlockHashObj,
+ pStmt->usingTableName.tname);
memset(&pCxt->tags, 0, sizeof(pCxt->tags));
pStmt->pVgroupsHashObj = NULL;
@@ -1571,16 +1649,16 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt, SVnodeModifOpStmt* pSt
static void destroySubTableHashElem(void* p) { taosMemoryFree(*(STableMeta**)p); }
-static int32_t createVnodeModifOpStmt(SParseContext* pCxt, bool reentry, SNode** pOutput) {
+static int32_t createVnodeModifOpStmt(SInsertParseContext* pCxt, bool reentry, SNode** pOutput) {
SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)nodesMakeNode(QUERY_NODE_VNODE_MODIF_STMT);
if (NULL == pStmt) {
return TSDB_CODE_OUT_OF_MEMORY;
}
- if (pCxt->pStmtCb) {
+ if (pCxt->pComCxt->pStmtCb) {
TSDB_QUERY_SET_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_STMT_INSERT);
}
- pStmt->pSql = pCxt->pSql;
+ pStmt->pSql = pCxt->pComCxt->pSql;
pStmt->freeHashFunc = insDestroyBlockHashmap;
pStmt->freeArrayFunc = insDestroyBlockArrayList;
@@ -1604,7 +1682,7 @@ static int32_t createVnodeModifOpStmt(SParseContext* pCxt, bool reentry, SNode**
return TSDB_CODE_SUCCESS;
}
-static int32_t createInsertQuery(SParseContext* pCxt, SQuery** pOutput) {
+static int32_t createInsertQuery(SInsertParseContext* pCxt, SQuery** pOutput) {
SQuery* pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
if (NULL == pQuery) {
return TSDB_CODE_OUT_OF_MEMORY;
@@ -1667,11 +1745,15 @@ static int32_t getTableVgroupFromMetaData(const SArray* pTables, SVnodeModifOpSt
sizeof(SVgroupInfo));
}
-static int32_t getTableSchemaFromMetaData(const SMetaData* pMetaData, SVnodeModifOpStmt* pStmt, bool isStb) {
+static int32_t getTableSchemaFromMetaData(SInsertParseContext* pCxt, const SMetaData* pMetaData,
+ SVnodeModifOpStmt* pStmt, bool isStb) {
int32_t code = checkAuthFromMetaData(pMetaData->pUser);
if (TSDB_CODE_SUCCESS == code) {
code = getTableMetaFromMetaData(pMetaData->pTableMeta, &pStmt->pTableMeta);
}
+ if (TSDB_CODE_SUCCESS == code && !isStb && TSDB_SUPER_TABLE == pStmt->pTableMeta->tableType) {
+ code = buildInvalidOperationMsg(&pCxt->msg, "insert data into super table is not supported");
+ }
if (TSDB_CODE_SUCCESS == code) {
code = getTableVgroupFromMetaData(pMetaData->pTableHash, pStmt, isStb);
}
@@ -1696,24 +1778,25 @@ static void clearCatalogReq(SCatalogReq* pCatalogReq) {
pCatalogReq->pUser = NULL;
}
-static int32_t setVnodeModifOpStmt(SParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData,
+static int32_t setVnodeModifOpStmt(SInsertParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData,
SVnodeModifOpStmt* pStmt) {
clearCatalogReq(pCatalogReq);
if (pStmt->usingTableProcessing) {
- return getTableSchemaFromMetaData(pMetaData, pStmt, true);
+ return getTableSchemaFromMetaData(pCxt, pMetaData, pStmt, true);
}
- return getTableSchemaFromMetaData(pMetaData, pStmt, false);
+ return getTableSchemaFromMetaData(pCxt, pMetaData, pStmt, false);
}
-static int32_t resetVnodeModifOpStmt(SParseContext* pCxt, SQuery* pQuery) {
+static int32_t resetVnodeModifOpStmt(SInsertParseContext* pCxt, SQuery* pQuery) {
nodesDestroyNode(pQuery->pRoot);
int32_t code = createVnodeModifOpStmt(pCxt, true, &pQuery->pRoot);
if (TSDB_CODE_SUCCESS == code) {
SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pQuery->pRoot;
- (*pCxt->pStmtCb->getExecInfoFn)(pCxt->pStmtCb->pStmt, &pStmt->pVgroupsHashObj, &pStmt->pTableBlockHashObj);
+ (*pCxt->pComCxt->pStmtCb->getExecInfoFn)(pCxt->pComCxt->pStmtCb->pStmt, &pStmt->pVgroupsHashObj,
+ &pStmt->pTableBlockHashObj);
if (NULL == pStmt->pVgroupsHashObj) {
pStmt->pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
}
@@ -1729,13 +1812,13 @@ static int32_t resetVnodeModifOpStmt(SParseContext* pCxt, SQuery* pQuery) {
return code;
}
-static int32_t initInsertQuery(SParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData,
+static int32_t initInsertQuery(SInsertParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData,
SQuery** pQuery) {
if (NULL == *pQuery) {
return createInsertQuery(pCxt, pQuery);
}
- if (NULL != pCxt->pStmtCb) {
+ if (NULL != pCxt->pComCxt->pStmtCb) {
return resetVnodeModifOpStmt(pCxt, *pQuery);
}
@@ -1750,16 +1833,25 @@ static int32_t initInsertQuery(SParseContext* pCxt, SCatalogReq* pCatalogReq, co
static int32_t setRefreshMate(SQuery* pQuery) {
SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pQuery->pRoot;
- SName* pTable = taosHashIterate(pStmt->pTableNameHashObj, NULL);
- while (NULL != pTable) {
- taosArrayPush(pQuery->pTableList, pTable);
- pTable = taosHashIterate(pStmt->pTableNameHashObj, pTable);
+
+ if (taosHashGetSize(pStmt->pTableNameHashObj) > 0) {
+ taosArrayDestroy(pQuery->pTableList);
+ pQuery->pTableList = taosArrayInit(taosHashGetSize(pStmt->pTableNameHashObj), sizeof(SName));
+ SName* pTable = taosHashIterate(pStmt->pTableNameHashObj, NULL);
+ while (NULL != pTable) {
+ taosArrayPush(pQuery->pTableList, pTable);
+ pTable = taosHashIterate(pStmt->pTableNameHashObj, pTable);
+ }
}
- char* pDb = taosHashIterate(pStmt->pDbFNameHashObj, NULL);
- while (NULL != pDb) {
- taosArrayPush(pQuery->pDbList, pDb);
- pDb = taosHashIterate(pStmt->pDbFNameHashObj, pDb);
+ if (taosHashGetSize(pStmt->pDbFNameHashObj) > 0) {
+ taosArrayDestroy(pQuery->pDbList);
+ pQuery->pDbList = taosArrayInit(taosHashGetSize(pStmt->pDbFNameHashObj), TSDB_DB_FNAME_LEN);
+ char* pDb = taosHashIterate(pStmt->pDbFNameHashObj, NULL);
+ while (NULL != pDb) {
+ taosArrayPush(pQuery->pDbList, pDb);
+ pDb = taosHashIterate(pStmt->pDbFNameHashObj, pDb);
+ }
}
return TSDB_CODE_SUCCESS;
@@ -1873,30 +1965,30 @@ static int32_t buildInsertCatalogReq(SInsertParseContext* pCxt, SVnodeModifOpStm
}
static int32_t setNextStageInfo(SInsertParseContext* pCxt, SQuery* pQuery, SCatalogReq* pCatalogReq) {
+ SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pQuery->pRoot;
if (pCxt->missCache) {
- parserDebug("0x%" PRIx64 " %d rows have been inserted before cache miss", pCxt->pComCxt->requestId,
- ((SVnodeModifOpStmt*)pQuery->pRoot)->totalRowsNum);
+ parserDebug("0x%" PRIx64 " %d rows of %d tables have been inserted before cache miss", pCxt->pComCxt->requestId,
+ pStmt->totalRowsNum, pStmt->totalTbNum);
pQuery->execStage = QUERY_EXEC_STAGE_PARSE;
- return buildInsertCatalogReq(pCxt, (SVnodeModifOpStmt*)pQuery->pRoot, pCatalogReq);
+ return buildInsertCatalogReq(pCxt, pStmt, pCatalogReq);
}
- parserDebug("0x%" PRIx64 " %d rows have been inserted", pCxt->pComCxt->requestId,
- ((SVnodeModifOpStmt*)pQuery->pRoot)->totalRowsNum);
+ parserDebug("0x%" PRIx64 " %d rows of %d tables have been inserted", pCxt->pComCxt->requestId, pStmt->totalRowsNum,
+ pStmt->totalTbNum);
pQuery->execStage = QUERY_EXEC_STAGE_SCHEDULE;
return TSDB_CODE_SUCCESS;
}
int32_t parseInsertSql(SParseContext* pCxt, SQuery** pQuery, SCatalogReq* pCatalogReq, const SMetaData* pMetaData) {
- SInsertParseContext context = {
- .pComCxt = pCxt,
- .msg = {.buf = pCxt->pMsg, .len = pCxt->msgLen},
- .missCache = false,
- .usingDuplicateTable = false,
- };
-
- int32_t code = initInsertQuery(pCxt, pCatalogReq, pMetaData, pQuery);
+ SInsertParseContext context = {.pComCxt = pCxt,
+ .msg = {.buf = pCxt->pMsg, .len = pCxt->msgLen},
+ .missCache = false,
+ .usingDuplicateTable = false,
+ .forceUpdate = (NULL != pCatalogReq ? pCatalogReq->forceUpdate : false)};
+
+ int32_t code = initInsertQuery(&context, pCatalogReq, pMetaData, pQuery);
if (TSDB_CODE_SUCCESS == code) {
code = parseInsertSqlImpl(&context, (SVnodeModifOpStmt*)(*pQuery)->pRoot);
}
diff --git a/source/libs/parser/src/parInsertStmt.c b/source/libs/parser/src/parInsertStmt.c
index 9a5f349d8fe1f9da5bd2290832b3d5ab61cb7688..4ed72e6c14622872d2535f17ec0f407135594392 100644
--- a/source/libs/parser/src/parInsertStmt.c
+++ b/source/libs/parser/src/parInsertStmt.c
@@ -47,9 +47,10 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const ch
TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen) {
STableDataBlocks* pDataBlock = (STableDataBlocks*)pBlock;
SMsgBuf pBuf = {.buf = msgBuf, .len = msgBufLen};
+ int32_t code = TSDB_CODE_SUCCESS;
SParsedDataColInfo* tags = (SParsedDataColInfo*)boundTags;
if (NULL == tags) {
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
SArray* pTagArray = taosArrayInit(tags->numOfBound, sizeof(STagVal));
@@ -59,10 +60,10 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const ch
SArray* tagName = taosArrayInit(8, TSDB_COL_NAME_LEN);
if (!tagName) {
- return buildInvalidOperationMsg(&pBuf, "out of memory");
+ code = buildInvalidOperationMsg(&pBuf, "out of memory");
+ goto end;
}
- int32_t code = TSDB_CODE_SUCCESS;
SSchema* pSchema = getTableTagSchema(pDataBlock->pTableMeta);
bool isJson = false;
@@ -77,6 +78,10 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const ch
int32_t colLen = pTagSchema->bytes;
if (IS_VAR_DATA_TYPE(pTagSchema->type)) {
colLen = bind[c].length[0];
+ if ((colLen + VARSTR_HEADER_SIZE) > pTagSchema->bytes) {
+ code = buildInvalidOperationMsg(&pBuf, "tag length is too big");
+ goto end;
+ }
}
taosArrayPush(tagName, pTagSchema->name);
if (pTagSchema->type == TSDB_DATA_TYPE_JSON) {
@@ -132,7 +137,7 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const ch
}
SVCreateTbReq tbReq = {0};
- insBuildCreateTbReq(&tbReq, tName, pTag, suid, sTableName, tagName, pDataBlock->pTableMeta->tableInfo.numOfTags);
+ insBuildCreateTbReq(&tbReq, tName, pTag, suid, sTableName, tagName, pDataBlock->pTableMeta->tableInfo.numOfTags, TSDB_DEFAULT_TABLE_TTL);
code = insBuildCreateTbMsg(pDataBlock, &tbReq);
tdDestroySVCreateTbReq(&tbReq);
@@ -334,7 +339,7 @@ int32_t qBuildStmtTagFields(void* pBlock, void* boundTags, int32_t* fieldNum, TA
STableDataBlocks* pDataBlock = (STableDataBlocks*)pBlock;
SParsedDataColInfo* tags = (SParsedDataColInfo*)boundTags;
if (NULL == tags) {
- return TSDB_CODE_QRY_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
if (pDataBlock->pTableMeta->tableType != TSDB_SUPER_TABLE && pDataBlock->pTableMeta->tableType != TSDB_CHILD_TABLE) {
diff --git a/source/libs/parser/src/parInsertUtil.c b/source/libs/parser/src/parInsertUtil.c
index bc09163753d91e883d4e0f176bb97733cfca2c33..73cedfeb3d4109622062477214cd148bdd441391 100644
--- a/source/libs/parser/src/parInsertUtil.c
+++ b/source/libs/parser/src/parInsertUtil.c
@@ -139,8 +139,8 @@ void insSetBoundColumnInfo(SParsedDataColInfo* pColList, SSchema* pSchema, col_i
if (i > 0) {
pColList->cols[i].offset = pColList->cols[i - 1].offset + pSchema[i - 1].bytes;
pColList->cols[i].toffset = pColList->flen;
+ pColList->flen += TYPE_BYTES[type];
}
- pColList->flen += TYPE_BYTES[type];
switch (type) {
case TSDB_DATA_TYPE_BINARY:
pColList->allNullLen += (VARSTR_HEADER_SIZE + CHAR_BYTES);
@@ -198,7 +198,7 @@ static int32_t createDataBlock(size_t defaultSize, int32_t rowSize, int32_t star
STableDataBlocks** dataBlocks) {
STableDataBlocks* dataBuf = (STableDataBlocks*)taosMemoryCalloc(1, sizeof(STableDataBlocks));
if (dataBuf == NULL) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
dataBuf->nAllocSize = (uint32_t)defaultSize;
@@ -212,7 +212,7 @@ static int32_t createDataBlock(size_t defaultSize, int32_t rowSize, int32_t star
dataBuf->pData = taosMemoryMalloc(dataBuf->nAllocSize);
if (dataBuf->pData == NULL) {
taosMemoryFreeClear(dataBuf);
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
memset(dataBuf->pData, 0, sizeof(SSubmitBlk));
@@ -249,7 +249,7 @@ int32_t insBuildCreateTbMsg(STableDataBlocks* pBlocks, SVCreateTbReq* pCreateTbR
memset(pBlocks->pData + pBlocks->size, 0, pBlocks->nAllocSize - pBlocks->size);
} else {
pBlocks->nAllocSize -= len + pBlocks->rowSize;
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
}
@@ -350,7 +350,7 @@ static int sortRemoveDataBlockDupRows(STableDataBlocks* dataBuf, SBlockKeyInfo*
if (pBlkKeyInfo->pKeyTuple == NULL || pBlkKeyInfo->maxBytesAlloc < nAlloc) {
char* tmp = taosMemoryRealloc(pBlkKeyInfo->pKeyTuple, nAlloc);
if (tmp == NULL) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
pBlkKeyInfo->pKeyTuple = (SBlockKeyTuple*)tmp;
pBlkKeyInfo->maxBytesAlloc = (int32_t)nAlloc;
@@ -518,7 +518,7 @@ static int sortMergeDataBlockDupRows(STableDataBlocks* dataBuf, SBlockKeyInfo* p
if (pBlkKeyInfo->pKeyTuple == NULL || pBlkKeyInfo->maxBytesAlloc < nAlloc) {
char* tmp = taosMemoryRealloc(pBlkKeyInfo->pKeyTuple, nAlloc);
if (tmp == NULL) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
pBlkKeyInfo->pKeyTuple = (SBlockKeyTuple*)tmp;
pBlkKeyInfo->maxBytesAlloc = (int32_t)nAlloc;
@@ -668,7 +668,7 @@ int32_t insMergeTableDataBlocks(SHashObj* pHashObj, SArray** pVgDataBlocks) {
insDestroyBlockArrayList(pVnodeDataBlockList);
taosMemoryFreeClear(dataBuf->pData);
taosMemoryFreeClear(blkKeyInfo.pKeyTuple);
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
}
@@ -721,7 +721,7 @@ int32_t insAllocateMemForSize(STableDataBlocks* pDataBlock, int32_t allSize) {
} else {
// do nothing, if allocate more memory failed
pDataBlock->nAllocSize = nAllocSizeOld;
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
}
@@ -850,15 +850,15 @@ int32_t insFindCol(SToken* pColname, int32_t start, int32_t end, SSchema* pSchem
}
void insBuildCreateTbReq(SVCreateTbReq* pTbReq, const char* tname, STag* pTag, int64_t suid, const char* sname,
- SArray* tagName, uint8_t tagNum) {
+ SArray* tagName, uint8_t tagNum, int32_t ttl) {
pTbReq->type = TD_CHILD_TABLE;
pTbReq->name = strdup(tname);
pTbReq->ctb.suid = suid;
pTbReq->ctb.tagNum = tagNum;
if (sname) pTbReq->ctb.stbName = strdup(sname);
pTbReq->ctb.pTag = (uint8_t*)pTag;
- pTbReq->ctb.tagName = taosArrayDup(tagName);
- pTbReq->ttl = TSDB_DEFAULT_TABLE_TTL;
+ pTbReq->ctb.tagName = taosArrayDup(tagName, NULL);
+ pTbReq->ttl = ttl;
pTbReq->commentLen = -1;
return;
@@ -938,13 +938,13 @@ int32_t insBuildOutput(SHashObj* pVgroupsHashObj, SArray* pVgDataBlocks, SArray*
size_t numOfVg = taosArrayGetSize(pVgDataBlocks);
*pDataBlocks = taosArrayInit(numOfVg, POINTER_BYTES);
if (NULL == *pDataBlocks) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
for (size_t i = 0; i < numOfVg; ++i) {
STableDataBlocks* src = taosArrayGetP(pVgDataBlocks, i);
SVgDataBlocks* dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
if (NULL == dst) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ return TSDB_CODE_OUT_OF_MEMORY;
}
taosHashGetDup(pVgroupsHashObj, (const char*)&src->vgId, sizeof(src->vgId), &dst->vg);
dst->numOfTables = src->numOfTables;
diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c
index 88a1d39ff25aa554a78346fb363dd19d2180d82e..e62b2f0f5ab2db843d41009bb21e68a60f19cd67 100644
--- a/source/libs/parser/src/parTokenizer.c
+++ b/source/libs/parser/src/parTokenizer.c
@@ -74,6 +74,7 @@ static SKeyword keywordTable[] = {
{"DATABASES", TK_DATABASES},
{"DBS", TK_DBS},
{"DELETE", TK_DELETE},
+ {"DELETE_MARK", TK_DELETE_MARK},
{"DESC", TK_DESC},
{"DESCRIBE", TK_DESCRIBE},
{"DISTINCT", TK_DISTINCT},
@@ -161,6 +162,7 @@ static SKeyword keywordTable[] = {
{"PPS", TK_PPS},
{"PRECISION", TK_PRECISION},
{"PREV", TK_PREV},
+ {"PRIVILEGES", TK_PRIVILEGES},
{"QNODE", TK_QNODE},
{"QNODES", TK_QNODES},
{"QTIME", TK_QTIME},
@@ -202,6 +204,7 @@ static SKeyword keywordTable[] = {
{"STREAM", TK_STREAM},
{"STREAMS", TK_STREAMS},
{"STRICT", TK_STRICT},
+ {"SUBSCRIBE", TK_SUBSCRIBE},
{"SUBSCRIPTIONS", TK_SUBSCRIPTIONS},
{"SUBTABLE", TK_SUBTABLE},
{"SYSINFO", TK_SYSINFO},
diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c
index 54f450e9712b3e273ee9ec008d19ab4f0d590a24..10e45901e5dc53acc2edeef4fb5d661980fcf69c 100644
--- a/source/libs/parser/src/parTranslater.c
+++ b/source/libs/parser/src/parTranslater.c
@@ -47,6 +47,7 @@ typedef struct STranslateContext {
SParseMetaCache* pMetaCache;
bool createStream;
bool stableQuery;
+ bool showRewrite;
} STranslateContext;
typedef struct SFullDatabaseName {
@@ -251,6 +252,12 @@ static const SSysTableShowAdapter sysTableShowAdapter[] = {
.numOfShowCols = 1,
.pShowCols = {"*"}
},
+ { .showType = QUERY_NODE_SHOW_USER_PRIVILEGES_STMT,
+ .pDbName = TSDB_INFORMATION_SCHEMA_DB,
+ .pTableName = TSDB_INS_TABLE_USER_PRIVILEGES,
+ .numOfShowCols = 1,
+ .pShowCols = {"*"}
+ },
};
// clang-format on
@@ -744,8 +751,8 @@ static bool isPrimaryKeyImpl(SNode* pExpr) {
return (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pExpr)->colId);
} else if (QUERY_NODE_FUNCTION == nodeType(pExpr)) {
SFunctionNode* pFunc = (SFunctionNode*)pExpr;
- if (FUNCTION_TYPE_SELECT_VALUE == pFunc->funcType || FUNCTION_TYPE_FIRST == pFunc->funcType ||
- FUNCTION_TYPE_LAST == pFunc->funcType) {
+ if (FUNCTION_TYPE_SELECT_VALUE == pFunc->funcType || FUNCTION_TYPE_GROUP_KEY == pFunc->funcType ||
+ FUNCTION_TYPE_FIRST == pFunc->funcType || FUNCTION_TYPE_LAST == pFunc->funcType) {
return isPrimaryKeyImpl(nodesListGetNode(pFunc->pParameterList, 0));
} else if (FUNCTION_TYPE_WSTART == pFunc->funcType || FUNCTION_TYPE_WEND == pFunc->funcType) {
return true;
@@ -2203,22 +2210,28 @@ static int32_t dnodeToVgroupsInfo(SArray* pDnodes, SVgroupsInfo** pVgsInfo) {
}
static bool sysTableFromVnode(const char* pTable) {
- return (0 == strcmp(pTable, TSDB_INS_TABLE_TABLES)) ||
- (0 == strcmp(pTable, TSDB_INS_TABLE_TABLE_DISTRIBUTED) || (0 == strcmp(pTable, TSDB_INS_TABLE_TAGS)));
+ return ((0 == strcmp(pTable, TSDB_INS_TABLE_TABLES)) || (0 == strcmp(pTable, TSDB_INS_TABLE_TAGS)));
}
static bool sysTableFromDnode(const char* pTable) { return 0 == strcmp(pTable, TSDB_INS_TABLE_DNODE_VARIABLES); }
-static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTargetName, SName* pName,
- SArray** pVgroupList) {
+static int32_t getVnodeSysTableVgroupListImpl(STranslateContext* pCxt, SName* pTargetName, SName* pName,
+ SArray** pVgroupList) {
if (0 == pTargetName->type) {
return getDBVgInfoImpl(pCxt, pName, pVgroupList);
}
+ if (0 == strcmp(pTargetName->dbname, TSDB_INFORMATION_SCHEMA_DB) ||
+ 0 == strcmp(pTargetName->dbname, TSDB_PERFORMANCE_SCHEMA_DB)) {
+ pTargetName->type = 0;
+ return TSDB_CODE_SUCCESS;
+ }
+
if (TSDB_DB_NAME_T == pTargetName->type) {
int32_t code = getDBVgInfoImpl(pCxt, pTargetName, pVgroupList);
- if (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
- TSDB_CODE_MND_DB_IN_DROPPING == code) {
+ if (!pCxt->showRewrite && (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
+ TSDB_CODE_MND_DB_IN_DROPPING == code)) {
+ // system table query should not report errors
code = TSDB_CODE_SUCCESS;
}
return code;
@@ -2235,50 +2248,44 @@ static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTarge
}
} else if (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
TSDB_CODE_MND_DB_IN_DROPPING == code) {
+ // system table query should not report errors
code = TSDB_CODE_SUCCESS;
}
return code;
}
-static int32_t getTagsTableVgroupList(STranslateContext* pCxt, SName* pName, SArray** pVgroupList) {
+static int32_t getVnodeSysTableVgroupList(STranslateContext* pCxt, SName* pName, SArray** pVgs, bool* pHasUserDbCond) {
if (!isSelectStmt(pCxt->pCurrStmt)) {
return TSDB_CODE_SUCCESS;
}
SSelectStmt* pSelect = (SSelectStmt*)pCxt->pCurrStmt;
SName targetName = {0};
- int32_t code = getInsTagsTableTargetName(pCxt->pParseCxt->acctId, pSelect->pWhere, &targetName);
+ int32_t code = getVnodeSysTableTargetName(pCxt->pParseCxt->acctId, pSelect->pWhere, &targetName);
if (TSDB_CODE_SUCCESS == code) {
- code = getTagsTableVgroupListImpl(pCxt, &targetName, pName, pVgroupList);
+ code = getVnodeSysTableVgroupListImpl(pCxt, &targetName, pName, pVgs);
}
+ *pHasUserDbCond = (0 != targetName.type && taosArrayGetSize(*pVgs) > 0);
return code;
}
static int32_t setVnodeSysTableVgroupList(STranslateContext* pCxt, SName* pName, SRealTableNode* pRealTable) {
- int32_t code = TSDB_CODE_SUCCESS;
- SArray* vgroupList = NULL;
- if (0 == strcmp(pRealTable->table.tableName, TSDB_INS_TABLE_TAGS)) {
- code = getTagsTableVgroupList(pCxt, pName, &vgroupList);
- } else if ('\0' != pRealTable->qualDbName[0]) {
- if (0 != strcmp(pRealTable->qualDbName, TSDB_INFORMATION_SCHEMA_DB)) {
- code = getDBVgInfo(pCxt, pRealTable->qualDbName, &vgroupList);
- }
- } else {
- code = getDBVgInfoImpl(pCxt, pName, &vgroupList);
- }
+ bool hasUserDbCond = false;
+ SArray* pVgs = NULL;
+ int32_t code = getVnodeSysTableVgroupList(pCxt, pName, &pVgs, &hasUserDbCond);
if (TSDB_CODE_SUCCESS == code && 0 == strcmp(pRealTable->table.tableName, TSDB_INS_TABLE_TAGS) &&
- isSelectStmt(pCxt->pCurrStmt) && 0 == taosArrayGetSize(vgroupList)) {
+ isSelectStmt(pCxt->pCurrStmt) && 0 == taosArrayGetSize(pVgs)) {
((SSelectStmt*)pCxt->pCurrStmt)->isEmptyResult = true;
}
- if (TSDB_CODE_SUCCESS == code && 0 == strcmp(pRealTable->table.tableName, TSDB_INS_TABLE_TABLES)) {
- code = addMnodeToVgroupList(&pCxt->pParseCxt->mgmtEpSet, &vgroupList);
+ if (TSDB_CODE_SUCCESS == code && 0 == strcmp(pRealTable->table.tableName, TSDB_INS_TABLE_TABLES) && !hasUserDbCond) {
+ code = addMnodeToVgroupList(&pCxt->pParseCxt->mgmtEpSet, &pVgs);
}
if (TSDB_CODE_SUCCESS == code) {
- code = toVgroupsInfo(vgroupList, &pRealTable->pVgroupList);
+ code = toVgroupsInfo(pVgs, &pRealTable->pVgroupList);
}
- taosArrayDestroy(vgroupList);
+ taosArrayDestroy(pVgs);
return code;
}
@@ -2303,30 +2310,39 @@ static int32_t setSysTableVgroupList(STranslateContext* pCxt, SName* pName, SRea
}
}
+static int32_t setSuperTableVgroupList(STranslateContext* pCxt, SName* pName, SRealTableNode* pRealTable) {
+ SArray* vgroupList = NULL;
+ int32_t code = getDBVgInfoImpl(pCxt, pName, &vgroupList);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = toVgroupsInfo(vgroupList, &pRealTable->pVgroupList);
+ }
+ taosArrayDestroy(vgroupList);
+ return code;
+}
+
+static int32_t setNormalTableVgroupList(STranslateContext* pCxt, SName* pName, SRealTableNode* pRealTable) {
+ pRealTable->pVgroupList = taosMemoryCalloc(1, sizeof(SVgroupsInfo) + sizeof(SVgroupInfo));
+ if (NULL == pRealTable->pVgroupList) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+ pRealTable->pVgroupList->numOfVgroups = 1;
+ return getTableHashVgroupImpl(pCxt, pName, pRealTable->pVgroupList->vgroups);
+}
+
static int32_t setTableVgroupList(STranslateContext* pCxt, SName* pName, SRealTableNode* pRealTable) {
if (pCxt->pParseCxt->topicQuery) {
return TSDB_CODE_SUCCESS;
}
- int32_t code = TSDB_CODE_SUCCESS;
if (TSDB_SUPER_TABLE == pRealTable->pMeta->tableType) {
- SArray* vgroupList = NULL;
- code = getDBVgInfoImpl(pCxt, pName, &vgroupList);
- if (TSDB_CODE_SUCCESS == code) {
- code = toVgroupsInfo(vgroupList, &pRealTable->pVgroupList);
- }
- taosArrayDestroy(vgroupList);
- } else if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType) {
- code = setSysTableVgroupList(pCxt, pName, pRealTable);
- } else {
- pRealTable->pVgroupList = taosMemoryCalloc(1, sizeof(SVgroupsInfo) + sizeof(SVgroupInfo));
- if (NULL == pRealTable->pVgroupList) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- pRealTable->pVgroupList->numOfVgroups = 1;
- code = getTableHashVgroupImpl(pCxt, pName, pRealTable->pVgroupList->vgroups);
+ return setSuperTableVgroupList(pCxt, pName, pRealTable);
}
- return code;
+
+ if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType) {
+ return setSysTableVgroupList(pCxt, pName, pRealTable);
+ }
+
+ return setNormalTableVgroupList(pCxt, pName, pRealTable);
}
static uint8_t getStmtPrecision(SNode* pStmt) {
@@ -2360,7 +2376,6 @@ static bool isSingleTable(SRealTableNode* pRealTable) {
int8_t tableType = pRealTable->pMeta->tableType;
if (TSDB_SYSTEM_TABLE == tableType) {
return 0 != strcmp(pRealTable->table.tableName, TSDB_INS_TABLE_TABLES) &&
- 0 != strcmp(pRealTable->table.tableName, TSDB_INS_TABLE_TABLE_DISTRIBUTED) &&
0 != strcmp(pRealTable->table.tableName, TSDB_INS_TABLE_TAGS);
}
return (TSDB_CHILD_TABLE == tableType || TSDB_NORMAL_TABLE == tableType);
@@ -3685,9 +3700,19 @@ static int32_t translateInsertProject(STranslateContext* pCxt, SInsertStmt* pIns
return addOrderByPrimaryKeyToQuery(pCxt, pPrimaryKeyExpr, pInsert->pQuery);
}
+static int32_t translateInsertTable(STranslateContext* pCxt, SNode* pTable) {
+ int32_t code = translateFrom(pCxt, pTable);
+ if (TSDB_CODE_SUCCESS == code && TSDB_CHILD_TABLE != ((SRealTableNode*)pTable)->pMeta->tableType &&
+ TSDB_NORMAL_TABLE != ((SRealTableNode*)pTable)->pMeta->tableType) {
+ code = generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR,
+ "insert data into super table is not supported");
+ }
+ return code;
+}
+
static int32_t translateInsert(STranslateContext* pCxt, SInsertStmt* pInsert) {
pCxt->pCurrStmt = (SNode*)pInsert;
- int32_t code = translateFrom(pCxt, pInsert->pTable);
+ int32_t code = translateInsertTable(pCxt, pInsert->pTable);
if (TSDB_CODE_SUCCESS == code) {
code = translateInsertCols(pCxt, pInsert);
}
@@ -3779,10 +3804,11 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS
return buildCreateDbRetentions(pStmt->pOptions->pRetentions, pReq);
}
-static int32_t checkRangeOption(STranslateContext* pCxt, int32_t code, const char* pName, int32_t val, int32_t minVal,
- int32_t maxVal) {
+static int32_t checkRangeOption(STranslateContext* pCxt, int32_t code, const char* pName, int64_t val, int64_t minVal,
+ int64_t maxVal) {
if (val >= 0 && (val < minVal || val > maxVal)) {
- return generateSyntaxErrMsgExt(&pCxt->msgBuf, code, "Invalid option %s: %d valid range: [%d, %d]", pName, val,
+ return generateSyntaxErrMsgExt(&pCxt->msgBuf, code,
+ "Invalid option %s: %" PRId64 " valid range: [%" PRId64 ", %" PRId64 "]", pName, val,
minVal, maxVal);
}
return TSDB_CODE_SUCCESS;
@@ -3793,8 +3819,8 @@ static int32_t checkDbRangeOption(STranslateContext* pCxt, const char* pName, in
return checkRangeOption(pCxt, TSDB_CODE_PAR_INVALID_DB_OPTION, pName, val, minVal, maxVal);
}
-static int32_t checkTableRangeOption(STranslateContext* pCxt, const char* pName, int32_t val, int32_t minVal,
- int32_t maxVal) {
+static int32_t checkTableRangeOption(STranslateContext* pCxt, const char* pName, int64_t val, int64_t minVal,
+ int64_t maxVal) {
return checkRangeOption(pCxt, TSDB_CODE_PAR_INVALID_TABLE_OPTION, pName, val, minVal, maxVal);
}
@@ -3853,12 +3879,17 @@ static int32_t checkDbKeepOption(STranslateContext* pCxt, SDatabaseOptions* pOpt
pOptions->keep[2] = getBigintFromValueNode((SValueNode*)nodesListGetNode(pOptions->pKeep, 2));
}
+ int64_t tsdbMaxKeep = TSDB_MAX_KEEP;
+ if (pOptions->precision == TSDB_TIME_PRECISION_NANO) {
+ tsdbMaxKeep = TSDB_MAX_KEEP_NS;
+ }
+
if (pOptions->keep[0] < TSDB_MIN_KEEP || pOptions->keep[1] < TSDB_MIN_KEEP || pOptions->keep[2] < TSDB_MIN_KEEP ||
- pOptions->keep[0] > TSDB_MAX_KEEP || pOptions->keep[1] > TSDB_MAX_KEEP || pOptions->keep[2] > TSDB_MAX_KEEP) {
+ pOptions->keep[0] > tsdbMaxKeep || pOptions->keep[1] > tsdbMaxKeep || pOptions->keep[2] > tsdbMaxKeep) {
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION,
"Invalid option keep: %" PRId64 ", %" PRId64 ", %" PRId64 " valid range: [%dm, %dm]",
pOptions->keep[0], pOptions->keep[1], pOptions->keep[2], TSDB_MIN_KEEP,
- TSDB_MAX_KEEP);
+ tsdbMaxKeep);
}
if (!((pOptions->keep[0] <= pOptions->keep[1]) && (pOptions->keep[1] <= pOptions->keep[2]))) {
@@ -4010,7 +4041,10 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName
TSDB_MAX_MINROWS_FBLOCK);
}
if (TSDB_CODE_SUCCESS == code) {
- code = checkDbKeepOption(pCxt, pOptions);
+ code = checkDbPrecisionOption(pCxt, pOptions);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = checkDbKeepOption(pCxt, pOptions); // use precision
}
if (TSDB_CODE_SUCCESS == code) {
code = checkDbRangeOption(pCxt, "pages", pOptions->pages, TSDB_MIN_PAGES_PER_VNODE, TSDB_MAX_PAGES_PER_VNODE);
@@ -4023,9 +4057,6 @@ static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName
code = checkDbRangeOption(pCxt, "tsdbPagesize", pOptions->tsdbPageSize, TSDB_MIN_TSDB_PAGESIZE,
TSDB_MAX_TSDB_PAGESIZE);
}
- if (TSDB_CODE_SUCCESS == code) {
- code = checkDbPrecisionOption(pCxt, pOptions);
- }
if (TSDB_CODE_SUCCESS == code) {
code = checkDbEnumOption(pCxt, "replications", pOptions->replica, TSDB_MIN_DB_REPLICA, TSDB_MAX_DB_REPLICA);
}
@@ -4438,6 +4469,37 @@ static int32_t checkTableWatermarkOption(STranslateContext* pCxt, STableOptions*
return code;
}
+static int32_t getTableDeleteMarkOption(STranslateContext* pCxt, SValueNode* pVal, int64_t* pMaxDelay) {
+ return getTableDelayOrWatermarkOption(pCxt, "delete_mark", TSDB_MIN_ROLLUP_DELETE_MARK, TSDB_MAX_ROLLUP_DELETE_MARK,
+ pVal, pMaxDelay);
+}
+
+static int32_t checkTableDeleteMarkOption(STranslateContext* pCxt, STableOptions* pOptions, bool createStable,
+ SDbCfgInfo* pDbCfg) {
+ if (NULL == pOptions->pDeleteMark) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ if (!createStable || NULL == pDbCfg->pRetensions) {
+ return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TABLE_OPTION,
+ "Invalid option delete_mark: Only supported for create super table in databases "
+ "configured with the 'RETENTIONS' option");
+ }
+
+ if (LIST_LENGTH(pOptions->pDeleteMark) > 2) {
+ return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TABLE_OPTION, "Invalid option delete_mark");
+ }
+
+ int32_t code =
+ getTableDeleteMarkOption(pCxt, (SValueNode*)nodesListGetNode(pOptions->pDeleteMark, 0), &pOptions->deleteMark1);
+ if (TSDB_CODE_SUCCESS == code && 2 == LIST_LENGTH(pOptions->pDeleteMark)) {
+ code =
+ getTableDeleteMarkOption(pCxt, (SValueNode*)nodesListGetNode(pOptions->pDeleteMark, 1), &pOptions->deleteMark2);
+ }
+
+ return code;
+}
+
static int32_t checkCreateTable(STranslateContext* pCxt, SCreateTableStmt* pStmt, bool createStable) {
if (NULL != strchr(pStmt->tableName, '.')) {
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME,
@@ -4457,6 +4519,9 @@ static int32_t checkCreateTable(STranslateContext* pCxt, SCreateTableStmt* pStmt
if (TSDB_CODE_SUCCESS == code) {
code = checkTableWatermarkOption(pCxt, pStmt->pOptions, createStable, &dbCfg);
}
+ if (TSDB_CODE_SUCCESS == code) {
+ code = checkTableDeleteMarkOption(pCxt, pStmt->pOptions, createStable, &dbCfg);
+ }
if (TSDB_CODE_SUCCESS == code) {
code = checkTableRollupOption(pCxt, pStmt->pOptions->pRollupFuncs, createStable, &dbCfg);
}
@@ -4724,6 +4789,8 @@ static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStm
pReq->delay2 = pStmt->pOptions->maxDelay2;
pReq->watermark1 = pStmt->pOptions->watermark1;
pReq->watermark2 = pStmt->pOptions->watermark2;
+ pReq->deleteMark1 = pStmt->pOptions->deleteMark1;
+ pReq->deleteMark2 = pStmt->pOptions->deleteMark2;
pReq->colVer = 1;
pReq->tagVer = 1;
pReq->source = TD_REQ_FROM_APP;
@@ -5021,7 +5088,7 @@ static int32_t translateAlterUser(STranslateContext* pCxt, SAlterUserStmt* pStmt
alterReq.sysInfo = pStmt->sysinfo;
snprintf(alterReq.pass, sizeof(alterReq.pass), "%s", pStmt->password);
if (NULL != pCxt->pParseCxt->db) {
- snprintf(alterReq.dbname, sizeof(alterReq.dbname), "%s", pCxt->pParseCxt->db);
+ snprintf(alterReq.objname, sizeof(alterReq.objname), "%s", pCxt->pParseCxt->db);
}
return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &alterReq);
@@ -5119,20 +5186,34 @@ static int32_t buildCreateSmaReq(STranslateContext* pCxt, SCreateIndexStmt* pStm
(NULL != pStmt->pOptions->pSliding ? ((SValueNode*)pStmt->pOptions->pSliding)->datum.i : pReq->interval);
pReq->slidingUnit =
(NULL != pStmt->pOptions->pSliding ? ((SValueNode*)pStmt->pOptions->pSliding)->unit : pReq->intervalUnit);
+
+ int32_t code = TSDB_CODE_SUCCESS;
if (NULL != pStmt->pOptions->pStreamOptions) {
SStreamOptions* pStreamOpt = (SStreamOptions*)pStmt->pOptions->pStreamOptions;
- pReq->maxDelay = (NULL != pStreamOpt->pDelay ? ((SValueNode*)pStreamOpt->pDelay)->datum.i : -1);
- pReq->watermark = (NULL != pStreamOpt->pWatermark ? ((SValueNode*)pStreamOpt->pWatermark)->datum.i
- : TSDB_DEFAULT_ROLLUP_WATERMARK);
- if (pReq->watermark < TSDB_MIN_ROLLUP_WATERMARK) {
- pReq->watermark = TSDB_MIN_ROLLUP_WATERMARK;
+ if (NULL != pStreamOpt->pDelay) {
+ code = getTableMaxDelayOption(pCxt, (SValueNode*)pStreamOpt->pDelay, &pReq->maxDelay);
+ } else {
+ pReq->maxDelay = -1;
}
- if (pReq->watermark > TSDB_MAX_ROLLUP_WATERMARK) {
- pReq->watermark = TSDB_MAX_ROLLUP_WATERMARK;
+ if (TSDB_CODE_SUCCESS == code) {
+ if (NULL != pStreamOpt->pWatermark) {
+ code = getTableWatermarkOption(pCxt, (SValueNode*)pStreamOpt->pWatermark, &pReq->watermark);
+ } else {
+ pReq->watermark = TSDB_DEFAULT_ROLLUP_WATERMARK;
+ }
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ if (NULL != pStreamOpt->pDeleteMark) {
+ code = getTableDeleteMarkOption(pCxt, (SValueNode*)pStreamOpt->pDeleteMark, &pReq->deleteMark);
+ } else {
+ pReq->deleteMark = TSDB_DEFAULT_ROLLUP_DELETE_MARK;
+ }
}
}
- int32_t code = getSmaIndexDstVgId(pCxt, pStmt->dbName, pStmt->tableName, &pReq->dstVgId);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = getSmaIndexDstVgId(pCxt, pStmt->dbName, pStmt->tableName, &pReq->dstVgId);
+ }
if (TSDB_CODE_SUCCESS == code) {
code = getSmaIndexSql(pCxt, &pReq->sql, &pReq->sqlLen);
}
@@ -5160,16 +5241,6 @@ static int32_t checkCreateSmaIndex(STranslateContext* pCxt, SCreateIndexStmt* pS
code = doTranslateValue(pCxt, (SValueNode*)pStmt->pOptions->pSliding);
}
- if (TSDB_CODE_SUCCESS == code && NULL != pStmt->pOptions->pStreamOptions) {
- SStreamOptions* pStreamOpt = (SStreamOptions*)pStmt->pOptions->pStreamOptions;
- if (NULL != pStreamOpt->pWatermark) {
- code = doTranslateValue(pCxt, (SValueNode*)pStreamOpt->pWatermark);
- }
- if (TSDB_CODE_SUCCESS == code && NULL != pStreamOpt->pDelay) {
- code = doTranslateValue(pCxt, (SValueNode*)pStreamOpt->pDelay);
- }
- }
-
return code;
}
@@ -5657,7 +5728,7 @@ static int32_t readFromFile(char* pName, int32_t* len, char** buf) {
if (s != *len) {
taosCloseFile(&tfile);
taosMemoryFreeClear(*buf);
- return TSDB_CODE_TSC_APP_ERROR;
+ return TSDB_CODE_APP_ERROR;
}
taosCloseFile(&tfile);
return TSDB_CODE_SUCCESS;
@@ -5700,9 +5771,11 @@ static int32_t translateGrant(STranslateContext* pCxt, SGrantStmt* pStmt) {
req.alterType = TSDB_ALTER_USER_ADD_READ_DB;
} else if (PRIVILEGE_TYPE_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE)) {
req.alterType = TSDB_ALTER_USER_ADD_WRITE_DB;
+ } else if (PRIVILEGE_TYPE_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_SUBSCRIBE)) {
+ req.alterType = TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC;
}
strcpy(req.user, pStmt->userName);
- sprintf(req.dbname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->dbName);
+ sprintf(req.objname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->objName);
return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req);
}
@@ -5716,9 +5789,11 @@ static int32_t translateRevoke(STranslateContext* pCxt, SRevokeStmt* pStmt) {
req.alterType = TSDB_ALTER_USER_REMOVE_READ_DB;
} else if (PRIVILEGE_TYPE_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_WRITE)) {
req.alterType = TSDB_ALTER_USER_REMOVE_WRITE_DB;
+ } else if (PRIVILEGE_TYPE_TEST_MASK(pStmt->privileges, PRIVILEGE_TYPE_SUBSCRIBE)) {
+ req.alterType = TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC;
}
strcpy(req.user, pStmt->userName);
- sprintf(req.dbname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->dbName);
+ sprintf(req.objname, "%d.%s", pCxt->pParseCxt->acctId, pStmt->objName);
return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req);
}
@@ -6276,6 +6351,7 @@ static int32_t rewriteShow(STranslateContext* pCxt, SQuery* pQuery) {
code = createShowCondition((SShowStmt*)pQuery->pRoot, pStmt);
}
if (TSDB_CODE_SUCCESS == code) {
+ pCxt->showRewrite = true;
pQuery->showRewrite = true;
nodesDestroyNode(pQuery->pRoot);
pQuery->pRoot = (SNode*)pStmt;
@@ -6329,6 +6405,7 @@ static int32_t rewriteShowStableTags(STranslateContext* pCxt, SQuery* pQuery) {
code = createShowTableTagsProjections(&pSelect->pProjectionList, &pShow->pTags);
}
if (TSDB_CODE_SUCCESS == code) {
+ pCxt->showRewrite = true;
pQuery->showRewrite = true;
pSelect->tagScan = true;
nodesDestroyNode(pQuery->pRoot);
@@ -6359,6 +6436,7 @@ static int32_t rewriteShowDnodeVariables(STranslateContext* pCxt, SQuery* pQuery
}
}
if (TSDB_CODE_SUCCESS == code) {
+ pCxt->showRewrite = true;
pQuery->showRewrite = true;
nodesDestroyNode(pQuery->pRoot);
pQuery->pRoot = (SNode*)pSelect;
@@ -6378,6 +6456,7 @@ static int32_t rewriteShowVnodes(STranslateContext* pCxt, SQuery* pQuery) {
}
}
if (TSDB_CODE_SUCCESS == code) {
+ pCxt->showRewrite = true;
pQuery->showRewrite = true;
nodesDestroyNode(pQuery->pRoot);
pQuery->pRoot = (SNode*)pStmt;
@@ -6419,6 +6498,7 @@ static int32_t rewriteShowTableDist(STranslateContext* pCxt, SQuery* pQuery) {
code = nodesListMakeStrictAppend(&pStmt->pProjectionList, createBlockDistFunc());
}
if (TSDB_CODE_SUCCESS == code) {
+ pCxt->showRewrite = true;
pQuery->showRewrite = true;
nodesDestroyNode(pQuery->pRoot);
pQuery->pRoot = (SNode*)pStmt;
@@ -6615,7 +6695,7 @@ static void addCreateTbReqIntoVgroup(int32_t acctId, SHashObj* pVgroupHashmap, S
req.ctb.tagNum = tagNum;
req.ctb.stbName = strdup(sTableNmae);
req.ctb.pTag = (uint8_t*)pTag;
- req.ctb.tagName = taosArrayDup(tagName);
+ req.ctb.tagName = taosArrayDup(tagName, NULL);
if (pStmt->ignoreExists) {
req.flags |= TD_CREATE_IF_NOT_EXISTS;
}
@@ -7089,9 +7169,10 @@ static int32_t rewriteDropTable(STranslateContext* pCxt, SQuery* pQuery) {
static int32_t buildUpdateTagValReq(STranslateContext* pCxt, SAlterTableStmt* pStmt, STableMeta* pTableMeta,
SVAlterTbReq* pReq) {
- SSchema* pSchema = getColSchema(pTableMeta, pStmt->colName);
+ SSchema* pSchema = getTagSchema(pTableMeta, pStmt->colName);
if (NULL == pSchema) {
- return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ALTER_TABLE);
+ return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_ALTER_TABLE, "Invalid tag name: %s",
+ pStmt->colName);
}
pReq->tagName = strdup(pStmt->colName);
@@ -7493,6 +7574,7 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) {
case QUERY_NODE_SHOW_CONSUMERS_STMT:
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
case QUERY_NODE_SHOW_TAGS_STMT:
+ case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
code = rewriteShow(pCxt, pQuery);
break;
case QUERY_NODE_SHOW_VGROUPS_STMT:
diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c
index e8c3f2fa8da8717c826ced8e33a540ebaa4db829..fa091901b680041721936f7501fe23bb53b36305 100644
--- a/source/libs/parser/src/parUtil.c
+++ b/source/libs/parser/src/parUtil.c
@@ -377,7 +377,7 @@ int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag** ppTag, voi
int32_t valLen = (int32_t)strlen(jsonValue);
char* tmp = taosMemoryCalloc(1, valLen * TSDB_NCHAR_SIZE);
if (!tmp) {
- retCode = TSDB_CODE_TSC_OUT_OF_MEMORY;
+ retCode = TSDB_CODE_OUT_OF_MEMORY;
goto end;
}
val.type = TSDB_DATA_TYPE_NCHAR;
@@ -474,7 +474,7 @@ static int32_t getInsTagsTableTargetNameFromCond(int32_t acctId, SLogicCondition
return TSDB_CODE_SUCCESS;
}
-int32_t getInsTagsTableTargetName(int32_t acctId, SNode* pWhere, SName* pName) {
+int32_t getVnodeSysTableTargetName(int32_t acctId, SNode* pWhere, SName* pName) {
if (NULL == pWhere) {
return TSDB_CODE_SUCCESS;
}
@@ -844,7 +844,7 @@ int32_t getDbVgInfoFromCache(SParseMetaCache* pMetaCache, const char* pDbFName,
int32_t code = getMetaDataFromHash(pDbFName, strlen(pDbFName), pMetaCache->pDbVgroup, (void**)&pVgList);
// pVgList is null, which is a legal value, indicating that the user DB has not been created
if (TSDB_CODE_SUCCESS == code && NULL != pVgList) {
- *pVgInfo = taosArrayDup(pVgList);
+ *pVgInfo = taosArrayDup(pVgList, NULL);
if (NULL == *pVgInfo) {
code = TSDB_CODE_OUT_OF_MEMORY;
}
@@ -961,7 +961,7 @@ int32_t getUdfInfoFromCache(SParseMetaCache* pMetaCache, const char* pFunc, SFun
static void destroySmaIndex(void* p) { taosMemoryFree(((STableIndexInfo*)p)->expr); }
static SArray* smaIndexesDup(SArray* pSrc) {
- SArray* pDst = taosArrayDup(pSrc);
+ SArray* pDst = taosArrayDup(pSrc, NULL);
if (NULL == pDst) {
return NULL;
}
@@ -1011,7 +1011,7 @@ STableCfg* tableCfgDup(STableCfg* pCfg) {
memcpy(pNew->pComment, pCfg->pComment, pNew->commentLen);
}
if (NULL != pNew->pFuncs) {
- pNew->pFuncs = taosArrayDup(pNew->pFuncs);
+ pNew->pFuncs = taosArrayDup(pNew->pFuncs, NULL);
}
if (NULL != pNew->pTags) {
pNew->pTags = taosMemoryCalloc(pNew->tagsLen + 1, 1);
@@ -1053,7 +1053,7 @@ int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes) {
return pRes->code;
}
- *pDnodes = taosArrayDup((SArray*)pRes->pRes);
+ *pDnodes = taosArrayDup((SArray*)pRes->pRes, NULL);
if (NULL == *pDnodes) {
return TSDB_CODE_OUT_OF_MEMORY;
}
diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c
index a8044fa848977cf1366d41b659dfa61d30fc98d5..b4d4a3457e2352ba437b971703ad0db13b3edc35 100644
--- a/source/libs/parser/src/sql.c
+++ b/source/libs/parser/src/sql.c
@@ -104,26 +104,26 @@
#endif
/************* Begin control #defines *****************************************/
#define YYCODETYPE unsigned short int
-#define YYNOCODE 454
+#define YYNOCODE 457
#define YYACTIONTYPE unsigned short int
#define ParseTOKENTYPE SToken
typedef union {
int yyinit;
ParseTOKENTYPE yy0;
- ENullOrder yy153;
- SNode* yy164;
- bool yy193;
- SAlterOption yy213;
- EOrder yy238;
- int32_t yy512;
- int64_t yy577;
- SToken yy593;
- EFillMode yy638;
- SNodeList* yy648;
- EOperatorType yy656;
- int8_t yy687;
- SDataType yy720;
- EJoinType yy868;
+ EOperatorType yy20;
+ int8_t yy33;
+ SAlterOption yy123;
+ SNode* yy148;
+ SToken yy199;
+ EFillMode yy334;
+ bool yy397;
+ SNodeList* yy404;
+ EJoinType yy470;
+ ENullOrder yy499;
+ int64_t yy525;
+ SDataType yy530;
+ int32_t yy706;
+ EOrder yy898;
} YYMINORTYPE;
#ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100
@@ -139,17 +139,17 @@ typedef union {
#define ParseCTX_FETCH
#define ParseCTX_STORE
#define YYFALLBACK 1
-#define YYNSTATE 705
-#define YYNRULE 536
-#define YYNTOKEN 319
-#define YY_MAX_SHIFT 704
-#define YY_MIN_SHIFTREDUCE 1046
-#define YY_MAX_SHIFTREDUCE 1581
-#define YY_ERROR_ACTION 1582
-#define YY_ACCEPT_ACTION 1583
-#define YY_NO_ACTION 1584
-#define YY_MIN_REDUCE 1585
-#define YY_MAX_REDUCE 2120
+#define YYNSTATE 710
+#define YYNRULE 540
+#define YYNTOKEN 322
+#define YY_MAX_SHIFT 709
+#define YY_MIN_SHIFTREDUCE 1052
+#define YY_MAX_SHIFTREDUCE 1591
+#define YY_ERROR_ACTION 1592
+#define YY_ACCEPT_ACTION 1593
+#define YY_NO_ACTION 1594
+#define YY_MIN_REDUCE 1595
+#define YY_MAX_REDUCE 2134
/************* End control #defines *******************************************/
#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
@@ -216,821 +216,694 @@ typedef union {
** yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (3135)
+#define YY_ACTTAB_COUNT (2410)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 454, 1936, 455, 1620, 1832, 168, 363, 594, 556, 1783,
- /* 10 */ 1785, 556, 44, 42, 462, 182, 455, 1620, 1790, 1922,
- /* 20 */ 358, 121, 1362, 1585, 52, 326, 329, 1836, 492, 453,
- /* 30 */ 1918, 1954, 457, 1442, 1788, 1360, 1819, 134, 1738, 611,
- /* 40 */ 158, 1738, 95, 1727, 1904, 1691, 610, 120, 119, 118,
- /* 50 */ 117, 116, 115, 114, 113, 112, 129, 1437, 513, 1914,
- /* 60 */ 1920, 346, 17, 1079, 1730, 582, 62, 344, 597, 1368,
- /* 70 */ 612, 604, 1388, 523, 1970, 156, 122, 99, 357, 1937,
- /* 80 */ 614, 1939, 1940, 609, 1740, 604, 1096, 225, 1095, 40,
- /* 90 */ 39, 38, 2023, 439, 2091, 1, 321, 2019, 271, 2031,
- /* 100 */ 593, 516, 592, 1083, 1084, 2091, 510, 2091, 397, 581,
- /* 110 */ 174, 224, 34, 274, 2092, 583, 1097, 701, 1608, 403,
- /* 120 */ 581, 174, 581, 174, 538, 2092, 583, 2092, 583, 37,
- /* 130 */ 36, 1444, 1445, 43, 41, 40, 39, 38, 58, 234,
- /* 140 */ 47, 1390, 556, 46, 44, 42, 1512, 597, 64, 190,
- /* 150 */ 189, 63, 358, 2091, 1362, 179, 58, 58, 317, 1418,
- /* 160 */ 1427, 1904, 508, 507, 506, 1442, 1165, 1360, 2097, 174,
- /* 170 */ 128, 502, 1738, 2092, 583, 501, 500, 58, 1363, 82,
- /* 180 */ 1361, 499, 505, 1247, 1248, 420, 1790, 498, 1387, 1437,
- /* 190 */ 597, 37, 36, 345, 17, 43, 41, 40, 39, 38,
- /* 200 */ 1167, 1368, 1788, 1366, 1367, 1586, 1417, 1420, 1421, 1422,
- /* 210 */ 1423, 1424, 1425, 1426, 606, 602, 1435, 1436, 1438, 1439,
- /* 220 */ 1440, 1441, 1443, 1446, 3, 78, 111, 1, 541, 110,
- /* 230 */ 109, 108, 107, 106, 105, 104, 103, 102, 396, 127,
- /* 240 */ 395, 316, 177, 1385, 538, 1784, 1785, 1387, 1733, 701,
- /* 250 */ 433, 111, 65, 444, 110, 109, 108, 107, 106, 105,
- /* 260 */ 104, 103, 102, 1444, 1445, 46, 2096, 1790, 542, 582,
- /* 270 */ 417, 471, 445, 2091, 362, 419, 44, 42, 343, 1548,
- /* 280 */ 1607, 1847, 250, 1788, 358, 177, 1362, 177, 2097, 174,
- /* 290 */ 177, 1418, 1427, 2092, 583, 2091, 1388, 1442, 2091, 1360,
- /* 300 */ 73, 37, 36, 177, 177, 43, 41, 40, 39, 38,
- /* 310 */ 1363, 2095, 1361, 581, 174, 2092, 2094, 330, 2092, 583,
- /* 320 */ 572, 1437, 58, 1904, 177, 1387, 17, 1299, 1300, 407,
- /* 330 */ 13, 12, 159, 1368, 1597, 1366, 1367, 233, 1417, 1420,
- /* 340 */ 1421, 1422, 1423, 1424, 1425, 1426, 606, 602, 1435, 1436,
- /* 350 */ 1438, 1439, 1440, 1441, 1443, 1446, 3, 443, 577, 1,
- /* 360 */ 438, 437, 436, 435, 432, 431, 430, 429, 428, 424,
- /* 370 */ 423, 422, 421, 331, 414, 413, 412, 81, 409, 408,
- /* 380 */ 328, 701, 37, 36, 1371, 371, 43, 41, 40, 39,
- /* 390 */ 38, 212, 1096, 170, 1095, 1444, 1445, 461, 2096, 392,
- /* 400 */ 457, 538, 361, 578, 573, 163, 1777, 211, 44, 42,
- /* 410 */ 156, 488, 484, 480, 476, 209, 358, 26, 1362, 1740,
- /* 420 */ 394, 390, 1097, 1418, 1427, 1485, 30, 2091, 647, 1442,
- /* 430 */ 2091, 1360, 37, 36, 226, 1583, 43, 41, 40, 39,
- /* 440 */ 38, 78, 1363, 2095, 1361, 2097, 174, 2092, 2093, 364,
- /* 450 */ 2092, 583, 79, 1437, 1954, 207, 1386, 156, 17, 1538,
- /* 460 */ 504, 503, 576, 1578, 1734, 1368, 1740, 1366, 1367, 177,
- /* 470 */ 1417, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 606, 602,
- /* 480 */ 1435, 1436, 1438, 1439, 1440, 1441, 1443, 1446, 3, 522,
- /* 490 */ 11, 1, 80, 319, 1083, 1084, 546, 2096, 544, 373,
- /* 500 */ 1606, 594, 520, 575, 518, 2038, 370, 569, 1536, 1537,
- /* 510 */ 1539, 1540, 1516, 701, 1389, 538, 645, 526, 1387, 239,
- /* 520 */ 206, 200, 538, 205, 459, 1605, 467, 1444, 1445, 1374,
- /* 530 */ 1385, 134, 2035, 538, 1716, 147, 146, 642, 641, 640,
- /* 540 */ 44, 42, 198, 1904, 2091, 556, 1604, 168, 358, 1715,
- /* 550 */ 1362, 2091, 558, 639, 1995, 1418, 1427, 1577, 401, 2097,
- /* 560 */ 174, 1442, 2091, 1360, 2092, 583, 2097, 174, 1904, 1837,
- /* 570 */ 132, 2092, 583, 1452, 1363, 1738, 1361, 2097, 174, 1387,
- /* 580 */ 1339, 1340, 2092, 583, 1713, 1437, 1389, 1729, 1603, 1904,
- /* 590 */ 1571, 596, 172, 2031, 2032, 471, 2036, 1368, 1918, 1366,
- /* 600 */ 1367, 1602, 1417, 1420, 1421, 1422, 1423, 1424, 1425, 1426,
- /* 610 */ 606, 602, 1435, 1436, 1438, 1439, 1440, 1441, 1443, 1446,
- /* 620 */ 3, 186, 1601, 8, 11, 1850, 9, 1914, 1920, 37,
- /* 630 */ 36, 1904, 11, 43, 41, 40, 39, 38, 1473, 604,
- /* 640 */ 32, 1600, 88, 1891, 1904, 701, 37, 36, 672, 670,
- /* 650 */ 43, 41, 40, 39, 38, 273, 645, 1419, 75, 1444,
- /* 660 */ 1445, 74, 37, 36, 1731, 1904, 43, 41, 40, 39,
- /* 670 */ 38, 2038, 44, 42, 1447, 147, 146, 642, 641, 640,
- /* 680 */ 358, 1923, 1362, 322, 1904, 1936, 556, 1418, 1427, 1790,
- /* 690 */ 380, 645, 1918, 1442, 556, 1360, 37, 36, 2034, 402,
- /* 700 */ 43, 41, 40, 39, 38, 1789, 1363, 411, 1361, 31,
- /* 710 */ 147, 146, 642, 641, 640, 1954, 1738, 1437, 1419, 1478,
- /* 720 */ 1368, 1914, 1920, 598, 1738, 1471, 659, 273, 1904, 1368,
- /* 730 */ 610, 1366, 1367, 604, 1417, 1420, 1421, 1422, 1423, 1424,
- /* 740 */ 1425, 1426, 606, 602, 1435, 1436, 1438, 1439, 1440, 1441,
- /* 750 */ 1443, 1446, 3, 1509, 1934, 8, 1599, 145, 1970, 1596,
- /* 760 */ 1832, 98, 1935, 1937, 614, 1939, 1940, 609, 1714, 604,
- /* 770 */ 177, 184, 227, 334, 171, 1768, 2023, 701, 1595, 1472,
- /* 780 */ 351, 2019, 37, 36, 1528, 1594, 43, 41, 40, 39,
- /* 790 */ 38, 1444, 1445, 176, 43, 41, 40, 39, 38, 1904,
- /* 800 */ 556, 2049, 1904, 556, 44, 42, 1832, 560, 2038, 1995,
- /* 810 */ 51, 556, 358, 425, 1362, 155, 121, 188, 556, 1418,
- /* 820 */ 1427, 1904, 1390, 497, 426, 1442, 2095, 1360, 1904, 647,
- /* 830 */ 1738, 469, 556, 1738, 335, 2033, 333, 332, 1363, 494,
- /* 840 */ 1361, 1738, 1390, 496, 1846, 470, 312, 1387, 1738, 1437,
- /* 850 */ 33, 355, 1466, 1467, 1468, 1469, 1470, 1474, 1475, 1476,
- /* 860 */ 1477, 1368, 1738, 1366, 1367, 495, 1417, 1420, 1421, 1422,
- /* 870 */ 1423, 1424, 1425, 1426, 606, 602, 1435, 1436, 1438, 1439,
- /* 880 */ 1440, 1441, 1443, 1446, 3, 240, 241, 8, 1205, 636,
- /* 890 */ 635, 634, 1209, 633, 1211, 1212, 632, 1214, 629, 1593,
- /* 900 */ 1220, 626, 1222, 1223, 623, 620, 542, 156, 556, 701,
- /* 910 */ 1592, 2043, 1505, 556, 1922, 1845, 1741, 312, 404, 1848,
- /* 920 */ 7, 1735, 1591, 1444, 1445, 1918, 139, 660, 556, 1708,
- /* 930 */ 1590, 405, 1589, 1588, 556, 45, 44, 42, 1738, 48,
- /* 940 */ 4, 534, 1904, 1738, 358, 319, 1362, 539, 546, 556,
- /* 950 */ 544, 1418, 1427, 1904, 1914, 1920, 352, 1442, 1738, 1360,
- /* 960 */ 1652, 556, 244, 183, 1738, 1904, 604, 496, 643, 238,
- /* 970 */ 1363, 1781, 1361, 1904, 552, 1904, 1904, 130, 533, 1738,
- /* 980 */ 1994, 1437, 644, 249, 286, 1781, 1419, 1768, 1310, 495,
- /* 990 */ 586, 1738, 1508, 1368, 1723, 1366, 1367, 1936, 1417, 1420,
- /* 1000 */ 1421, 1422, 1423, 1424, 1425, 1426, 606, 602, 1435, 1436,
- /* 1010 */ 1438, 1439, 1440, 1441, 1443, 1446, 3, 556, 140, 1,
- /* 1020 */ 137, 123, 242, 556, 508, 507, 506, 1954, 594, 589,
- /* 1030 */ 554, 217, 128, 502, 215, 598, 555, 501, 500, 556,
- /* 1040 */ 1904, 701, 610, 499, 505, 219, 1639, 1738, 218, 498,
- /* 1050 */ 144, 221, 275, 1738, 220, 1444, 1445, 223, 134, 556,
- /* 1060 */ 222, 145, 50, 60, 254, 60, 1934, 537, 509, 1738,
- /* 1070 */ 1970, 549, 365, 98, 1935, 1937, 614, 1939, 1940, 609,
- /* 1080 */ 1370, 604, 585, 1418, 1427, 1649, 171, 1632, 2023, 1738,
- /* 1090 */ 1630, 601, 351, 2019, 1580, 1581, 2096, 132, 94, 13,
- /* 1100 */ 12, 45, 1363, 246, 1361, 1725, 1721, 230, 91, 511,
- /* 1110 */ 605, 638, 514, 2050, 1198, 2063, 1535, 257, 1479, 173,
- /* 1120 */ 2031, 2032, 1505, 2036, 1692, 268, 1598, 1366, 1367, 1925,
- /* 1130 */ 1417, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 606, 602,
- /* 1140 */ 1435, 1436, 1438, 1439, 1440, 1441, 1443, 1446, 3, 678,
- /* 1150 */ 677, 676, 675, 368, 1428, 674, 673, 135, 668, 667,
- /* 1160 */ 666, 665, 664, 663, 662, 661, 149, 657, 656, 655,
- /* 1170 */ 367, 366, 652, 651, 650, 649, 648, 157, 1927, 570,
- /* 1180 */ 45, 618, 292, 144, 1936, 145, 124, 144, 1362, 1571,
- /* 1190 */ 653, 654, 1125, 1626, 210, 262, 290, 67, 594, 1955,
- /* 1200 */ 66, 1360, 369, 1841, 1621, 1778, 2053, 595, 587, 270,
- /* 1210 */ 267, 5, 1145, 1143, 1954, 2, 379, 194, 450, 448,
- /* 1220 */ 1326, 327, 611, 374, 282, 1373, 1126, 1904, 134, 610,
- /* 1230 */ 187, 406, 1463, 285, 1226, 1368, 1230, 1390, 1237, 1235,
- /* 1240 */ 148, 696, 1842, 415, 410, 1385, 441, 427, 1834, 590,
- /* 1250 */ 434, 447, 440, 1934, 58, 442, 446, 1970, 191, 449,
- /* 1260 */ 98, 1935, 1937, 614, 1939, 1940, 609, 132, 604, 451,
- /* 1270 */ 1391, 131, 452, 143, 1994, 2023, 1393, 460, 463, 351,
- /* 1280 */ 2019, 1392, 464, 701, 197, 199, 465, 1394, 468, 175,
- /* 1290 */ 2031, 2032, 97, 2036, 466, 1936, 202, 204, 472, 76,
- /* 1300 */ 77, 208, 1099, 489, 490, 491, 493, 1728, 214, 1724,
- /* 1310 */ 1881, 216, 100, 318, 525, 527, 283, 228, 528, 529,
- /* 1320 */ 340, 150, 151, 231, 535, 1954, 1726, 540, 1722, 72,
- /* 1330 */ 71, 400, 152, 611, 181, 153, 550, 235, 1904, 85,
- /* 1340 */ 610, 568, 543, 284, 1363, 87, 1361, 571, 2045, 580,
- /* 1350 */ 1936, 6, 315, 1880, 532, 388, 1852, 386, 382, 378,
- /* 1360 */ 375, 372, 565, 141, 1934, 547, 342, 2054, 1970, 1366,
- /* 1370 */ 1367, 98, 1935, 1937, 614, 1939, 1940, 609, 551, 604,
- /* 1380 */ 1954, 564, 566, 142, 2111, 1739, 2023, 252, 611, 2064,
- /* 1390 */ 351, 2019, 567, 1904, 562, 610, 347, 256, 574, 348,
- /* 1400 */ 2057, 177, 563, 591, 2114, 1505, 1936, 588, 266, 133,
- /* 1410 */ 1389, 57, 2004, 2069, 89, 616, 1782, 1709, 697, 1934,
- /* 1420 */ 700, 287, 278, 1970, 698, 264, 98, 1935, 1937, 614,
- /* 1430 */ 1939, 1940, 609, 2068, 604, 2039, 1954, 311, 49, 2111,
- /* 1440 */ 299, 2023, 164, 263, 611, 351, 2019, 261, 310, 1904,
- /* 1450 */ 289, 610, 309, 291, 265, 2085, 1898, 1897, 69, 1896,
- /* 1460 */ 2090, 1936, 1895, 70, 1892, 376, 377, 1354, 1355, 180,
- /* 1470 */ 269, 381, 1890, 383, 384, 1934, 385, 1889, 387, 1970,
- /* 1480 */ 1936, 1888, 98, 1935, 1937, 614, 1939, 1940, 609, 389,
- /* 1490 */ 604, 1954, 1887, 391, 1886, 2111, 393, 2023, 1329, 611,
- /* 1500 */ 1328, 351, 2019, 1863, 1904, 1862, 610, 398, 399, 1861,
- /* 1510 */ 1954, 2042, 1860, 1290, 1827, 1826, 1824, 136, 611, 1823,
- /* 1520 */ 1822, 1825, 1821, 1904, 1820, 610, 1818, 1817, 1816, 185,
- /* 1530 */ 612, 416, 1815, 418, 1970, 1814, 1813, 301, 357, 1937,
- /* 1540 */ 614, 1939, 1940, 609, 1812, 604, 1811, 1810, 1809, 1934,
- /* 1550 */ 1808, 1807, 1806, 1970, 1805, 1804, 98, 1935, 1937, 614,
- /* 1560 */ 1939, 1940, 609, 1803, 604, 1802, 1801, 2091, 1173, 1998,
- /* 1570 */ 1800, 2023, 138, 1799, 1798, 351, 2019, 1936, 1797, 1796,
- /* 1580 */ 354, 353, 581, 174, 1795, 1794, 1292, 2092, 583, 1086,
- /* 1590 */ 1376, 1793, 1792, 1791, 1654, 192, 1653, 193, 1936, 1651,
- /* 1600 */ 1617, 1442, 169, 1369, 195, 1616, 125, 1954, 126, 1085,
- /* 1610 */ 1876, 1870, 1859, 203, 1858, 611, 196, 456, 458, 201,
- /* 1620 */ 1904, 1844, 610, 1717, 1118, 1437, 1650, 1648, 1954, 474,
- /* 1630 */ 1646, 1644, 473, 477, 478, 482, 611, 1368, 1642, 481,
- /* 1640 */ 475, 1904, 479, 610, 485, 483, 1934, 487, 1629, 486,
- /* 1650 */ 1970, 1628, 1613, 98, 1935, 1937, 614, 1939, 1940, 609,
- /* 1660 */ 1719, 604, 59, 1241, 1240, 1718, 1996, 1934, 2023, 1164,
- /* 1670 */ 1163, 1970, 351, 2019, 98, 1935, 1937, 614, 1939, 1940,
- /* 1680 */ 609, 1162, 604, 1936, 1161, 600, 669, 559, 213, 2023,
- /* 1690 */ 1160, 1155, 1157, 351, 2019, 1640, 671, 1156, 1154, 336,
- /* 1700 */ 1633, 337, 1631, 512, 338, 515, 1612, 1611, 517, 519,
- /* 1710 */ 1610, 521, 101, 1954, 1346, 25, 1875, 53, 1335, 1869,
- /* 1720 */ 154, 611, 1857, 530, 1855, 1856, 1904, 18, 610, 237,
- /* 1730 */ 1851, 1344, 2096, 1854, 1853, 545, 243, 1843, 531, 1343,
- /* 1740 */ 83, 86, 84, 248, 232, 91, 1377, 15, 1372, 646,
- /* 1750 */ 536, 339, 1934, 27, 19, 20, 1970, 1550, 56, 99,
- /* 1760 */ 1935, 1937, 614, 1939, 1940, 609, 1454, 604, 1936, 245,
- /* 1770 */ 10, 1380, 1382, 251, 2023, 259, 253, 548, 2022, 2019,
- /* 1780 */ 1532, 255, 1453, 602, 1435, 1436, 1438, 1439, 1440, 1441,
- /* 1790 */ 1534, 260, 1925, 162, 258, 29, 61, 22, 1954, 21,
- /* 1800 */ 28, 1565, 1564, 349, 1527, 1570, 611, 1569, 90, 1568,
- /* 1810 */ 1571, 1904, 350, 610, 1502, 272, 1501, 1924, 55, 165,
- /* 1820 */ 12, 1378, 1464, 1973, 1936, 166, 178, 1432, 1410, 613,
- /* 1830 */ 603, 617, 1430, 35, 1171, 1429, 14, 1934, 23, 360,
- /* 1840 */ 1402, 1970, 621, 24, 99, 1935, 1937, 614, 1939, 1940,
- /* 1850 */ 609, 1227, 604, 1936, 1954, 615, 54, 619, 622, 2023,
- /* 1860 */ 1224, 16, 608, 599, 2019, 624, 1221, 1904, 627, 610,
- /* 1870 */ 1219, 625, 630, 1204, 1215, 1218, 628, 1217, 1213, 631,
- /* 1880 */ 1216, 92, 1936, 1954, 93, 1236, 68, 276, 1232, 1116,
- /* 1890 */ 637, 611, 1151, 1934, 1150, 1149, 1904, 1970, 610, 1148,
- /* 1900 */ 307, 1935, 1937, 614, 1939, 1940, 609, 607, 604, 557,
- /* 1910 */ 1988, 1936, 1954, 1147, 1146, 1144, 1142, 1141, 1140, 658,
- /* 1920 */ 611, 1138, 1934, 1137, 1136, 1904, 1970, 610, 277, 160,
- /* 1930 */ 1935, 1937, 614, 1939, 1940, 609, 1135, 604, 1134, 1133,
- /* 1940 */ 1132, 1954, 1131, 1168, 1166, 1128, 1127, 1124, 1123, 611,
- /* 1950 */ 1122, 1934, 1121, 1647, 1904, 1970, 610, 679, 161, 1935,
- /* 1960 */ 1937, 614, 1939, 1940, 609, 680, 604, 1645, 681, 683,
- /* 1970 */ 561, 2060, 684, 1643, 685, 687, 689, 688, 1936, 1641,
- /* 1980 */ 1934, 691, 693, 692, 1970, 1627, 695, 99, 1935, 1937,
- /* 1990 */ 614, 1939, 1940, 609, 1936, 604, 1076, 1609, 280, 699,
- /* 2000 */ 1584, 702, 2023, 1364, 288, 1584, 703, 2020, 1954, 1584,
- /* 2010 */ 584, 2112, 1584, 341, 1584, 1584, 611, 1584, 1584, 1584,
- /* 2020 */ 1584, 1904, 1584, 610, 1954, 1584, 1584, 1584, 1584, 1584,
- /* 2030 */ 1584, 1584, 608, 1584, 1584, 1584, 1584, 1904, 1584, 610,
- /* 2040 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584, 1936,
- /* 2050 */ 1584, 1970, 1584, 1584, 308, 1935, 1937, 614, 1939, 1940,
- /* 2060 */ 609, 1584, 604, 1934, 1584, 1584, 1584, 1970, 1584, 1936,
- /* 2070 */ 307, 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1954,
- /* 2080 */ 1989, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584,
- /* 2090 */ 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584, 1584, 1954,
- /* 2100 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584,
- /* 2110 */ 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584, 1934, 1584,
- /* 2120 */ 1584, 1584, 1970, 1584, 1584, 160, 1935, 1937, 614, 1939,
- /* 2130 */ 1940, 609, 1584, 604, 1936, 1584, 1584, 1584, 1934, 1584,
- /* 2140 */ 1584, 1584, 1970, 1584, 1584, 303, 1935, 1937, 614, 1939,
- /* 2150 */ 1940, 609, 1584, 604, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2160 */ 1584, 1584, 1584, 1584, 1954, 1584, 1584, 2061, 1584, 1584,
- /* 2170 */ 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610,
- /* 2180 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 579,
- /* 2190 */ 1584, 1584, 1936, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2200 */ 1584, 1584, 1584, 1934, 1584, 1584, 1936, 1970, 1584, 1584,
- /* 2210 */ 161, 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1584,
- /* 2220 */ 1584, 1584, 1954, 1584, 1584, 1584, 1584, 356, 1584, 1584,
- /* 2230 */ 611, 1584, 1584, 1584, 1584, 1904, 1954, 610, 1584, 1584,
- /* 2240 */ 1584, 359, 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904,
- /* 2250 */ 1584, 610, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2260 */ 1584, 1934, 1584, 2113, 1936, 1970, 1584, 1584, 308, 1935,
- /* 2270 */ 1937, 614, 1939, 1940, 609, 1934, 604, 1584, 1936, 1970,
- /* 2280 */ 1584, 1584, 308, 1935, 1937, 614, 1939, 1940, 609, 1584,
- /* 2290 */ 604, 1584, 1584, 1584, 1954, 1584, 1584, 1584, 1584, 1584,
- /* 2300 */ 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904, 1954, 610,
- /* 2310 */ 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584,
- /* 2320 */ 1584, 1904, 1584, 610, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2330 */ 1584, 1936, 1584, 524, 1584, 1584, 1584, 1970, 1584, 1584,
- /* 2340 */ 301, 1935, 1937, 614, 1939, 1940, 609, 1934, 604, 1584,
- /* 2350 */ 1584, 1970, 1584, 1584, 293, 1935, 1937, 614, 1939, 1940,
- /* 2360 */ 609, 1954, 604, 1584, 1584, 1584, 1584, 1584, 1584, 611,
- /* 2370 */ 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584,
- /* 2380 */ 1584, 1584, 1584, 1584, 1584, 1584, 1936, 1584, 1584, 1584,
- /* 2390 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2400 */ 1934, 1584, 1936, 1584, 1970, 1584, 1584, 294, 1935, 1937,
- /* 2410 */ 614, 1939, 1940, 609, 1584, 604, 1954, 1584, 1584, 1584,
- /* 2420 */ 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904,
- /* 2430 */ 1584, 610, 1954, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2440 */ 611, 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584,
- /* 2450 */ 1584, 1584, 1584, 1584, 1584, 1934, 1584, 1936, 1584, 1970,
- /* 2460 */ 1584, 1584, 295, 1935, 1937, 614, 1939, 1940, 609, 1584,
- /* 2470 */ 604, 1934, 1584, 1936, 1584, 1970, 1584, 1584, 302, 1935,
- /* 2480 */ 1937, 614, 1939, 1940, 609, 1584, 604, 1954, 1584, 1584,
- /* 2490 */ 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584,
- /* 2500 */ 1904, 1584, 610, 1954, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2510 */ 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584,
- /* 2520 */ 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584, 1584, 1936,
- /* 2530 */ 1970, 1584, 1584, 304, 1935, 1937, 614, 1939, 1940, 609,
- /* 2540 */ 1584, 604, 1934, 1584, 1584, 1936, 1970, 1584, 1584, 296,
- /* 2550 */ 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1584, 1954,
- /* 2560 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584,
- /* 2570 */ 1584, 1584, 1904, 1584, 610, 1954, 1584, 1584, 1584, 1584,
- /* 2580 */ 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584,
- /* 2590 */ 610, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584,
- /* 2600 */ 1584, 1936, 1970, 1584, 1584, 305, 1935, 1937, 614, 1939,
- /* 2610 */ 1940, 609, 1584, 604, 1934, 1584, 1584, 1936, 1970, 1584,
- /* 2620 */ 1584, 297, 1935, 1937, 614, 1939, 1940, 609, 1584, 604,
- /* 2630 */ 1584, 1954, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611,
- /* 2640 */ 1584, 1584, 1584, 1584, 1904, 1584, 610, 1954, 1584, 1584,
- /* 2650 */ 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584,
- /* 2660 */ 1904, 1584, 610, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2670 */ 1934, 1584, 1584, 1584, 1970, 1584, 1584, 306, 1935, 1937,
- /* 2680 */ 614, 1939, 1940, 609, 1936, 604, 1934, 1584, 1584, 1584,
- /* 2690 */ 1970, 1584, 1584, 298, 1935, 1937, 614, 1939, 1940, 609,
- /* 2700 */ 1584, 604, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1936,
- /* 2710 */ 1584, 1584, 1584, 1584, 1954, 1584, 1584, 1584, 1584, 1584,
- /* 2720 */ 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610,
- /* 2730 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1954,
- /* 2740 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584,
- /* 2750 */ 1584, 1584, 1904, 1934, 610, 1584, 1584, 1970, 1584, 1584,
- /* 2760 */ 313, 1935, 1937, 614, 1939, 1940, 609, 704, 604, 1584,
- /* 2770 */ 1936, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584,
- /* 2780 */ 1584, 281, 1970, 1584, 1584, 314, 1935, 1937, 614, 1939,
- /* 2790 */ 1940, 609, 1584, 604, 1584, 167, 1584, 1584, 1584, 1584,
- /* 2800 */ 1954, 694, 690, 686, 682, 279, 1584, 1584, 611, 1584,
- /* 2810 */ 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584, 1584,
- /* 2820 */ 1584, 1584, 1584, 1936, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 2830 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934,
- /* 2840 */ 1584, 1936, 96, 1970, 1584, 247, 1948, 1935, 1937, 614,
- /* 2850 */ 1939, 1940, 609, 1954, 604, 1584, 1584, 1584, 1584, 1584,
- /* 2860 */ 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584,
- /* 2870 */ 1584, 1954, 1584, 1584, 1584, 1584, 1584, 1584, 553, 611,
- /* 2880 */ 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584,
- /* 2890 */ 1584, 1584, 1934, 1584, 1584, 1584, 1970, 1936, 1584, 1947,
- /* 2900 */ 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1584, 1584,
- /* 2910 */ 1934, 1936, 1584, 236, 1970, 1584, 1584, 1946, 1935, 1937,
- /* 2920 */ 614, 1939, 1940, 609, 1584, 604, 1584, 1954, 1584, 1584,
- /* 2930 */ 1333, 1584, 229, 1584, 1584, 611, 1584, 1584, 1584, 1584,
- /* 2940 */ 1904, 1954, 610, 1584, 1584, 1584, 1584, 1584, 1584, 611,
- /* 2950 */ 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584,
- /* 2960 */ 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1936, 1584, 1584,
- /* 2970 */ 1970, 1584, 1584, 323, 1935, 1937, 614, 1939, 1940, 609,
- /* 2980 */ 1934, 604, 1584, 1936, 1970, 1584, 1584, 324, 1935, 1937,
- /* 2990 */ 614, 1939, 1940, 609, 1584, 604, 1584, 1954, 1584, 1584,
- /* 3000 */ 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584,
- /* 3010 */ 1904, 1584, 610, 1954, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 3020 */ 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584,
- /* 3030 */ 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584, 1584, 1584,
- /* 3040 */ 1970, 1584, 1584, 320, 1935, 1937, 614, 1939, 1940, 609,
- /* 3050 */ 1936, 604, 1934, 1584, 1584, 1584, 1970, 1584, 1584, 325,
- /* 3060 */ 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1584, 1584,
- /* 3070 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 3080 */ 1954, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584,
- /* 3090 */ 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584, 1584,
- /* 3100 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
- /* 3110 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934,
- /* 3120 */ 1584, 1584, 1584, 1970, 1584, 1584, 300, 1935, 1937, 614,
- /* 3130 */ 1939, 1940, 609, 1584, 604,
+ /* 0 */ 1950, 458, 157, 459, 1631, 566, 167, 1703, 467, 2105,
+ /* 10 */ 459, 1631, 43, 41, 1522, 365, 1651, 2110, 1796, 1798,
+ /* 20 */ 360, 2105, 1373, 1595, 565, 173, 598, 332, 1850, 2106,
+ /* 30 */ 567, 1968, 1741, 1452, 405, 1371, 1664, 2109, 514, 581,
+ /* 40 */ 52, 2106, 2108, 1933, 1919, 399, 614, 122, 121, 120,
+ /* 50 */ 119, 118, 117, 116, 115, 114, 464, 1750, 1447, 597,
+ /* 60 */ 36, 35, 460, 16, 42, 40, 39, 38, 37, 1949,
+ /* 70 */ 1379, 1929, 1935, 1984, 318, 597, 100, 1951, 618, 1953,
+ /* 80 */ 1954, 613, 608, 608, 258, 597, 1526, 546, 170, 1938,
+ /* 90 */ 2037, 2105, 1398, 476, 354, 2033, 12, 2052, 1462, 1950,
+ /* 100 */ 1933, 513, 512, 511, 1398, 1968, 2111, 173, 175, 128,
+ /* 110 */ 507, 2106, 567, 560, 506, 505, 2063, 158, 706, 1607,
+ /* 120 */ 504, 510, 58, 2049, 85, 561, 503, 598, 1929, 1935,
+ /* 130 */ 1968, 1398, 1085, 1454, 1455, 1104, 1593, 1103, 615, 608,
+ /* 140 */ 2110, 123, 1846, 1919, 2105, 614, 43, 41, 497, 1558,
+ /* 150 */ 210, 46, 559, 181, 360, 1727, 1373, 1399, 1750, 1950,
+ /* 160 */ 2109, 46, 1428, 1437, 2106, 2107, 1105, 1452, 1949, 1371,
+ /* 170 */ 598, 1087, 1984, 1090, 1091, 100, 1951, 618, 1953, 1954,
+ /* 180 */ 613, 1374, 608, 1372, 123, 134, 62, 141, 2008, 2037,
+ /* 190 */ 1968, 502, 1447, 354, 2033, 33, 274, 16, 581, 375,
+ /* 200 */ 1398, 1750, 652, 1919, 1379, 614, 1377, 1378, 1398, 1427,
+ /* 210 */ 1430, 1431, 1432, 1433, 1434, 1435, 1436, 610, 606, 1445,
+ /* 220 */ 1446, 1448, 1449, 1450, 1451, 1453, 1456, 2, 1949, 97,
+ /* 230 */ 12, 2110, 1984, 1950, 1429, 100, 1951, 618, 1953, 1954,
+ /* 240 */ 613, 546, 608, 132, 1397, 2105, 1429, 170, 1400, 2037,
+ /* 250 */ 556, 1742, 706, 354, 2033, 42, 40, 39, 38, 37,
+ /* 260 */ 2111, 173, 9, 650, 1968, 2106, 567, 1454, 1455, 1797,
+ /* 270 */ 1798, 176, 615, 1309, 1310, 2064, 58, 1919, 58, 614,
+ /* 280 */ 43, 41, 146, 145, 647, 646, 645, 143, 360, 1400,
+ /* 290 */ 1373, 58, 1399, 1950, 509, 508, 1428, 1437, 1618, 578,
+ /* 300 */ 176, 1452, 1949, 1371, 457, 598, 1984, 462, 1637, 100,
+ /* 310 */ 1951, 618, 1953, 1954, 613, 1374, 608, 1372, 225, 178,
+ /* 320 */ 643, 2012, 169, 2037, 1968, 1581, 1447, 354, 2033, 1483,
+ /* 330 */ 131, 16, 615, 562, 557, 1790, 1750, 1919, 1379, 614,
+ /* 340 */ 1377, 1378, 1919, 1427, 1430, 1431, 1432, 1433, 1434, 1435,
+ /* 350 */ 1436, 610, 606, 1445, 1446, 1448, 1449, 1450, 1451, 1453,
+ /* 360 */ 1456, 2, 1949, 9, 12, 1950, 1984, 677, 675, 100,
+ /* 370 */ 1951, 618, 1953, 1954, 613, 398, 608, 397, 82, 320,
+ /* 380 */ 58, 2125, 531, 2037, 529, 80, 706, 354, 2033, 255,
+ /* 390 */ 2045, 577, 257, 124, 576, 441, 1968, 2105, 2071, 127,
+ /* 400 */ 30, 1454, 1455, 541, 612, 1256, 1257, 406, 1745, 1919,
+ /* 410 */ 1488, 614, 565, 173, 43, 41, 1457, 2106, 567, 585,
+ /* 420 */ 407, 1379, 360, 1725, 1373, 176, 47, 176, 1846, 351,
+ /* 430 */ 1428, 1437, 1861, 257, 1949, 1452, 185, 1371, 1984, 183,
+ /* 440 */ 176, 310, 1951, 618, 1953, 1954, 613, 650, 608, 1374,
+ /* 450 */ 2003, 1372, 466, 189, 188, 462, 1637, 36, 35, 664,
+ /* 460 */ 1447, 42, 40, 39, 38, 37, 146, 145, 647, 646,
+ /* 470 */ 645, 143, 1379, 77, 1377, 1378, 76, 1427, 1430, 1431,
+ /* 480 */ 1432, 1433, 1434, 1435, 1436, 610, 606, 1445, 1446, 1448,
+ /* 490 */ 1449, 1450, 1451, 1453, 1456, 2, 598, 1617, 44, 598,
+ /* 500 */ 1739, 1950, 1803, 513, 512, 511, 1398, 598, 1803, 353,
+ /* 510 */ 403, 128, 507, 404, 1735, 364, 506, 505, 1801, 1616,
+ /* 520 */ 706, 413, 504, 510, 1801, 352, 363, 1750, 503, 176,
+ /* 530 */ 1750, 650, 1968, 155, 155, 1454, 1455, 1104, 1750, 1103,
+ /* 540 */ 615, 1919, 1752, 1752, 527, 1919, 1538, 614, 43, 41,
+ /* 550 */ 146, 145, 647, 646, 645, 143, 360, 525, 1373, 523,
+ /* 560 */ 1737, 1950, 598, 1919, 1428, 1437, 394, 1173, 1105, 1452,
+ /* 570 */ 1949, 1371, 598, 578, 1984, 176, 427, 100, 1951, 618,
+ /* 580 */ 1953, 1954, 613, 1374, 608, 1372, 428, 396, 392, 2010,
+ /* 590 */ 1733, 2037, 1968, 1750, 1447, 354, 2033, 226, 230, 9,
+ /* 600 */ 615, 7, 1175, 1750, 131, 1919, 1379, 614, 1377, 1378,
+ /* 610 */ 80, 1427, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 610,
+ /* 620 */ 606, 1445, 1446, 1448, 1449, 1450, 1451, 1453, 1456, 2,
+ /* 630 */ 1949, 167, 44, 1746, 1984, 366, 605, 100, 1951, 618,
+ /* 640 */ 1953, 1954, 613, 155, 608, 265, 266, 1615, 1429, 2125,
+ /* 650 */ 264, 2037, 1752, 1851, 706, 354, 2033, 1614, 1950, 1728,
+ /* 660 */ 1350, 1351, 580, 171, 2045, 2046, 2099, 129, 2050, 1454,
+ /* 670 */ 1455, 36, 35, 6, 29, 42, 40, 39, 38, 37,
+ /* 680 */ 36, 35, 43, 41, 42, 40, 39, 38, 37, 1968,
+ /* 690 */ 360, 1919, 1373, 91, 598, 598, 2077, 615, 1428, 1437,
+ /* 700 */ 1613, 1919, 1919, 1452, 614, 1371, 1803, 25, 474, 475,
+ /* 710 */ 39, 38, 37, 329, 600, 1743, 2009, 1374, 602, 1372,
+ /* 720 */ 2009, 476, 1801, 609, 155, 1750, 1750, 1949, 1447, 227,
+ /* 730 */ 1612, 1984, 1780, 1753, 159, 1951, 618, 1953, 1954, 613,
+ /* 740 */ 1379, 608, 1377, 1378, 1919, 1427, 1430, 1431, 1432, 1433,
+ /* 750 */ 1434, 1435, 1436, 610, 606, 1445, 1446, 1448, 1449, 1450,
+ /* 760 */ 1451, 1453, 1456, 2, 36, 35, 12, 1950, 42, 40,
+ /* 770 */ 39, 38, 37, 1846, 1919, 547, 2074, 566, 1548, 1473,
+ /* 780 */ 317, 2105, 1396, 2052, 187, 598, 642, 1611, 706, 435,
+ /* 790 */ 1610, 1609, 448, 1596, 1606, 447, 565, 173, 1968, 1747,
+ /* 800 */ 1726, 2106, 567, 1454, 1455, 1605, 615, 1608, 1604, 2048,
+ /* 810 */ 419, 1919, 449, 614, 113, 421, 1750, 112, 111, 110,
+ /* 820 */ 109, 108, 107, 106, 105, 104, 553, 1546, 1547, 1549,
+ /* 830 */ 1550, 1919, 1428, 1437, 1919, 1919, 532, 665, 1919, 1720,
+ /* 840 */ 1984, 598, 598, 306, 1951, 618, 1953, 1954, 613, 1919,
+ /* 850 */ 608, 1374, 1919, 1372, 1603, 139, 367, 333, 1661, 36,
+ /* 860 */ 35, 1519, 652, 42, 40, 39, 38, 37, 2109, 409,
+ /* 870 */ 1401, 1401, 1750, 1750, 2052, 1602, 1377, 1378, 1515, 1427,
+ /* 880 */ 1430, 1431, 1432, 1433, 1434, 1435, 1436, 610, 606, 1445,
+ /* 890 */ 1446, 1448, 1449, 1450, 1451, 1453, 1456, 2, 1919, 445,
+ /* 900 */ 2047, 1704, 440, 439, 438, 437, 434, 433, 432, 431,
+ /* 910 */ 430, 426, 425, 424, 423, 334, 416, 415, 414, 1919,
+ /* 920 */ 411, 410, 331, 683, 682, 681, 680, 370, 144, 679,
+ /* 930 */ 678, 135, 673, 672, 671, 670, 669, 668, 667, 666,
+ /* 940 */ 148, 662, 661, 660, 369, 368, 657, 656, 655, 654,
+ /* 950 */ 653, 156, 1601, 1600, 598, 1599, 294, 36, 35, 357,
+ /* 960 */ 356, 42, 40, 39, 38, 37, 1598, 1950, 542, 1387,
+ /* 970 */ 292, 66, 598, 133, 65, 644, 2008, 252, 1794, 1401,
+ /* 980 */ 1452, 51, 1380, 36, 35, 1750, 582, 42, 40, 39,
+ /* 990 */ 38, 37, 193, 454, 452, 585, 1919, 1919, 1968, 1919,
+ /* 1000 */ 11, 10, 337, 1750, 648, 1447, 615, 1794, 1862, 554,
+ /* 1010 */ 1919, 1919, 325, 614, 182, 235, 573, 1379, 1213, 640,
+ /* 1020 */ 639, 638, 1217, 637, 1219, 1220, 636, 1222, 633, 58,
+ /* 1030 */ 1228, 630, 1230, 1231, 627, 624, 1949, 209, 288, 598,
+ /* 1040 */ 1984, 1780, 1803, 100, 1951, 618, 1953, 1954, 613, 649,
+ /* 1050 */ 608, 584, 1794, 269, 1481, 2125, 216, 2037, 1802, 214,
+ /* 1060 */ 211, 354, 2033, 709, 338, 604, 336, 335, 99, 499,
+ /* 1070 */ 1750, 246, 2056, 501, 598, 162, 1906, 281, 1373, 1090,
+ /* 1080 */ 1091, 493, 489, 485, 481, 208, 2057, 1515, 593, 1833,
+ /* 1090 */ 598, 1371, 166, 546, 501, 500, 1495, 2105, 699, 695,
+ /* 1100 */ 691, 687, 279, 1518, 595, 1750, 74, 73, 402, 578,
+ /* 1110 */ 1482, 180, 2111, 173, 67, 570, 500, 2106, 567, 598,
+ /* 1120 */ 1382, 1750, 81, 234, 382, 206, 1379, 569, 1388, 316,
+ /* 1130 */ 1383, 1969, 390, 596, 388, 384, 380, 377, 374, 98,
+ /* 1140 */ 131, 48, 272, 3, 137, 1381, 125, 371, 1588, 60,
+ /* 1150 */ 1750, 1855, 113, 1391, 1393, 112, 111, 110, 109, 108,
+ /* 1160 */ 107, 106, 105, 104, 75, 606, 1445, 1446, 1448, 1449,
+ /* 1170 */ 1450, 1451, 239, 218, 706, 594, 217, 1950, 176, 45,
+ /* 1180 */ 598, 32, 358, 1476, 1477, 1478, 1479, 1480, 1484, 1485,
+ /* 1190 */ 1486, 1487, 205, 199, 275, 204, 1644, 1642, 472, 172,
+ /* 1200 */ 2045, 2046, 1545, 129, 2050, 1950, 220, 222, 1968, 219,
+ /* 1210 */ 221, 1750, 260, 262, 197, 50, 615, 140, 516, 519,
+ /* 1220 */ 545, 1919, 142, 614, 233, 241, 1590, 1591, 1940, 1344,
+ /* 1230 */ 96, 229, 1320, 11, 10, 1632, 1968, 1374, 574, 1372,
+ /* 1240 */ 93, 422, 1587, 144, 615, 1133, 1949, 658, 1950, 1919,
+ /* 1250 */ 1984, 614, 2067, 100, 1951, 618, 1953, 1954, 613, 60,
+ /* 1260 */ 608, 45, 1377, 1378, 83, 601, 267, 2037, 1385, 1153,
+ /* 1270 */ 590, 354, 2033, 1791, 1949, 271, 1950, 1942, 1984, 1968,
+ /* 1280 */ 1134, 101, 1951, 618, 1953, 1954, 613, 615, 608, 579,
+ /* 1290 */ 254, 31, 1919, 1384, 614, 2037, 1206, 36, 35, 2036,
+ /* 1300 */ 2033, 42, 40, 39, 38, 37, 251, 1968, 45, 622,
+ /* 1310 */ 1, 142, 1489, 4, 1438, 615, 144, 1949, 659, 1950,
+ /* 1320 */ 1919, 1984, 614, 1638, 101, 1951, 618, 1953, 1954, 613,
+ /* 1330 */ 376, 608, 126, 381, 330, 571, 142, 1950, 2037, 1337,
+ /* 1340 */ 1151, 282, 603, 2033, 186, 616, 408, 1401, 1856, 1984,
+ /* 1350 */ 1968, 443, 101, 1951, 618, 1953, 1954, 613, 612, 608,
+ /* 1360 */ 412, 287, 1234, 1919, 1238, 614, 2037, 417, 1968, 1245,
+ /* 1370 */ 324, 2033, 701, 1396, 429, 1848, 615, 436, 442, 444,
+ /* 1380 */ 1950, 1919, 190, 614, 450, 1243, 451, 453, 1949, 147,
+ /* 1390 */ 455, 1402, 1984, 518, 456, 310, 1951, 618, 1953, 1954,
+ /* 1400 */ 613, 611, 608, 599, 2002, 465, 1949, 1404, 528, 468,
+ /* 1410 */ 1984, 1968, 1403, 160, 1951, 618, 1953, 1954, 613, 615,
+ /* 1420 */ 608, 196, 224, 469, 1919, 198, 614, 1405, 1937, 470,
+ /* 1430 */ 201, 473, 471, 1950, 1107, 203, 477, 521, 1896, 1933,
+ /* 1440 */ 78, 1937, 515, 79, 496, 533, 498, 223, 494, 1949,
+ /* 1450 */ 207, 495, 1933, 1984, 1950, 102, 101, 1951, 618, 1953,
+ /* 1460 */ 1954, 613, 228, 608, 1968, 568, 2126, 1929, 1935, 343,
+ /* 1470 */ 2037, 319, 615, 535, 1740, 2034, 213, 1919, 608, 614,
+ /* 1480 */ 1929, 1935, 355, 373, 64, 1968, 1736, 63, 215, 149,
+ /* 1490 */ 1895, 608, 150, 615, 372, 1738, 1734, 151, 1919, 152,
+ /* 1500 */ 614, 536, 1949, 543, 283, 231, 1984, 550, 1950, 159,
+ /* 1510 */ 1951, 618, 1953, 1954, 613, 555, 608, 537, 540, 237,
+ /* 1520 */ 588, 2068, 578, 1949, 2078, 546, 552, 1984, 344, 2105,
+ /* 1530 */ 304, 1951, 618, 1953, 1954, 613, 546, 608, 240, 1968,
+ /* 1540 */ 2105, 558, 5, 551, 2111, 173, 564, 615, 548, 2106,
+ /* 1550 */ 567, 2075, 1919, 131, 614, 2111, 173, 549, 248, 2059,
+ /* 1560 */ 2106, 567, 1950, 36, 35, 245, 345, 42, 40, 39,
+ /* 1570 */ 38, 37, 250, 1515, 563, 575, 572, 1949, 130, 1950,
+ /* 1580 */ 2128, 1984, 249, 2083, 160, 1951, 618, 1953, 1954, 613,
+ /* 1590 */ 2082, 608, 163, 1968, 247, 1400, 583, 259, 349, 2104,
+ /* 1600 */ 253, 615, 2053, 348, 284, 1950, 1919, 586, 614, 587,
+ /* 1610 */ 1968, 1867, 174, 2045, 2046, 359, 129, 2050, 615, 591,
+ /* 1620 */ 1866, 1865, 350, 1919, 88, 614, 285, 592, 286, 57,
+ /* 1630 */ 90, 1949, 92, 1950, 1751, 1984, 1968, 2127, 311, 1951,
+ /* 1640 */ 618, 1953, 1954, 613, 615, 608, 2018, 1795, 1949, 1919,
+ /* 1650 */ 1721, 614, 1984, 289, 620, 311, 1951, 618, 1953, 1954,
+ /* 1660 */ 613, 278, 608, 702, 1968, 703, 705, 49, 298, 361,
+ /* 1670 */ 291, 312, 615, 313, 1949, 302, 1950, 1919, 1984, 614,
+ /* 1680 */ 293, 295, 1951, 618, 1953, 1954, 613, 1913, 608, 321,
+ /* 1690 */ 322, 1912, 1950, 71, 1911, 1910, 72, 1907, 378, 379,
+ /* 1700 */ 1365, 1366, 1949, 179, 383, 1905, 1984, 1968, 385, 311,
+ /* 1710 */ 1951, 618, 1953, 1954, 613, 615, 608, 386, 387, 154,
+ /* 1720 */ 1919, 1904, 614, 1968, 389, 1903, 1902, 391, 393, 1901,
+ /* 1730 */ 1340, 615, 1339, 395, 1878, 534, 1919, 1877, 614, 400,
+ /* 1740 */ 401, 1876, 1875, 1950, 1841, 1949, 1300, 1840, 1838, 1984,
+ /* 1750 */ 136, 1837, 296, 1951, 618, 1953, 1954, 613, 1836, 608,
+ /* 1760 */ 1839, 1949, 1835, 1834, 1832, 1984, 1831, 1830, 297, 1951,
+ /* 1770 */ 618, 1953, 1954, 613, 1968, 608, 184, 546, 418, 1829,
+ /* 1780 */ 420, 2105, 615, 1828, 1827, 1826, 1950, 1919, 1825, 614,
+ /* 1790 */ 1824, 1823, 1822, 1821, 1820, 1819, 2111, 173, 1818, 1817,
+ /* 1800 */ 1816, 2106, 567, 1950, 1815, 1814, 1813, 138, 1812, 1811,
+ /* 1810 */ 1810, 1809, 1949, 1808, 1807, 1806, 1984, 1968, 1302, 303,
+ /* 1820 */ 1951, 618, 1953, 1954, 613, 615, 608, 1805, 1804, 446,
+ /* 1830 */ 1919, 1666, 614, 191, 1968, 1665, 1181, 1663, 192, 1627,
+ /* 1840 */ 1093, 168, 615, 1092, 194, 1626, 69, 1919, 1891, 614,
+ /* 1850 */ 1939, 1885, 195, 1874, 1873, 1949, 1950, 70, 200, 1984,
+ /* 1860 */ 202, 1858, 307, 1951, 618, 1953, 1954, 613, 461, 608,
+ /* 1870 */ 463, 1729, 1949, 1950, 1662, 1660, 1984, 478, 479, 299,
+ /* 1880 */ 1951, 618, 1953, 1954, 613, 480, 608, 1968, 1126, 1658,
+ /* 1890 */ 482, 483, 1656, 486, 1654, 615, 484, 487, 488, 490,
+ /* 1900 */ 1919, 492, 614, 1641, 1968, 1640, 1623, 1731, 491, 1249,
+ /* 1910 */ 1730, 1250, 615, 1172, 1171, 1170, 1169, 1919, 1168, 614,
+ /* 1920 */ 212, 59, 1163, 1165, 1950, 1949, 674, 1652, 676, 1984,
+ /* 1930 */ 1164, 1162, 308, 1951, 618, 1953, 1954, 613, 339, 608,
+ /* 1940 */ 1645, 1950, 1949, 340, 1643, 341, 1984, 517, 520, 300,
+ /* 1950 */ 1951, 618, 1953, 1954, 613, 1968, 608, 1622, 1621, 522,
+ /* 1960 */ 524, 1620, 1357, 615, 526, 103, 1355, 1950, 1919, 1354,
+ /* 1970 */ 614, 530, 1968, 24, 1890, 1884, 1346, 538, 1872, 1870,
+ /* 1980 */ 615, 17, 14, 2110, 1950, 1919, 53, 614, 1560, 18,
+ /* 1990 */ 56, 243, 28, 1949, 26, 236, 539, 1984, 1968, 232,
+ /* 2000 */ 309, 1951, 618, 1953, 1954, 613, 615, 608, 342, 153,
+ /* 2010 */ 1949, 1919, 238, 614, 1984, 1968, 1544, 301, 1951, 618,
+ /* 2020 */ 1953, 1954, 613, 615, 608, 161, 544, 1537, 1919, 244,
+ /* 2030 */ 614, 242, 27, 1940, 84, 1950, 1949, 61, 19, 1575,
+ /* 2040 */ 1984, 1574, 346, 314, 1951, 618, 1953, 1954, 613, 1580,
+ /* 2050 */ 608, 1581, 1579, 1949, 1578, 347, 1512, 1984, 256, 1511,
+ /* 2060 */ 315, 1951, 618, 1953, 1954, 613, 1968, 608, 55, 164,
+ /* 2070 */ 1871, 1869, 1868, 20, 615, 589, 1857, 263, 1950, 1919,
+ /* 2080 */ 261, 614, 1542, 15, 54, 268, 86, 87, 89, 273,
+ /* 2090 */ 93, 270, 10, 21, 1950, 1464, 8, 1463, 1987, 1389,
+ /* 2100 */ 1442, 607, 165, 177, 1949, 1440, 34, 1474, 1984, 1968,
+ /* 2110 */ 1439, 1962, 1951, 618, 1953, 1954, 613, 615, 608, 13,
+ /* 2120 */ 1420, 22, 1919, 1412, 614, 1968, 617, 23, 619, 1235,
+ /* 2130 */ 621, 362, 623, 615, 1232, 625, 626, 628, 1919, 629,
+ /* 2140 */ 614, 1229, 1223, 631, 1221, 1950, 632, 1949, 634, 635,
+ /* 2150 */ 1227, 1984, 1212, 1226, 1961, 1951, 618, 1953, 1954, 613,
+ /* 2160 */ 641, 608, 94, 1949, 276, 95, 1225, 1984, 1244, 68,
+ /* 2170 */ 1960, 1951, 618, 1953, 1954, 613, 1968, 608, 1224, 1240,
+ /* 2180 */ 1124, 651, 1159, 1158, 615, 1157, 1156, 1155, 1950, 1919,
+ /* 2190 */ 1154, 614, 1179, 1152, 1150, 1149, 1148, 663, 277, 1146,
+ /* 2200 */ 1145, 1144, 1143, 1142, 1141, 1950, 1140, 1139, 1176, 1174,
+ /* 2210 */ 1136, 1135, 1132, 1131, 1949, 1130, 1659, 1129, 1984, 1968,
+ /* 2220 */ 684, 326, 1951, 618, 1953, 1954, 613, 615, 608, 686,
+ /* 2230 */ 1657, 685, 1919, 688, 614, 689, 1968, 1655, 690, 692,
+ /* 2240 */ 693, 694, 1653, 696, 615, 697, 698, 1639, 700, 1919,
+ /* 2250 */ 1082, 614, 1619, 280, 704, 708, 1375, 1949, 1950, 1594,
+ /* 2260 */ 290, 1984, 707, 1594, 327, 1951, 618, 1953, 1954, 613,
+ /* 2270 */ 1594, 608, 1594, 1594, 1949, 1950, 1594, 1594, 1984, 1594,
+ /* 2280 */ 1594, 323, 1951, 618, 1953, 1954, 613, 1594, 608, 1968,
+ /* 2290 */ 1594, 1594, 1594, 1594, 1594, 1594, 1594, 615, 1594, 1594,
+ /* 2300 */ 1594, 1594, 1919, 1594, 614, 1594, 1968, 1594, 1594, 1594,
+ /* 2310 */ 1594, 1594, 1594, 1594, 615, 1594, 1594, 1594, 1594, 1919,
+ /* 2320 */ 1594, 614, 1594, 1594, 1594, 1594, 1950, 1949, 1594, 1594,
+ /* 2330 */ 1594, 1984, 1594, 1594, 328, 1951, 618, 1953, 1954, 613,
+ /* 2340 */ 1594, 608, 1594, 1594, 616, 1594, 1594, 1594, 1984, 1594,
+ /* 2350 */ 1594, 306, 1951, 618, 1953, 1954, 613, 1968, 608, 1594,
+ /* 2360 */ 1594, 1594, 1594, 1594, 1594, 615, 1594, 1594, 1594, 1594,
+ /* 2370 */ 1919, 1594, 614, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
+ /* 2380 */ 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
+ /* 2390 */ 1594, 1594, 1594, 1594, 1594, 1949, 1594, 1594, 1594, 1984,
+ /* 2400 */ 1594, 1594, 305, 1951, 618, 1953, 1954, 613, 1594, 608,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 326, 322, 328, 329, 360, 352, 363, 330, 330, 366,
- /* 10 */ 367, 330, 12, 13, 326, 371, 328, 329, 352, 354,
- /* 20 */ 20, 343, 22, 0, 343, 359, 373, 374, 350, 327,
- /* 30 */ 365, 352, 330, 33, 368, 35, 0, 360, 360, 360,
- /* 40 */ 336, 360, 333, 353, 365, 341, 367, 24, 25, 26,
- /* 50 */ 27, 28, 29, 30, 31, 32, 347, 57, 4, 394,
- /* 60 */ 395, 396, 62, 4, 355, 399, 4, 344, 20, 69,
- /* 70 */ 391, 406, 20, 19, 395, 352, 399, 398, 399, 400,
- /* 80 */ 401, 402, 403, 404, 361, 406, 20, 33, 22, 14,
- /* 90 */ 15, 16, 413, 79, 428, 95, 417, 418, 421, 422,
- /* 100 */ 423, 47, 425, 44, 45, 428, 52, 428, 383, 443,
- /* 110 */ 444, 57, 414, 415, 448, 449, 50, 117, 322, 330,
- /* 120 */ 443, 444, 443, 444, 399, 448, 449, 448, 449, 8,
- /* 130 */ 9, 131, 132, 12, 13, 14, 15, 16, 95, 57,
- /* 140 */ 95, 20, 330, 95, 12, 13, 14, 20, 94, 135,
- /* 150 */ 136, 97, 20, 428, 22, 343, 95, 95, 369, 159,
- /* 160 */ 160, 365, 64, 65, 66, 33, 35, 35, 443, 444,
- /* 170 */ 72, 73, 360, 448, 449, 77, 78, 95, 178, 97,
- /* 180 */ 180, 83, 84, 131, 132, 149, 352, 89, 20, 57,
- /* 190 */ 20, 8, 9, 359, 62, 12, 13, 14, 15, 16,
- /* 200 */ 69, 69, 368, 203, 204, 0, 206, 207, 208, 209,
+ /* 0 */ 325, 329, 340, 331, 332, 427, 356, 345, 329, 431,
+ /* 10 */ 331, 332, 12, 13, 14, 367, 0, 427, 370, 371,
+ /* 20 */ 20, 431, 22, 0, 446, 447, 333, 377, 378, 451,
+ /* 30 */ 452, 356, 358, 33, 333, 35, 0, 447, 22, 364,
+ /* 40 */ 347, 451, 452, 369, 369, 385, 371, 24, 25, 26,
+ /* 50 */ 27, 28, 29, 30, 31, 32, 14, 364, 58, 20,
+ /* 60 */ 8, 9, 20, 63, 12, 13, 14, 15, 16, 394,
+ /* 70 */ 70, 397, 398, 398, 373, 20, 401, 402, 403, 404,
+ /* 80 */ 405, 406, 408, 408, 58, 20, 14, 427, 413, 358,
+ /* 90 */ 415, 431, 20, 62, 419, 420, 96, 400, 14, 325,
+ /* 100 */ 369, 65, 66, 67, 20, 356, 446, 447, 433, 73,
+ /* 110 */ 74, 451, 452, 364, 78, 79, 441, 324, 118, 326,
+ /* 120 */ 84, 85, 96, 426, 98, 20, 90, 333, 397, 398,
+ /* 130 */ 356, 20, 4, 133, 134, 20, 322, 22, 364, 408,
+ /* 140 */ 427, 347, 364, 369, 431, 371, 12, 13, 354, 97,
+ /* 150 */ 35, 96, 403, 375, 20, 0, 22, 20, 364, 325,
+ /* 160 */ 447, 96, 162, 163, 451, 452, 51, 33, 394, 35,
+ /* 170 */ 333, 43, 398, 45, 46, 401, 402, 403, 404, 405,
+ /* 180 */ 406, 181, 408, 183, 347, 411, 4, 413, 414, 415,
+ /* 190 */ 356, 354, 58, 419, 420, 416, 417, 63, 364, 385,
+ /* 200 */ 20, 364, 62, 369, 70, 371, 206, 207, 20, 209,
/* 210 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- /* 220 */ 220, 221, 222, 223, 224, 335, 21, 95, 383, 24,
- /* 230 */ 25, 26, 27, 28, 29, 30, 31, 32, 177, 349,
- /* 240 */ 179, 18, 242, 20, 399, 366, 367, 20, 358, 117,
- /* 250 */ 27, 21, 106, 30, 24, 25, 26, 27, 28, 29,
- /* 260 */ 30, 31, 32, 131, 132, 95, 399, 352, 367, 399,
- /* 270 */ 47, 61, 49, 428, 359, 52, 12, 13, 377, 96,
- /* 280 */ 322, 380, 161, 368, 20, 242, 22, 242, 443, 444,
- /* 290 */ 242, 159, 160, 448, 449, 428, 20, 33, 428, 35,
- /* 300 */ 154, 8, 9, 242, 242, 12, 13, 14, 15, 16,
- /* 310 */ 178, 444, 180, 443, 444, 448, 449, 94, 448, 449,
- /* 320 */ 164, 57, 95, 365, 242, 20, 62, 159, 160, 106,
- /* 330 */ 1, 2, 321, 69, 323, 203, 204, 57, 206, 207,
- /* 340 */ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
- /* 350 */ 218, 219, 220, 221, 222, 223, 224, 134, 20, 95,
- /* 360 */ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
- /* 370 */ 147, 148, 149, 150, 151, 152, 153, 97, 155, 156,
- /* 380 */ 157, 117, 8, 9, 35, 383, 12, 13, 14, 15,
- /* 390 */ 16, 33, 20, 351, 22, 131, 132, 327, 399, 173,
- /* 400 */ 330, 399, 344, 247, 248, 47, 364, 35, 12, 13,
- /* 410 */ 352, 53, 54, 55, 56, 57, 20, 43, 22, 361,
- /* 420 */ 194, 195, 50, 159, 160, 96, 2, 428, 61, 33,
- /* 430 */ 428, 35, 8, 9, 127, 319, 12, 13, 14, 15,
- /* 440 */ 16, 335, 178, 444, 180, 443, 444, 448, 449, 344,
- /* 450 */ 448, 449, 94, 57, 352, 97, 20, 352, 62, 203,
- /* 460 */ 338, 339, 360, 170, 358, 69, 361, 203, 204, 242,
- /* 470 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
- /* 480 */ 216, 217, 218, 219, 220, 221, 222, 223, 224, 21,
- /* 490 */ 226, 95, 185, 186, 44, 45, 189, 3, 191, 383,
- /* 500 */ 322, 330, 34, 401, 36, 397, 383, 251, 252, 253,
- /* 510 */ 254, 255, 14, 117, 20, 399, 107, 383, 20, 126,
- /* 520 */ 162, 163, 399, 165, 14, 322, 168, 131, 132, 180,
- /* 530 */ 20, 360, 424, 399, 0, 126, 127, 128, 129, 130,
- /* 540 */ 12, 13, 184, 365, 428, 330, 322, 352, 20, 0,
- /* 550 */ 22, 428, 410, 106, 412, 159, 160, 264, 343, 443,
- /* 560 */ 444, 33, 428, 35, 448, 449, 443, 444, 365, 374,
- /* 570 */ 399, 448, 449, 14, 178, 360, 180, 443, 444, 20,
- /* 580 */ 187, 188, 448, 449, 0, 57, 20, 354, 322, 365,
- /* 590 */ 96, 420, 421, 422, 423, 61, 425, 69, 365, 203,
- /* 600 */ 204, 322, 206, 207, 208, 209, 210, 211, 212, 213,
- /* 610 */ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
- /* 620 */ 224, 57, 322, 95, 226, 0, 228, 394, 395, 8,
- /* 630 */ 9, 365, 226, 12, 13, 14, 15, 16, 158, 406,
- /* 640 */ 2, 322, 333, 0, 365, 117, 8, 9, 338, 339,
- /* 650 */ 12, 13, 14, 15, 16, 161, 107, 159, 94, 131,
- /* 660 */ 132, 97, 8, 9, 355, 365, 12, 13, 14, 15,
- /* 670 */ 16, 397, 12, 13, 14, 126, 127, 128, 129, 130,
- /* 680 */ 20, 354, 22, 62, 365, 322, 330, 159, 160, 352,
- /* 690 */ 47, 107, 365, 33, 330, 35, 8, 9, 424, 343,
- /* 700 */ 12, 13, 14, 15, 16, 368, 178, 343, 180, 229,
- /* 710 */ 126, 127, 128, 129, 130, 352, 360, 57, 159, 239,
- /* 720 */ 69, 394, 395, 360, 360, 104, 69, 161, 365, 69,
- /* 730 */ 367, 203, 204, 406, 206, 207, 208, 209, 210, 211,
- /* 740 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
- /* 750 */ 222, 223, 224, 4, 391, 95, 322, 43, 395, 322,
- /* 760 */ 360, 398, 399, 400, 401, 402, 403, 404, 0, 406,
- /* 770 */ 242, 371, 345, 37, 411, 348, 413, 117, 322, 158,
- /* 780 */ 417, 418, 8, 9, 96, 322, 12, 13, 14, 15,
- /* 790 */ 16, 131, 132, 430, 12, 13, 14, 15, 16, 365,
- /* 800 */ 330, 438, 365, 330, 12, 13, 360, 410, 397, 412,
- /* 810 */ 96, 330, 20, 343, 22, 161, 343, 371, 330, 159,
- /* 820 */ 160, 365, 20, 350, 343, 33, 3, 35, 365, 61,
- /* 830 */ 360, 343, 330, 360, 98, 424, 100, 101, 178, 103,
- /* 840 */ 180, 360, 20, 107, 379, 343, 381, 20, 360, 57,
- /* 850 */ 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
- /* 860 */ 239, 69, 360, 203, 204, 129, 206, 207, 208, 209,
- /* 870 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- /* 880 */ 220, 221, 222, 223, 224, 126, 127, 95, 108, 109,
- /* 890 */ 110, 111, 112, 113, 114, 115, 116, 117, 118, 322,
- /* 900 */ 120, 121, 122, 123, 124, 125, 367, 352, 330, 117,
- /* 910 */ 322, 240, 241, 330, 354, 379, 361, 381, 22, 380,
- /* 920 */ 39, 343, 322, 131, 132, 365, 343, 340, 330, 342,
- /* 930 */ 322, 35, 322, 322, 330, 43, 12, 13, 360, 42,
- /* 940 */ 43, 343, 365, 360, 20, 186, 22, 343, 189, 330,
- /* 950 */ 191, 159, 160, 365, 394, 395, 396, 33, 360, 35,
- /* 960 */ 0, 330, 343, 161, 360, 365, 406, 107, 362, 43,
- /* 970 */ 178, 365, 180, 365, 343, 365, 365, 409, 387, 360,
- /* 980 */ 412, 57, 362, 161, 345, 365, 159, 348, 96, 129,
- /* 990 */ 43, 360, 243, 69, 353, 203, 204, 322, 206, 207,
- /* 1000 */ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
- /* 1010 */ 218, 219, 220, 221, 222, 223, 224, 330, 43, 95,
- /* 1020 */ 42, 43, 96, 330, 64, 65, 66, 352, 330, 43,
- /* 1030 */ 343, 99, 72, 73, 102, 360, 343, 77, 78, 330,
- /* 1040 */ 365, 117, 367, 83, 84, 99, 0, 360, 102, 89,
- /* 1050 */ 43, 99, 343, 360, 102, 131, 132, 99, 360, 330,
- /* 1060 */ 102, 43, 161, 43, 43, 43, 391, 166, 22, 360,
- /* 1070 */ 395, 96, 343, 398, 399, 400, 401, 402, 403, 404,
- /* 1080 */ 35, 406, 259, 159, 160, 0, 411, 0, 413, 360,
- /* 1090 */ 0, 62, 417, 418, 131, 132, 3, 399, 95, 1,
- /* 1100 */ 2, 43, 178, 96, 180, 353, 353, 353, 105, 22,
- /* 1110 */ 353, 353, 22, 438, 96, 375, 96, 96, 96, 421,
- /* 1120 */ 422, 423, 241, 425, 341, 452, 323, 203, 204, 46,
- /* 1130 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
- /* 1140 */ 216, 217, 218, 219, 220, 221, 222, 223, 224, 64,
- /* 1150 */ 65, 66, 67, 68, 96, 70, 71, 72, 73, 74,
- /* 1160 */ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- /* 1170 */ 85, 86, 87, 88, 89, 90, 91, 18, 95, 441,
- /* 1180 */ 43, 43, 23, 43, 322, 43, 43, 43, 22, 96,
- /* 1190 */ 13, 13, 35, 0, 331, 435, 37, 38, 330, 352,
- /* 1200 */ 41, 35, 331, 375, 329, 364, 375, 426, 261, 445,
- /* 1210 */ 419, 244, 35, 35, 352, 429, 47, 58, 59, 60,
- /* 1220 */ 176, 392, 360, 393, 385, 180, 69, 365, 360, 367,
- /* 1230 */ 42, 372, 203, 96, 96, 69, 96, 20, 96, 96,
- /* 1240 */ 96, 48, 375, 370, 372, 20, 158, 330, 330, 263,
- /* 1250 */ 372, 337, 370, 391, 95, 370, 93, 395, 330, 330,
- /* 1260 */ 398, 399, 400, 401, 402, 403, 404, 399, 406, 330,
- /* 1270 */ 20, 409, 324, 411, 412, 413, 20, 324, 389, 417,
- /* 1280 */ 418, 20, 367, 117, 335, 335, 382, 20, 382, 421,
- /* 1290 */ 422, 423, 133, 425, 384, 322, 335, 335, 330, 335,
- /* 1300 */ 335, 335, 51, 332, 332, 324, 352, 352, 352, 352,
- /* 1310 */ 365, 352, 330, 324, 192, 390, 389, 333, 183, 388,
- /* 1320 */ 382, 352, 352, 333, 330, 352, 352, 330, 352, 170,
- /* 1330 */ 171, 172, 352, 360, 175, 352, 163, 333, 365, 333,
- /* 1340 */ 367, 249, 365, 348, 178, 333, 180, 250, 437, 169,
- /* 1350 */ 322, 256, 193, 365, 367, 196, 365, 198, 199, 200,
- /* 1360 */ 201, 202, 258, 378, 391, 365, 365, 375, 395, 203,
- /* 1370 */ 204, 398, 399, 400, 401, 402, 403, 404, 376, 406,
- /* 1380 */ 352, 365, 365, 378, 411, 360, 413, 378, 360, 375,
- /* 1390 */ 417, 418, 365, 365, 245, 367, 365, 378, 365, 265,
- /* 1400 */ 427, 242, 257, 262, 453, 241, 322, 260, 393, 360,
- /* 1410 */ 20, 95, 416, 434, 95, 356, 365, 342, 36, 391,
- /* 1420 */ 324, 330, 333, 395, 325, 432, 398, 399, 400, 401,
- /* 1430 */ 402, 403, 404, 434, 406, 397, 352, 381, 386, 411,
- /* 1440 */ 346, 413, 434, 433, 360, 417, 418, 436, 346, 365,
- /* 1450 */ 334, 367, 346, 320, 431, 427, 0, 0, 185, 0,
- /* 1460 */ 447, 322, 0, 42, 0, 35, 197, 35, 35, 35,
- /* 1470 */ 446, 197, 0, 35, 35, 391, 197, 0, 197, 395,
- /* 1480 */ 322, 0, 398, 399, 400, 401, 402, 403, 404, 35,
- /* 1490 */ 406, 352, 0, 22, 0, 411, 35, 413, 180, 360,
- /* 1500 */ 178, 417, 418, 0, 365, 0, 367, 174, 173, 0,
- /* 1510 */ 352, 427, 0, 46, 0, 0, 0, 42, 360, 0,
- /* 1520 */ 0, 0, 0, 365, 0, 367, 0, 0, 0, 149,
- /* 1530 */ 391, 35, 0, 149, 395, 0, 0, 398, 399, 400,
- /* 1540 */ 401, 402, 403, 404, 0, 406, 0, 0, 0, 391,
- /* 1550 */ 0, 0, 0, 395, 0, 0, 398, 399, 400, 401,
- /* 1560 */ 402, 403, 404, 0, 406, 0, 0, 428, 35, 411,
- /* 1570 */ 0, 413, 42, 0, 0, 417, 418, 322, 0, 0,
- /* 1580 */ 12, 13, 443, 444, 0, 0, 22, 448, 449, 14,
- /* 1590 */ 22, 0, 0, 0, 0, 57, 0, 57, 322, 0,
- /* 1600 */ 0, 33, 43, 35, 42, 0, 39, 352, 39, 14,
- /* 1610 */ 0, 0, 0, 169, 0, 360, 40, 46, 46, 39,
- /* 1620 */ 365, 0, 367, 0, 63, 57, 0, 0, 352, 47,
- /* 1630 */ 0, 0, 35, 35, 47, 47, 360, 69, 0, 35,
- /* 1640 */ 39, 365, 39, 367, 35, 39, 391, 39, 0, 47,
- /* 1650 */ 395, 0, 0, 398, 399, 400, 401, 402, 403, 404,
- /* 1660 */ 0, 406, 104, 35, 22, 0, 411, 391, 413, 35,
- /* 1670 */ 35, 395, 417, 418, 398, 399, 400, 401, 402, 403,
- /* 1680 */ 404, 22, 406, 322, 35, 117, 43, 411, 102, 413,
- /* 1690 */ 35, 22, 35, 417, 418, 0, 43, 35, 35, 22,
- /* 1700 */ 0, 22, 0, 49, 22, 35, 0, 0, 35, 35,
- /* 1710 */ 0, 22, 20, 352, 96, 95, 0, 161, 35, 0,
- /* 1720 */ 181, 360, 0, 22, 0, 0, 365, 95, 367, 96,
- /* 1730 */ 0, 35, 3, 0, 0, 190, 95, 0, 161, 35,
- /* 1740 */ 95, 95, 39, 46, 163, 105, 178, 246, 180, 62,
- /* 1750 */ 167, 161, 391, 95, 43, 43, 395, 96, 43, 398,
- /* 1760 */ 399, 400, 401, 402, 403, 404, 225, 406, 322, 162,
- /* 1770 */ 227, 203, 204, 95, 413, 43, 96, 164, 417, 418,
- /* 1780 */ 96, 95, 225, 215, 216, 217, 218, 219, 220, 221,
- /* 1790 */ 96, 46, 46, 95, 95, 43, 3, 43, 352, 246,
- /* 1800 */ 95, 35, 35, 35, 96, 96, 360, 35, 95, 35,
- /* 1810 */ 96, 365, 35, 367, 96, 46, 96, 46, 43, 46,
- /* 1820 */ 2, 22, 203, 95, 322, 46, 46, 96, 22, 205,
- /* 1830 */ 95, 35, 96, 95, 69, 96, 95, 391, 95, 35,
- /* 1840 */ 96, 395, 35, 95, 398, 399, 400, 401, 402, 403,
- /* 1850 */ 404, 96, 406, 322, 352, 106, 240, 95, 95, 413,
- /* 1860 */ 96, 246, 360, 417, 418, 35, 96, 365, 35, 367,
- /* 1870 */ 119, 95, 35, 22, 96, 119, 95, 119, 96, 95,
- /* 1880 */ 119, 95, 322, 352, 95, 35, 95, 43, 22, 63,
- /* 1890 */ 107, 360, 35, 391, 35, 35, 365, 395, 367, 35,
- /* 1900 */ 398, 399, 400, 401, 402, 403, 404, 405, 406, 407,
- /* 1910 */ 408, 322, 352, 35, 35, 35, 35, 35, 35, 92,
- /* 1920 */ 360, 35, 391, 35, 22, 365, 395, 367, 43, 398,
- /* 1930 */ 399, 400, 401, 402, 403, 404, 35, 406, 22, 35,
- /* 1940 */ 35, 352, 35, 69, 35, 35, 35, 35, 35, 360,
- /* 1950 */ 22, 391, 35, 0, 365, 395, 367, 35, 398, 399,
- /* 1960 */ 400, 401, 402, 403, 404, 47, 406, 0, 39, 35,
- /* 1970 */ 439, 440, 47, 0, 39, 35, 39, 47, 322, 0,
- /* 1980 */ 391, 35, 39, 47, 395, 0, 35, 398, 399, 400,
- /* 1990 */ 401, 402, 403, 404, 322, 406, 35, 0, 22, 21,
- /* 2000 */ 454, 21, 413, 22, 22, 454, 20, 418, 352, 454,
- /* 2010 */ 450, 451, 454, 357, 454, 454, 360, 454, 454, 454,
- /* 2020 */ 454, 365, 454, 367, 352, 454, 454, 454, 454, 454,
- /* 2030 */ 454, 454, 360, 454, 454, 454, 454, 365, 454, 367,
- /* 2040 */ 454, 454, 454, 454, 454, 454, 454, 391, 454, 322,
- /* 2050 */ 454, 395, 454, 454, 398, 399, 400, 401, 402, 403,
- /* 2060 */ 404, 454, 406, 391, 454, 454, 454, 395, 454, 322,
- /* 2070 */ 398, 399, 400, 401, 402, 403, 404, 454, 406, 352,
- /* 2080 */ 408, 454, 454, 454, 454, 454, 454, 360, 454, 454,
- /* 2090 */ 454, 454, 365, 454, 367, 454, 454, 454, 454, 352,
- /* 2100 */ 454, 454, 454, 454, 454, 454, 454, 360, 454, 454,
- /* 2110 */ 454, 454, 365, 454, 367, 454, 454, 454, 391, 454,
- /* 2120 */ 454, 454, 395, 454, 454, 398, 399, 400, 401, 402,
- /* 2130 */ 403, 404, 454, 406, 322, 454, 454, 454, 391, 454,
- /* 2140 */ 454, 454, 395, 454, 454, 398, 399, 400, 401, 402,
- /* 2150 */ 403, 404, 454, 406, 454, 454, 454, 454, 454, 454,
- /* 2160 */ 454, 454, 454, 454, 352, 454, 454, 440, 454, 454,
- /* 2170 */ 454, 454, 360, 454, 454, 454, 454, 365, 454, 367,
- /* 2180 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 442,
- /* 2190 */ 454, 454, 322, 454, 454, 454, 454, 454, 454, 454,
- /* 2200 */ 454, 454, 454, 391, 454, 454, 322, 395, 454, 454,
- /* 2210 */ 398, 399, 400, 401, 402, 403, 404, 454, 406, 454,
- /* 2220 */ 454, 454, 352, 454, 454, 454, 454, 357, 454, 454,
- /* 2230 */ 360, 454, 454, 454, 454, 365, 352, 367, 454, 454,
- /* 2240 */ 454, 357, 454, 454, 360, 454, 454, 454, 454, 365,
- /* 2250 */ 454, 367, 454, 454, 454, 454, 454, 454, 454, 454,
- /* 2260 */ 454, 391, 454, 451, 322, 395, 454, 454, 398, 399,
- /* 2270 */ 400, 401, 402, 403, 404, 391, 406, 454, 322, 395,
- /* 2280 */ 454, 454, 398, 399, 400, 401, 402, 403, 404, 454,
- /* 2290 */ 406, 454, 454, 454, 352, 454, 454, 454, 454, 454,
- /* 2300 */ 454, 454, 360, 454, 454, 454, 454, 365, 352, 367,
- /* 2310 */ 454, 454, 454, 454, 454, 454, 360, 454, 454, 454,
- /* 2320 */ 454, 365, 454, 367, 454, 454, 454, 454, 454, 454,
- /* 2330 */ 454, 322, 454, 391, 454, 454, 454, 395, 454, 454,
- /* 2340 */ 398, 399, 400, 401, 402, 403, 404, 391, 406, 454,
- /* 2350 */ 454, 395, 454, 454, 398, 399, 400, 401, 402, 403,
- /* 2360 */ 404, 352, 406, 454, 454, 454, 454, 454, 454, 360,
- /* 2370 */ 454, 454, 454, 454, 365, 454, 367, 454, 454, 454,
- /* 2380 */ 454, 454, 454, 454, 454, 454, 322, 454, 454, 454,
- /* 2390 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454,
- /* 2400 */ 391, 454, 322, 454, 395, 454, 454, 398, 399, 400,
- /* 2410 */ 401, 402, 403, 404, 454, 406, 352, 454, 454, 454,
- /* 2420 */ 454, 454, 454, 454, 360, 454, 454, 454, 454, 365,
- /* 2430 */ 454, 367, 352, 454, 454, 454, 454, 454, 454, 454,
- /* 2440 */ 360, 454, 454, 454, 454, 365, 454, 367, 454, 454,
- /* 2450 */ 454, 454, 454, 454, 454, 391, 454, 322, 454, 395,
- /* 2460 */ 454, 454, 398, 399, 400, 401, 402, 403, 404, 454,
- /* 2470 */ 406, 391, 454, 322, 454, 395, 454, 454, 398, 399,
- /* 2480 */ 400, 401, 402, 403, 404, 454, 406, 352, 454, 454,
- /* 2490 */ 454, 454, 454, 454, 454, 360, 454, 454, 454, 454,
- /* 2500 */ 365, 454, 367, 352, 454, 454, 454, 454, 454, 454,
- /* 2510 */ 454, 360, 454, 454, 454, 454, 365, 454, 367, 454,
- /* 2520 */ 454, 454, 454, 454, 454, 454, 391, 454, 454, 322,
- /* 2530 */ 395, 454, 454, 398, 399, 400, 401, 402, 403, 404,
- /* 2540 */ 454, 406, 391, 454, 454, 322, 395, 454, 454, 398,
- /* 2550 */ 399, 400, 401, 402, 403, 404, 454, 406, 454, 352,
- /* 2560 */ 454, 454, 454, 454, 454, 454, 454, 360, 454, 454,
- /* 2570 */ 454, 454, 365, 454, 367, 352, 454, 454, 454, 454,
- /* 2580 */ 454, 454, 454, 360, 454, 454, 454, 454, 365, 454,
- /* 2590 */ 367, 454, 454, 454, 454, 454, 454, 454, 391, 454,
- /* 2600 */ 454, 322, 395, 454, 454, 398, 399, 400, 401, 402,
- /* 2610 */ 403, 404, 454, 406, 391, 454, 454, 322, 395, 454,
- /* 2620 */ 454, 398, 399, 400, 401, 402, 403, 404, 454, 406,
- /* 2630 */ 454, 352, 454, 454, 454, 454, 454, 454, 454, 360,
- /* 2640 */ 454, 454, 454, 454, 365, 454, 367, 352, 454, 454,
- /* 2650 */ 454, 454, 454, 454, 454, 360, 454, 454, 454, 454,
- /* 2660 */ 365, 454, 367, 454, 454, 454, 454, 454, 454, 454,
- /* 2670 */ 391, 454, 454, 454, 395, 454, 454, 398, 399, 400,
- /* 2680 */ 401, 402, 403, 404, 322, 406, 391, 454, 454, 454,
- /* 2690 */ 395, 454, 454, 398, 399, 400, 401, 402, 403, 404,
- /* 2700 */ 454, 406, 454, 454, 454, 454, 454, 454, 454, 322,
- /* 2710 */ 454, 454, 454, 454, 352, 454, 454, 454, 454, 454,
- /* 2720 */ 454, 454, 360, 454, 454, 454, 454, 365, 454, 367,
- /* 2730 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 352,
- /* 2740 */ 454, 454, 454, 454, 454, 454, 454, 360, 454, 454,
- /* 2750 */ 454, 454, 365, 391, 367, 454, 454, 395, 454, 454,
- /* 2760 */ 398, 399, 400, 401, 402, 403, 404, 19, 406, 454,
- /* 2770 */ 322, 454, 454, 454, 454, 454, 454, 454, 391, 454,
- /* 2780 */ 454, 33, 395, 454, 454, 398, 399, 400, 401, 402,
- /* 2790 */ 403, 404, 454, 406, 454, 47, 454, 454, 454, 454,
- /* 2800 */ 352, 53, 54, 55, 56, 57, 454, 454, 360, 454,
- /* 2810 */ 454, 454, 454, 365, 454, 367, 454, 454, 454, 454,
- /* 2820 */ 454, 454, 454, 322, 454, 454, 454, 454, 454, 454,
- /* 2830 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 391,
- /* 2840 */ 454, 322, 94, 395, 454, 97, 398, 399, 400, 401,
- /* 2850 */ 402, 403, 404, 352, 406, 454, 454, 454, 454, 454,
- /* 2860 */ 454, 360, 454, 454, 454, 454, 365, 454, 367, 454,
- /* 2870 */ 454, 352, 454, 454, 454, 454, 454, 454, 130, 360,
- /* 2880 */ 454, 454, 454, 454, 365, 454, 367, 454, 454, 454,
- /* 2890 */ 454, 454, 391, 454, 454, 454, 395, 322, 454, 398,
- /* 2900 */ 399, 400, 401, 402, 403, 404, 454, 406, 454, 454,
- /* 2910 */ 391, 322, 454, 165, 395, 454, 454, 398, 399, 400,
- /* 2920 */ 401, 402, 403, 404, 454, 406, 454, 352, 454, 454,
- /* 2930 */ 182, 454, 184, 454, 454, 360, 454, 454, 454, 454,
- /* 2940 */ 365, 352, 367, 454, 454, 454, 454, 454, 454, 360,
- /* 2950 */ 454, 454, 454, 454, 365, 454, 367, 454, 454, 454,
- /* 2960 */ 454, 454, 454, 454, 454, 454, 391, 322, 454, 454,
- /* 2970 */ 395, 454, 454, 398, 399, 400, 401, 402, 403, 404,
- /* 2980 */ 391, 406, 454, 322, 395, 454, 454, 398, 399, 400,
- /* 2990 */ 401, 402, 403, 404, 454, 406, 454, 352, 454, 454,
- /* 3000 */ 454, 454, 454, 454, 454, 360, 454, 454, 454, 454,
- /* 3010 */ 365, 454, 367, 352, 454, 454, 454, 454, 454, 454,
- /* 3020 */ 454, 360, 454, 454, 454, 454, 365, 454, 367, 454,
- /* 3030 */ 454, 454, 454, 454, 454, 454, 391, 454, 454, 454,
- /* 3040 */ 395, 454, 454, 398, 399, 400, 401, 402, 403, 404,
- /* 3050 */ 322, 406, 391, 454, 454, 454, 395, 454, 454, 398,
- /* 3060 */ 399, 400, 401, 402, 403, 404, 454, 406, 454, 454,
- /* 3070 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454,
- /* 3080 */ 352, 454, 454, 454, 454, 454, 454, 454, 360, 454,
- /* 3090 */ 454, 454, 454, 365, 454, 367, 454, 454, 454, 454,
- /* 3100 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454,
- /* 3110 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 391,
- /* 3120 */ 454, 454, 454, 395, 454, 454, 398, 399, 400, 401,
- /* 3130 */ 402, 403, 404, 454, 406,
+ /* 220 */ 220, 221, 222, 223, 224, 225, 226, 227, 394, 337,
+ /* 230 */ 96, 3, 398, 325, 162, 401, 402, 403, 404, 405,
+ /* 240 */ 406, 427, 408, 351, 20, 431, 162, 413, 20, 415,
+ /* 250 */ 167, 359, 118, 419, 420, 12, 13, 14, 15, 16,
+ /* 260 */ 446, 447, 229, 108, 356, 451, 452, 133, 134, 370,
+ /* 270 */ 371, 245, 364, 162, 163, 441, 96, 369, 96, 371,
+ /* 280 */ 12, 13, 127, 128, 129, 130, 131, 132, 20, 20,
+ /* 290 */ 22, 96, 20, 325, 342, 343, 162, 163, 325, 333,
+ /* 300 */ 245, 33, 394, 35, 330, 333, 398, 333, 334, 401,
+ /* 310 */ 402, 403, 404, 405, 406, 181, 408, 183, 128, 347,
+ /* 320 */ 107, 413, 355, 415, 356, 97, 58, 419, 420, 161,
+ /* 330 */ 364, 63, 364, 250, 251, 368, 364, 369, 70, 371,
+ /* 340 */ 206, 207, 369, 209, 210, 211, 212, 213, 214, 215,
+ /* 350 */ 216, 217, 218, 219, 220, 221, 222, 223, 224, 225,
+ /* 360 */ 226, 227, 394, 229, 96, 325, 398, 342, 343, 401,
+ /* 370 */ 402, 403, 404, 405, 406, 180, 408, 182, 188, 189,
+ /* 380 */ 96, 413, 192, 415, 194, 339, 118, 419, 420, 423,
+ /* 390 */ 424, 425, 164, 427, 428, 80, 356, 431, 430, 353,
+ /* 400 */ 232, 133, 134, 389, 364, 133, 134, 22, 362, 369,
+ /* 410 */ 242, 371, 446, 447, 12, 13, 14, 451, 452, 371,
+ /* 420 */ 35, 70, 20, 0, 22, 245, 96, 245, 364, 381,
+ /* 430 */ 162, 163, 384, 164, 394, 33, 58, 35, 398, 375,
+ /* 440 */ 245, 401, 402, 403, 404, 405, 406, 108, 408, 181,
+ /* 450 */ 410, 183, 330, 138, 139, 333, 334, 8, 9, 70,
+ /* 460 */ 58, 12, 13, 14, 15, 16, 127, 128, 129, 130,
+ /* 470 */ 131, 132, 70, 95, 206, 207, 98, 209, 210, 211,
+ /* 480 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
+ /* 490 */ 222, 223, 224, 225, 226, 227, 333, 325, 96, 333,
+ /* 500 */ 357, 325, 356, 65, 66, 67, 20, 333, 356, 363,
+ /* 510 */ 347, 73, 74, 347, 357, 363, 78, 79, 372, 325,
+ /* 520 */ 118, 347, 84, 85, 372, 348, 348, 364, 90, 245,
+ /* 530 */ 364, 108, 356, 356, 356, 133, 134, 20, 364, 22,
+ /* 540 */ 364, 369, 365, 365, 21, 369, 97, 371, 12, 13,
+ /* 550 */ 127, 128, 129, 130, 131, 132, 20, 34, 22, 36,
+ /* 560 */ 357, 325, 333, 369, 162, 163, 176, 35, 51, 33,
+ /* 570 */ 394, 35, 333, 333, 398, 245, 347, 401, 402, 403,
+ /* 580 */ 404, 405, 406, 181, 408, 183, 347, 197, 198, 413,
+ /* 590 */ 357, 415, 356, 364, 58, 419, 420, 127, 357, 229,
+ /* 600 */ 364, 231, 70, 364, 364, 369, 70, 371, 206, 207,
+ /* 610 */ 339, 209, 210, 211, 212, 213, 214, 215, 216, 217,
+ /* 620 */ 218, 219, 220, 221, 222, 223, 224, 225, 226, 227,
+ /* 630 */ 394, 356, 96, 362, 398, 348, 63, 401, 402, 403,
+ /* 640 */ 404, 405, 406, 356, 408, 127, 128, 325, 162, 413,
+ /* 650 */ 132, 415, 365, 378, 118, 419, 420, 325, 325, 0,
+ /* 660 */ 190, 191, 422, 423, 424, 425, 430, 427, 428, 133,
+ /* 670 */ 134, 8, 9, 39, 2, 12, 13, 14, 15, 16,
+ /* 680 */ 8, 9, 12, 13, 12, 13, 14, 15, 16, 356,
+ /* 690 */ 20, 369, 22, 337, 333, 333, 379, 364, 162, 163,
+ /* 700 */ 325, 369, 369, 33, 371, 35, 356, 44, 347, 347,
+ /* 710 */ 14, 15, 16, 363, 412, 359, 414, 181, 412, 183,
+ /* 720 */ 414, 62, 372, 357, 356, 364, 364, 394, 58, 349,
+ /* 730 */ 325, 398, 352, 365, 401, 402, 403, 404, 405, 406,
+ /* 740 */ 70, 408, 206, 207, 369, 209, 210, 211, 212, 213,
+ /* 750 */ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+ /* 760 */ 224, 225, 226, 227, 8, 9, 96, 325, 12, 13,
+ /* 770 */ 14, 15, 16, 364, 369, 442, 443, 427, 206, 206,
+ /* 780 */ 18, 431, 20, 400, 375, 333, 357, 325, 118, 27,
+ /* 790 */ 325, 325, 30, 0, 325, 33, 446, 447, 356, 347,
+ /* 800 */ 0, 451, 452, 133, 134, 325, 364, 326, 325, 426,
+ /* 810 */ 48, 369, 50, 371, 21, 53, 364, 24, 25, 26,
+ /* 820 */ 27, 28, 29, 30, 31, 32, 254, 255, 256, 257,
+ /* 830 */ 258, 369, 162, 163, 369, 369, 394, 344, 369, 346,
+ /* 840 */ 398, 333, 333, 401, 402, 403, 404, 405, 406, 369,
+ /* 850 */ 408, 181, 369, 183, 325, 347, 347, 95, 0, 8,
+ /* 860 */ 9, 4, 62, 12, 13, 14, 15, 16, 3, 107,
+ /* 870 */ 20, 20, 364, 364, 400, 325, 206, 207, 244, 209,
+ /* 880 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
+ /* 890 */ 220, 221, 222, 223, 224, 225, 226, 227, 369, 137,
+ /* 900 */ 426, 345, 140, 141, 142, 143, 144, 145, 146, 147,
+ /* 910 */ 148, 149, 150, 151, 152, 153, 154, 155, 156, 369,
+ /* 920 */ 158, 159, 160, 65, 66, 67, 68, 69, 44, 71,
+ /* 930 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ /* 940 */ 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ /* 950 */ 92, 18, 325, 325, 333, 325, 23, 8, 9, 12,
+ /* 960 */ 13, 12, 13, 14, 15, 16, 325, 325, 347, 22,
+ /* 970 */ 37, 38, 333, 411, 41, 366, 414, 455, 369, 20,
+ /* 980 */ 33, 97, 35, 8, 9, 364, 347, 12, 13, 14,
+ /* 990 */ 15, 16, 59, 60, 61, 371, 369, 369, 356, 369,
+ /* 1000 */ 1, 2, 37, 364, 366, 58, 364, 369, 384, 444,
+ /* 1010 */ 369, 369, 63, 371, 164, 164, 44, 70, 109, 110,
+ /* 1020 */ 111, 112, 113, 114, 115, 116, 117, 118, 119, 96,
+ /* 1030 */ 121, 122, 123, 124, 125, 126, 394, 335, 349, 333,
+ /* 1040 */ 398, 352, 356, 401, 402, 403, 404, 405, 406, 366,
+ /* 1050 */ 408, 385, 369, 347, 105, 413, 100, 415, 372, 103,
+ /* 1060 */ 33, 419, 420, 19, 99, 118, 101, 102, 135, 104,
+ /* 1070 */ 364, 438, 430, 108, 333, 48, 0, 33, 22, 45,
+ /* 1080 */ 46, 54, 55, 56, 57, 58, 243, 244, 347, 0,
+ /* 1090 */ 333, 35, 48, 427, 108, 130, 97, 431, 54, 55,
+ /* 1100 */ 56, 57, 58, 246, 347, 364, 173, 174, 175, 333,
+ /* 1110 */ 161, 178, 446, 447, 107, 44, 130, 451, 452, 333,
+ /* 1120 */ 35, 364, 95, 164, 48, 98, 70, 262, 181, 196,
+ /* 1130 */ 183, 356, 199, 347, 201, 202, 203, 204, 205, 95,
+ /* 1140 */ 364, 42, 98, 44, 42, 35, 44, 335, 173, 44,
+ /* 1150 */ 364, 379, 21, 206, 207, 24, 25, 26, 27, 28,
+ /* 1160 */ 29, 30, 31, 32, 157, 218, 219, 220, 221, 222,
+ /* 1170 */ 223, 224, 44, 100, 118, 131, 103, 325, 245, 44,
+ /* 1180 */ 333, 232, 233, 234, 235, 236, 237, 238, 239, 240,
+ /* 1190 */ 241, 242, 165, 166, 347, 168, 0, 0, 171, 423,
+ /* 1200 */ 424, 425, 97, 427, 428, 325, 100, 100, 356, 103,
+ /* 1210 */ 103, 364, 168, 44, 187, 164, 364, 44, 22, 22,
+ /* 1220 */ 169, 369, 44, 371, 58, 97, 133, 134, 47, 185,
+ /* 1230 */ 96, 187, 97, 1, 2, 332, 356, 181, 266, 183,
+ /* 1240 */ 106, 152, 267, 44, 364, 35, 394, 13, 325, 369,
+ /* 1250 */ 398, 371, 379, 401, 402, 403, 404, 405, 406, 44,
+ /* 1260 */ 408, 44, 206, 207, 98, 413, 97, 415, 183, 35,
+ /* 1270 */ 97, 419, 420, 368, 394, 97, 325, 96, 398, 356,
+ /* 1280 */ 70, 401, 402, 403, 404, 405, 406, 364, 408, 429,
+ /* 1290 */ 448, 2, 369, 183, 371, 415, 97, 8, 9, 419,
+ /* 1300 */ 420, 12, 13, 14, 15, 16, 421, 356, 44, 44,
+ /* 1310 */ 432, 44, 97, 247, 97, 364, 44, 394, 13, 325,
+ /* 1320 */ 369, 398, 371, 0, 401, 402, 403, 404, 405, 406,
+ /* 1330 */ 396, 408, 44, 48, 395, 264, 44, 325, 415, 179,
+ /* 1340 */ 35, 387, 419, 420, 42, 394, 376, 20, 379, 398,
+ /* 1350 */ 356, 161, 401, 402, 403, 404, 405, 406, 364, 408,
+ /* 1360 */ 376, 97, 97, 369, 97, 371, 415, 374, 356, 97,
+ /* 1370 */ 419, 420, 49, 20, 333, 333, 364, 376, 374, 374,
+ /* 1380 */ 325, 369, 333, 371, 94, 97, 341, 333, 394, 97,
+ /* 1390 */ 333, 20, 398, 4, 327, 401, 402, 403, 404, 405,
+ /* 1400 */ 406, 407, 408, 409, 410, 327, 394, 20, 19, 391,
+ /* 1410 */ 398, 356, 20, 401, 402, 403, 404, 405, 406, 364,
+ /* 1420 */ 408, 339, 33, 371, 369, 339, 371, 20, 358, 334,
+ /* 1430 */ 339, 334, 386, 325, 52, 339, 333, 48, 369, 369,
+ /* 1440 */ 339, 358, 53, 339, 327, 195, 356, 58, 336, 394,
+ /* 1450 */ 339, 336, 369, 398, 325, 333, 401, 402, 403, 404,
+ /* 1460 */ 405, 406, 337, 408, 356, 453, 454, 397, 398, 399,
+ /* 1470 */ 415, 327, 364, 393, 356, 420, 356, 369, 408, 371,
+ /* 1480 */ 397, 398, 399, 385, 95, 356, 356, 98, 356, 356,
+ /* 1490 */ 369, 408, 356, 364, 385, 356, 356, 356, 369, 356,
+ /* 1500 */ 371, 186, 394, 333, 391, 337, 398, 369, 325, 401,
+ /* 1510 */ 402, 403, 404, 405, 406, 253, 408, 390, 371, 382,
+ /* 1520 */ 252, 379, 333, 394, 379, 427, 369, 398, 369, 431,
+ /* 1530 */ 401, 402, 403, 404, 405, 406, 427, 408, 382, 356,
+ /* 1540 */ 431, 369, 259, 261, 446, 447, 172, 364, 248, 451,
+ /* 1550 */ 452, 443, 369, 364, 371, 446, 447, 260, 435, 440,
+ /* 1560 */ 451, 452, 325, 8, 9, 439, 268, 12, 13, 14,
+ /* 1570 */ 15, 16, 396, 244, 445, 265, 263, 394, 364, 325,
+ /* 1580 */ 456, 398, 434, 437, 401, 402, 403, 404, 405, 406,
+ /* 1590 */ 437, 408, 437, 356, 436, 20, 333, 337, 361, 450,
+ /* 1600 */ 449, 364, 400, 334, 382, 325, 369, 369, 371, 369,
+ /* 1610 */ 356, 369, 423, 424, 425, 361, 427, 428, 364, 166,
+ /* 1620 */ 369, 369, 369, 369, 337, 371, 382, 380, 352, 96,
+ /* 1630 */ 337, 394, 96, 325, 364, 398, 356, 454, 401, 402,
+ /* 1640 */ 403, 404, 405, 406, 364, 408, 418, 369, 394, 369,
+ /* 1650 */ 346, 371, 398, 333, 360, 401, 402, 403, 404, 405,
+ /* 1660 */ 406, 337, 408, 36, 356, 328, 327, 388, 350, 361,
+ /* 1670 */ 338, 350, 364, 392, 394, 350, 325, 369, 398, 371,
+ /* 1680 */ 323, 401, 402, 403, 404, 405, 406, 0, 408, 383,
+ /* 1690 */ 383, 0, 325, 188, 0, 0, 42, 0, 35, 200,
+ /* 1700 */ 35, 35, 394, 35, 200, 0, 398, 356, 35, 401,
+ /* 1710 */ 402, 403, 404, 405, 406, 364, 408, 35, 200, 164,
+ /* 1720 */ 369, 0, 371, 356, 200, 0, 0, 35, 22, 0,
+ /* 1730 */ 183, 364, 181, 35, 0, 385, 369, 0, 371, 177,
+ /* 1740 */ 176, 0, 0, 325, 0, 394, 47, 0, 0, 398,
+ /* 1750 */ 42, 0, 401, 402, 403, 404, 405, 406, 0, 408,
+ /* 1760 */ 0, 394, 0, 0, 0, 398, 0, 0, 401, 402,
+ /* 1770 */ 403, 404, 405, 406, 356, 408, 152, 427, 35, 0,
+ /* 1780 */ 152, 431, 364, 0, 0, 0, 325, 369, 0, 371,
+ /* 1790 */ 0, 0, 0, 0, 0, 0, 446, 447, 0, 0,
+ /* 1800 */ 0, 451, 452, 325, 0, 0, 0, 42, 0, 0,
+ /* 1810 */ 0, 0, 394, 0, 0, 0, 398, 356, 22, 401,
+ /* 1820 */ 402, 403, 404, 405, 406, 364, 408, 0, 0, 136,
+ /* 1830 */ 369, 0, 371, 58, 356, 0, 35, 0, 58, 0,
+ /* 1840 */ 14, 44, 364, 14, 42, 0, 39, 369, 0, 371,
+ /* 1850 */ 47, 0, 40, 0, 0, 394, 325, 39, 39, 398,
+ /* 1860 */ 172, 0, 401, 402, 403, 404, 405, 406, 47, 408,
+ /* 1870 */ 47, 0, 394, 325, 0, 0, 398, 35, 48, 401,
+ /* 1880 */ 402, 403, 404, 405, 406, 39, 408, 356, 64, 0,
+ /* 1890 */ 35, 48, 0, 35, 0, 364, 39, 48, 39, 35,
+ /* 1900 */ 369, 39, 371, 0, 356, 0, 0, 0, 48, 22,
+ /* 1910 */ 0, 35, 364, 35, 35, 22, 35, 369, 35, 371,
+ /* 1920 */ 103, 105, 22, 35, 325, 394, 44, 0, 44, 398,
+ /* 1930 */ 35, 35, 401, 402, 403, 404, 405, 406, 22, 408,
+ /* 1940 */ 0, 325, 394, 22, 0, 22, 398, 50, 35, 401,
+ /* 1950 */ 402, 403, 404, 405, 406, 356, 408, 0, 0, 35,
+ /* 1960 */ 35, 0, 97, 364, 22, 20, 35, 325, 369, 35,
+ /* 1970 */ 371, 193, 356, 96, 0, 0, 35, 22, 0, 0,
+ /* 1980 */ 364, 44, 249, 3, 325, 369, 164, 371, 97, 249,
+ /* 1990 */ 44, 44, 44, 394, 96, 96, 164, 398, 356, 166,
+ /* 2000 */ 401, 402, 403, 404, 405, 406, 364, 408, 164, 184,
+ /* 2010 */ 394, 369, 97, 371, 398, 356, 97, 401, 402, 403,
+ /* 2020 */ 404, 405, 406, 364, 408, 96, 170, 97, 369, 47,
+ /* 2030 */ 371, 96, 96, 47, 96, 325, 394, 3, 44, 35,
+ /* 2040 */ 398, 35, 35, 401, 402, 403, 404, 405, 406, 97,
+ /* 2050 */ 408, 97, 35, 394, 35, 35, 97, 398, 47, 97,
+ /* 2060 */ 401, 402, 403, 404, 405, 406, 356, 408, 44, 47,
+ /* 2070 */ 0, 0, 0, 96, 364, 167, 0, 96, 325, 369,
+ /* 2080 */ 97, 371, 97, 249, 243, 96, 96, 39, 96, 47,
+ /* 2090 */ 106, 165, 2, 44, 325, 228, 230, 228, 96, 22,
+ /* 2100 */ 97, 96, 47, 47, 394, 97, 96, 206, 398, 356,
+ /* 2110 */ 97, 401, 402, 403, 404, 405, 406, 364, 408, 96,
+ /* 2120 */ 22, 96, 369, 97, 371, 356, 208, 96, 107, 97,
+ /* 2130 */ 35, 35, 96, 364, 97, 35, 96, 35, 369, 96,
+ /* 2140 */ 371, 97, 97, 35, 97, 325, 96, 394, 35, 96,
+ /* 2150 */ 120, 398, 22, 120, 401, 402, 403, 404, 405, 406,
+ /* 2160 */ 108, 408, 96, 394, 44, 96, 120, 398, 35, 96,
+ /* 2170 */ 401, 402, 403, 404, 405, 406, 356, 408, 120, 22,
+ /* 2180 */ 64, 63, 35, 35, 364, 35, 35, 35, 325, 369,
+ /* 2190 */ 35, 371, 70, 35, 35, 35, 35, 93, 44, 35,
+ /* 2200 */ 35, 22, 35, 22, 35, 325, 35, 35, 70, 35,
+ /* 2210 */ 35, 35, 35, 35, 394, 22, 0, 35, 398, 356,
+ /* 2220 */ 35, 401, 402, 403, 404, 405, 406, 364, 408, 39,
+ /* 2230 */ 0, 48, 369, 35, 371, 48, 356, 0, 39, 35,
+ /* 2240 */ 48, 39, 0, 35, 364, 48, 39, 0, 35, 369,
+ /* 2250 */ 35, 371, 0, 22, 21, 20, 22, 394, 325, 457,
+ /* 2260 */ 22, 398, 21, 457, 401, 402, 403, 404, 405, 406,
+ /* 2270 */ 457, 408, 457, 457, 394, 325, 457, 457, 398, 457,
+ /* 2280 */ 457, 401, 402, 403, 404, 405, 406, 457, 408, 356,
+ /* 2290 */ 457, 457, 457, 457, 457, 457, 457, 364, 457, 457,
+ /* 2300 */ 457, 457, 369, 457, 371, 457, 356, 457, 457, 457,
+ /* 2310 */ 457, 457, 457, 457, 364, 457, 457, 457, 457, 369,
+ /* 2320 */ 457, 371, 457, 457, 457, 457, 325, 394, 457, 457,
+ /* 2330 */ 457, 398, 457, 457, 401, 402, 403, 404, 405, 406,
+ /* 2340 */ 457, 408, 457, 457, 394, 457, 457, 457, 398, 457,
+ /* 2350 */ 457, 401, 402, 403, 404, 405, 406, 356, 408, 457,
+ /* 2360 */ 457, 457, 457, 457, 457, 364, 457, 457, 457, 457,
+ /* 2370 */ 369, 457, 371, 457, 457, 457, 457, 457, 457, 457,
+ /* 2380 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2390 */ 457, 457, 457, 457, 457, 394, 457, 457, 457, 398,
+ /* 2400 */ 457, 457, 401, 402, 403, 404, 405, 406, 457, 408,
+ /* 2410 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2420 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2430 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2440 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2450 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2460 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2470 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2480 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2490 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2500 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2510 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2520 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2530 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2540 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2550 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2560 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2570 */ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ /* 2580 */ 457, 457, 457, 457, 457,
};
-#define YY_SHIFT_COUNT (704)
+#define YY_SHIFT_COUNT (709)
#define YY_SHIFT_MIN (0)
-#define YY_SHIFT_MAX (2748)
+#define YY_SHIFT_MAX (2252)
static const unsigned short int yy_shift_ofst[] = {
- /* 0 */ 1159, 0, 132, 264, 132, 396, 396, 396, 528, 396,
- /* 10 */ 396, 396, 396, 396, 660, 792, 792, 924, 792, 792,
- /* 20 */ 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
- /* 30 */ 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
- /* 40 */ 792, 792, 792, 792, 792, 792, 48, 227, 170, 61,
- /* 50 */ 82, 43, 45, 43, 170, 170, 1568, 1568, 43, 1568,
- /* 60 */ 1568, 62, 43, 127, 127, 168, 59, 59, 52, 127,
- /* 70 */ 127, 127, 127, 127, 127, 127, 127, 127, 127, 210,
- /* 80 */ 127, 127, 127, 276, 127, 127, 305, 127, 127, 305,
- /* 90 */ 338, 127, 305, 305, 305, 127, 367, 223, 621, 621,
- /* 100 */ 98, 230, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166,
- /* 110 */ 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166,
- /* 120 */ 1166, 736, 494, 168, 52, 510, 510, 534, 131, 768,
- /* 130 */ 398, 398, 566, 566, 566, 131, 436, 436, 436, 447,
- /* 140 */ 276, 625, 625, 406, 305, 305, 651, 651, 447, 657,
- /* 150 */ 780, 780, 780, 780, 780, 780, 780, 2748, 960, 205,
- /* 160 */ 121, 293, 256, 372, 156, 498, 559, 66, 802, 450,
- /* 170 */ 860, 822, 671, 881, 823, 671, 897, 749, 827, 967,
- /* 180 */ 1169, 1044, 1188, 1217, 1188, 1088, 1225, 1225, 1188, 1088,
- /* 190 */ 1088, 1163, 1225, 1225, 1225, 1250, 1250, 1256, 210, 276,
- /* 200 */ 210, 1261, 1267, 210, 1261, 210, 210, 210, 1225, 210,
- /* 210 */ 1251, 1251, 1250, 305, 305, 305, 305, 305, 305, 305,
- /* 220 */ 305, 305, 305, 305, 1225, 1250, 651, 1122, 1256, 367,
- /* 230 */ 1135, 276, 367, 1225, 1225, 1261, 367, 1092, 651, 651,
- /* 240 */ 651, 651, 1092, 651, 1173, 367, 447, 367, 436, 1217,
- /* 250 */ 1217, 651, 1097, 1092, 651, 651, 1097, 1092, 651, 651,
- /* 260 */ 305, 1095, 1180, 1097, 1104, 1145, 1149, 967, 1134, 1141,
- /* 270 */ 1147, 1164, 436, 1390, 1316, 1319, 651, 657, 1225, 367,
- /* 280 */ 1382, 1250, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 1085,
- /* 290 */ 358, 23, 54, 183, 374, 688, 424, 638, 654, 549,
- /* 300 */ 774, 774, 774, 774, 774, 774, 774, 774, 774, 584,
- /* 310 */ 409, 307, 759, 782, 782, 226, 564, 14, 468, 393,
- /* 320 */ 75, 329, 480, 75, 75, 75, 714, 643, 896, 978,
- /* 330 */ 146, 36, 932, 946, 952, 958, 1046, 1087, 1090, 280,
- /* 340 */ 901, 892, 926, 975, 1007, 1018, 1020, 1021, 963, 947,
- /* 350 */ 986, 1098, 1022, 349, 1045, 1029, 1058, 1093, 1083, 1137,
- /* 360 */ 1138, 1140, 1142, 1143, 1144, 1003, 1177, 1178, 1157, 1193,
- /* 370 */ 1456, 1457, 1273, 1459, 1462, 1421, 1464, 1430, 1269, 1432,
- /* 380 */ 1433, 1434, 1274, 1472, 1438, 1439, 1279, 1477, 1281, 1481,
- /* 390 */ 1454, 1492, 1471, 1494, 1461, 1318, 1322, 1503, 1505, 1333,
- /* 400 */ 1335, 1509, 1512, 1467, 1514, 1515, 1516, 1475, 1519, 1520,
- /* 410 */ 1521, 1522, 1524, 1526, 1527, 1528, 1380, 1496, 1532, 1384,
- /* 420 */ 1535, 1536, 1544, 1546, 1547, 1548, 1550, 1551, 1552, 1554,
- /* 430 */ 1555, 1563, 1565, 1566, 1570, 1530, 1573, 1574, 1578, 1579,
- /* 440 */ 1584, 1564, 1585, 1591, 1592, 1593, 1533, 1594, 1538, 1596,
- /* 450 */ 1540, 1599, 1600, 1562, 1567, 1559, 1575, 1571, 1595, 1572,
- /* 460 */ 1605, 1576, 1569, 1610, 1611, 1612, 1580, 1444, 1614, 1621,
- /* 470 */ 1623, 1561, 1626, 1627, 1597, 1582, 1601, 1630, 1598, 1587,
- /* 480 */ 1603, 1631, 1604, 1588, 1606, 1638, 1609, 1602, 1608, 1648,
- /* 490 */ 1651, 1652, 1660, 1558, 1586, 1628, 1642, 1665, 1634, 1635,
- /* 500 */ 1659, 1649, 1655, 1643, 1653, 1657, 1662, 1669, 1663, 1695,
- /* 510 */ 1677, 1700, 1679, 1654, 1702, 1682, 1670, 1706, 1673, 1707,
- /* 520 */ 1674, 1710, 1689, 1692, 1618, 1620, 1716, 1556, 1683, 1719,
- /* 530 */ 1539, 1701, 1577, 1581, 1722, 1724, 1590, 1583, 1729, 1725,
- /* 540 */ 1733, 1734, 1632, 1633, 1696, 1704, 1545, 1730, 1641, 1613,
- /* 550 */ 1645, 1737, 1703, 1607, 1646, 1640, 1697, 1711, 1541, 1543,
- /* 560 */ 1557, 1712, 1501, 1658, 1661, 1678, 1680, 1684, 1686, 1715,
- /* 570 */ 1694, 1698, 1699, 1705, 1708, 1732, 1745, 1746, 1713, 1752,
- /* 580 */ 1553, 1709, 1714, 1793, 1754, 1615, 1766, 1767, 1768, 1772,
- /* 590 */ 1774, 1777, 1718, 1720, 1769, 1616, 1775, 1771, 1773, 1818,
- /* 600 */ 1799, 1619, 1728, 1731, 1735, 1736, 1738, 1739, 1779, 1741,
- /* 610 */ 1743, 1780, 1744, 1806, 1624, 1748, 1749, 1755, 1796, 1804,
- /* 620 */ 1762, 1764, 1807, 1763, 1770, 1830, 1776, 1778, 1833, 1781,
- /* 630 */ 1782, 1837, 1784, 1751, 1756, 1758, 1761, 1851, 1783, 1786,
- /* 640 */ 1789, 1850, 1791, 1844, 1844, 1866, 1826, 1687, 1857, 1859,
- /* 650 */ 1860, 1864, 1878, 1879, 1880, 1881, 1882, 1883, 1765, 1827,
- /* 660 */ 1885, 1886, 1888, 1902, 1901, 1916, 1904, 1905, 1907, 1874,
- /* 670 */ 1643, 1909, 1653, 1910, 1911, 1912, 1913, 1928, 1917, 1953,
- /* 680 */ 1922, 1918, 1929, 1967, 1934, 1925, 1935, 1973, 1940, 1930,
- /* 690 */ 1937, 1979, 1946, 1936, 1943, 1985, 1951, 1961, 1997, 1976,
- /* 700 */ 1978, 1981, 1982, 1980, 1986,
+ /* 0 */ 933, 0, 134, 0, 268, 268, 268, 268, 268, 268,
+ /* 10 */ 268, 268, 268, 402, 536, 536, 670, 536, 536, 536,
+ /* 20 */ 536, 536, 536, 536, 536, 536, 536, 536, 536, 536,
+ /* 30 */ 536, 536, 536, 536, 536, 536, 536, 536, 536, 536,
+ /* 40 */ 536, 536, 536, 536, 536, 536, 55, 180, 65, 195,
+ /* 50 */ 26, 284, 330, 284, 65, 65, 947, 947, 284, 947,
+ /* 60 */ 947, 182, 284, 39, 39, 128, 128, 111, 272, 42,
+ /* 70 */ 42, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ /* 80 */ 39, 31, 39, 39, 105, 39, 137, 39, 39, 188,
+ /* 90 */ 39, 39, 188, 39, 188, 188, 188, 39, 140, 762,
+ /* 100 */ 949, 949, 438, 1131, 1056, 1056, 1056, 1056, 1056, 1056,
+ /* 110 */ 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056,
+ /* 120 */ 1056, 1056, 1056, 965, 228, 111, 272, 659, 532, 269,
+ /* 130 */ 269, 269, 800, 370, 370, 532, 224, 224, 224, 213,
+ /* 140 */ 137, 33, 188, 351, 188, 351, 351, 213, 389, 909,
+ /* 150 */ 909, 909, 909, 909, 909, 909, 1044, 36, 793, 851,
+ /* 160 */ 975, 572, 115, 83, 72, 84, 517, 850, 1034, 986,
+ /* 170 */ 959, 843, 634, 865, 843, 1099, 857, 486, 1066, 1285,
+ /* 180 */ 1160, 1302, 1327, 1302, 1190, 1353, 1353, 1302, 1190, 1190,
+ /* 190 */ 1290, 1353, 1353, 1353, 1371, 1371, 1387, 31, 137, 31,
+ /* 200 */ 1392, 1407, 31, 1392, 31, 31, 31, 1353, 31, 1382,
+ /* 210 */ 1382, 1371, 188, 188, 188, 188, 188, 188, 188, 188,
+ /* 220 */ 188, 188, 188, 1353, 1371, 351, 351, 1250, 1387, 140,
+ /* 230 */ 1315, 137, 140, 1353, 1327, 1327, 351, 1262, 1268, 351,
+ /* 240 */ 1262, 1268, 351, 351, 188, 1283, 1374, 1262, 1282, 1297,
+ /* 250 */ 1300, 1066, 1298, 1310, 1313, 1329, 224, 1575, 1353, 1392,
+ /* 260 */ 140, 1268, 351, 351, 351, 351, 351, 1268, 351, 1453,
+ /* 270 */ 140, 213, 140, 224, 1533, 1536, 351, 389, 1353, 140,
+ /* 280 */ 1627, 1371, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ /* 290 */ 2410, 858, 1027, 23, 1389, 52, 663, 449, 155, 672,
+ /* 300 */ 1289, 1555, 423, 756, 756, 756, 756, 756, 756, 756,
+ /* 310 */ 756, 756, 339, 190, 243, 243, 390, 378, 315, 523,
+ /* 320 */ 470, 518, 518, 696, 999, 168, 696, 696, 696, 884,
+ /* 330 */ 1076, 385, 1102, 1007, 1089, 956, 1073, 1106, 1107, 16,
+ /* 340 */ 1196, 1197, 1166, 1105, 1128, 1093, 1071, 972, 1051, 1135,
+ /* 350 */ 1169, 1173, 1178, 1199, 1232, 1215, 1085, 1110, 573, 1217,
+ /* 360 */ 1181, 1264, 1265, 1267, 1272, 1288, 1292, 1134, 1234, 1305,
+ /* 370 */ 1210, 1323, 1687, 1691, 1505, 1694, 1695, 1654, 1697, 1663,
+ /* 380 */ 1499, 1665, 1666, 1668, 1504, 1705, 1673, 1682, 1518, 1721,
+ /* 390 */ 1524, 1725, 1692, 1726, 1706, 1729, 1698, 1547, 1551, 1734,
+ /* 400 */ 1737, 1562, 1564, 1741, 1742, 1699, 1744, 1747, 1748, 1708,
+ /* 410 */ 1751, 1758, 1760, 1762, 1763, 1764, 1766, 1767, 1624, 1743,
+ /* 420 */ 1779, 1628, 1783, 1784, 1785, 1788, 1790, 1791, 1792, 1793,
+ /* 430 */ 1794, 1795, 1798, 1799, 1800, 1804, 1805, 1765, 1806, 1808,
+ /* 440 */ 1809, 1810, 1811, 1796, 1813, 1814, 1815, 1693, 1827, 1828,
+ /* 450 */ 1801, 1831, 1775, 1835, 1780, 1837, 1839, 1802, 1807, 1797,
+ /* 460 */ 1803, 1826, 1821, 1829, 1823, 1845, 1812, 1818, 1848, 1851,
+ /* 470 */ 1853, 1819, 1688, 1854, 1861, 1871, 1824, 1874, 1875, 1842,
+ /* 480 */ 1830, 1846, 1889, 1855, 1843, 1857, 1892, 1858, 1849, 1859,
+ /* 490 */ 1894, 1864, 1860, 1862, 1903, 1905, 1906, 1907, 1816, 1817,
+ /* 500 */ 1876, 1887, 1910, 1878, 1879, 1893, 1881, 1883, 1882, 1884,
+ /* 510 */ 1888, 1895, 1900, 1896, 1927, 1916, 1940, 1921, 1897, 1944,
+ /* 520 */ 1923, 1913, 1957, 1924, 1958, 1925, 1961, 1942, 1945, 1931,
+ /* 530 */ 1934, 1778, 1865, 1877, 1974, 1822, 1941, 1975, 1825, 1955,
+ /* 540 */ 1832, 1833, 1978, 1979, 1844, 1856, 1980, 1937, 1733, 1898,
+ /* 550 */ 1891, 1899, 1915, 1946, 1919, 1929, 1935, 1936, 1930, 1947,
+ /* 560 */ 1982, 1986, 1938, 1948, 1740, 1952, 1954, 2034, 1994, 1834,
+ /* 570 */ 2004, 2006, 2007, 2017, 2019, 2020, 1959, 1962, 2011, 1841,
+ /* 580 */ 2024, 2022, 2070, 2071, 2072, 1977, 1983, 1985, 1981, 1989,
+ /* 590 */ 1908, 1990, 2076, 2048, 1926, 1992, 1984, 1803, 2042, 2049,
+ /* 600 */ 1867, 1866, 1869, 2090, 2077, 1901, 2002, 2003, 2005, 2008,
+ /* 610 */ 2010, 2013, 2055, 2023, 2025, 2056, 2026, 2098, 1918, 2031,
+ /* 620 */ 2021, 2032, 2095, 2096, 2036, 2037, 2100, 2040, 2044, 2102,
+ /* 630 */ 2043, 2045, 2108, 2050, 2047, 2113, 2053, 2030, 2033, 2046,
+ /* 640 */ 2058, 2130, 2052, 2066, 2120, 2069, 2133, 2073, 2120, 2120,
+ /* 650 */ 2157, 2116, 2118, 2147, 2148, 2150, 2151, 2152, 2155, 2158,
+ /* 660 */ 2159, 2160, 2161, 2122, 2104, 2154, 2164, 2165, 2179, 2167,
+ /* 670 */ 2181, 2169, 2171, 2172, 2138, 1882, 2174, 1884, 2175, 2176,
+ /* 680 */ 2177, 2178, 2193, 2182, 2216, 2185, 2183, 2190, 2230, 2198,
+ /* 690 */ 2187, 2199, 2237, 2204, 2192, 2202, 2242, 2208, 2197, 2207,
+ /* 700 */ 2247, 2213, 2215, 2252, 2231, 2233, 2234, 2238, 2241, 2235,
};
-#define YY_REDUCE_COUNT (288)
-#define YY_REDUCE_MIN (-357)
-#define YY_REDUCE_MAX (2728)
+#define YY_REDUCE_COUNT (290)
+#define YY_REDUCE_MIN (-422)
+#define YY_REDUCE_MAX (2001)
static const short yy_reduce_ofst[] = {
- /* 0 */ 116, -321, 363, 862, 675, 973, 1028, 1084, 1139, 1158,
- /* 10 */ 1255, 1276, 1361, 1446, 1502, 1531, 1560, 1589, 1656, 1672,
- /* 20 */ 1727, 1747, 1812, 1870, 1884, 1942, 1956, 2009, 2064, 2080,
- /* 30 */ 2135, 2151, 2207, 2223, 2279, 2295, 2362, 2387, 2448, 2501,
- /* 40 */ 2519, 2575, 2589, 2645, 2661, 2728, -323, -334, 171, -275,
- /* 50 */ -155, 2, 123, 134, 698, 868, -335, 560, -130, 233,
- /* 60 */ 327, -133, -1, -322, 473, -347, -326, -312, -357, -319,
- /* 70 */ -188, 215, 356, 364, 470, 481, 488, 502, 578, -110,
- /* 80 */ 583, 598, 604, -99, 619, 631, -277, 687, 693, -166,
- /* 90 */ 102, 709, 58, -85, 105, 729, -291, -211, -302, -302,
- /* 100 */ -296, 11, -204, -42, 178, 203, 224, 266, 279, 300,
- /* 110 */ 319, 434, 437, 456, 463, 577, 588, 600, 608, 610,
- /* 120 */ 611, 42, 108, 195, -121, -298, 70, 106, 122, 309,
- /* 130 */ 142, 397, 108, 274, 411, 310, -356, 400, 446, 427,
- /* 140 */ 539, 465, 536, 568, 555, 337, 606, 620, 639, 587,
- /* 150 */ -310, 641, 752, 753, 754, 757, 758, 591, 783, 803,
- /* 160 */ 740, 673, 738, 863, 760, 847, 847, 871, 828, 875,
- /* 170 */ 841, 831, 781, 781, 764, 781, 791, 786, 847, 830,
- /* 180 */ 829, 839, 859, 867, 872, 873, 917, 918, 878, 882,
- /* 190 */ 885, 914, 928, 929, 939, 948, 953, 889, 949, 915,
- /* 200 */ 950, 904, 910, 961, 906, 962, 964, 965, 968, 966,
- /* 210 */ 971, 972, 981, 954, 955, 956, 957, 959, 969, 970,
- /* 220 */ 974, 976, 980, 983, 982, 989, 945, 925, 927, 984,
- /* 230 */ 931, 987, 990, 994, 997, 938, 1004, 985, 977, 988,
- /* 240 */ 991, 1000, 1005, 1001, 1002, 1006, 995, 1012, 1025, 992,
- /* 250 */ 1014, 1016, 979, 1009, 1017, 1027, 999, 1019, 1031, 1033,
- /* 260 */ 847, 911, 1011, 1008, 1010, 993, 1023, 1015, 951, 1013,
- /* 270 */ 1024, 781, 1049, 1038, 996, 1059, 1051, 1075, 1091, 1089,
- /* 280 */ 1099, 1096, 1052, 1056, 1094, 1102, 1106, 1116, 1133,
+ /* 0 */ -186, -325, -226, -166, -32, 236, 642, -92, 176, 852,
+ /* 10 */ 880, 923, 951, 994, 333, 1012, 1055, 1108, 1129, 1183,
+ /* 20 */ 1237, 40, 1254, 1308, 442, 1280, 1351, 1367, 1418, 1461,
+ /* 30 */ 1478, 1531, 1548, 1599, 1616, 1642, 1659, 1710, 1753, 1769,
+ /* 40 */ 1820, 1863, 1880, 1933, 1950, 2001, -34, 350, 240, -340,
+ /* 50 */ 666, 1098, 1109, 1350, 776, 1189, 1070, 1083, -422, -326,
+ /* 60 */ -269, -410, -287, -206, -163, -328, -321, -350, -352, -26,
+ /* 70 */ 122, -307, -28, 163, 166, 174, 229, 239, 361, 362,
+ /* 80 */ 452, 46, 508, 621, -251, 639, 48, 706, 741, 177,
+ /* 90 */ 757, 786, 146, 847, 178, 152, 287, 509, -108, -299,
+ /* 100 */ -221, -221, -338, -207, -27, 172, 194, 322, 332, 375,
+ /* 110 */ 405, 462, 465, 466, 469, 480, 483, 529, 550, 627,
+ /* 120 */ 628, 630, 641, -33, -303, 275, -101, 271, -48, -303,
+ /* 130 */ 383, 474, 356, 302, 306, 25, -222, 64, 409, 380,
+ /* 140 */ 624, 562, 368, 609, 686, 638, 683, 689, 493, 143,
+ /* 150 */ 157, 203, 233, 241, 366, 429, 14, 556, 481, 317,
+ /* 160 */ 522, 565, 702, 633, 775, 775, 812, 772, 903, 905,
+ /* 170 */ 873, 860, 860, 842, 860, 885, 878, 775, 934, 939,
+ /* 180 */ 954, 970, 969, 984, 993, 1041, 1042, 1001, 1004, 1005,
+ /* 190 */ 1045, 1049, 1054, 1057, 1067, 1078, 1018, 1082, 1052, 1086,
+ /* 200 */ 1095, 1046, 1091, 1097, 1096, 1101, 1104, 1103, 1111, 1112,
+ /* 210 */ 1115, 1117, 1090, 1118, 1120, 1130, 1132, 1133, 1136, 1139,
+ /* 220 */ 1140, 1141, 1143, 1122, 1144, 1069, 1121, 1080, 1113, 1125,
+ /* 230 */ 1127, 1147, 1168, 1170, 1142, 1145, 1138, 1146, 1137, 1157,
+ /* 240 */ 1153, 1156, 1159, 1172, 775, 1119, 1126, 1155, 1158, 1123,
+ /* 250 */ 1148, 1176, 1124, 1149, 1151, 860, 1214, 1202, 1263, 1269,
+ /* 260 */ 1260, 1222, 1238, 1240, 1242, 1251, 1252, 1244, 1253, 1247,
+ /* 270 */ 1287, 1276, 1293, 1270, 1228, 1294, 1278, 1304, 1320, 1324,
+ /* 280 */ 1337, 1339, 1279, 1281, 1306, 1307, 1318, 1321, 1325, 1332,
+ /* 290 */ 1357,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 10 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 20 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 30 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 40 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 50 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 60 */ 1582, 1582, 1582, 1582, 1582, 1835, 1582, 1582, 1582, 1582,
- /* 70 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1658,
- /* 80 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 90 */ 1582, 1582, 1582, 1582, 1582, 1582, 1656, 1828, 2025, 1582,
- /* 100 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 110 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 120 */ 1582, 1582, 2037, 1582, 1582, 1582, 1582, 1658, 1582, 1656,
- /* 130 */ 1997, 1997, 2037, 2037, 2037, 1582, 1582, 1582, 1582, 1767,
- /* 140 */ 1582, 1877, 1877, 1582, 1582, 1582, 1582, 1582, 1767, 1582,
- /* 150 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1871, 1582, 1582,
- /* 160 */ 2062, 2115, 1582, 1582, 2065, 1582, 1582, 1582, 1840, 1582,
- /* 170 */ 1720, 2052, 2029, 2043, 2099, 2030, 2027, 2046, 1582, 2056,
- /* 180 */ 1582, 1864, 1833, 1582, 1833, 1830, 1582, 1582, 1833, 1830,
- /* 190 */ 1830, 1711, 1582, 1582, 1582, 1582, 1582, 1582, 1658, 1582,
- /* 200 */ 1658, 1582, 1582, 1658, 1582, 1658, 1658, 1658, 1582, 1658,
- /* 210 */ 1637, 1637, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 220 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1884, 1582, 1656,
- /* 230 */ 1873, 1582, 1656, 1582, 1582, 1582, 1656, 2070, 1582, 1582,
- /* 240 */ 1582, 1582, 2070, 1582, 1582, 1656, 1582, 1656, 1582, 1582,
- /* 250 */ 1582, 1582, 2072, 2070, 1582, 1582, 2072, 2070, 1582, 1582,
- /* 260 */ 1582, 2084, 2080, 2072, 2088, 2086, 2058, 2056, 2118, 2105,
- /* 270 */ 2101, 2043, 1582, 1582, 1582, 1736, 1582, 1582, 1582, 1656,
- /* 280 */ 1614, 1582, 1866, 1877, 1770, 1770, 1770, 1659, 1587, 1582,
- /* 290 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 300 */ 1953, 1582, 2083, 2082, 2001, 2000, 1999, 1990, 1952, 1582,
- /* 310 */ 1732, 1582, 1582, 1951, 1950, 1582, 1582, 1582, 1582, 1582,
- /* 320 */ 1944, 1582, 1582, 1945, 1943, 1942, 1582, 1582, 1582, 1582,
- /* 330 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 340 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 2102,
- /* 350 */ 2106, 2026, 1582, 1582, 1582, 1582, 1582, 1935, 1926, 1582,
- /* 360 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 370 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 380 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 390 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 400 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 410 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 420 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 430 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 440 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 450 */ 1582, 1582, 1582, 1582, 1582, 1619, 1582, 1582, 1582, 1582,
- /* 460 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 470 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 480 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 490 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 500 */ 1582, 1582, 1582, 1698, 1697, 1582, 1582, 1582, 1582, 1582,
- /* 510 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 520 */ 1582, 1582, 1582, 1582, 1934, 1582, 1582, 1582, 1582, 1582,
- /* 530 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 2098, 1582,
- /* 540 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1881, 1582, 1582,
- /* 550 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1987, 1582, 1582,
- /* 560 */ 1582, 2059, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 570 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1926, 1582, 2081,
- /* 580 */ 1582, 1582, 2096, 1582, 2100, 1582, 1582, 1582, 1582, 1582,
- /* 590 */ 1582, 1582, 2036, 2032, 1582, 1582, 2028, 1925, 1582, 2021,
- /* 600 */ 1582, 1582, 1972, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 610 */ 1582, 1582, 1934, 1582, 1938, 1582, 1582, 1582, 1582, 1582,
- /* 620 */ 1764, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 630 */ 1582, 1582, 1582, 1749, 1747, 1746, 1745, 1582, 1742, 1582,
- /* 640 */ 1582, 1582, 1582, 1773, 1772, 1582, 1582, 1582, 1582, 1582,
- /* 650 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 660 */ 1678, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 670 */ 1669, 1582, 1668, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 680 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 690 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
- /* 700 */ 1582, 1582, 1582, 1582, 1582,
+ /* 0 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 10 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 20 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 30 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 40 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 50 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 60 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1849, 1592, 1592,
+ /* 70 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 80 */ 1592, 1670, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 90 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1668, 1842,
+ /* 100 */ 2039, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 110 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 120 */ 1592, 1592, 1592, 1592, 2051, 1592, 1592, 1670, 1592, 2051,
+ /* 130 */ 2051, 2051, 1668, 2011, 2011, 1592, 1592, 1592, 1592, 1779,
+ /* 140 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1779, 1592, 1592,
+ /* 150 */ 1592, 1592, 1592, 1592, 1592, 1592, 1886, 1592, 1592, 2076,
+ /* 160 */ 2129, 1592, 1592, 2079, 1592, 1592, 1592, 1854, 1592, 1732,
+ /* 170 */ 2066, 2043, 2057, 2113, 2044, 2041, 2060, 1592, 2070, 1592,
+ /* 180 */ 1879, 1847, 1592, 1847, 1844, 1592, 1592, 1847, 1844, 1844,
+ /* 190 */ 1723, 1592, 1592, 1592, 1592, 1592, 1592, 1670, 1592, 1670,
+ /* 200 */ 1592, 1592, 1670, 1592, 1670, 1670, 1670, 1592, 1670, 1649,
+ /* 210 */ 1649, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 220 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1899, 1592, 1668,
+ /* 230 */ 1888, 1592, 1668, 1592, 1592, 1592, 1592, 2086, 2084, 1592,
+ /* 240 */ 2086, 2084, 1592, 1592, 1592, 2098, 2094, 2086, 2102, 2100,
+ /* 250 */ 2072, 2070, 2132, 2119, 2115, 2057, 1592, 1592, 1592, 1592,
+ /* 260 */ 1668, 2084, 1592, 1592, 1592, 1592, 1592, 2084, 1592, 1592,
+ /* 270 */ 1668, 1592, 1668, 1592, 1592, 1748, 1592, 1592, 1592, 1668,
+ /* 280 */ 1624, 1592, 1881, 1892, 1864, 1864, 1782, 1782, 1782, 1671,
+ /* 290 */ 1597, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 300 */ 1592, 1592, 1592, 2097, 2096, 1967, 1592, 2015, 2014, 2013,
+ /* 310 */ 2004, 1966, 1744, 1592, 1965, 1964, 1592, 1592, 1592, 1592,
+ /* 320 */ 1592, 1860, 1859, 1958, 1592, 1592, 1959, 1957, 1956, 1592,
+ /* 330 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 340 */ 1592, 1592, 1592, 1592, 1592, 1592, 2116, 2120, 1592, 1592,
+ /* 350 */ 1592, 1592, 1592, 1592, 2040, 1592, 1592, 1592, 1592, 1592,
+ /* 360 */ 1941, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 370 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 380 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 390 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 400 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 410 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 420 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 430 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 440 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 450 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1629,
+ /* 460 */ 1946, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 470 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 480 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 490 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 500 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1710, 1709,
+ /* 510 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 520 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 530 */ 1592, 1592, 1949, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 540 */ 1592, 1592, 1592, 1592, 1592, 1592, 2112, 2073, 1592, 1592,
+ /* 550 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 560 */ 1592, 1941, 1592, 2095, 1592, 1592, 2110, 1592, 2114, 1592,
+ /* 570 */ 1592, 1592, 1592, 1592, 1592, 1592, 2050, 2046, 1592, 1592,
+ /* 580 */ 2042, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 590 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1940, 1592, 2001,
+ /* 600 */ 1592, 1592, 1592, 2035, 1592, 1592, 1986, 1592, 1592, 1592,
+ /* 610 */ 1592, 1592, 1592, 1592, 1592, 1592, 1949, 1592, 1952, 1592,
+ /* 620 */ 1592, 1592, 1592, 1592, 1776, 1592, 1592, 1592, 1592, 1592,
+ /* 630 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1761, 1759, 1758,
+ /* 640 */ 1757, 1592, 1754, 1592, 1789, 1592, 1592, 1592, 1785, 1784,
+ /* 650 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 660 */ 1592, 1592, 1592, 1592, 1592, 1690, 1592, 1592, 1592, 1592,
+ /* 670 */ 1592, 1592, 1592, 1592, 1592, 1681, 1592, 1680, 1592, 1592,
+ /* 680 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 690 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ /* 700 */ 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -1093,6 +966,7 @@ static const YYCODETYPE yyFallback[] = {
0, /* TO => nothing */
0, /* REVOKE => nothing */
0, /* FROM => nothing */
+ 0, /* SUBSCRIBE => nothing */
0, /* NK_COMMA => nothing */
0, /* READ => nothing */
0, /* WRITE => nothing */
@@ -1181,9 +1055,11 @@ static const YYCODETYPE yyFallback[] = {
0, /* ROLLUP => nothing */
0, /* TTL => nothing */
0, /* SMA => nothing */
+ 0, /* DELETE_MARK => nothing */
0, /* FIRST => nothing */
0, /* LAST => nothing */
0, /* SHOW => nothing */
+ 0, /* PRIVILEGES => nothing */
0, /* DATABASES => nothing */
0, /* TABLES => nothing */
0, /* STABLES => nothing */
@@ -1275,7 +1151,7 @@ static const YYCODETYPE yyFallback[] = {
0, /* COUNT => nothing */
0, /* LAST_ROW => nothing */
0, /* CASE => nothing */
- 266, /* END => ABORT */
+ 269, /* END => ABORT */
0, /* WHEN => nothing */
0, /* THEN => nothing */
0, /* ELSE => nothing */
@@ -1317,58 +1193,58 @@ static const YYCODETYPE yyFallback[] = {
0, /* ASC => nothing */
0, /* NULLS => nothing */
0, /* ABORT => nothing */
- 266, /* AFTER => ABORT */
- 266, /* ATTACH => ABORT */
- 266, /* BEFORE => ABORT */
- 266, /* BEGIN => ABORT */
- 266, /* BITAND => ABORT */
- 266, /* BITNOT => ABORT */
- 266, /* BITOR => ABORT */
- 266, /* BLOCKS => ABORT */
- 266, /* CHANGE => ABORT */
- 266, /* COMMA => ABORT */
- 266, /* COMPACT => ABORT */
- 266, /* CONCAT => ABORT */
- 266, /* CONFLICT => ABORT */
- 266, /* COPY => ABORT */
- 266, /* DEFERRED => ABORT */
- 266, /* DELIMITERS => ABORT */
- 266, /* DETACH => ABORT */
- 266, /* DIVIDE => ABORT */
- 266, /* DOT => ABORT */
- 266, /* EACH => ABORT */
- 266, /* FAIL => ABORT */
- 266, /* FILE => ABORT */
- 266, /* FOR => ABORT */
- 266, /* GLOB => ABORT */
- 266, /* ID => ABORT */
- 266, /* IMMEDIATE => ABORT */
- 266, /* IMPORT => ABORT */
- 266, /* INITIALLY => ABORT */
- 266, /* INSTEAD => ABORT */
- 266, /* ISNULL => ABORT */
- 266, /* KEY => ABORT */
- 266, /* MODULES => ABORT */
- 266, /* NK_BITNOT => ABORT */
- 266, /* NK_SEMI => ABORT */
- 266, /* NOTNULL => ABORT */
- 266, /* OF => ABORT */
- 266, /* PLUS => ABORT */
- 266, /* PRIVILEGE => ABORT */
- 266, /* RAISE => ABORT */
- 266, /* REPLACE => ABORT */
- 266, /* RESTRICT => ABORT */
- 266, /* ROW => ABORT */
- 266, /* SEMI => ABORT */
- 266, /* STAR => ABORT */
- 266, /* STATEMENT => ABORT */
- 266, /* STRING => ABORT */
- 266, /* TIMES => ABORT */
- 266, /* UPDATE => ABORT */
- 266, /* VALUES => ABORT */
- 266, /* VARIABLE => ABORT */
- 266, /* VIEW => ABORT */
- 266, /* WAL => ABORT */
+ 269, /* AFTER => ABORT */
+ 269, /* ATTACH => ABORT */
+ 269, /* BEFORE => ABORT */
+ 269, /* BEGIN => ABORT */
+ 269, /* BITAND => ABORT */
+ 269, /* BITNOT => ABORT */
+ 269, /* BITOR => ABORT */
+ 269, /* BLOCKS => ABORT */
+ 269, /* CHANGE => ABORT */
+ 269, /* COMMA => ABORT */
+ 269, /* COMPACT => ABORT */
+ 269, /* CONCAT => ABORT */
+ 269, /* CONFLICT => ABORT */
+ 269, /* COPY => ABORT */
+ 269, /* DEFERRED => ABORT */
+ 269, /* DELIMITERS => ABORT */
+ 269, /* DETACH => ABORT */
+ 269, /* DIVIDE => ABORT */
+ 269, /* DOT => ABORT */
+ 269, /* EACH => ABORT */
+ 269, /* FAIL => ABORT */
+ 269, /* FILE => ABORT */
+ 269, /* FOR => ABORT */
+ 269, /* GLOB => ABORT */
+ 269, /* ID => ABORT */
+ 269, /* IMMEDIATE => ABORT */
+ 269, /* IMPORT => ABORT */
+ 269, /* INITIALLY => ABORT */
+ 269, /* INSTEAD => ABORT */
+ 269, /* ISNULL => ABORT */
+ 269, /* KEY => ABORT */
+ 269, /* MODULES => ABORT */
+ 269, /* NK_BITNOT => ABORT */
+ 269, /* NK_SEMI => ABORT */
+ 269, /* NOTNULL => ABORT */
+ 269, /* OF => ABORT */
+ 269, /* PLUS => ABORT */
+ 269, /* PRIVILEGE => ABORT */
+ 269, /* RAISE => ABORT */
+ 269, /* REPLACE => ABORT */
+ 269, /* RESTRICT => ABORT */
+ 269, /* ROW => ABORT */
+ 269, /* SEMI => ABORT */
+ 269, /* STAR => ABORT */
+ 269, /* STATEMENT => ABORT */
+ 269, /* STRING => ABORT */
+ 269, /* TIMES => ABORT */
+ 269, /* UPDATE => ABORT */
+ 269, /* VALUES => ABORT */
+ 269, /* VARIABLE => ABORT */
+ 269, /* VIEW => ABORT */
+ 269, /* WAL => ABORT */
};
#endif /* YYFALLBACK */
@@ -1499,417 +1375,420 @@ static const char *const yyTokenName[] = {
/* 40 */ "TO",
/* 41 */ "REVOKE",
/* 42 */ "FROM",
- /* 43 */ "NK_COMMA",
- /* 44 */ "READ",
- /* 45 */ "WRITE",
- /* 46 */ "NK_DOT",
- /* 47 */ "DNODE",
- /* 48 */ "PORT",
- /* 49 */ "DNODES",
- /* 50 */ "NK_IPTOKEN",
- /* 51 */ "FORCE",
- /* 52 */ "LOCAL",
- /* 53 */ "QNODE",
- /* 54 */ "BNODE",
- /* 55 */ "SNODE",
- /* 56 */ "MNODE",
- /* 57 */ "DATABASE",
- /* 58 */ "USE",
- /* 59 */ "FLUSH",
- /* 60 */ "TRIM",
- /* 61 */ "IF",
- /* 62 */ "NOT",
- /* 63 */ "EXISTS",
- /* 64 */ "BUFFER",
- /* 65 */ "CACHEMODEL",
- /* 66 */ "CACHESIZE",
- /* 67 */ "COMP",
- /* 68 */ "DURATION",
- /* 69 */ "NK_VARIABLE",
- /* 70 */ "MAXROWS",
- /* 71 */ "MINROWS",
- /* 72 */ "KEEP",
- /* 73 */ "PAGES",
- /* 74 */ "PAGESIZE",
- /* 75 */ "TSDB_PAGESIZE",
- /* 76 */ "PRECISION",
- /* 77 */ "REPLICA",
- /* 78 */ "STRICT",
- /* 79 */ "VGROUPS",
- /* 80 */ "SINGLE_STABLE",
- /* 81 */ "RETENTIONS",
- /* 82 */ "SCHEMALESS",
- /* 83 */ "WAL_LEVEL",
- /* 84 */ "WAL_FSYNC_PERIOD",
- /* 85 */ "WAL_RETENTION_PERIOD",
- /* 86 */ "WAL_RETENTION_SIZE",
- /* 87 */ "WAL_ROLL_PERIOD",
- /* 88 */ "WAL_SEGMENT_SIZE",
- /* 89 */ "STT_TRIGGER",
- /* 90 */ "TABLE_PREFIX",
- /* 91 */ "TABLE_SUFFIX",
- /* 92 */ "NK_COLON",
- /* 93 */ "MAX_SPEED",
- /* 94 */ "TABLE",
- /* 95 */ "NK_LP",
- /* 96 */ "NK_RP",
- /* 97 */ "STABLE",
- /* 98 */ "ADD",
- /* 99 */ "COLUMN",
- /* 100 */ "MODIFY",
- /* 101 */ "RENAME",
- /* 102 */ "TAG",
- /* 103 */ "SET",
- /* 104 */ "NK_EQ",
- /* 105 */ "USING",
- /* 106 */ "TAGS",
- /* 107 */ "COMMENT",
- /* 108 */ "BOOL",
- /* 109 */ "TINYINT",
- /* 110 */ "SMALLINT",
- /* 111 */ "INT",
- /* 112 */ "INTEGER",
- /* 113 */ "BIGINT",
- /* 114 */ "FLOAT",
- /* 115 */ "DOUBLE",
- /* 116 */ "BINARY",
- /* 117 */ "TIMESTAMP",
- /* 118 */ "NCHAR",
- /* 119 */ "UNSIGNED",
- /* 120 */ "JSON",
- /* 121 */ "VARCHAR",
- /* 122 */ "MEDIUMBLOB",
- /* 123 */ "BLOB",
- /* 124 */ "VARBINARY",
- /* 125 */ "DECIMAL",
- /* 126 */ "MAX_DELAY",
- /* 127 */ "WATERMARK",
- /* 128 */ "ROLLUP",
- /* 129 */ "TTL",
- /* 130 */ "SMA",
- /* 131 */ "FIRST",
- /* 132 */ "LAST",
- /* 133 */ "SHOW",
- /* 134 */ "DATABASES",
- /* 135 */ "TABLES",
- /* 136 */ "STABLES",
- /* 137 */ "MNODES",
- /* 138 */ "QNODES",
- /* 139 */ "FUNCTIONS",
- /* 140 */ "INDEXES",
- /* 141 */ "ACCOUNTS",
- /* 142 */ "APPS",
- /* 143 */ "CONNECTIONS",
- /* 144 */ "LICENCES",
- /* 145 */ "GRANTS",
- /* 146 */ "QUERIES",
- /* 147 */ "SCORES",
- /* 148 */ "TOPICS",
- /* 149 */ "VARIABLES",
- /* 150 */ "CLUSTER",
- /* 151 */ "BNODES",
- /* 152 */ "SNODES",
- /* 153 */ "TRANSACTIONS",
- /* 154 */ "DISTRIBUTED",
- /* 155 */ "CONSUMERS",
- /* 156 */ "SUBSCRIPTIONS",
- /* 157 */ "VNODES",
- /* 158 */ "LIKE",
- /* 159 */ "TBNAME",
- /* 160 */ "QTAGS",
- /* 161 */ "AS",
- /* 162 */ "INDEX",
- /* 163 */ "FUNCTION",
- /* 164 */ "INTERVAL",
- /* 165 */ "TOPIC",
- /* 166 */ "WITH",
- /* 167 */ "META",
- /* 168 */ "CONSUMER",
- /* 169 */ "GROUP",
- /* 170 */ "DESC",
- /* 171 */ "DESCRIBE",
- /* 172 */ "RESET",
- /* 173 */ "QUERY",
- /* 174 */ "CACHE",
- /* 175 */ "EXPLAIN",
- /* 176 */ "ANALYZE",
- /* 177 */ "VERBOSE",
- /* 178 */ "NK_BOOL",
- /* 179 */ "RATIO",
- /* 180 */ "NK_FLOAT",
- /* 181 */ "OUTPUTTYPE",
- /* 182 */ "AGGREGATE",
- /* 183 */ "BUFSIZE",
- /* 184 */ "STREAM",
- /* 185 */ "INTO",
- /* 186 */ "TRIGGER",
- /* 187 */ "AT_ONCE",
- /* 188 */ "WINDOW_CLOSE",
- /* 189 */ "IGNORE",
- /* 190 */ "EXPIRED",
- /* 191 */ "FILL_HISTORY",
- /* 192 */ "SUBTABLE",
- /* 193 */ "KILL",
- /* 194 */ "CONNECTION",
- /* 195 */ "TRANSACTION",
- /* 196 */ "BALANCE",
- /* 197 */ "VGROUP",
- /* 198 */ "MERGE",
- /* 199 */ "REDISTRIBUTE",
- /* 200 */ "SPLIT",
- /* 201 */ "DELETE",
- /* 202 */ "INSERT",
- /* 203 */ "NULL",
- /* 204 */ "NK_QUESTION",
- /* 205 */ "NK_ARROW",
- /* 206 */ "ROWTS",
- /* 207 */ "QSTART",
- /* 208 */ "QEND",
- /* 209 */ "QDURATION",
- /* 210 */ "WSTART",
- /* 211 */ "WEND",
- /* 212 */ "WDURATION",
- /* 213 */ "IROWTS",
- /* 214 */ "CAST",
- /* 215 */ "NOW",
- /* 216 */ "TODAY",
- /* 217 */ "TIMEZONE",
- /* 218 */ "CLIENT_VERSION",
- /* 219 */ "SERVER_VERSION",
- /* 220 */ "SERVER_STATUS",
- /* 221 */ "CURRENT_USER",
- /* 222 */ "COUNT",
- /* 223 */ "LAST_ROW",
- /* 224 */ "CASE",
- /* 225 */ "END",
- /* 226 */ "WHEN",
- /* 227 */ "THEN",
- /* 228 */ "ELSE",
- /* 229 */ "BETWEEN",
- /* 230 */ "IS",
- /* 231 */ "NK_LT",
- /* 232 */ "NK_GT",
- /* 233 */ "NK_LE",
- /* 234 */ "NK_GE",
- /* 235 */ "NK_NE",
- /* 236 */ "MATCH",
- /* 237 */ "NMATCH",
- /* 238 */ "CONTAINS",
- /* 239 */ "IN",
- /* 240 */ "JOIN",
- /* 241 */ "INNER",
- /* 242 */ "SELECT",
- /* 243 */ "DISTINCT",
- /* 244 */ "WHERE",
- /* 245 */ "PARTITION",
- /* 246 */ "BY",
- /* 247 */ "SESSION",
- /* 248 */ "STATE_WINDOW",
- /* 249 */ "SLIDING",
- /* 250 */ "FILL",
- /* 251 */ "VALUE",
- /* 252 */ "NONE",
- /* 253 */ "PREV",
- /* 254 */ "LINEAR",
- /* 255 */ "NEXT",
- /* 256 */ "HAVING",
- /* 257 */ "RANGE",
- /* 258 */ "EVERY",
- /* 259 */ "ORDER",
- /* 260 */ "SLIMIT",
- /* 261 */ "SOFFSET",
- /* 262 */ "LIMIT",
- /* 263 */ "OFFSET",
- /* 264 */ "ASC",
- /* 265 */ "NULLS",
- /* 266 */ "ABORT",
- /* 267 */ "AFTER",
- /* 268 */ "ATTACH",
- /* 269 */ "BEFORE",
- /* 270 */ "BEGIN",
- /* 271 */ "BITAND",
- /* 272 */ "BITNOT",
- /* 273 */ "BITOR",
- /* 274 */ "BLOCKS",
- /* 275 */ "CHANGE",
- /* 276 */ "COMMA",
- /* 277 */ "COMPACT",
- /* 278 */ "CONCAT",
- /* 279 */ "CONFLICT",
- /* 280 */ "COPY",
- /* 281 */ "DEFERRED",
- /* 282 */ "DELIMITERS",
- /* 283 */ "DETACH",
- /* 284 */ "DIVIDE",
- /* 285 */ "DOT",
- /* 286 */ "EACH",
- /* 287 */ "FAIL",
- /* 288 */ "FILE",
- /* 289 */ "FOR",
- /* 290 */ "GLOB",
- /* 291 */ "ID",
- /* 292 */ "IMMEDIATE",
- /* 293 */ "IMPORT",
- /* 294 */ "INITIALLY",
- /* 295 */ "INSTEAD",
- /* 296 */ "ISNULL",
- /* 297 */ "KEY",
- /* 298 */ "MODULES",
- /* 299 */ "NK_BITNOT",
- /* 300 */ "NK_SEMI",
- /* 301 */ "NOTNULL",
- /* 302 */ "OF",
- /* 303 */ "PLUS",
- /* 304 */ "PRIVILEGE",
- /* 305 */ "RAISE",
- /* 306 */ "REPLACE",
- /* 307 */ "RESTRICT",
- /* 308 */ "ROW",
- /* 309 */ "SEMI",
- /* 310 */ "STAR",
- /* 311 */ "STATEMENT",
- /* 312 */ "STRING",
- /* 313 */ "TIMES",
- /* 314 */ "UPDATE",
- /* 315 */ "VALUES",
- /* 316 */ "VARIABLE",
- /* 317 */ "VIEW",
- /* 318 */ "WAL",
- /* 319 */ "cmd",
- /* 320 */ "account_options",
- /* 321 */ "alter_account_options",
- /* 322 */ "literal",
- /* 323 */ "alter_account_option",
- /* 324 */ "user_name",
- /* 325 */ "sysinfo_opt",
- /* 326 */ "privileges",
- /* 327 */ "priv_level",
- /* 328 */ "priv_type_list",
- /* 329 */ "priv_type",
- /* 330 */ "db_name",
- /* 331 */ "dnode_endpoint",
- /* 332 */ "force_opt",
- /* 333 */ "not_exists_opt",
- /* 334 */ "db_options",
- /* 335 */ "exists_opt",
- /* 336 */ "alter_db_options",
- /* 337 */ "speed_opt",
- /* 338 */ "integer_list",
- /* 339 */ "variable_list",
- /* 340 */ "retention_list",
- /* 341 */ "alter_db_option",
- /* 342 */ "retention",
- /* 343 */ "full_table_name",
- /* 344 */ "column_def_list",
- /* 345 */ "tags_def_opt",
- /* 346 */ "table_options",
- /* 347 */ "multi_create_clause",
- /* 348 */ "tags_def",
- /* 349 */ "multi_drop_clause",
- /* 350 */ "alter_table_clause",
- /* 351 */ "alter_table_options",
- /* 352 */ "column_name",
- /* 353 */ "type_name",
- /* 354 */ "signed_literal",
- /* 355 */ "create_subtable_clause",
- /* 356 */ "specific_cols_opt",
- /* 357 */ "expression_list",
- /* 358 */ "drop_table_clause",
- /* 359 */ "col_name_list",
- /* 360 */ "table_name",
- /* 361 */ "column_def",
- /* 362 */ "duration_list",
- /* 363 */ "rollup_func_list",
- /* 364 */ "alter_table_option",
- /* 365 */ "duration_literal",
- /* 366 */ "rollup_func_name",
- /* 367 */ "function_name",
- /* 368 */ "col_name",
- /* 369 */ "db_name_cond_opt",
- /* 370 */ "like_pattern_opt",
- /* 371 */ "table_name_cond",
- /* 372 */ "from_db_opt",
- /* 373 */ "tag_list_opt",
- /* 374 */ "tag_item",
- /* 375 */ "column_alias",
- /* 376 */ "index_options",
- /* 377 */ "func_list",
- /* 378 */ "sliding_opt",
- /* 379 */ "sma_stream_opt",
- /* 380 */ "func",
- /* 381 */ "stream_options",
- /* 382 */ "topic_name",
- /* 383 */ "query_or_subquery",
- /* 384 */ "cgroup_name",
- /* 385 */ "analyze_opt",
- /* 386 */ "explain_options",
- /* 387 */ "agg_func_opt",
- /* 388 */ "bufsize_opt",
- /* 389 */ "stream_name",
- /* 390 */ "subtable_opt",
- /* 391 */ "expression",
- /* 392 */ "dnode_list",
- /* 393 */ "where_clause_opt",
- /* 394 */ "signed",
- /* 395 */ "literal_func",
- /* 396 */ "literal_list",
- /* 397 */ "table_alias",
- /* 398 */ "expr_or_subquery",
- /* 399 */ "subquery",
- /* 400 */ "pseudo_column",
- /* 401 */ "column_reference",
- /* 402 */ "function_expression",
- /* 403 */ "case_when_expression",
- /* 404 */ "star_func",
- /* 405 */ "star_func_para_list",
- /* 406 */ "noarg_func",
- /* 407 */ "other_para_list",
- /* 408 */ "star_func_para",
- /* 409 */ "when_then_list",
- /* 410 */ "case_when_else_opt",
- /* 411 */ "common_expression",
- /* 412 */ "when_then_expr",
- /* 413 */ "predicate",
- /* 414 */ "compare_op",
- /* 415 */ "in_op",
- /* 416 */ "in_predicate_value",
- /* 417 */ "boolean_value_expression",
- /* 418 */ "boolean_primary",
- /* 419 */ "from_clause_opt",
- /* 420 */ "table_reference_list",
- /* 421 */ "table_reference",
- /* 422 */ "table_primary",
- /* 423 */ "joined_table",
- /* 424 */ "alias_opt",
- /* 425 */ "parenthesized_joined_table",
- /* 426 */ "join_type",
- /* 427 */ "search_condition",
- /* 428 */ "query_specification",
- /* 429 */ "set_quantifier_opt",
- /* 430 */ "select_list",
- /* 431 */ "partition_by_clause_opt",
- /* 432 */ "range_opt",
- /* 433 */ "every_opt",
- /* 434 */ "fill_opt",
- /* 435 */ "twindow_clause_opt",
- /* 436 */ "group_by_clause_opt",
- /* 437 */ "having_clause_opt",
- /* 438 */ "select_item",
- /* 439 */ "partition_list",
- /* 440 */ "partition_item",
- /* 441 */ "fill_mode",
- /* 442 */ "group_by_list",
- /* 443 */ "query_expression",
- /* 444 */ "query_simple",
- /* 445 */ "order_by_clause_opt",
- /* 446 */ "slimit_clause_opt",
- /* 447 */ "limit_clause_opt",
- /* 448 */ "union_query_expression",
- /* 449 */ "query_simple_or_subquery",
- /* 450 */ "sort_specification_list",
- /* 451 */ "sort_specification",
- /* 452 */ "ordering_specification_opt",
- /* 453 */ "null_ordering_opt",
+ /* 43 */ "SUBSCRIBE",
+ /* 44 */ "NK_COMMA",
+ /* 45 */ "READ",
+ /* 46 */ "WRITE",
+ /* 47 */ "NK_DOT",
+ /* 48 */ "DNODE",
+ /* 49 */ "PORT",
+ /* 50 */ "DNODES",
+ /* 51 */ "NK_IPTOKEN",
+ /* 52 */ "FORCE",
+ /* 53 */ "LOCAL",
+ /* 54 */ "QNODE",
+ /* 55 */ "BNODE",
+ /* 56 */ "SNODE",
+ /* 57 */ "MNODE",
+ /* 58 */ "DATABASE",
+ /* 59 */ "USE",
+ /* 60 */ "FLUSH",
+ /* 61 */ "TRIM",
+ /* 62 */ "IF",
+ /* 63 */ "NOT",
+ /* 64 */ "EXISTS",
+ /* 65 */ "BUFFER",
+ /* 66 */ "CACHEMODEL",
+ /* 67 */ "CACHESIZE",
+ /* 68 */ "COMP",
+ /* 69 */ "DURATION",
+ /* 70 */ "NK_VARIABLE",
+ /* 71 */ "MAXROWS",
+ /* 72 */ "MINROWS",
+ /* 73 */ "KEEP",
+ /* 74 */ "PAGES",
+ /* 75 */ "PAGESIZE",
+ /* 76 */ "TSDB_PAGESIZE",
+ /* 77 */ "PRECISION",
+ /* 78 */ "REPLICA",
+ /* 79 */ "STRICT",
+ /* 80 */ "VGROUPS",
+ /* 81 */ "SINGLE_STABLE",
+ /* 82 */ "RETENTIONS",
+ /* 83 */ "SCHEMALESS",
+ /* 84 */ "WAL_LEVEL",
+ /* 85 */ "WAL_FSYNC_PERIOD",
+ /* 86 */ "WAL_RETENTION_PERIOD",
+ /* 87 */ "WAL_RETENTION_SIZE",
+ /* 88 */ "WAL_ROLL_PERIOD",
+ /* 89 */ "WAL_SEGMENT_SIZE",
+ /* 90 */ "STT_TRIGGER",
+ /* 91 */ "TABLE_PREFIX",
+ /* 92 */ "TABLE_SUFFIX",
+ /* 93 */ "NK_COLON",
+ /* 94 */ "MAX_SPEED",
+ /* 95 */ "TABLE",
+ /* 96 */ "NK_LP",
+ /* 97 */ "NK_RP",
+ /* 98 */ "STABLE",
+ /* 99 */ "ADD",
+ /* 100 */ "COLUMN",
+ /* 101 */ "MODIFY",
+ /* 102 */ "RENAME",
+ /* 103 */ "TAG",
+ /* 104 */ "SET",
+ /* 105 */ "NK_EQ",
+ /* 106 */ "USING",
+ /* 107 */ "TAGS",
+ /* 108 */ "COMMENT",
+ /* 109 */ "BOOL",
+ /* 110 */ "TINYINT",
+ /* 111 */ "SMALLINT",
+ /* 112 */ "INT",
+ /* 113 */ "INTEGER",
+ /* 114 */ "BIGINT",
+ /* 115 */ "FLOAT",
+ /* 116 */ "DOUBLE",
+ /* 117 */ "BINARY",
+ /* 118 */ "TIMESTAMP",
+ /* 119 */ "NCHAR",
+ /* 120 */ "UNSIGNED",
+ /* 121 */ "JSON",
+ /* 122 */ "VARCHAR",
+ /* 123 */ "MEDIUMBLOB",
+ /* 124 */ "BLOB",
+ /* 125 */ "VARBINARY",
+ /* 126 */ "DECIMAL",
+ /* 127 */ "MAX_DELAY",
+ /* 128 */ "WATERMARK",
+ /* 129 */ "ROLLUP",
+ /* 130 */ "TTL",
+ /* 131 */ "SMA",
+ /* 132 */ "DELETE_MARK",
+ /* 133 */ "FIRST",
+ /* 134 */ "LAST",
+ /* 135 */ "SHOW",
+ /* 136 */ "PRIVILEGES",
+ /* 137 */ "DATABASES",
+ /* 138 */ "TABLES",
+ /* 139 */ "STABLES",
+ /* 140 */ "MNODES",
+ /* 141 */ "QNODES",
+ /* 142 */ "FUNCTIONS",
+ /* 143 */ "INDEXES",
+ /* 144 */ "ACCOUNTS",
+ /* 145 */ "APPS",
+ /* 146 */ "CONNECTIONS",
+ /* 147 */ "LICENCES",
+ /* 148 */ "GRANTS",
+ /* 149 */ "QUERIES",
+ /* 150 */ "SCORES",
+ /* 151 */ "TOPICS",
+ /* 152 */ "VARIABLES",
+ /* 153 */ "CLUSTER",
+ /* 154 */ "BNODES",
+ /* 155 */ "SNODES",
+ /* 156 */ "TRANSACTIONS",
+ /* 157 */ "DISTRIBUTED",
+ /* 158 */ "CONSUMERS",
+ /* 159 */ "SUBSCRIPTIONS",
+ /* 160 */ "VNODES",
+ /* 161 */ "LIKE",
+ /* 162 */ "TBNAME",
+ /* 163 */ "QTAGS",
+ /* 164 */ "AS",
+ /* 165 */ "INDEX",
+ /* 166 */ "FUNCTION",
+ /* 167 */ "INTERVAL",
+ /* 168 */ "TOPIC",
+ /* 169 */ "WITH",
+ /* 170 */ "META",
+ /* 171 */ "CONSUMER",
+ /* 172 */ "GROUP",
+ /* 173 */ "DESC",
+ /* 174 */ "DESCRIBE",
+ /* 175 */ "RESET",
+ /* 176 */ "QUERY",
+ /* 177 */ "CACHE",
+ /* 178 */ "EXPLAIN",
+ /* 179 */ "ANALYZE",
+ /* 180 */ "VERBOSE",
+ /* 181 */ "NK_BOOL",
+ /* 182 */ "RATIO",
+ /* 183 */ "NK_FLOAT",
+ /* 184 */ "OUTPUTTYPE",
+ /* 185 */ "AGGREGATE",
+ /* 186 */ "BUFSIZE",
+ /* 187 */ "STREAM",
+ /* 188 */ "INTO",
+ /* 189 */ "TRIGGER",
+ /* 190 */ "AT_ONCE",
+ /* 191 */ "WINDOW_CLOSE",
+ /* 192 */ "IGNORE",
+ /* 193 */ "EXPIRED",
+ /* 194 */ "FILL_HISTORY",
+ /* 195 */ "SUBTABLE",
+ /* 196 */ "KILL",
+ /* 197 */ "CONNECTION",
+ /* 198 */ "TRANSACTION",
+ /* 199 */ "BALANCE",
+ /* 200 */ "VGROUP",
+ /* 201 */ "MERGE",
+ /* 202 */ "REDISTRIBUTE",
+ /* 203 */ "SPLIT",
+ /* 204 */ "DELETE",
+ /* 205 */ "INSERT",
+ /* 206 */ "NULL",
+ /* 207 */ "NK_QUESTION",
+ /* 208 */ "NK_ARROW",
+ /* 209 */ "ROWTS",
+ /* 210 */ "QSTART",
+ /* 211 */ "QEND",
+ /* 212 */ "QDURATION",
+ /* 213 */ "WSTART",
+ /* 214 */ "WEND",
+ /* 215 */ "WDURATION",
+ /* 216 */ "IROWTS",
+ /* 217 */ "CAST",
+ /* 218 */ "NOW",
+ /* 219 */ "TODAY",
+ /* 220 */ "TIMEZONE",
+ /* 221 */ "CLIENT_VERSION",
+ /* 222 */ "SERVER_VERSION",
+ /* 223 */ "SERVER_STATUS",
+ /* 224 */ "CURRENT_USER",
+ /* 225 */ "COUNT",
+ /* 226 */ "LAST_ROW",
+ /* 227 */ "CASE",
+ /* 228 */ "END",
+ /* 229 */ "WHEN",
+ /* 230 */ "THEN",
+ /* 231 */ "ELSE",
+ /* 232 */ "BETWEEN",
+ /* 233 */ "IS",
+ /* 234 */ "NK_LT",
+ /* 235 */ "NK_GT",
+ /* 236 */ "NK_LE",
+ /* 237 */ "NK_GE",
+ /* 238 */ "NK_NE",
+ /* 239 */ "MATCH",
+ /* 240 */ "NMATCH",
+ /* 241 */ "CONTAINS",
+ /* 242 */ "IN",
+ /* 243 */ "JOIN",
+ /* 244 */ "INNER",
+ /* 245 */ "SELECT",
+ /* 246 */ "DISTINCT",
+ /* 247 */ "WHERE",
+ /* 248 */ "PARTITION",
+ /* 249 */ "BY",
+ /* 250 */ "SESSION",
+ /* 251 */ "STATE_WINDOW",
+ /* 252 */ "SLIDING",
+ /* 253 */ "FILL",
+ /* 254 */ "VALUE",
+ /* 255 */ "NONE",
+ /* 256 */ "PREV",
+ /* 257 */ "LINEAR",
+ /* 258 */ "NEXT",
+ /* 259 */ "HAVING",
+ /* 260 */ "RANGE",
+ /* 261 */ "EVERY",
+ /* 262 */ "ORDER",
+ /* 263 */ "SLIMIT",
+ /* 264 */ "SOFFSET",
+ /* 265 */ "LIMIT",
+ /* 266 */ "OFFSET",
+ /* 267 */ "ASC",
+ /* 268 */ "NULLS",
+ /* 269 */ "ABORT",
+ /* 270 */ "AFTER",
+ /* 271 */ "ATTACH",
+ /* 272 */ "BEFORE",
+ /* 273 */ "BEGIN",
+ /* 274 */ "BITAND",
+ /* 275 */ "BITNOT",
+ /* 276 */ "BITOR",
+ /* 277 */ "BLOCKS",
+ /* 278 */ "CHANGE",
+ /* 279 */ "COMMA",
+ /* 280 */ "COMPACT",
+ /* 281 */ "CONCAT",
+ /* 282 */ "CONFLICT",
+ /* 283 */ "COPY",
+ /* 284 */ "DEFERRED",
+ /* 285 */ "DELIMITERS",
+ /* 286 */ "DETACH",
+ /* 287 */ "DIVIDE",
+ /* 288 */ "DOT",
+ /* 289 */ "EACH",
+ /* 290 */ "FAIL",
+ /* 291 */ "FILE",
+ /* 292 */ "FOR",
+ /* 293 */ "GLOB",
+ /* 294 */ "ID",
+ /* 295 */ "IMMEDIATE",
+ /* 296 */ "IMPORT",
+ /* 297 */ "INITIALLY",
+ /* 298 */ "INSTEAD",
+ /* 299 */ "ISNULL",
+ /* 300 */ "KEY",
+ /* 301 */ "MODULES",
+ /* 302 */ "NK_BITNOT",
+ /* 303 */ "NK_SEMI",
+ /* 304 */ "NOTNULL",
+ /* 305 */ "OF",
+ /* 306 */ "PLUS",
+ /* 307 */ "PRIVILEGE",
+ /* 308 */ "RAISE",
+ /* 309 */ "REPLACE",
+ /* 310 */ "RESTRICT",
+ /* 311 */ "ROW",
+ /* 312 */ "SEMI",
+ /* 313 */ "STAR",
+ /* 314 */ "STATEMENT",
+ /* 315 */ "STRING",
+ /* 316 */ "TIMES",
+ /* 317 */ "UPDATE",
+ /* 318 */ "VALUES",
+ /* 319 */ "VARIABLE",
+ /* 320 */ "VIEW",
+ /* 321 */ "WAL",
+ /* 322 */ "cmd",
+ /* 323 */ "account_options",
+ /* 324 */ "alter_account_options",
+ /* 325 */ "literal",
+ /* 326 */ "alter_account_option",
+ /* 327 */ "user_name",
+ /* 328 */ "sysinfo_opt",
+ /* 329 */ "privileges",
+ /* 330 */ "priv_level",
+ /* 331 */ "priv_type_list",
+ /* 332 */ "priv_type",
+ /* 333 */ "db_name",
+ /* 334 */ "topic_name",
+ /* 335 */ "dnode_endpoint",
+ /* 336 */ "force_opt",
+ /* 337 */ "not_exists_opt",
+ /* 338 */ "db_options",
+ /* 339 */ "exists_opt",
+ /* 340 */ "alter_db_options",
+ /* 341 */ "speed_opt",
+ /* 342 */ "integer_list",
+ /* 343 */ "variable_list",
+ /* 344 */ "retention_list",
+ /* 345 */ "alter_db_option",
+ /* 346 */ "retention",
+ /* 347 */ "full_table_name",
+ /* 348 */ "column_def_list",
+ /* 349 */ "tags_def_opt",
+ /* 350 */ "table_options",
+ /* 351 */ "multi_create_clause",
+ /* 352 */ "tags_def",
+ /* 353 */ "multi_drop_clause",
+ /* 354 */ "alter_table_clause",
+ /* 355 */ "alter_table_options",
+ /* 356 */ "column_name",
+ /* 357 */ "type_name",
+ /* 358 */ "signed_literal",
+ /* 359 */ "create_subtable_clause",
+ /* 360 */ "specific_cols_opt",
+ /* 361 */ "expression_list",
+ /* 362 */ "drop_table_clause",
+ /* 363 */ "col_name_list",
+ /* 364 */ "table_name",
+ /* 365 */ "column_def",
+ /* 366 */ "duration_list",
+ /* 367 */ "rollup_func_list",
+ /* 368 */ "alter_table_option",
+ /* 369 */ "duration_literal",
+ /* 370 */ "rollup_func_name",
+ /* 371 */ "function_name",
+ /* 372 */ "col_name",
+ /* 373 */ "db_name_cond_opt",
+ /* 374 */ "like_pattern_opt",
+ /* 375 */ "table_name_cond",
+ /* 376 */ "from_db_opt",
+ /* 377 */ "tag_list_opt",
+ /* 378 */ "tag_item",
+ /* 379 */ "column_alias",
+ /* 380 */ "index_options",
+ /* 381 */ "func_list",
+ /* 382 */ "sliding_opt",
+ /* 383 */ "sma_stream_opt",
+ /* 384 */ "func",
+ /* 385 */ "query_or_subquery",
+ /* 386 */ "cgroup_name",
+ /* 387 */ "analyze_opt",
+ /* 388 */ "explain_options",
+ /* 389 */ "agg_func_opt",
+ /* 390 */ "bufsize_opt",
+ /* 391 */ "stream_name",
+ /* 392 */ "stream_options",
+ /* 393 */ "subtable_opt",
+ /* 394 */ "expression",
+ /* 395 */ "dnode_list",
+ /* 396 */ "where_clause_opt",
+ /* 397 */ "signed",
+ /* 398 */ "literal_func",
+ /* 399 */ "literal_list",
+ /* 400 */ "table_alias",
+ /* 401 */ "expr_or_subquery",
+ /* 402 */ "pseudo_column",
+ /* 403 */ "column_reference",
+ /* 404 */ "function_expression",
+ /* 405 */ "case_when_expression",
+ /* 406 */ "star_func",
+ /* 407 */ "star_func_para_list",
+ /* 408 */ "noarg_func",
+ /* 409 */ "other_para_list",
+ /* 410 */ "star_func_para",
+ /* 411 */ "when_then_list",
+ /* 412 */ "case_when_else_opt",
+ /* 413 */ "common_expression",
+ /* 414 */ "when_then_expr",
+ /* 415 */ "predicate",
+ /* 416 */ "compare_op",
+ /* 417 */ "in_op",
+ /* 418 */ "in_predicate_value",
+ /* 419 */ "boolean_value_expression",
+ /* 420 */ "boolean_primary",
+ /* 421 */ "from_clause_opt",
+ /* 422 */ "table_reference_list",
+ /* 423 */ "table_reference",
+ /* 424 */ "table_primary",
+ /* 425 */ "joined_table",
+ /* 426 */ "alias_opt",
+ /* 427 */ "subquery",
+ /* 428 */ "parenthesized_joined_table",
+ /* 429 */ "join_type",
+ /* 430 */ "search_condition",
+ /* 431 */ "query_specification",
+ /* 432 */ "set_quantifier_opt",
+ /* 433 */ "select_list",
+ /* 434 */ "partition_by_clause_opt",
+ /* 435 */ "range_opt",
+ /* 436 */ "every_opt",
+ /* 437 */ "fill_opt",
+ /* 438 */ "twindow_clause_opt",
+ /* 439 */ "group_by_clause_opt",
+ /* 440 */ "having_clause_opt",
+ /* 441 */ "select_item",
+ /* 442 */ "partition_list",
+ /* 443 */ "partition_item",
+ /* 444 */ "fill_mode",
+ /* 445 */ "group_by_list",
+ /* 446 */ "query_expression",
+ /* 447 */ "query_simple",
+ /* 448 */ "order_by_clause_opt",
+ /* 449 */ "slimit_clause_opt",
+ /* 450 */ "limit_clause_opt",
+ /* 451 */ "union_query_expression",
+ /* 452 */ "query_simple_or_subquery",
+ /* 453 */ "sort_specification_list",
+ /* 454 */ "sort_specification",
+ /* 455 */ "ordering_specification_opt",
+ /* 456 */ "null_ordering_opt",
};
#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
@@ -1952,507 +1831,511 @@ static const char *const yyRuleName[] = {
/* 32 */ "cmd ::= REVOKE privileges ON priv_level FROM user_name",
/* 33 */ "privileges ::= ALL",
/* 34 */ "privileges ::= priv_type_list",
- /* 35 */ "priv_type_list ::= priv_type",
- /* 36 */ "priv_type_list ::= priv_type_list NK_COMMA priv_type",
- /* 37 */ "priv_type ::= READ",
- /* 38 */ "priv_type ::= WRITE",
- /* 39 */ "priv_level ::= NK_STAR NK_DOT NK_STAR",
- /* 40 */ "priv_level ::= db_name NK_DOT NK_STAR",
- /* 41 */ "cmd ::= CREATE DNODE dnode_endpoint",
- /* 42 */ "cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER",
- /* 43 */ "cmd ::= DROP DNODE NK_INTEGER force_opt",
- /* 44 */ "cmd ::= DROP DNODE dnode_endpoint force_opt",
- /* 45 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING",
- /* 46 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING",
- /* 47 */ "cmd ::= ALTER ALL DNODES NK_STRING",
- /* 48 */ "cmd ::= ALTER ALL DNODES NK_STRING NK_STRING",
- /* 49 */ "dnode_endpoint ::= NK_STRING",
- /* 50 */ "dnode_endpoint ::= NK_ID",
- /* 51 */ "dnode_endpoint ::= NK_IPTOKEN",
- /* 52 */ "force_opt ::=",
- /* 53 */ "force_opt ::= FORCE",
- /* 54 */ "cmd ::= ALTER LOCAL NK_STRING",
- /* 55 */ "cmd ::= ALTER LOCAL NK_STRING NK_STRING",
- /* 56 */ "cmd ::= CREATE QNODE ON DNODE NK_INTEGER",
- /* 57 */ "cmd ::= DROP QNODE ON DNODE NK_INTEGER",
- /* 58 */ "cmd ::= CREATE BNODE ON DNODE NK_INTEGER",
- /* 59 */ "cmd ::= DROP BNODE ON DNODE NK_INTEGER",
- /* 60 */ "cmd ::= CREATE SNODE ON DNODE NK_INTEGER",
- /* 61 */ "cmd ::= DROP SNODE ON DNODE NK_INTEGER",
- /* 62 */ "cmd ::= CREATE MNODE ON DNODE NK_INTEGER",
- /* 63 */ "cmd ::= DROP MNODE ON DNODE NK_INTEGER",
- /* 64 */ "cmd ::= CREATE DATABASE not_exists_opt db_name db_options",
- /* 65 */ "cmd ::= DROP DATABASE exists_opt db_name",
- /* 66 */ "cmd ::= USE db_name",
- /* 67 */ "cmd ::= ALTER DATABASE db_name alter_db_options",
- /* 68 */ "cmd ::= FLUSH DATABASE db_name",
- /* 69 */ "cmd ::= TRIM DATABASE db_name speed_opt",
- /* 70 */ "not_exists_opt ::= IF NOT EXISTS",
- /* 71 */ "not_exists_opt ::=",
- /* 72 */ "exists_opt ::= IF EXISTS",
- /* 73 */ "exists_opt ::=",
- /* 74 */ "db_options ::=",
- /* 75 */ "db_options ::= db_options BUFFER NK_INTEGER",
- /* 76 */ "db_options ::= db_options CACHEMODEL NK_STRING",
- /* 77 */ "db_options ::= db_options CACHESIZE NK_INTEGER",
- /* 78 */ "db_options ::= db_options COMP NK_INTEGER",
- /* 79 */ "db_options ::= db_options DURATION NK_INTEGER",
- /* 80 */ "db_options ::= db_options DURATION NK_VARIABLE",
- /* 81 */ "db_options ::= db_options MAXROWS NK_INTEGER",
- /* 82 */ "db_options ::= db_options MINROWS NK_INTEGER",
- /* 83 */ "db_options ::= db_options KEEP integer_list",
- /* 84 */ "db_options ::= db_options KEEP variable_list",
- /* 85 */ "db_options ::= db_options PAGES NK_INTEGER",
- /* 86 */ "db_options ::= db_options PAGESIZE NK_INTEGER",
- /* 87 */ "db_options ::= db_options TSDB_PAGESIZE NK_INTEGER",
- /* 88 */ "db_options ::= db_options PRECISION NK_STRING",
- /* 89 */ "db_options ::= db_options REPLICA NK_INTEGER",
- /* 90 */ "db_options ::= db_options STRICT NK_STRING",
- /* 91 */ "db_options ::= db_options VGROUPS NK_INTEGER",
- /* 92 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER",
- /* 93 */ "db_options ::= db_options RETENTIONS retention_list",
- /* 94 */ "db_options ::= db_options SCHEMALESS NK_INTEGER",
- /* 95 */ "db_options ::= db_options WAL_LEVEL NK_INTEGER",
- /* 96 */ "db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER",
- /* 97 */ "db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER",
- /* 98 */ "db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER",
- /* 99 */ "db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER",
- /* 100 */ "db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER",
- /* 101 */ "db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER",
- /* 102 */ "db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER",
- /* 103 */ "db_options ::= db_options STT_TRIGGER NK_INTEGER",
- /* 104 */ "db_options ::= db_options TABLE_PREFIX NK_INTEGER",
- /* 105 */ "db_options ::= db_options TABLE_SUFFIX NK_INTEGER",
- /* 106 */ "alter_db_options ::= alter_db_option",
- /* 107 */ "alter_db_options ::= alter_db_options alter_db_option",
- /* 108 */ "alter_db_option ::= BUFFER NK_INTEGER",
- /* 109 */ "alter_db_option ::= CACHEMODEL NK_STRING",
- /* 110 */ "alter_db_option ::= CACHESIZE NK_INTEGER",
- /* 111 */ "alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER",
- /* 112 */ "alter_db_option ::= KEEP integer_list",
- /* 113 */ "alter_db_option ::= KEEP variable_list",
- /* 114 */ "alter_db_option ::= PAGES NK_INTEGER",
- /* 115 */ "alter_db_option ::= REPLICA NK_INTEGER",
- /* 116 */ "alter_db_option ::= STRICT NK_STRING",
- /* 117 */ "alter_db_option ::= WAL_LEVEL NK_INTEGER",
- /* 118 */ "alter_db_option ::= STT_TRIGGER NK_INTEGER",
- /* 119 */ "integer_list ::= NK_INTEGER",
- /* 120 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER",
- /* 121 */ "variable_list ::= NK_VARIABLE",
- /* 122 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE",
- /* 123 */ "retention_list ::= retention",
- /* 124 */ "retention_list ::= retention_list NK_COMMA retention",
- /* 125 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE",
- /* 126 */ "speed_opt ::=",
- /* 127 */ "speed_opt ::= MAX_SPEED NK_INTEGER",
- /* 128 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options",
- /* 129 */ "cmd ::= CREATE TABLE multi_create_clause",
- /* 130 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options",
- /* 131 */ "cmd ::= DROP TABLE multi_drop_clause",
- /* 132 */ "cmd ::= DROP STABLE exists_opt full_table_name",
- /* 133 */ "cmd ::= ALTER TABLE alter_table_clause",
- /* 134 */ "cmd ::= ALTER STABLE alter_table_clause",
- /* 135 */ "alter_table_clause ::= full_table_name alter_table_options",
- /* 136 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name",
- /* 137 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name",
- /* 138 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name",
- /* 139 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name",
- /* 140 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name",
- /* 141 */ "alter_table_clause ::= full_table_name DROP TAG column_name",
- /* 142 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name",
- /* 143 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name",
- /* 144 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal",
- /* 145 */ "multi_create_clause ::= create_subtable_clause",
- /* 146 */ "multi_create_clause ::= multi_create_clause create_subtable_clause",
- /* 147 */ "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",
- /* 148 */ "multi_drop_clause ::= drop_table_clause",
- /* 149 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause",
- /* 150 */ "drop_table_clause ::= exists_opt full_table_name",
- /* 151 */ "specific_cols_opt ::=",
- /* 152 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP",
- /* 153 */ "full_table_name ::= table_name",
- /* 154 */ "full_table_name ::= db_name NK_DOT table_name",
- /* 155 */ "column_def_list ::= column_def",
- /* 156 */ "column_def_list ::= column_def_list NK_COMMA column_def",
- /* 157 */ "column_def ::= column_name type_name",
- /* 158 */ "column_def ::= column_name type_name COMMENT NK_STRING",
- /* 159 */ "type_name ::= BOOL",
- /* 160 */ "type_name ::= TINYINT",
- /* 161 */ "type_name ::= SMALLINT",
- /* 162 */ "type_name ::= INT",
- /* 163 */ "type_name ::= INTEGER",
- /* 164 */ "type_name ::= BIGINT",
- /* 165 */ "type_name ::= FLOAT",
- /* 166 */ "type_name ::= DOUBLE",
- /* 167 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP",
- /* 168 */ "type_name ::= TIMESTAMP",
- /* 169 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP",
- /* 170 */ "type_name ::= TINYINT UNSIGNED",
- /* 171 */ "type_name ::= SMALLINT UNSIGNED",
- /* 172 */ "type_name ::= INT UNSIGNED",
- /* 173 */ "type_name ::= BIGINT UNSIGNED",
- /* 174 */ "type_name ::= JSON",
- /* 175 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP",
- /* 176 */ "type_name ::= MEDIUMBLOB",
- /* 177 */ "type_name ::= BLOB",
- /* 178 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP",
- /* 179 */ "type_name ::= DECIMAL",
- /* 180 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP",
- /* 181 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP",
- /* 182 */ "tags_def_opt ::=",
- /* 183 */ "tags_def_opt ::= tags_def",
- /* 184 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP",
- /* 185 */ "table_options ::=",
- /* 186 */ "table_options ::= table_options COMMENT NK_STRING",
- /* 187 */ "table_options ::= table_options MAX_DELAY duration_list",
- /* 188 */ "table_options ::= table_options WATERMARK duration_list",
- /* 189 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP",
- /* 190 */ "table_options ::= table_options TTL NK_INTEGER",
- /* 191 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP",
- /* 192 */ "alter_table_options ::= alter_table_option",
- /* 193 */ "alter_table_options ::= alter_table_options alter_table_option",
- /* 194 */ "alter_table_option ::= COMMENT NK_STRING",
- /* 195 */ "alter_table_option ::= TTL NK_INTEGER",
- /* 196 */ "duration_list ::= duration_literal",
- /* 197 */ "duration_list ::= duration_list NK_COMMA duration_literal",
- /* 198 */ "rollup_func_list ::= rollup_func_name",
- /* 199 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name",
- /* 200 */ "rollup_func_name ::= function_name",
- /* 201 */ "rollup_func_name ::= FIRST",
- /* 202 */ "rollup_func_name ::= LAST",
- /* 203 */ "col_name_list ::= col_name",
- /* 204 */ "col_name_list ::= col_name_list NK_COMMA col_name",
- /* 205 */ "col_name ::= column_name",
- /* 206 */ "cmd ::= SHOW DNODES",
- /* 207 */ "cmd ::= SHOW USERS",
- /* 208 */ "cmd ::= SHOW DATABASES",
- /* 209 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt",
- /* 210 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt",
- /* 211 */ "cmd ::= SHOW db_name_cond_opt VGROUPS",
- /* 212 */ "cmd ::= SHOW MNODES",
- /* 213 */ "cmd ::= SHOW QNODES",
- /* 214 */ "cmd ::= SHOW FUNCTIONS",
- /* 215 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt",
- /* 216 */ "cmd ::= SHOW STREAMS",
- /* 217 */ "cmd ::= SHOW ACCOUNTS",
- /* 218 */ "cmd ::= SHOW APPS",
- /* 219 */ "cmd ::= SHOW CONNECTIONS",
- /* 220 */ "cmd ::= SHOW LICENCES",
- /* 221 */ "cmd ::= SHOW GRANTS",
- /* 222 */ "cmd ::= SHOW CREATE DATABASE db_name",
- /* 223 */ "cmd ::= SHOW CREATE TABLE full_table_name",
- /* 224 */ "cmd ::= SHOW CREATE STABLE full_table_name",
- /* 225 */ "cmd ::= SHOW QUERIES",
- /* 226 */ "cmd ::= SHOW SCORES",
- /* 227 */ "cmd ::= SHOW TOPICS",
- /* 228 */ "cmd ::= SHOW VARIABLES",
- /* 229 */ "cmd ::= SHOW CLUSTER VARIABLES",
- /* 230 */ "cmd ::= SHOW LOCAL VARIABLES",
- /* 231 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt",
- /* 232 */ "cmd ::= SHOW BNODES",
- /* 233 */ "cmd ::= SHOW SNODES",
- /* 234 */ "cmd ::= SHOW CLUSTER",
- /* 235 */ "cmd ::= SHOW TRANSACTIONS",
- /* 236 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name",
- /* 237 */ "cmd ::= SHOW CONSUMERS",
- /* 238 */ "cmd ::= SHOW SUBSCRIPTIONS",
- /* 239 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt",
- /* 240 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt",
- /* 241 */ "cmd ::= SHOW VNODES NK_INTEGER",
- /* 242 */ "cmd ::= SHOW VNODES NK_STRING",
- /* 243 */ "db_name_cond_opt ::=",
- /* 244 */ "db_name_cond_opt ::= db_name NK_DOT",
- /* 245 */ "like_pattern_opt ::=",
- /* 246 */ "like_pattern_opt ::= LIKE NK_STRING",
- /* 247 */ "table_name_cond ::= table_name",
- /* 248 */ "from_db_opt ::=",
- /* 249 */ "from_db_opt ::= FROM db_name",
- /* 250 */ "tag_list_opt ::=",
- /* 251 */ "tag_list_opt ::= tag_item",
- /* 252 */ "tag_list_opt ::= tag_list_opt NK_COMMA tag_item",
- /* 253 */ "tag_item ::= TBNAME",
- /* 254 */ "tag_item ::= QTAGS",
- /* 255 */ "tag_item ::= column_name",
- /* 256 */ "tag_item ::= column_name column_alias",
- /* 257 */ "tag_item ::= column_name AS column_alias",
- /* 258 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options",
- /* 259 */ "cmd ::= DROP INDEX exists_opt full_table_name",
- /* 260 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt",
- /* 261 */ "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",
- /* 262 */ "func_list ::= func",
- /* 263 */ "func_list ::= func_list NK_COMMA func",
- /* 264 */ "func ::= function_name NK_LP expression_list NK_RP",
- /* 265 */ "sma_stream_opt ::=",
- /* 266 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal",
- /* 267 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal",
- /* 268 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery",
- /* 269 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name",
- /* 270 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name",
- /* 271 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name",
- /* 272 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name",
- /* 273 */ "cmd ::= DROP TOPIC exists_opt topic_name",
- /* 274 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name",
- /* 275 */ "cmd ::= DESC full_table_name",
- /* 276 */ "cmd ::= DESCRIBE full_table_name",
- /* 277 */ "cmd ::= RESET QUERY CACHE",
- /* 278 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery",
- /* 279 */ "analyze_opt ::=",
- /* 280 */ "analyze_opt ::= ANALYZE",
- /* 281 */ "explain_options ::=",
- /* 282 */ "explain_options ::= explain_options VERBOSE NK_BOOL",
- /* 283 */ "explain_options ::= explain_options RATIO NK_FLOAT",
- /* 284 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt",
- /* 285 */ "cmd ::= DROP FUNCTION exists_opt function_name",
- /* 286 */ "agg_func_opt ::=",
- /* 287 */ "agg_func_opt ::= AGGREGATE",
- /* 288 */ "bufsize_opt ::=",
- /* 289 */ "bufsize_opt ::= BUFSIZE NK_INTEGER",
- /* 290 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery",
- /* 291 */ "cmd ::= DROP STREAM exists_opt stream_name",
- /* 292 */ "stream_options ::=",
- /* 293 */ "stream_options ::= stream_options TRIGGER AT_ONCE",
- /* 294 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE",
- /* 295 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal",
- /* 296 */ "stream_options ::= stream_options WATERMARK duration_literal",
- /* 297 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER",
- /* 298 */ "stream_options ::= stream_options FILL_HISTORY NK_INTEGER",
- /* 299 */ "subtable_opt ::=",
- /* 300 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP",
- /* 301 */ "cmd ::= KILL CONNECTION NK_INTEGER",
- /* 302 */ "cmd ::= KILL QUERY NK_STRING",
- /* 303 */ "cmd ::= KILL TRANSACTION NK_INTEGER",
- /* 304 */ "cmd ::= BALANCE VGROUP",
- /* 305 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER",
- /* 306 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list",
- /* 307 */ "cmd ::= SPLIT VGROUP NK_INTEGER",
- /* 308 */ "dnode_list ::= DNODE NK_INTEGER",
- /* 309 */ "dnode_list ::= dnode_list DNODE NK_INTEGER",
- /* 310 */ "cmd ::= DELETE FROM full_table_name where_clause_opt",
- /* 311 */ "cmd ::= query_or_subquery",
- /* 312 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery",
- /* 313 */ "cmd ::= INSERT INTO full_table_name query_or_subquery",
- /* 314 */ "literal ::= NK_INTEGER",
- /* 315 */ "literal ::= NK_FLOAT",
- /* 316 */ "literal ::= NK_STRING",
- /* 317 */ "literal ::= NK_BOOL",
- /* 318 */ "literal ::= TIMESTAMP NK_STRING",
- /* 319 */ "literal ::= duration_literal",
- /* 320 */ "literal ::= NULL",
- /* 321 */ "literal ::= NK_QUESTION",
- /* 322 */ "duration_literal ::= NK_VARIABLE",
- /* 323 */ "signed ::= NK_INTEGER",
- /* 324 */ "signed ::= NK_PLUS NK_INTEGER",
- /* 325 */ "signed ::= NK_MINUS NK_INTEGER",
- /* 326 */ "signed ::= NK_FLOAT",
- /* 327 */ "signed ::= NK_PLUS NK_FLOAT",
- /* 328 */ "signed ::= NK_MINUS NK_FLOAT",
- /* 329 */ "signed_literal ::= signed",
- /* 330 */ "signed_literal ::= NK_STRING",
- /* 331 */ "signed_literal ::= NK_BOOL",
- /* 332 */ "signed_literal ::= TIMESTAMP NK_STRING",
- /* 333 */ "signed_literal ::= duration_literal",
- /* 334 */ "signed_literal ::= NULL",
- /* 335 */ "signed_literal ::= literal_func",
- /* 336 */ "signed_literal ::= NK_QUESTION",
- /* 337 */ "literal_list ::= signed_literal",
- /* 338 */ "literal_list ::= literal_list NK_COMMA signed_literal",
- /* 339 */ "db_name ::= NK_ID",
- /* 340 */ "table_name ::= NK_ID",
- /* 341 */ "column_name ::= NK_ID",
- /* 342 */ "function_name ::= NK_ID",
- /* 343 */ "table_alias ::= NK_ID",
- /* 344 */ "column_alias ::= NK_ID",
- /* 345 */ "user_name ::= NK_ID",
- /* 346 */ "topic_name ::= NK_ID",
- /* 347 */ "stream_name ::= NK_ID",
- /* 348 */ "cgroup_name ::= NK_ID",
- /* 349 */ "expr_or_subquery ::= expression",
- /* 350 */ "expr_or_subquery ::= subquery",
- /* 351 */ "expression ::= literal",
- /* 352 */ "expression ::= pseudo_column",
- /* 353 */ "expression ::= column_reference",
- /* 354 */ "expression ::= function_expression",
- /* 355 */ "expression ::= case_when_expression",
- /* 356 */ "expression ::= NK_LP expression NK_RP",
- /* 357 */ "expression ::= NK_PLUS expr_or_subquery",
- /* 358 */ "expression ::= NK_MINUS expr_or_subquery",
- /* 359 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery",
- /* 360 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery",
- /* 361 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery",
- /* 362 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery",
- /* 363 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery",
- /* 364 */ "expression ::= column_reference NK_ARROW NK_STRING",
- /* 365 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery",
- /* 366 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery",
- /* 367 */ "expression_list ::= expr_or_subquery",
- /* 368 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery",
- /* 369 */ "column_reference ::= column_name",
- /* 370 */ "column_reference ::= table_name NK_DOT column_name",
- /* 371 */ "pseudo_column ::= ROWTS",
- /* 372 */ "pseudo_column ::= TBNAME",
- /* 373 */ "pseudo_column ::= table_name NK_DOT TBNAME",
- /* 374 */ "pseudo_column ::= QSTART",
- /* 375 */ "pseudo_column ::= QEND",
- /* 376 */ "pseudo_column ::= QDURATION",
- /* 377 */ "pseudo_column ::= WSTART",
- /* 378 */ "pseudo_column ::= WEND",
- /* 379 */ "pseudo_column ::= WDURATION",
- /* 380 */ "pseudo_column ::= IROWTS",
- /* 381 */ "pseudo_column ::= QTAGS",
- /* 382 */ "function_expression ::= function_name NK_LP expression_list NK_RP",
- /* 383 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP",
- /* 384 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP",
- /* 385 */ "function_expression ::= literal_func",
- /* 386 */ "literal_func ::= noarg_func NK_LP NK_RP",
- /* 387 */ "literal_func ::= NOW",
- /* 388 */ "noarg_func ::= NOW",
- /* 389 */ "noarg_func ::= TODAY",
- /* 390 */ "noarg_func ::= TIMEZONE",
- /* 391 */ "noarg_func ::= DATABASE",
- /* 392 */ "noarg_func ::= CLIENT_VERSION",
- /* 393 */ "noarg_func ::= SERVER_VERSION",
- /* 394 */ "noarg_func ::= SERVER_STATUS",
- /* 395 */ "noarg_func ::= CURRENT_USER",
- /* 396 */ "noarg_func ::= USER",
- /* 397 */ "star_func ::= COUNT",
- /* 398 */ "star_func ::= FIRST",
- /* 399 */ "star_func ::= LAST",
- /* 400 */ "star_func ::= LAST_ROW",
- /* 401 */ "star_func_para_list ::= NK_STAR",
- /* 402 */ "star_func_para_list ::= other_para_list",
- /* 403 */ "other_para_list ::= star_func_para",
- /* 404 */ "other_para_list ::= other_para_list NK_COMMA star_func_para",
- /* 405 */ "star_func_para ::= expr_or_subquery",
- /* 406 */ "star_func_para ::= table_name NK_DOT NK_STAR",
- /* 407 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END",
- /* 408 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END",
- /* 409 */ "when_then_list ::= when_then_expr",
- /* 410 */ "when_then_list ::= when_then_list when_then_expr",
- /* 411 */ "when_then_expr ::= WHEN common_expression THEN common_expression",
- /* 412 */ "case_when_else_opt ::=",
- /* 413 */ "case_when_else_opt ::= ELSE common_expression",
- /* 414 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery",
- /* 415 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery",
- /* 416 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery",
- /* 417 */ "predicate ::= expr_or_subquery IS NULL",
- /* 418 */ "predicate ::= expr_or_subquery IS NOT NULL",
- /* 419 */ "predicate ::= expr_or_subquery in_op in_predicate_value",
- /* 420 */ "compare_op ::= NK_LT",
- /* 421 */ "compare_op ::= NK_GT",
- /* 422 */ "compare_op ::= NK_LE",
- /* 423 */ "compare_op ::= NK_GE",
- /* 424 */ "compare_op ::= NK_NE",
- /* 425 */ "compare_op ::= NK_EQ",
- /* 426 */ "compare_op ::= LIKE",
- /* 427 */ "compare_op ::= NOT LIKE",
- /* 428 */ "compare_op ::= MATCH",
- /* 429 */ "compare_op ::= NMATCH",
- /* 430 */ "compare_op ::= CONTAINS",
- /* 431 */ "in_op ::= IN",
- /* 432 */ "in_op ::= NOT IN",
- /* 433 */ "in_predicate_value ::= NK_LP literal_list NK_RP",
- /* 434 */ "boolean_value_expression ::= boolean_primary",
- /* 435 */ "boolean_value_expression ::= NOT boolean_primary",
- /* 436 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression",
- /* 437 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression",
- /* 438 */ "boolean_primary ::= predicate",
- /* 439 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP",
- /* 440 */ "common_expression ::= expr_or_subquery",
- /* 441 */ "common_expression ::= boolean_value_expression",
- /* 442 */ "from_clause_opt ::=",
- /* 443 */ "from_clause_opt ::= FROM table_reference_list",
- /* 444 */ "table_reference_list ::= table_reference",
- /* 445 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference",
- /* 446 */ "table_reference ::= table_primary",
- /* 447 */ "table_reference ::= joined_table",
- /* 448 */ "table_primary ::= table_name alias_opt",
- /* 449 */ "table_primary ::= db_name NK_DOT table_name alias_opt",
- /* 450 */ "table_primary ::= subquery alias_opt",
- /* 451 */ "table_primary ::= parenthesized_joined_table",
- /* 452 */ "alias_opt ::=",
- /* 453 */ "alias_opt ::= table_alias",
- /* 454 */ "alias_opt ::= AS table_alias",
- /* 455 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP",
- /* 456 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP",
- /* 457 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition",
- /* 458 */ "join_type ::=",
- /* 459 */ "join_type ::= INNER",
- /* 460 */ "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",
- /* 461 */ "set_quantifier_opt ::=",
- /* 462 */ "set_quantifier_opt ::= DISTINCT",
- /* 463 */ "set_quantifier_opt ::= ALL",
- /* 464 */ "select_list ::= select_item",
- /* 465 */ "select_list ::= select_list NK_COMMA select_item",
- /* 466 */ "select_item ::= NK_STAR",
- /* 467 */ "select_item ::= common_expression",
- /* 468 */ "select_item ::= common_expression column_alias",
- /* 469 */ "select_item ::= common_expression AS column_alias",
- /* 470 */ "select_item ::= table_name NK_DOT NK_STAR",
- /* 471 */ "where_clause_opt ::=",
- /* 472 */ "where_clause_opt ::= WHERE search_condition",
- /* 473 */ "partition_by_clause_opt ::=",
- /* 474 */ "partition_by_clause_opt ::= PARTITION BY partition_list",
- /* 475 */ "partition_list ::= partition_item",
- /* 476 */ "partition_list ::= partition_list NK_COMMA partition_item",
- /* 477 */ "partition_item ::= expr_or_subquery",
- /* 478 */ "partition_item ::= expr_or_subquery column_alias",
- /* 479 */ "partition_item ::= expr_or_subquery AS column_alias",
- /* 480 */ "twindow_clause_opt ::=",
- /* 481 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP",
- /* 482 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP",
- /* 483 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt",
- /* 484 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt",
- /* 485 */ "sliding_opt ::=",
- /* 486 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP",
- /* 487 */ "fill_opt ::=",
- /* 488 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP",
- /* 489 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP",
- /* 490 */ "fill_mode ::= NONE",
- /* 491 */ "fill_mode ::= PREV",
- /* 492 */ "fill_mode ::= NULL",
- /* 493 */ "fill_mode ::= LINEAR",
- /* 494 */ "fill_mode ::= NEXT",
- /* 495 */ "group_by_clause_opt ::=",
- /* 496 */ "group_by_clause_opt ::= GROUP BY group_by_list",
- /* 497 */ "group_by_list ::= expr_or_subquery",
- /* 498 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery",
- /* 499 */ "having_clause_opt ::=",
- /* 500 */ "having_clause_opt ::= HAVING search_condition",
- /* 501 */ "range_opt ::=",
- /* 502 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP",
- /* 503 */ "every_opt ::=",
- /* 504 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP",
- /* 505 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt",
- /* 506 */ "query_simple ::= query_specification",
- /* 507 */ "query_simple ::= union_query_expression",
- /* 508 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery",
- /* 509 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery",
- /* 510 */ "query_simple_or_subquery ::= query_simple",
- /* 511 */ "query_simple_or_subquery ::= subquery",
- /* 512 */ "query_or_subquery ::= query_expression",
- /* 513 */ "query_or_subquery ::= subquery",
- /* 514 */ "order_by_clause_opt ::=",
- /* 515 */ "order_by_clause_opt ::= ORDER BY sort_specification_list",
- /* 516 */ "slimit_clause_opt ::=",
- /* 517 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER",
- /* 518 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER",
- /* 519 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER",
- /* 520 */ "limit_clause_opt ::=",
- /* 521 */ "limit_clause_opt ::= LIMIT NK_INTEGER",
- /* 522 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER",
- /* 523 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER",
- /* 524 */ "subquery ::= NK_LP query_expression NK_RP",
- /* 525 */ "subquery ::= NK_LP subquery NK_RP",
- /* 526 */ "search_condition ::= common_expression",
- /* 527 */ "sort_specification_list ::= sort_specification",
- /* 528 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification",
- /* 529 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt",
- /* 530 */ "ordering_specification_opt ::=",
- /* 531 */ "ordering_specification_opt ::= ASC",
- /* 532 */ "ordering_specification_opt ::= DESC",
- /* 533 */ "null_ordering_opt ::=",
- /* 534 */ "null_ordering_opt ::= NULLS FIRST",
- /* 535 */ "null_ordering_opt ::= NULLS LAST",
+ /* 35 */ "privileges ::= SUBSCRIBE",
+ /* 36 */ "priv_type_list ::= priv_type",
+ /* 37 */ "priv_type_list ::= priv_type_list NK_COMMA priv_type",
+ /* 38 */ "priv_type ::= READ",
+ /* 39 */ "priv_type ::= WRITE",
+ /* 40 */ "priv_level ::= NK_STAR NK_DOT NK_STAR",
+ /* 41 */ "priv_level ::= db_name NK_DOT NK_STAR",
+ /* 42 */ "priv_level ::= topic_name",
+ /* 43 */ "cmd ::= CREATE DNODE dnode_endpoint",
+ /* 44 */ "cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER",
+ /* 45 */ "cmd ::= DROP DNODE NK_INTEGER force_opt",
+ /* 46 */ "cmd ::= DROP DNODE dnode_endpoint force_opt",
+ /* 47 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING",
+ /* 48 */ "cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING",
+ /* 49 */ "cmd ::= ALTER ALL DNODES NK_STRING",
+ /* 50 */ "cmd ::= ALTER ALL DNODES NK_STRING NK_STRING",
+ /* 51 */ "dnode_endpoint ::= NK_STRING",
+ /* 52 */ "dnode_endpoint ::= NK_ID",
+ /* 53 */ "dnode_endpoint ::= NK_IPTOKEN",
+ /* 54 */ "force_opt ::=",
+ /* 55 */ "force_opt ::= FORCE",
+ /* 56 */ "cmd ::= ALTER LOCAL NK_STRING",
+ /* 57 */ "cmd ::= ALTER LOCAL NK_STRING NK_STRING",
+ /* 58 */ "cmd ::= CREATE QNODE ON DNODE NK_INTEGER",
+ /* 59 */ "cmd ::= DROP QNODE ON DNODE NK_INTEGER",
+ /* 60 */ "cmd ::= CREATE BNODE ON DNODE NK_INTEGER",
+ /* 61 */ "cmd ::= DROP BNODE ON DNODE NK_INTEGER",
+ /* 62 */ "cmd ::= CREATE SNODE ON DNODE NK_INTEGER",
+ /* 63 */ "cmd ::= DROP SNODE ON DNODE NK_INTEGER",
+ /* 64 */ "cmd ::= CREATE MNODE ON DNODE NK_INTEGER",
+ /* 65 */ "cmd ::= DROP MNODE ON DNODE NK_INTEGER",
+ /* 66 */ "cmd ::= CREATE DATABASE not_exists_opt db_name db_options",
+ /* 67 */ "cmd ::= DROP DATABASE exists_opt db_name",
+ /* 68 */ "cmd ::= USE db_name",
+ /* 69 */ "cmd ::= ALTER DATABASE db_name alter_db_options",
+ /* 70 */ "cmd ::= FLUSH DATABASE db_name",
+ /* 71 */ "cmd ::= TRIM DATABASE db_name speed_opt",
+ /* 72 */ "not_exists_opt ::= IF NOT EXISTS",
+ /* 73 */ "not_exists_opt ::=",
+ /* 74 */ "exists_opt ::= IF EXISTS",
+ /* 75 */ "exists_opt ::=",
+ /* 76 */ "db_options ::=",
+ /* 77 */ "db_options ::= db_options BUFFER NK_INTEGER",
+ /* 78 */ "db_options ::= db_options CACHEMODEL NK_STRING",
+ /* 79 */ "db_options ::= db_options CACHESIZE NK_INTEGER",
+ /* 80 */ "db_options ::= db_options COMP NK_INTEGER",
+ /* 81 */ "db_options ::= db_options DURATION NK_INTEGER",
+ /* 82 */ "db_options ::= db_options DURATION NK_VARIABLE",
+ /* 83 */ "db_options ::= db_options MAXROWS NK_INTEGER",
+ /* 84 */ "db_options ::= db_options MINROWS NK_INTEGER",
+ /* 85 */ "db_options ::= db_options KEEP integer_list",
+ /* 86 */ "db_options ::= db_options KEEP variable_list",
+ /* 87 */ "db_options ::= db_options PAGES NK_INTEGER",
+ /* 88 */ "db_options ::= db_options PAGESIZE NK_INTEGER",
+ /* 89 */ "db_options ::= db_options TSDB_PAGESIZE NK_INTEGER",
+ /* 90 */ "db_options ::= db_options PRECISION NK_STRING",
+ /* 91 */ "db_options ::= db_options REPLICA NK_INTEGER",
+ /* 92 */ "db_options ::= db_options STRICT NK_STRING",
+ /* 93 */ "db_options ::= db_options VGROUPS NK_INTEGER",
+ /* 94 */ "db_options ::= db_options SINGLE_STABLE NK_INTEGER",
+ /* 95 */ "db_options ::= db_options RETENTIONS retention_list",
+ /* 96 */ "db_options ::= db_options SCHEMALESS NK_INTEGER",
+ /* 97 */ "db_options ::= db_options WAL_LEVEL NK_INTEGER",
+ /* 98 */ "db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER",
+ /* 99 */ "db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER",
+ /* 100 */ "db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER",
+ /* 101 */ "db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER",
+ /* 102 */ "db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER",
+ /* 103 */ "db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER",
+ /* 104 */ "db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER",
+ /* 105 */ "db_options ::= db_options STT_TRIGGER NK_INTEGER",
+ /* 106 */ "db_options ::= db_options TABLE_PREFIX NK_INTEGER",
+ /* 107 */ "db_options ::= db_options TABLE_SUFFIX NK_INTEGER",
+ /* 108 */ "alter_db_options ::= alter_db_option",
+ /* 109 */ "alter_db_options ::= alter_db_options alter_db_option",
+ /* 110 */ "alter_db_option ::= BUFFER NK_INTEGER",
+ /* 111 */ "alter_db_option ::= CACHEMODEL NK_STRING",
+ /* 112 */ "alter_db_option ::= CACHESIZE NK_INTEGER",
+ /* 113 */ "alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER",
+ /* 114 */ "alter_db_option ::= KEEP integer_list",
+ /* 115 */ "alter_db_option ::= KEEP variable_list",
+ /* 116 */ "alter_db_option ::= PAGES NK_INTEGER",
+ /* 117 */ "alter_db_option ::= REPLICA NK_INTEGER",
+ /* 118 */ "alter_db_option ::= STRICT NK_STRING",
+ /* 119 */ "alter_db_option ::= WAL_LEVEL NK_INTEGER",
+ /* 120 */ "alter_db_option ::= STT_TRIGGER NK_INTEGER",
+ /* 121 */ "integer_list ::= NK_INTEGER",
+ /* 122 */ "integer_list ::= integer_list NK_COMMA NK_INTEGER",
+ /* 123 */ "variable_list ::= NK_VARIABLE",
+ /* 124 */ "variable_list ::= variable_list NK_COMMA NK_VARIABLE",
+ /* 125 */ "retention_list ::= retention",
+ /* 126 */ "retention_list ::= retention_list NK_COMMA retention",
+ /* 127 */ "retention ::= NK_VARIABLE NK_COLON NK_VARIABLE",
+ /* 128 */ "speed_opt ::=",
+ /* 129 */ "speed_opt ::= MAX_SPEED NK_INTEGER",
+ /* 130 */ "cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options",
+ /* 131 */ "cmd ::= CREATE TABLE multi_create_clause",
+ /* 132 */ "cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options",
+ /* 133 */ "cmd ::= DROP TABLE multi_drop_clause",
+ /* 134 */ "cmd ::= DROP STABLE exists_opt full_table_name",
+ /* 135 */ "cmd ::= ALTER TABLE alter_table_clause",
+ /* 136 */ "cmd ::= ALTER STABLE alter_table_clause",
+ /* 137 */ "alter_table_clause ::= full_table_name alter_table_options",
+ /* 138 */ "alter_table_clause ::= full_table_name ADD COLUMN column_name type_name",
+ /* 139 */ "alter_table_clause ::= full_table_name DROP COLUMN column_name",
+ /* 140 */ "alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name",
+ /* 141 */ "alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name",
+ /* 142 */ "alter_table_clause ::= full_table_name ADD TAG column_name type_name",
+ /* 143 */ "alter_table_clause ::= full_table_name DROP TAG column_name",
+ /* 144 */ "alter_table_clause ::= full_table_name MODIFY TAG column_name type_name",
+ /* 145 */ "alter_table_clause ::= full_table_name RENAME TAG column_name column_name",
+ /* 146 */ "alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal",
+ /* 147 */ "multi_create_clause ::= create_subtable_clause",
+ /* 148 */ "multi_create_clause ::= multi_create_clause create_subtable_clause",
+ /* 149 */ "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",
+ /* 150 */ "multi_drop_clause ::= drop_table_clause",
+ /* 151 */ "multi_drop_clause ::= multi_drop_clause drop_table_clause",
+ /* 152 */ "drop_table_clause ::= exists_opt full_table_name",
+ /* 153 */ "specific_cols_opt ::=",
+ /* 154 */ "specific_cols_opt ::= NK_LP col_name_list NK_RP",
+ /* 155 */ "full_table_name ::= table_name",
+ /* 156 */ "full_table_name ::= db_name NK_DOT table_name",
+ /* 157 */ "column_def_list ::= column_def",
+ /* 158 */ "column_def_list ::= column_def_list NK_COMMA column_def",
+ /* 159 */ "column_def ::= column_name type_name",
+ /* 160 */ "column_def ::= column_name type_name COMMENT NK_STRING",
+ /* 161 */ "type_name ::= BOOL",
+ /* 162 */ "type_name ::= TINYINT",
+ /* 163 */ "type_name ::= SMALLINT",
+ /* 164 */ "type_name ::= INT",
+ /* 165 */ "type_name ::= INTEGER",
+ /* 166 */ "type_name ::= BIGINT",
+ /* 167 */ "type_name ::= FLOAT",
+ /* 168 */ "type_name ::= DOUBLE",
+ /* 169 */ "type_name ::= BINARY NK_LP NK_INTEGER NK_RP",
+ /* 170 */ "type_name ::= TIMESTAMP",
+ /* 171 */ "type_name ::= NCHAR NK_LP NK_INTEGER NK_RP",
+ /* 172 */ "type_name ::= TINYINT UNSIGNED",
+ /* 173 */ "type_name ::= SMALLINT UNSIGNED",
+ /* 174 */ "type_name ::= INT UNSIGNED",
+ /* 175 */ "type_name ::= BIGINT UNSIGNED",
+ /* 176 */ "type_name ::= JSON",
+ /* 177 */ "type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP",
+ /* 178 */ "type_name ::= MEDIUMBLOB",
+ /* 179 */ "type_name ::= BLOB",
+ /* 180 */ "type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP",
+ /* 181 */ "type_name ::= DECIMAL",
+ /* 182 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP",
+ /* 183 */ "type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP",
+ /* 184 */ "tags_def_opt ::=",
+ /* 185 */ "tags_def_opt ::= tags_def",
+ /* 186 */ "tags_def ::= TAGS NK_LP column_def_list NK_RP",
+ /* 187 */ "table_options ::=",
+ /* 188 */ "table_options ::= table_options COMMENT NK_STRING",
+ /* 189 */ "table_options ::= table_options MAX_DELAY duration_list",
+ /* 190 */ "table_options ::= table_options WATERMARK duration_list",
+ /* 191 */ "table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP",
+ /* 192 */ "table_options ::= table_options TTL NK_INTEGER",
+ /* 193 */ "table_options ::= table_options SMA NK_LP col_name_list NK_RP",
+ /* 194 */ "table_options ::= table_options DELETE_MARK duration_list",
+ /* 195 */ "alter_table_options ::= alter_table_option",
+ /* 196 */ "alter_table_options ::= alter_table_options alter_table_option",
+ /* 197 */ "alter_table_option ::= COMMENT NK_STRING",
+ /* 198 */ "alter_table_option ::= TTL NK_INTEGER",
+ /* 199 */ "duration_list ::= duration_literal",
+ /* 200 */ "duration_list ::= duration_list NK_COMMA duration_literal",
+ /* 201 */ "rollup_func_list ::= rollup_func_name",
+ /* 202 */ "rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name",
+ /* 203 */ "rollup_func_name ::= function_name",
+ /* 204 */ "rollup_func_name ::= FIRST",
+ /* 205 */ "rollup_func_name ::= LAST",
+ /* 206 */ "col_name_list ::= col_name",
+ /* 207 */ "col_name_list ::= col_name_list NK_COMMA col_name",
+ /* 208 */ "col_name ::= column_name",
+ /* 209 */ "cmd ::= SHOW DNODES",
+ /* 210 */ "cmd ::= SHOW USERS",
+ /* 211 */ "cmd ::= SHOW USER PRIVILEGES",
+ /* 212 */ "cmd ::= SHOW DATABASES",
+ /* 213 */ "cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt",
+ /* 214 */ "cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt",
+ /* 215 */ "cmd ::= SHOW db_name_cond_opt VGROUPS",
+ /* 216 */ "cmd ::= SHOW MNODES",
+ /* 217 */ "cmd ::= SHOW QNODES",
+ /* 218 */ "cmd ::= SHOW FUNCTIONS",
+ /* 219 */ "cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt",
+ /* 220 */ "cmd ::= SHOW STREAMS",
+ /* 221 */ "cmd ::= SHOW ACCOUNTS",
+ /* 222 */ "cmd ::= SHOW APPS",
+ /* 223 */ "cmd ::= SHOW CONNECTIONS",
+ /* 224 */ "cmd ::= SHOW LICENCES",
+ /* 225 */ "cmd ::= SHOW GRANTS",
+ /* 226 */ "cmd ::= SHOW CREATE DATABASE db_name",
+ /* 227 */ "cmd ::= SHOW CREATE TABLE full_table_name",
+ /* 228 */ "cmd ::= SHOW CREATE STABLE full_table_name",
+ /* 229 */ "cmd ::= SHOW QUERIES",
+ /* 230 */ "cmd ::= SHOW SCORES",
+ /* 231 */ "cmd ::= SHOW TOPICS",
+ /* 232 */ "cmd ::= SHOW VARIABLES",
+ /* 233 */ "cmd ::= SHOW CLUSTER VARIABLES",
+ /* 234 */ "cmd ::= SHOW LOCAL VARIABLES",
+ /* 235 */ "cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt",
+ /* 236 */ "cmd ::= SHOW BNODES",
+ /* 237 */ "cmd ::= SHOW SNODES",
+ /* 238 */ "cmd ::= SHOW CLUSTER",
+ /* 239 */ "cmd ::= SHOW TRANSACTIONS",
+ /* 240 */ "cmd ::= SHOW TABLE DISTRIBUTED full_table_name",
+ /* 241 */ "cmd ::= SHOW CONSUMERS",
+ /* 242 */ "cmd ::= SHOW SUBSCRIPTIONS",
+ /* 243 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt",
+ /* 244 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt",
+ /* 245 */ "cmd ::= SHOW VNODES NK_INTEGER",
+ /* 246 */ "cmd ::= SHOW VNODES NK_STRING",
+ /* 247 */ "db_name_cond_opt ::=",
+ /* 248 */ "db_name_cond_opt ::= db_name NK_DOT",
+ /* 249 */ "like_pattern_opt ::=",
+ /* 250 */ "like_pattern_opt ::= LIKE NK_STRING",
+ /* 251 */ "table_name_cond ::= table_name",
+ /* 252 */ "from_db_opt ::=",
+ /* 253 */ "from_db_opt ::= FROM db_name",
+ /* 254 */ "tag_list_opt ::=",
+ /* 255 */ "tag_list_opt ::= tag_item",
+ /* 256 */ "tag_list_opt ::= tag_list_opt NK_COMMA tag_item",
+ /* 257 */ "tag_item ::= TBNAME",
+ /* 258 */ "tag_item ::= QTAGS",
+ /* 259 */ "tag_item ::= column_name",
+ /* 260 */ "tag_item ::= column_name column_alias",
+ /* 261 */ "tag_item ::= column_name AS column_alias",
+ /* 262 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options",
+ /* 263 */ "cmd ::= DROP INDEX exists_opt full_table_name",
+ /* 264 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt",
+ /* 265 */ "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",
+ /* 266 */ "func_list ::= func",
+ /* 267 */ "func_list ::= func_list NK_COMMA func",
+ /* 268 */ "func ::= function_name NK_LP expression_list NK_RP",
+ /* 269 */ "sma_stream_opt ::=",
+ /* 270 */ "sma_stream_opt ::= sma_stream_opt WATERMARK duration_literal",
+ /* 271 */ "sma_stream_opt ::= sma_stream_opt MAX_DELAY duration_literal",
+ /* 272 */ "sma_stream_opt ::= sma_stream_opt DELETE_MARK duration_literal",
+ /* 273 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery",
+ /* 274 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name",
+ /* 275 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name",
+ /* 276 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name",
+ /* 277 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name",
+ /* 278 */ "cmd ::= DROP TOPIC exists_opt topic_name",
+ /* 279 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name",
+ /* 280 */ "cmd ::= DESC full_table_name",
+ /* 281 */ "cmd ::= DESCRIBE full_table_name",
+ /* 282 */ "cmd ::= RESET QUERY CACHE",
+ /* 283 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery",
+ /* 284 */ "analyze_opt ::=",
+ /* 285 */ "analyze_opt ::= ANALYZE",
+ /* 286 */ "explain_options ::=",
+ /* 287 */ "explain_options ::= explain_options VERBOSE NK_BOOL",
+ /* 288 */ "explain_options ::= explain_options RATIO NK_FLOAT",
+ /* 289 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt",
+ /* 290 */ "cmd ::= DROP FUNCTION exists_opt function_name",
+ /* 291 */ "agg_func_opt ::=",
+ /* 292 */ "agg_func_opt ::= AGGREGATE",
+ /* 293 */ "bufsize_opt ::=",
+ /* 294 */ "bufsize_opt ::= BUFSIZE NK_INTEGER",
+ /* 295 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery",
+ /* 296 */ "cmd ::= DROP STREAM exists_opt stream_name",
+ /* 297 */ "stream_options ::=",
+ /* 298 */ "stream_options ::= stream_options TRIGGER AT_ONCE",
+ /* 299 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE",
+ /* 300 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal",
+ /* 301 */ "stream_options ::= stream_options WATERMARK duration_literal",
+ /* 302 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER",
+ /* 303 */ "stream_options ::= stream_options FILL_HISTORY NK_INTEGER",
+ /* 304 */ "subtable_opt ::=",
+ /* 305 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP",
+ /* 306 */ "cmd ::= KILL CONNECTION NK_INTEGER",
+ /* 307 */ "cmd ::= KILL QUERY NK_STRING",
+ /* 308 */ "cmd ::= KILL TRANSACTION NK_INTEGER",
+ /* 309 */ "cmd ::= BALANCE VGROUP",
+ /* 310 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER",
+ /* 311 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list",
+ /* 312 */ "cmd ::= SPLIT VGROUP NK_INTEGER",
+ /* 313 */ "dnode_list ::= DNODE NK_INTEGER",
+ /* 314 */ "dnode_list ::= dnode_list DNODE NK_INTEGER",
+ /* 315 */ "cmd ::= DELETE FROM full_table_name where_clause_opt",
+ /* 316 */ "cmd ::= query_or_subquery",
+ /* 317 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery",
+ /* 318 */ "cmd ::= INSERT INTO full_table_name query_or_subquery",
+ /* 319 */ "literal ::= NK_INTEGER",
+ /* 320 */ "literal ::= NK_FLOAT",
+ /* 321 */ "literal ::= NK_STRING",
+ /* 322 */ "literal ::= NK_BOOL",
+ /* 323 */ "literal ::= TIMESTAMP NK_STRING",
+ /* 324 */ "literal ::= duration_literal",
+ /* 325 */ "literal ::= NULL",
+ /* 326 */ "literal ::= NK_QUESTION",
+ /* 327 */ "duration_literal ::= NK_VARIABLE",
+ /* 328 */ "signed ::= NK_INTEGER",
+ /* 329 */ "signed ::= NK_PLUS NK_INTEGER",
+ /* 330 */ "signed ::= NK_MINUS NK_INTEGER",
+ /* 331 */ "signed ::= NK_FLOAT",
+ /* 332 */ "signed ::= NK_PLUS NK_FLOAT",
+ /* 333 */ "signed ::= NK_MINUS NK_FLOAT",
+ /* 334 */ "signed_literal ::= signed",
+ /* 335 */ "signed_literal ::= NK_STRING",
+ /* 336 */ "signed_literal ::= NK_BOOL",
+ /* 337 */ "signed_literal ::= TIMESTAMP NK_STRING",
+ /* 338 */ "signed_literal ::= duration_literal",
+ /* 339 */ "signed_literal ::= NULL",
+ /* 340 */ "signed_literal ::= literal_func",
+ /* 341 */ "signed_literal ::= NK_QUESTION",
+ /* 342 */ "literal_list ::= signed_literal",
+ /* 343 */ "literal_list ::= literal_list NK_COMMA signed_literal",
+ /* 344 */ "db_name ::= NK_ID",
+ /* 345 */ "table_name ::= NK_ID",
+ /* 346 */ "column_name ::= NK_ID",
+ /* 347 */ "function_name ::= NK_ID",
+ /* 348 */ "table_alias ::= NK_ID",
+ /* 349 */ "column_alias ::= NK_ID",
+ /* 350 */ "user_name ::= NK_ID",
+ /* 351 */ "topic_name ::= NK_ID",
+ /* 352 */ "stream_name ::= NK_ID",
+ /* 353 */ "cgroup_name ::= NK_ID",
+ /* 354 */ "expr_or_subquery ::= expression",
+ /* 355 */ "expression ::= literal",
+ /* 356 */ "expression ::= pseudo_column",
+ /* 357 */ "expression ::= column_reference",
+ /* 358 */ "expression ::= function_expression",
+ /* 359 */ "expression ::= case_when_expression",
+ /* 360 */ "expression ::= NK_LP expression NK_RP",
+ /* 361 */ "expression ::= NK_PLUS expr_or_subquery",
+ /* 362 */ "expression ::= NK_MINUS expr_or_subquery",
+ /* 363 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery",
+ /* 364 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery",
+ /* 365 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery",
+ /* 366 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery",
+ /* 367 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery",
+ /* 368 */ "expression ::= column_reference NK_ARROW NK_STRING",
+ /* 369 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery",
+ /* 370 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery",
+ /* 371 */ "expression_list ::= expr_or_subquery",
+ /* 372 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery",
+ /* 373 */ "column_reference ::= column_name",
+ /* 374 */ "column_reference ::= table_name NK_DOT column_name",
+ /* 375 */ "pseudo_column ::= ROWTS",
+ /* 376 */ "pseudo_column ::= TBNAME",
+ /* 377 */ "pseudo_column ::= table_name NK_DOT TBNAME",
+ /* 378 */ "pseudo_column ::= QSTART",
+ /* 379 */ "pseudo_column ::= QEND",
+ /* 380 */ "pseudo_column ::= QDURATION",
+ /* 381 */ "pseudo_column ::= WSTART",
+ /* 382 */ "pseudo_column ::= WEND",
+ /* 383 */ "pseudo_column ::= WDURATION",
+ /* 384 */ "pseudo_column ::= IROWTS",
+ /* 385 */ "pseudo_column ::= QTAGS",
+ /* 386 */ "function_expression ::= function_name NK_LP expression_list NK_RP",
+ /* 387 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP",
+ /* 388 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP",
+ /* 389 */ "function_expression ::= literal_func",
+ /* 390 */ "literal_func ::= noarg_func NK_LP NK_RP",
+ /* 391 */ "literal_func ::= NOW",
+ /* 392 */ "noarg_func ::= NOW",
+ /* 393 */ "noarg_func ::= TODAY",
+ /* 394 */ "noarg_func ::= TIMEZONE",
+ /* 395 */ "noarg_func ::= DATABASE",
+ /* 396 */ "noarg_func ::= CLIENT_VERSION",
+ /* 397 */ "noarg_func ::= SERVER_VERSION",
+ /* 398 */ "noarg_func ::= SERVER_STATUS",
+ /* 399 */ "noarg_func ::= CURRENT_USER",
+ /* 400 */ "noarg_func ::= USER",
+ /* 401 */ "star_func ::= COUNT",
+ /* 402 */ "star_func ::= FIRST",
+ /* 403 */ "star_func ::= LAST",
+ /* 404 */ "star_func ::= LAST_ROW",
+ /* 405 */ "star_func_para_list ::= NK_STAR",
+ /* 406 */ "star_func_para_list ::= other_para_list",
+ /* 407 */ "other_para_list ::= star_func_para",
+ /* 408 */ "other_para_list ::= other_para_list NK_COMMA star_func_para",
+ /* 409 */ "star_func_para ::= expr_or_subquery",
+ /* 410 */ "star_func_para ::= table_name NK_DOT NK_STAR",
+ /* 411 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END",
+ /* 412 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END",
+ /* 413 */ "when_then_list ::= when_then_expr",
+ /* 414 */ "when_then_list ::= when_then_list when_then_expr",
+ /* 415 */ "when_then_expr ::= WHEN common_expression THEN common_expression",
+ /* 416 */ "case_when_else_opt ::=",
+ /* 417 */ "case_when_else_opt ::= ELSE common_expression",
+ /* 418 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery",
+ /* 419 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery",
+ /* 420 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery",
+ /* 421 */ "predicate ::= expr_or_subquery IS NULL",
+ /* 422 */ "predicate ::= expr_or_subquery IS NOT NULL",
+ /* 423 */ "predicate ::= expr_or_subquery in_op in_predicate_value",
+ /* 424 */ "compare_op ::= NK_LT",
+ /* 425 */ "compare_op ::= NK_GT",
+ /* 426 */ "compare_op ::= NK_LE",
+ /* 427 */ "compare_op ::= NK_GE",
+ /* 428 */ "compare_op ::= NK_NE",
+ /* 429 */ "compare_op ::= NK_EQ",
+ /* 430 */ "compare_op ::= LIKE",
+ /* 431 */ "compare_op ::= NOT LIKE",
+ /* 432 */ "compare_op ::= MATCH",
+ /* 433 */ "compare_op ::= NMATCH",
+ /* 434 */ "compare_op ::= CONTAINS",
+ /* 435 */ "in_op ::= IN",
+ /* 436 */ "in_op ::= NOT IN",
+ /* 437 */ "in_predicate_value ::= NK_LP literal_list NK_RP",
+ /* 438 */ "boolean_value_expression ::= boolean_primary",
+ /* 439 */ "boolean_value_expression ::= NOT boolean_primary",
+ /* 440 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression",
+ /* 441 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression",
+ /* 442 */ "boolean_primary ::= predicate",
+ /* 443 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP",
+ /* 444 */ "common_expression ::= expr_or_subquery",
+ /* 445 */ "common_expression ::= boolean_value_expression",
+ /* 446 */ "from_clause_opt ::=",
+ /* 447 */ "from_clause_opt ::= FROM table_reference_list",
+ /* 448 */ "table_reference_list ::= table_reference",
+ /* 449 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference",
+ /* 450 */ "table_reference ::= table_primary",
+ /* 451 */ "table_reference ::= joined_table",
+ /* 452 */ "table_primary ::= table_name alias_opt",
+ /* 453 */ "table_primary ::= db_name NK_DOT table_name alias_opt",
+ /* 454 */ "table_primary ::= subquery alias_opt",
+ /* 455 */ "table_primary ::= parenthesized_joined_table",
+ /* 456 */ "alias_opt ::=",
+ /* 457 */ "alias_opt ::= table_alias",
+ /* 458 */ "alias_opt ::= AS table_alias",
+ /* 459 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP",
+ /* 460 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP",
+ /* 461 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition",
+ /* 462 */ "join_type ::=",
+ /* 463 */ "join_type ::= INNER",
+ /* 464 */ "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",
+ /* 465 */ "set_quantifier_opt ::=",
+ /* 466 */ "set_quantifier_opt ::= DISTINCT",
+ /* 467 */ "set_quantifier_opt ::= ALL",
+ /* 468 */ "select_list ::= select_item",
+ /* 469 */ "select_list ::= select_list NK_COMMA select_item",
+ /* 470 */ "select_item ::= NK_STAR",
+ /* 471 */ "select_item ::= common_expression",
+ /* 472 */ "select_item ::= common_expression column_alias",
+ /* 473 */ "select_item ::= common_expression AS column_alias",
+ /* 474 */ "select_item ::= table_name NK_DOT NK_STAR",
+ /* 475 */ "where_clause_opt ::=",
+ /* 476 */ "where_clause_opt ::= WHERE search_condition",
+ /* 477 */ "partition_by_clause_opt ::=",
+ /* 478 */ "partition_by_clause_opt ::= PARTITION BY partition_list",
+ /* 479 */ "partition_list ::= partition_item",
+ /* 480 */ "partition_list ::= partition_list NK_COMMA partition_item",
+ /* 481 */ "partition_item ::= expr_or_subquery",
+ /* 482 */ "partition_item ::= expr_or_subquery column_alias",
+ /* 483 */ "partition_item ::= expr_or_subquery AS column_alias",
+ /* 484 */ "twindow_clause_opt ::=",
+ /* 485 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP",
+ /* 486 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP",
+ /* 487 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt",
+ /* 488 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt",
+ /* 489 */ "sliding_opt ::=",
+ /* 490 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP",
+ /* 491 */ "fill_opt ::=",
+ /* 492 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP",
+ /* 493 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP",
+ /* 494 */ "fill_mode ::= NONE",
+ /* 495 */ "fill_mode ::= PREV",
+ /* 496 */ "fill_mode ::= NULL",
+ /* 497 */ "fill_mode ::= LINEAR",
+ /* 498 */ "fill_mode ::= NEXT",
+ /* 499 */ "group_by_clause_opt ::=",
+ /* 500 */ "group_by_clause_opt ::= GROUP BY group_by_list",
+ /* 501 */ "group_by_list ::= expr_or_subquery",
+ /* 502 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery",
+ /* 503 */ "having_clause_opt ::=",
+ /* 504 */ "having_clause_opt ::= HAVING search_condition",
+ /* 505 */ "range_opt ::=",
+ /* 506 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP",
+ /* 507 */ "every_opt ::=",
+ /* 508 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP",
+ /* 509 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt",
+ /* 510 */ "query_simple ::= query_specification",
+ /* 511 */ "query_simple ::= union_query_expression",
+ /* 512 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery",
+ /* 513 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery",
+ /* 514 */ "query_simple_or_subquery ::= query_simple",
+ /* 515 */ "query_simple_or_subquery ::= subquery",
+ /* 516 */ "query_or_subquery ::= query_expression",
+ /* 517 */ "query_or_subquery ::= subquery",
+ /* 518 */ "order_by_clause_opt ::=",
+ /* 519 */ "order_by_clause_opt ::= ORDER BY sort_specification_list",
+ /* 520 */ "slimit_clause_opt ::=",
+ /* 521 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER",
+ /* 522 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER",
+ /* 523 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER",
+ /* 524 */ "limit_clause_opt ::=",
+ /* 525 */ "limit_clause_opt ::= LIMIT NK_INTEGER",
+ /* 526 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER",
+ /* 527 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER",
+ /* 528 */ "subquery ::= NK_LP query_expression NK_RP",
+ /* 529 */ "subquery ::= NK_LP subquery NK_RP",
+ /* 530 */ "search_condition ::= common_expression",
+ /* 531 */ "sort_specification_list ::= sort_specification",
+ /* 532 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification",
+ /* 533 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt",
+ /* 534 */ "ordering_specification_opt ::=",
+ /* 535 */ "ordering_specification_opt ::= ASC",
+ /* 536 */ "ordering_specification_opt ::= DESC",
+ /* 537 */ "null_ordering_opt ::=",
+ /* 538 */ "null_ordering_opt ::= NULLS FIRST",
+ /* 539 */ "null_ordering_opt ::= NULLS LAST",
};
#endif /* NDEBUG */
@@ -2579,193 +2462,193 @@ static void yy_destructor(
*/
/********* Begin destructor definitions ***************************************/
/* Default NON-TERMINAL Destructor */
- case 319: /* cmd */
- case 322: /* literal */
- case 334: /* db_options */
- case 336: /* alter_db_options */
- case 342: /* retention */
- case 343: /* full_table_name */
- case 346: /* table_options */
- case 350: /* alter_table_clause */
- case 351: /* alter_table_options */
- case 354: /* signed_literal */
- case 355: /* create_subtable_clause */
- case 358: /* drop_table_clause */
- case 361: /* column_def */
- case 365: /* duration_literal */
- case 366: /* rollup_func_name */
- case 368: /* col_name */
- case 369: /* db_name_cond_opt */
- case 370: /* like_pattern_opt */
- case 371: /* table_name_cond */
- case 372: /* from_db_opt */
- case 374: /* tag_item */
- case 376: /* index_options */
- case 378: /* sliding_opt */
- case 379: /* sma_stream_opt */
- case 380: /* func */
- case 381: /* stream_options */
- case 383: /* query_or_subquery */
- case 386: /* explain_options */
- case 390: /* subtable_opt */
- case 391: /* expression */
- case 393: /* where_clause_opt */
- case 394: /* signed */
- case 395: /* literal_func */
- case 398: /* expr_or_subquery */
- case 399: /* subquery */
- case 400: /* pseudo_column */
- case 401: /* column_reference */
- case 402: /* function_expression */
- case 403: /* case_when_expression */
- case 408: /* star_func_para */
- case 410: /* case_when_else_opt */
- case 411: /* common_expression */
- case 412: /* when_then_expr */
- case 413: /* predicate */
- case 416: /* in_predicate_value */
- case 417: /* boolean_value_expression */
- case 418: /* boolean_primary */
- case 419: /* from_clause_opt */
- case 420: /* table_reference_list */
- case 421: /* table_reference */
- case 422: /* table_primary */
- case 423: /* joined_table */
- case 425: /* parenthesized_joined_table */
- case 427: /* search_condition */
- case 428: /* query_specification */
- case 432: /* range_opt */
- case 433: /* every_opt */
- case 434: /* fill_opt */
- case 435: /* twindow_clause_opt */
- case 437: /* having_clause_opt */
- case 438: /* select_item */
- case 440: /* partition_item */
- case 443: /* query_expression */
- case 444: /* query_simple */
- case 446: /* slimit_clause_opt */
- case 447: /* limit_clause_opt */
- case 448: /* union_query_expression */
- case 449: /* query_simple_or_subquery */
- case 451: /* sort_specification */
+ case 322: /* cmd */
+ case 325: /* literal */
+ case 338: /* db_options */
+ case 340: /* alter_db_options */
+ case 346: /* retention */
+ case 347: /* full_table_name */
+ case 350: /* table_options */
+ case 354: /* alter_table_clause */
+ case 355: /* alter_table_options */
+ case 358: /* signed_literal */
+ case 359: /* create_subtable_clause */
+ case 362: /* drop_table_clause */
+ case 365: /* column_def */
+ case 369: /* duration_literal */
+ case 370: /* rollup_func_name */
+ case 372: /* col_name */
+ case 373: /* db_name_cond_opt */
+ case 374: /* like_pattern_opt */
+ case 375: /* table_name_cond */
+ case 376: /* from_db_opt */
+ case 378: /* tag_item */
+ case 380: /* index_options */
+ case 382: /* sliding_opt */
+ case 383: /* sma_stream_opt */
+ case 384: /* func */
+ case 385: /* query_or_subquery */
+ case 388: /* explain_options */
+ case 392: /* stream_options */
+ case 393: /* subtable_opt */
+ case 394: /* expression */
+ case 396: /* where_clause_opt */
+ case 397: /* signed */
+ case 398: /* literal_func */
+ case 401: /* expr_or_subquery */
+ case 402: /* pseudo_column */
+ case 403: /* column_reference */
+ case 404: /* function_expression */
+ case 405: /* case_when_expression */
+ case 410: /* star_func_para */
+ case 412: /* case_when_else_opt */
+ case 413: /* common_expression */
+ case 414: /* when_then_expr */
+ case 415: /* predicate */
+ case 418: /* in_predicate_value */
+ case 419: /* boolean_value_expression */
+ case 420: /* boolean_primary */
+ case 421: /* from_clause_opt */
+ case 422: /* table_reference_list */
+ case 423: /* table_reference */
+ case 424: /* table_primary */
+ case 425: /* joined_table */
+ case 427: /* subquery */
+ case 428: /* parenthesized_joined_table */
+ case 430: /* search_condition */
+ case 431: /* query_specification */
+ case 435: /* range_opt */
+ case 436: /* every_opt */
+ case 437: /* fill_opt */
+ case 438: /* twindow_clause_opt */
+ case 440: /* having_clause_opt */
+ case 441: /* select_item */
+ case 443: /* partition_item */
+ case 446: /* query_expression */
+ case 447: /* query_simple */
+ case 449: /* slimit_clause_opt */
+ case 450: /* limit_clause_opt */
+ case 451: /* union_query_expression */
+ case 452: /* query_simple_or_subquery */
+ case 454: /* sort_specification */
{
- nodesDestroyNode((yypminor->yy164));
+ nodesDestroyNode((yypminor->yy148));
}
break;
- case 320: /* account_options */
- case 321: /* alter_account_options */
- case 323: /* alter_account_option */
- case 337: /* speed_opt */
- case 388: /* bufsize_opt */
+ case 323: /* account_options */
+ case 324: /* alter_account_options */
+ case 326: /* alter_account_option */
+ case 341: /* speed_opt */
+ case 390: /* bufsize_opt */
{
}
break;
- case 324: /* user_name */
- case 327: /* priv_level */
- case 330: /* db_name */
- case 331: /* dnode_endpoint */
- case 352: /* column_name */
- case 360: /* table_name */
- case 367: /* function_name */
- case 375: /* column_alias */
- case 382: /* topic_name */
- case 384: /* cgroup_name */
- case 389: /* stream_name */
- case 397: /* table_alias */
- case 404: /* star_func */
- case 406: /* noarg_func */
- case 424: /* alias_opt */
+ case 327: /* user_name */
+ case 330: /* priv_level */
+ case 333: /* db_name */
+ case 334: /* topic_name */
+ case 335: /* dnode_endpoint */
+ case 356: /* column_name */
+ case 364: /* table_name */
+ case 371: /* function_name */
+ case 379: /* column_alias */
+ case 386: /* cgroup_name */
+ case 391: /* stream_name */
+ case 400: /* table_alias */
+ case 406: /* star_func */
+ case 408: /* noarg_func */
+ case 426: /* alias_opt */
{
}
break;
- case 325: /* sysinfo_opt */
+ case 328: /* sysinfo_opt */
{
}
break;
- case 326: /* privileges */
- case 328: /* priv_type_list */
- case 329: /* priv_type */
+ case 329: /* privileges */
+ case 331: /* priv_type_list */
+ case 332: /* priv_type */
{
}
break;
- case 332: /* force_opt */
- case 333: /* not_exists_opt */
- case 335: /* exists_opt */
- case 385: /* analyze_opt */
- case 387: /* agg_func_opt */
- case 429: /* set_quantifier_opt */
+ case 336: /* force_opt */
+ case 337: /* not_exists_opt */
+ case 339: /* exists_opt */
+ case 387: /* analyze_opt */
+ case 389: /* agg_func_opt */
+ case 432: /* set_quantifier_opt */
{
}
break;
- case 338: /* integer_list */
- case 339: /* variable_list */
- case 340: /* retention_list */
- case 344: /* column_def_list */
- case 345: /* tags_def_opt */
- case 347: /* multi_create_clause */
- case 348: /* tags_def */
- case 349: /* multi_drop_clause */
- case 356: /* specific_cols_opt */
- case 357: /* expression_list */
- case 359: /* col_name_list */
- case 362: /* duration_list */
- case 363: /* rollup_func_list */
- case 373: /* tag_list_opt */
- case 377: /* func_list */
- case 392: /* dnode_list */
- case 396: /* literal_list */
- case 405: /* star_func_para_list */
- case 407: /* other_para_list */
- case 409: /* when_then_list */
- case 430: /* select_list */
- case 431: /* partition_by_clause_opt */
- case 436: /* group_by_clause_opt */
- case 439: /* partition_list */
- case 442: /* group_by_list */
- case 445: /* order_by_clause_opt */
- case 450: /* sort_specification_list */
+ case 342: /* integer_list */
+ case 343: /* variable_list */
+ case 344: /* retention_list */
+ case 348: /* column_def_list */
+ case 349: /* tags_def_opt */
+ case 351: /* multi_create_clause */
+ case 352: /* tags_def */
+ case 353: /* multi_drop_clause */
+ case 360: /* specific_cols_opt */
+ case 361: /* expression_list */
+ case 363: /* col_name_list */
+ case 366: /* duration_list */
+ case 367: /* rollup_func_list */
+ case 377: /* tag_list_opt */
+ case 381: /* func_list */
+ case 395: /* dnode_list */
+ case 399: /* literal_list */
+ case 407: /* star_func_para_list */
+ case 409: /* other_para_list */
+ case 411: /* when_then_list */
+ case 433: /* select_list */
+ case 434: /* partition_by_clause_opt */
+ case 439: /* group_by_clause_opt */
+ case 442: /* partition_list */
+ case 445: /* group_by_list */
+ case 448: /* order_by_clause_opt */
+ case 453: /* sort_specification_list */
{
- nodesDestroyList((yypminor->yy648));
+ nodesDestroyList((yypminor->yy404));
}
break;
- case 341: /* alter_db_option */
- case 364: /* alter_table_option */
+ case 345: /* alter_db_option */
+ case 368: /* alter_table_option */
{
}
break;
- case 353: /* type_name */
+ case 357: /* type_name */
{
}
break;
- case 414: /* compare_op */
- case 415: /* in_op */
+ case 416: /* compare_op */
+ case 417: /* in_op */
{
}
break;
- case 426: /* join_type */
+ case 429: /* join_type */
{
}
break;
- case 441: /* fill_mode */
+ case 444: /* fill_mode */
{
}
break;
- case 452: /* ordering_specification_opt */
+ case 455: /* ordering_specification_opt */
{
}
break;
- case 453: /* null_ordering_opt */
+ case 456: /* null_ordering_opt */
{
}
@@ -3064,542 +2947,546 @@ static const struct {
YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
signed char nrhs; /* Negative of the number of RHS symbols in the rule */
} yyRuleInfo[] = {
- { 319, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */
- { 319, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */
- { 320, 0 }, /* (2) account_options ::= */
- { 320, -3 }, /* (3) account_options ::= account_options PPS literal */
- { 320, -3 }, /* (4) account_options ::= account_options TSERIES literal */
- { 320, -3 }, /* (5) account_options ::= account_options STORAGE literal */
- { 320, -3 }, /* (6) account_options ::= account_options STREAMS literal */
- { 320, -3 }, /* (7) account_options ::= account_options QTIME literal */
- { 320, -3 }, /* (8) account_options ::= account_options DBS literal */
- { 320, -3 }, /* (9) account_options ::= account_options USERS literal */
- { 320, -3 }, /* (10) account_options ::= account_options CONNS literal */
- { 320, -3 }, /* (11) account_options ::= account_options STATE literal */
- { 321, -1 }, /* (12) alter_account_options ::= alter_account_option */
- { 321, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */
- { 323, -2 }, /* (14) alter_account_option ::= PASS literal */
- { 323, -2 }, /* (15) alter_account_option ::= PPS literal */
- { 323, -2 }, /* (16) alter_account_option ::= TSERIES literal */
- { 323, -2 }, /* (17) alter_account_option ::= STORAGE literal */
- { 323, -2 }, /* (18) alter_account_option ::= STREAMS literal */
- { 323, -2 }, /* (19) alter_account_option ::= QTIME literal */
- { 323, -2 }, /* (20) alter_account_option ::= DBS literal */
- { 323, -2 }, /* (21) alter_account_option ::= USERS literal */
- { 323, -2 }, /* (22) alter_account_option ::= CONNS literal */
- { 323, -2 }, /* (23) alter_account_option ::= STATE literal */
- { 319, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */
- { 319, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */
- { 319, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */
- { 319, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */
- { 319, -3 }, /* (28) cmd ::= DROP USER user_name */
- { 325, 0 }, /* (29) sysinfo_opt ::= */
- { 325, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */
- { 319, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */
- { 319, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */
- { 326, -1 }, /* (33) privileges ::= ALL */
- { 326, -1 }, /* (34) privileges ::= priv_type_list */
- { 328, -1 }, /* (35) priv_type_list ::= priv_type */
- { 328, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */
- { 329, -1 }, /* (37) priv_type ::= READ */
- { 329, -1 }, /* (38) priv_type ::= WRITE */
- { 327, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */
- { 327, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */
- { 319, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */
- { 319, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */
- { 319, -4 }, /* (43) cmd ::= DROP DNODE NK_INTEGER force_opt */
- { 319, -4 }, /* (44) cmd ::= DROP DNODE dnode_endpoint force_opt */
- { 319, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */
- { 319, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */
- { 319, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */
- { 319, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */
- { 331, -1 }, /* (49) dnode_endpoint ::= NK_STRING */
- { 331, -1 }, /* (50) dnode_endpoint ::= NK_ID */
- { 331, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */
- { 332, 0 }, /* (52) force_opt ::= */
- { 332, -1 }, /* (53) force_opt ::= FORCE */
- { 319, -3 }, /* (54) cmd ::= ALTER LOCAL NK_STRING */
- { 319, -4 }, /* (55) cmd ::= ALTER LOCAL NK_STRING NK_STRING */
- { 319, -5 }, /* (56) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */
- { 319, -5 }, /* (57) cmd ::= DROP QNODE ON DNODE NK_INTEGER */
- { 319, -5 }, /* (58) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */
- { 319, -5 }, /* (59) cmd ::= DROP BNODE ON DNODE NK_INTEGER */
- { 319, -5 }, /* (60) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */
- { 319, -5 }, /* (61) cmd ::= DROP SNODE ON DNODE NK_INTEGER */
- { 319, -5 }, /* (62) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */
- { 319, -5 }, /* (63) cmd ::= DROP MNODE ON DNODE NK_INTEGER */
- { 319, -5 }, /* (64) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */
- { 319, -4 }, /* (65) cmd ::= DROP DATABASE exists_opt db_name */
- { 319, -2 }, /* (66) cmd ::= USE db_name */
- { 319, -4 }, /* (67) cmd ::= ALTER DATABASE db_name alter_db_options */
- { 319, -3 }, /* (68) cmd ::= FLUSH DATABASE db_name */
- { 319, -4 }, /* (69) cmd ::= TRIM DATABASE db_name speed_opt */
- { 333, -3 }, /* (70) not_exists_opt ::= IF NOT EXISTS */
- { 333, 0 }, /* (71) not_exists_opt ::= */
- { 335, -2 }, /* (72) exists_opt ::= IF EXISTS */
- { 335, 0 }, /* (73) exists_opt ::= */
- { 334, 0 }, /* (74) db_options ::= */
- { 334, -3 }, /* (75) db_options ::= db_options BUFFER NK_INTEGER */
- { 334, -3 }, /* (76) db_options ::= db_options CACHEMODEL NK_STRING */
- { 334, -3 }, /* (77) db_options ::= db_options CACHESIZE NK_INTEGER */
- { 334, -3 }, /* (78) db_options ::= db_options COMP NK_INTEGER */
- { 334, -3 }, /* (79) db_options ::= db_options DURATION NK_INTEGER */
- { 334, -3 }, /* (80) db_options ::= db_options DURATION NK_VARIABLE */
- { 334, -3 }, /* (81) db_options ::= db_options MAXROWS NK_INTEGER */
- { 334, -3 }, /* (82) db_options ::= db_options MINROWS NK_INTEGER */
- { 334, -3 }, /* (83) db_options ::= db_options KEEP integer_list */
- { 334, -3 }, /* (84) db_options ::= db_options KEEP variable_list */
- { 334, -3 }, /* (85) db_options ::= db_options PAGES NK_INTEGER */
- { 334, -3 }, /* (86) db_options ::= db_options PAGESIZE NK_INTEGER */
- { 334, -3 }, /* (87) db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */
- { 334, -3 }, /* (88) db_options ::= db_options PRECISION NK_STRING */
- { 334, -3 }, /* (89) db_options ::= db_options REPLICA NK_INTEGER */
- { 334, -3 }, /* (90) db_options ::= db_options STRICT NK_STRING */
- { 334, -3 }, /* (91) db_options ::= db_options VGROUPS NK_INTEGER */
- { 334, -3 }, /* (92) db_options ::= db_options SINGLE_STABLE NK_INTEGER */
- { 334, -3 }, /* (93) db_options ::= db_options RETENTIONS retention_list */
- { 334, -3 }, /* (94) db_options ::= db_options SCHEMALESS NK_INTEGER */
- { 334, -3 }, /* (95) db_options ::= db_options WAL_LEVEL NK_INTEGER */
- { 334, -3 }, /* (96) db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */
- { 334, -3 }, /* (97) db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */
- { 334, -4 }, /* (98) db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */
- { 334, -3 }, /* (99) db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */
- { 334, -4 }, /* (100) db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */
- { 334, -3 }, /* (101) db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */
- { 334, -3 }, /* (102) db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */
- { 334, -3 }, /* (103) db_options ::= db_options STT_TRIGGER NK_INTEGER */
- { 334, -3 }, /* (104) db_options ::= db_options TABLE_PREFIX NK_INTEGER */
- { 334, -3 }, /* (105) db_options ::= db_options TABLE_SUFFIX NK_INTEGER */
- { 336, -1 }, /* (106) alter_db_options ::= alter_db_option */
- { 336, -2 }, /* (107) alter_db_options ::= alter_db_options alter_db_option */
- { 341, -2 }, /* (108) alter_db_option ::= BUFFER NK_INTEGER */
- { 341, -2 }, /* (109) alter_db_option ::= CACHEMODEL NK_STRING */
- { 341, -2 }, /* (110) alter_db_option ::= CACHESIZE NK_INTEGER */
- { 341, -2 }, /* (111) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */
- { 341, -2 }, /* (112) alter_db_option ::= KEEP integer_list */
- { 341, -2 }, /* (113) alter_db_option ::= KEEP variable_list */
- { 341, -2 }, /* (114) alter_db_option ::= PAGES NK_INTEGER */
- { 341, -2 }, /* (115) alter_db_option ::= REPLICA NK_INTEGER */
- { 341, -2 }, /* (116) alter_db_option ::= STRICT NK_STRING */
- { 341, -2 }, /* (117) alter_db_option ::= WAL_LEVEL NK_INTEGER */
- { 341, -2 }, /* (118) alter_db_option ::= STT_TRIGGER NK_INTEGER */
- { 338, -1 }, /* (119) integer_list ::= NK_INTEGER */
- { 338, -3 }, /* (120) integer_list ::= integer_list NK_COMMA NK_INTEGER */
- { 339, -1 }, /* (121) variable_list ::= NK_VARIABLE */
- { 339, -3 }, /* (122) variable_list ::= variable_list NK_COMMA NK_VARIABLE */
- { 340, -1 }, /* (123) retention_list ::= retention */
- { 340, -3 }, /* (124) retention_list ::= retention_list NK_COMMA retention */
- { 342, -3 }, /* (125) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */
- { 337, 0 }, /* (126) speed_opt ::= */
- { 337, -2 }, /* (127) speed_opt ::= MAX_SPEED NK_INTEGER */
- { 319, -9 }, /* (128) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */
- { 319, -3 }, /* (129) cmd ::= CREATE TABLE multi_create_clause */
- { 319, -9 }, /* (130) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */
- { 319, -3 }, /* (131) cmd ::= DROP TABLE multi_drop_clause */
- { 319, -4 }, /* (132) cmd ::= DROP STABLE exists_opt full_table_name */
- { 319, -3 }, /* (133) cmd ::= ALTER TABLE alter_table_clause */
- { 319, -3 }, /* (134) cmd ::= ALTER STABLE alter_table_clause */
- { 350, -2 }, /* (135) alter_table_clause ::= full_table_name alter_table_options */
- { 350, -5 }, /* (136) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */
- { 350, -4 }, /* (137) alter_table_clause ::= full_table_name DROP COLUMN column_name */
- { 350, -5 }, /* (138) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */
- { 350, -5 }, /* (139) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */
- { 350, -5 }, /* (140) alter_table_clause ::= full_table_name ADD TAG column_name type_name */
- { 350, -4 }, /* (141) alter_table_clause ::= full_table_name DROP TAG column_name */
- { 350, -5 }, /* (142) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */
- { 350, -5 }, /* (143) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */
- { 350, -6 }, /* (144) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */
- { 347, -1 }, /* (145) multi_create_clause ::= create_subtable_clause */
- { 347, -2 }, /* (146) multi_create_clause ::= multi_create_clause create_subtable_clause */
- { 355, -10 }, /* (147) 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 */
- { 349, -1 }, /* (148) multi_drop_clause ::= drop_table_clause */
- { 349, -2 }, /* (149) multi_drop_clause ::= multi_drop_clause drop_table_clause */
- { 358, -2 }, /* (150) drop_table_clause ::= exists_opt full_table_name */
- { 356, 0 }, /* (151) specific_cols_opt ::= */
- { 356, -3 }, /* (152) specific_cols_opt ::= NK_LP col_name_list NK_RP */
- { 343, -1 }, /* (153) full_table_name ::= table_name */
- { 343, -3 }, /* (154) full_table_name ::= db_name NK_DOT table_name */
- { 344, -1 }, /* (155) column_def_list ::= column_def */
- { 344, -3 }, /* (156) column_def_list ::= column_def_list NK_COMMA column_def */
- { 361, -2 }, /* (157) column_def ::= column_name type_name */
- { 361, -4 }, /* (158) column_def ::= column_name type_name COMMENT NK_STRING */
- { 353, -1 }, /* (159) type_name ::= BOOL */
- { 353, -1 }, /* (160) type_name ::= TINYINT */
- { 353, -1 }, /* (161) type_name ::= SMALLINT */
- { 353, -1 }, /* (162) type_name ::= INT */
- { 353, -1 }, /* (163) type_name ::= INTEGER */
- { 353, -1 }, /* (164) type_name ::= BIGINT */
- { 353, -1 }, /* (165) type_name ::= FLOAT */
- { 353, -1 }, /* (166) type_name ::= DOUBLE */
- { 353, -4 }, /* (167) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */
- { 353, -1 }, /* (168) type_name ::= TIMESTAMP */
- { 353, -4 }, /* (169) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */
- { 353, -2 }, /* (170) type_name ::= TINYINT UNSIGNED */
- { 353, -2 }, /* (171) type_name ::= SMALLINT UNSIGNED */
- { 353, -2 }, /* (172) type_name ::= INT UNSIGNED */
- { 353, -2 }, /* (173) type_name ::= BIGINT UNSIGNED */
- { 353, -1 }, /* (174) type_name ::= JSON */
- { 353, -4 }, /* (175) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */
- { 353, -1 }, /* (176) type_name ::= MEDIUMBLOB */
- { 353, -1 }, /* (177) type_name ::= BLOB */
- { 353, -4 }, /* (178) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */
- { 353, -1 }, /* (179) type_name ::= DECIMAL */
- { 353, -4 }, /* (180) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */
- { 353, -6 }, /* (181) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */
- { 345, 0 }, /* (182) tags_def_opt ::= */
- { 345, -1 }, /* (183) tags_def_opt ::= tags_def */
- { 348, -4 }, /* (184) tags_def ::= TAGS NK_LP column_def_list NK_RP */
- { 346, 0 }, /* (185) table_options ::= */
- { 346, -3 }, /* (186) table_options ::= table_options COMMENT NK_STRING */
- { 346, -3 }, /* (187) table_options ::= table_options MAX_DELAY duration_list */
- { 346, -3 }, /* (188) table_options ::= table_options WATERMARK duration_list */
- { 346, -5 }, /* (189) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */
- { 346, -3 }, /* (190) table_options ::= table_options TTL NK_INTEGER */
- { 346, -5 }, /* (191) table_options ::= table_options SMA NK_LP col_name_list NK_RP */
- { 351, -1 }, /* (192) alter_table_options ::= alter_table_option */
- { 351, -2 }, /* (193) alter_table_options ::= alter_table_options alter_table_option */
- { 364, -2 }, /* (194) alter_table_option ::= COMMENT NK_STRING */
- { 364, -2 }, /* (195) alter_table_option ::= TTL NK_INTEGER */
- { 362, -1 }, /* (196) duration_list ::= duration_literal */
- { 362, -3 }, /* (197) duration_list ::= duration_list NK_COMMA duration_literal */
- { 363, -1 }, /* (198) rollup_func_list ::= rollup_func_name */
- { 363, -3 }, /* (199) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */
- { 366, -1 }, /* (200) rollup_func_name ::= function_name */
- { 366, -1 }, /* (201) rollup_func_name ::= FIRST */
- { 366, -1 }, /* (202) rollup_func_name ::= LAST */
- { 359, -1 }, /* (203) col_name_list ::= col_name */
- { 359, -3 }, /* (204) col_name_list ::= col_name_list NK_COMMA col_name */
- { 368, -1 }, /* (205) col_name ::= column_name */
- { 319, -2 }, /* (206) cmd ::= SHOW DNODES */
- { 319, -2 }, /* (207) cmd ::= SHOW USERS */
- { 319, -2 }, /* (208) cmd ::= SHOW DATABASES */
- { 319, -4 }, /* (209) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */
- { 319, -4 }, /* (210) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */
- { 319, -3 }, /* (211) cmd ::= SHOW db_name_cond_opt VGROUPS */
- { 319, -2 }, /* (212) cmd ::= SHOW MNODES */
- { 319, -2 }, /* (213) cmd ::= SHOW QNODES */
- { 319, -2 }, /* (214) cmd ::= SHOW FUNCTIONS */
- { 319, -5 }, /* (215) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */
- { 319, -2 }, /* (216) cmd ::= SHOW STREAMS */
- { 319, -2 }, /* (217) cmd ::= SHOW ACCOUNTS */
- { 319, -2 }, /* (218) cmd ::= SHOW APPS */
- { 319, -2 }, /* (219) cmd ::= SHOW CONNECTIONS */
- { 319, -2 }, /* (220) cmd ::= SHOW LICENCES */
- { 319, -2 }, /* (221) cmd ::= SHOW GRANTS */
- { 319, -4 }, /* (222) cmd ::= SHOW CREATE DATABASE db_name */
- { 319, -4 }, /* (223) cmd ::= SHOW CREATE TABLE full_table_name */
- { 319, -4 }, /* (224) cmd ::= SHOW CREATE STABLE full_table_name */
- { 319, -2 }, /* (225) cmd ::= SHOW QUERIES */
- { 319, -2 }, /* (226) cmd ::= SHOW SCORES */
- { 319, -2 }, /* (227) cmd ::= SHOW TOPICS */
- { 319, -2 }, /* (228) cmd ::= SHOW VARIABLES */
- { 319, -3 }, /* (229) cmd ::= SHOW CLUSTER VARIABLES */
- { 319, -3 }, /* (230) cmd ::= SHOW LOCAL VARIABLES */
- { 319, -5 }, /* (231) cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */
- { 319, -2 }, /* (232) cmd ::= SHOW BNODES */
- { 319, -2 }, /* (233) cmd ::= SHOW SNODES */
- { 319, -2 }, /* (234) cmd ::= SHOW CLUSTER */
- { 319, -2 }, /* (235) cmd ::= SHOW TRANSACTIONS */
- { 319, -4 }, /* (236) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */
- { 319, -2 }, /* (237) cmd ::= SHOW CONSUMERS */
- { 319, -2 }, /* (238) cmd ::= SHOW SUBSCRIPTIONS */
- { 319, -5 }, /* (239) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */
- { 319, -7 }, /* (240) cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */
- { 319, -3 }, /* (241) cmd ::= SHOW VNODES NK_INTEGER */
- { 319, -3 }, /* (242) cmd ::= SHOW VNODES NK_STRING */
- { 369, 0 }, /* (243) db_name_cond_opt ::= */
- { 369, -2 }, /* (244) db_name_cond_opt ::= db_name NK_DOT */
- { 370, 0 }, /* (245) like_pattern_opt ::= */
- { 370, -2 }, /* (246) like_pattern_opt ::= LIKE NK_STRING */
- { 371, -1 }, /* (247) table_name_cond ::= table_name */
- { 372, 0 }, /* (248) from_db_opt ::= */
- { 372, -2 }, /* (249) from_db_opt ::= FROM db_name */
- { 373, 0 }, /* (250) tag_list_opt ::= */
- { 373, -1 }, /* (251) tag_list_opt ::= tag_item */
- { 373, -3 }, /* (252) tag_list_opt ::= tag_list_opt NK_COMMA tag_item */
- { 374, -1 }, /* (253) tag_item ::= TBNAME */
- { 374, -1 }, /* (254) tag_item ::= QTAGS */
- { 374, -1 }, /* (255) tag_item ::= column_name */
- { 374, -2 }, /* (256) tag_item ::= column_name column_alias */
- { 374, -3 }, /* (257) tag_item ::= column_name AS column_alias */
- { 319, -8 }, /* (258) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */
- { 319, -4 }, /* (259) cmd ::= DROP INDEX exists_opt full_table_name */
- { 376, -10 }, /* (260) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */
- { 376, -12 }, /* (261) 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 */
- { 377, -1 }, /* (262) func_list ::= func */
- { 377, -3 }, /* (263) func_list ::= func_list NK_COMMA func */
- { 380, -4 }, /* (264) func ::= function_name NK_LP expression_list NK_RP */
- { 379, 0 }, /* (265) sma_stream_opt ::= */
- { 379, -3 }, /* (266) sma_stream_opt ::= stream_options WATERMARK duration_literal */
- { 379, -3 }, /* (267) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */
- { 319, -6 }, /* (268) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */
- { 319, -7 }, /* (269) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */
- { 319, -9 }, /* (270) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */
- { 319, -7 }, /* (271) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */
- { 319, -9 }, /* (272) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */
- { 319, -4 }, /* (273) cmd ::= DROP TOPIC exists_opt topic_name */
- { 319, -7 }, /* (274) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */
- { 319, -2 }, /* (275) cmd ::= DESC full_table_name */
- { 319, -2 }, /* (276) cmd ::= DESCRIBE full_table_name */
- { 319, -3 }, /* (277) cmd ::= RESET QUERY CACHE */
- { 319, -4 }, /* (278) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */
- { 385, 0 }, /* (279) analyze_opt ::= */
- { 385, -1 }, /* (280) analyze_opt ::= ANALYZE */
- { 386, 0 }, /* (281) explain_options ::= */
- { 386, -3 }, /* (282) explain_options ::= explain_options VERBOSE NK_BOOL */
- { 386, -3 }, /* (283) explain_options ::= explain_options RATIO NK_FLOAT */
- { 319, -10 }, /* (284) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */
- { 319, -4 }, /* (285) cmd ::= DROP FUNCTION exists_opt function_name */
- { 387, 0 }, /* (286) agg_func_opt ::= */
- { 387, -1 }, /* (287) agg_func_opt ::= AGGREGATE */
- { 388, 0 }, /* (288) bufsize_opt ::= */
- { 388, -2 }, /* (289) bufsize_opt ::= BUFSIZE NK_INTEGER */
- { 319, -11 }, /* (290) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */
- { 319, -4 }, /* (291) cmd ::= DROP STREAM exists_opt stream_name */
- { 381, 0 }, /* (292) stream_options ::= */
- { 381, -3 }, /* (293) stream_options ::= stream_options TRIGGER AT_ONCE */
- { 381, -3 }, /* (294) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */
- { 381, -4 }, /* (295) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */
- { 381, -3 }, /* (296) stream_options ::= stream_options WATERMARK duration_literal */
- { 381, -4 }, /* (297) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */
- { 381, -3 }, /* (298) stream_options ::= stream_options FILL_HISTORY NK_INTEGER */
- { 390, 0 }, /* (299) subtable_opt ::= */
- { 390, -4 }, /* (300) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */
- { 319, -3 }, /* (301) cmd ::= KILL CONNECTION NK_INTEGER */
- { 319, -3 }, /* (302) cmd ::= KILL QUERY NK_STRING */
- { 319, -3 }, /* (303) cmd ::= KILL TRANSACTION NK_INTEGER */
- { 319, -2 }, /* (304) cmd ::= BALANCE VGROUP */
- { 319, -4 }, /* (305) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */
- { 319, -4 }, /* (306) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */
- { 319, -3 }, /* (307) cmd ::= SPLIT VGROUP NK_INTEGER */
- { 392, -2 }, /* (308) dnode_list ::= DNODE NK_INTEGER */
- { 392, -3 }, /* (309) dnode_list ::= dnode_list DNODE NK_INTEGER */
- { 319, -4 }, /* (310) cmd ::= DELETE FROM full_table_name where_clause_opt */
- { 319, -1 }, /* (311) cmd ::= query_or_subquery */
- { 319, -7 }, /* (312) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */
- { 319, -4 }, /* (313) cmd ::= INSERT INTO full_table_name query_or_subquery */
- { 322, -1 }, /* (314) literal ::= NK_INTEGER */
- { 322, -1 }, /* (315) literal ::= NK_FLOAT */
- { 322, -1 }, /* (316) literal ::= NK_STRING */
- { 322, -1 }, /* (317) literal ::= NK_BOOL */
- { 322, -2 }, /* (318) literal ::= TIMESTAMP NK_STRING */
- { 322, -1 }, /* (319) literal ::= duration_literal */
- { 322, -1 }, /* (320) literal ::= NULL */
- { 322, -1 }, /* (321) literal ::= NK_QUESTION */
- { 365, -1 }, /* (322) duration_literal ::= NK_VARIABLE */
- { 394, -1 }, /* (323) signed ::= NK_INTEGER */
- { 394, -2 }, /* (324) signed ::= NK_PLUS NK_INTEGER */
- { 394, -2 }, /* (325) signed ::= NK_MINUS NK_INTEGER */
- { 394, -1 }, /* (326) signed ::= NK_FLOAT */
- { 394, -2 }, /* (327) signed ::= NK_PLUS NK_FLOAT */
- { 394, -2 }, /* (328) signed ::= NK_MINUS NK_FLOAT */
- { 354, -1 }, /* (329) signed_literal ::= signed */
- { 354, -1 }, /* (330) signed_literal ::= NK_STRING */
- { 354, -1 }, /* (331) signed_literal ::= NK_BOOL */
- { 354, -2 }, /* (332) signed_literal ::= TIMESTAMP NK_STRING */
- { 354, -1 }, /* (333) signed_literal ::= duration_literal */
- { 354, -1 }, /* (334) signed_literal ::= NULL */
- { 354, -1 }, /* (335) signed_literal ::= literal_func */
- { 354, -1 }, /* (336) signed_literal ::= NK_QUESTION */
- { 396, -1 }, /* (337) literal_list ::= signed_literal */
- { 396, -3 }, /* (338) literal_list ::= literal_list NK_COMMA signed_literal */
- { 330, -1 }, /* (339) db_name ::= NK_ID */
- { 360, -1 }, /* (340) table_name ::= NK_ID */
- { 352, -1 }, /* (341) column_name ::= NK_ID */
- { 367, -1 }, /* (342) function_name ::= NK_ID */
- { 397, -1 }, /* (343) table_alias ::= NK_ID */
- { 375, -1 }, /* (344) column_alias ::= NK_ID */
- { 324, -1 }, /* (345) user_name ::= NK_ID */
- { 382, -1 }, /* (346) topic_name ::= NK_ID */
- { 389, -1 }, /* (347) stream_name ::= NK_ID */
- { 384, -1 }, /* (348) cgroup_name ::= NK_ID */
- { 398, -1 }, /* (349) expr_or_subquery ::= expression */
- { 398, -1 }, /* (350) expr_or_subquery ::= subquery */
- { 391, -1 }, /* (351) expression ::= literal */
- { 391, -1 }, /* (352) expression ::= pseudo_column */
- { 391, -1 }, /* (353) expression ::= column_reference */
- { 391, -1 }, /* (354) expression ::= function_expression */
- { 391, -1 }, /* (355) expression ::= case_when_expression */
- { 391, -3 }, /* (356) expression ::= NK_LP expression NK_RP */
- { 391, -2 }, /* (357) expression ::= NK_PLUS expr_or_subquery */
- { 391, -2 }, /* (358) expression ::= NK_MINUS expr_or_subquery */
- { 391, -3 }, /* (359) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */
- { 391, -3 }, /* (360) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */
- { 391, -3 }, /* (361) expression ::= expr_or_subquery NK_STAR expr_or_subquery */
- { 391, -3 }, /* (362) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */
- { 391, -3 }, /* (363) expression ::= expr_or_subquery NK_REM expr_or_subquery */
- { 391, -3 }, /* (364) expression ::= column_reference NK_ARROW NK_STRING */
- { 391, -3 }, /* (365) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */
- { 391, -3 }, /* (366) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */
- { 357, -1 }, /* (367) expression_list ::= expr_or_subquery */
- { 357, -3 }, /* (368) expression_list ::= expression_list NK_COMMA expr_or_subquery */
- { 401, -1 }, /* (369) column_reference ::= column_name */
- { 401, -3 }, /* (370) column_reference ::= table_name NK_DOT column_name */
- { 400, -1 }, /* (371) pseudo_column ::= ROWTS */
- { 400, -1 }, /* (372) pseudo_column ::= TBNAME */
- { 400, -3 }, /* (373) pseudo_column ::= table_name NK_DOT TBNAME */
- { 400, -1 }, /* (374) pseudo_column ::= QSTART */
- { 400, -1 }, /* (375) pseudo_column ::= QEND */
- { 400, -1 }, /* (376) pseudo_column ::= QDURATION */
- { 400, -1 }, /* (377) pseudo_column ::= WSTART */
- { 400, -1 }, /* (378) pseudo_column ::= WEND */
- { 400, -1 }, /* (379) pseudo_column ::= WDURATION */
- { 400, -1 }, /* (380) pseudo_column ::= IROWTS */
- { 400, -1 }, /* (381) pseudo_column ::= QTAGS */
- { 402, -4 }, /* (382) function_expression ::= function_name NK_LP expression_list NK_RP */
- { 402, -4 }, /* (383) function_expression ::= star_func NK_LP star_func_para_list NK_RP */
- { 402, -6 }, /* (384) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */
- { 402, -1 }, /* (385) function_expression ::= literal_func */
- { 395, -3 }, /* (386) literal_func ::= noarg_func NK_LP NK_RP */
- { 395, -1 }, /* (387) literal_func ::= NOW */
- { 406, -1 }, /* (388) noarg_func ::= NOW */
- { 406, -1 }, /* (389) noarg_func ::= TODAY */
- { 406, -1 }, /* (390) noarg_func ::= TIMEZONE */
- { 406, -1 }, /* (391) noarg_func ::= DATABASE */
- { 406, -1 }, /* (392) noarg_func ::= CLIENT_VERSION */
- { 406, -1 }, /* (393) noarg_func ::= SERVER_VERSION */
- { 406, -1 }, /* (394) noarg_func ::= SERVER_STATUS */
- { 406, -1 }, /* (395) noarg_func ::= CURRENT_USER */
- { 406, -1 }, /* (396) noarg_func ::= USER */
- { 404, -1 }, /* (397) star_func ::= COUNT */
- { 404, -1 }, /* (398) star_func ::= FIRST */
- { 404, -1 }, /* (399) star_func ::= LAST */
- { 404, -1 }, /* (400) star_func ::= LAST_ROW */
- { 405, -1 }, /* (401) star_func_para_list ::= NK_STAR */
- { 405, -1 }, /* (402) star_func_para_list ::= other_para_list */
- { 407, -1 }, /* (403) other_para_list ::= star_func_para */
- { 407, -3 }, /* (404) other_para_list ::= other_para_list NK_COMMA star_func_para */
- { 408, -1 }, /* (405) star_func_para ::= expr_or_subquery */
- { 408, -3 }, /* (406) star_func_para ::= table_name NK_DOT NK_STAR */
- { 403, -4 }, /* (407) case_when_expression ::= CASE when_then_list case_when_else_opt END */
- { 403, -5 }, /* (408) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */
- { 409, -1 }, /* (409) when_then_list ::= when_then_expr */
- { 409, -2 }, /* (410) when_then_list ::= when_then_list when_then_expr */
- { 412, -4 }, /* (411) when_then_expr ::= WHEN common_expression THEN common_expression */
- { 410, 0 }, /* (412) case_when_else_opt ::= */
- { 410, -2 }, /* (413) case_when_else_opt ::= ELSE common_expression */
- { 413, -3 }, /* (414) predicate ::= expr_or_subquery compare_op expr_or_subquery */
- { 413, -5 }, /* (415) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */
- { 413, -6 }, /* (416) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */
- { 413, -3 }, /* (417) predicate ::= expr_or_subquery IS NULL */
- { 413, -4 }, /* (418) predicate ::= expr_or_subquery IS NOT NULL */
- { 413, -3 }, /* (419) predicate ::= expr_or_subquery in_op in_predicate_value */
- { 414, -1 }, /* (420) compare_op ::= NK_LT */
- { 414, -1 }, /* (421) compare_op ::= NK_GT */
- { 414, -1 }, /* (422) compare_op ::= NK_LE */
- { 414, -1 }, /* (423) compare_op ::= NK_GE */
- { 414, -1 }, /* (424) compare_op ::= NK_NE */
- { 414, -1 }, /* (425) compare_op ::= NK_EQ */
- { 414, -1 }, /* (426) compare_op ::= LIKE */
- { 414, -2 }, /* (427) compare_op ::= NOT LIKE */
- { 414, -1 }, /* (428) compare_op ::= MATCH */
- { 414, -1 }, /* (429) compare_op ::= NMATCH */
- { 414, -1 }, /* (430) compare_op ::= CONTAINS */
- { 415, -1 }, /* (431) in_op ::= IN */
- { 415, -2 }, /* (432) in_op ::= NOT IN */
- { 416, -3 }, /* (433) in_predicate_value ::= NK_LP literal_list NK_RP */
- { 417, -1 }, /* (434) boolean_value_expression ::= boolean_primary */
- { 417, -2 }, /* (435) boolean_value_expression ::= NOT boolean_primary */
- { 417, -3 }, /* (436) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */
- { 417, -3 }, /* (437) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */
- { 418, -1 }, /* (438) boolean_primary ::= predicate */
- { 418, -3 }, /* (439) boolean_primary ::= NK_LP boolean_value_expression NK_RP */
- { 411, -1 }, /* (440) common_expression ::= expr_or_subquery */
- { 411, -1 }, /* (441) common_expression ::= boolean_value_expression */
- { 419, 0 }, /* (442) from_clause_opt ::= */
- { 419, -2 }, /* (443) from_clause_opt ::= FROM table_reference_list */
- { 420, -1 }, /* (444) table_reference_list ::= table_reference */
- { 420, -3 }, /* (445) table_reference_list ::= table_reference_list NK_COMMA table_reference */
- { 421, -1 }, /* (446) table_reference ::= table_primary */
- { 421, -1 }, /* (447) table_reference ::= joined_table */
- { 422, -2 }, /* (448) table_primary ::= table_name alias_opt */
- { 422, -4 }, /* (449) table_primary ::= db_name NK_DOT table_name alias_opt */
- { 422, -2 }, /* (450) table_primary ::= subquery alias_opt */
- { 422, -1 }, /* (451) table_primary ::= parenthesized_joined_table */
- { 424, 0 }, /* (452) alias_opt ::= */
- { 424, -1 }, /* (453) alias_opt ::= table_alias */
- { 424, -2 }, /* (454) alias_opt ::= AS table_alias */
- { 425, -3 }, /* (455) parenthesized_joined_table ::= NK_LP joined_table NK_RP */
- { 425, -3 }, /* (456) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */
- { 423, -6 }, /* (457) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
- { 426, 0 }, /* (458) join_type ::= */
- { 426, -1 }, /* (459) join_type ::= INNER */
- { 428, -12 }, /* (460) 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 */
- { 429, 0 }, /* (461) set_quantifier_opt ::= */
- { 429, -1 }, /* (462) set_quantifier_opt ::= DISTINCT */
- { 429, -1 }, /* (463) set_quantifier_opt ::= ALL */
- { 430, -1 }, /* (464) select_list ::= select_item */
- { 430, -3 }, /* (465) select_list ::= select_list NK_COMMA select_item */
- { 438, -1 }, /* (466) select_item ::= NK_STAR */
- { 438, -1 }, /* (467) select_item ::= common_expression */
- { 438, -2 }, /* (468) select_item ::= common_expression column_alias */
- { 438, -3 }, /* (469) select_item ::= common_expression AS column_alias */
- { 438, -3 }, /* (470) select_item ::= table_name NK_DOT NK_STAR */
- { 393, 0 }, /* (471) where_clause_opt ::= */
- { 393, -2 }, /* (472) where_clause_opt ::= WHERE search_condition */
- { 431, 0 }, /* (473) partition_by_clause_opt ::= */
- { 431, -3 }, /* (474) partition_by_clause_opt ::= PARTITION BY partition_list */
- { 439, -1 }, /* (475) partition_list ::= partition_item */
- { 439, -3 }, /* (476) partition_list ::= partition_list NK_COMMA partition_item */
- { 440, -1 }, /* (477) partition_item ::= expr_or_subquery */
- { 440, -2 }, /* (478) partition_item ::= expr_or_subquery column_alias */
- { 440, -3 }, /* (479) partition_item ::= expr_or_subquery AS column_alias */
- { 435, 0 }, /* (480) twindow_clause_opt ::= */
- { 435, -6 }, /* (481) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
- { 435, -4 }, /* (482) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */
- { 435, -6 }, /* (483) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
- { 435, -8 }, /* (484) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
- { 378, 0 }, /* (485) sliding_opt ::= */
- { 378, -4 }, /* (486) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */
- { 434, 0 }, /* (487) fill_opt ::= */
- { 434, -4 }, /* (488) fill_opt ::= FILL NK_LP fill_mode NK_RP */
- { 434, -6 }, /* (489) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
- { 441, -1 }, /* (490) fill_mode ::= NONE */
- { 441, -1 }, /* (491) fill_mode ::= PREV */
- { 441, -1 }, /* (492) fill_mode ::= NULL */
- { 441, -1 }, /* (493) fill_mode ::= LINEAR */
- { 441, -1 }, /* (494) fill_mode ::= NEXT */
- { 436, 0 }, /* (495) group_by_clause_opt ::= */
- { 436, -3 }, /* (496) group_by_clause_opt ::= GROUP BY group_by_list */
- { 442, -1 }, /* (497) group_by_list ::= expr_or_subquery */
- { 442, -3 }, /* (498) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */
- { 437, 0 }, /* (499) having_clause_opt ::= */
- { 437, -2 }, /* (500) having_clause_opt ::= HAVING search_condition */
- { 432, 0 }, /* (501) range_opt ::= */
- { 432, -6 }, /* (502) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */
- { 433, 0 }, /* (503) every_opt ::= */
- { 433, -4 }, /* (504) every_opt ::= EVERY NK_LP duration_literal NK_RP */
- { 443, -4 }, /* (505) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */
- { 444, -1 }, /* (506) query_simple ::= query_specification */
- { 444, -1 }, /* (507) query_simple ::= union_query_expression */
- { 448, -4 }, /* (508) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */
- { 448, -3 }, /* (509) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */
- { 449, -1 }, /* (510) query_simple_or_subquery ::= query_simple */
- { 449, -1 }, /* (511) query_simple_or_subquery ::= subquery */
- { 383, -1 }, /* (512) query_or_subquery ::= query_expression */
- { 383, -1 }, /* (513) query_or_subquery ::= subquery */
- { 445, 0 }, /* (514) order_by_clause_opt ::= */
- { 445, -3 }, /* (515) order_by_clause_opt ::= ORDER BY sort_specification_list */
- { 446, 0 }, /* (516) slimit_clause_opt ::= */
- { 446, -2 }, /* (517) slimit_clause_opt ::= SLIMIT NK_INTEGER */
- { 446, -4 }, /* (518) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
- { 446, -4 }, /* (519) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- { 447, 0 }, /* (520) limit_clause_opt ::= */
- { 447, -2 }, /* (521) limit_clause_opt ::= LIMIT NK_INTEGER */
- { 447, -4 }, /* (522) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */
- { 447, -4 }, /* (523) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- { 399, -3 }, /* (524) subquery ::= NK_LP query_expression NK_RP */
- { 399, -3 }, /* (525) subquery ::= NK_LP subquery NK_RP */
- { 427, -1 }, /* (526) search_condition ::= common_expression */
- { 450, -1 }, /* (527) sort_specification_list ::= sort_specification */
- { 450, -3 }, /* (528) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */
- { 451, -3 }, /* (529) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */
- { 452, 0 }, /* (530) ordering_specification_opt ::= */
- { 452, -1 }, /* (531) ordering_specification_opt ::= ASC */
- { 452, -1 }, /* (532) ordering_specification_opt ::= DESC */
- { 453, 0 }, /* (533) null_ordering_opt ::= */
- { 453, -2 }, /* (534) null_ordering_opt ::= NULLS FIRST */
- { 453, -2 }, /* (535) null_ordering_opt ::= NULLS LAST */
+ { 322, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */
+ { 322, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */
+ { 323, 0 }, /* (2) account_options ::= */
+ { 323, -3 }, /* (3) account_options ::= account_options PPS literal */
+ { 323, -3 }, /* (4) account_options ::= account_options TSERIES literal */
+ { 323, -3 }, /* (5) account_options ::= account_options STORAGE literal */
+ { 323, -3 }, /* (6) account_options ::= account_options STREAMS literal */
+ { 323, -3 }, /* (7) account_options ::= account_options QTIME literal */
+ { 323, -3 }, /* (8) account_options ::= account_options DBS literal */
+ { 323, -3 }, /* (9) account_options ::= account_options USERS literal */
+ { 323, -3 }, /* (10) account_options ::= account_options CONNS literal */
+ { 323, -3 }, /* (11) account_options ::= account_options STATE literal */
+ { 324, -1 }, /* (12) alter_account_options ::= alter_account_option */
+ { 324, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */
+ { 326, -2 }, /* (14) alter_account_option ::= PASS literal */
+ { 326, -2 }, /* (15) alter_account_option ::= PPS literal */
+ { 326, -2 }, /* (16) alter_account_option ::= TSERIES literal */
+ { 326, -2 }, /* (17) alter_account_option ::= STORAGE literal */
+ { 326, -2 }, /* (18) alter_account_option ::= STREAMS literal */
+ { 326, -2 }, /* (19) alter_account_option ::= QTIME literal */
+ { 326, -2 }, /* (20) alter_account_option ::= DBS literal */
+ { 326, -2 }, /* (21) alter_account_option ::= USERS literal */
+ { 326, -2 }, /* (22) alter_account_option ::= CONNS literal */
+ { 326, -2 }, /* (23) alter_account_option ::= STATE literal */
+ { 322, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */
+ { 322, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */
+ { 322, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */
+ { 322, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */
+ { 322, -3 }, /* (28) cmd ::= DROP USER user_name */
+ { 328, 0 }, /* (29) sysinfo_opt ::= */
+ { 328, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */
+ { 322, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */
+ { 322, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */
+ { 329, -1 }, /* (33) privileges ::= ALL */
+ { 329, -1 }, /* (34) privileges ::= priv_type_list */
+ { 329, -1 }, /* (35) privileges ::= SUBSCRIBE */
+ { 331, -1 }, /* (36) priv_type_list ::= priv_type */
+ { 331, -3 }, /* (37) priv_type_list ::= priv_type_list NK_COMMA priv_type */
+ { 332, -1 }, /* (38) priv_type ::= READ */
+ { 332, -1 }, /* (39) priv_type ::= WRITE */
+ { 330, -3 }, /* (40) priv_level ::= NK_STAR NK_DOT NK_STAR */
+ { 330, -3 }, /* (41) priv_level ::= db_name NK_DOT NK_STAR */
+ { 330, -1 }, /* (42) priv_level ::= topic_name */
+ { 322, -3 }, /* (43) cmd ::= CREATE DNODE dnode_endpoint */
+ { 322, -5 }, /* (44) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */
+ { 322, -4 }, /* (45) cmd ::= DROP DNODE NK_INTEGER force_opt */
+ { 322, -4 }, /* (46) cmd ::= DROP DNODE dnode_endpoint force_opt */
+ { 322, -4 }, /* (47) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */
+ { 322, -5 }, /* (48) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */
+ { 322, -4 }, /* (49) cmd ::= ALTER ALL DNODES NK_STRING */
+ { 322, -5 }, /* (50) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */
+ { 335, -1 }, /* (51) dnode_endpoint ::= NK_STRING */
+ { 335, -1 }, /* (52) dnode_endpoint ::= NK_ID */
+ { 335, -1 }, /* (53) dnode_endpoint ::= NK_IPTOKEN */
+ { 336, 0 }, /* (54) force_opt ::= */
+ { 336, -1 }, /* (55) force_opt ::= FORCE */
+ { 322, -3 }, /* (56) cmd ::= ALTER LOCAL NK_STRING */
+ { 322, -4 }, /* (57) cmd ::= ALTER LOCAL NK_STRING NK_STRING */
+ { 322, -5 }, /* (58) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */
+ { 322, -5 }, /* (59) cmd ::= DROP QNODE ON DNODE NK_INTEGER */
+ { 322, -5 }, /* (60) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */
+ { 322, -5 }, /* (61) cmd ::= DROP BNODE ON DNODE NK_INTEGER */
+ { 322, -5 }, /* (62) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */
+ { 322, -5 }, /* (63) cmd ::= DROP SNODE ON DNODE NK_INTEGER */
+ { 322, -5 }, /* (64) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */
+ { 322, -5 }, /* (65) cmd ::= DROP MNODE ON DNODE NK_INTEGER */
+ { 322, -5 }, /* (66) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */
+ { 322, -4 }, /* (67) cmd ::= DROP DATABASE exists_opt db_name */
+ { 322, -2 }, /* (68) cmd ::= USE db_name */
+ { 322, -4 }, /* (69) cmd ::= ALTER DATABASE db_name alter_db_options */
+ { 322, -3 }, /* (70) cmd ::= FLUSH DATABASE db_name */
+ { 322, -4 }, /* (71) cmd ::= TRIM DATABASE db_name speed_opt */
+ { 337, -3 }, /* (72) not_exists_opt ::= IF NOT EXISTS */
+ { 337, 0 }, /* (73) not_exists_opt ::= */
+ { 339, -2 }, /* (74) exists_opt ::= IF EXISTS */
+ { 339, 0 }, /* (75) exists_opt ::= */
+ { 338, 0 }, /* (76) db_options ::= */
+ { 338, -3 }, /* (77) db_options ::= db_options BUFFER NK_INTEGER */
+ { 338, -3 }, /* (78) db_options ::= db_options CACHEMODEL NK_STRING */
+ { 338, -3 }, /* (79) db_options ::= db_options CACHESIZE NK_INTEGER */
+ { 338, -3 }, /* (80) db_options ::= db_options COMP NK_INTEGER */
+ { 338, -3 }, /* (81) db_options ::= db_options DURATION NK_INTEGER */
+ { 338, -3 }, /* (82) db_options ::= db_options DURATION NK_VARIABLE */
+ { 338, -3 }, /* (83) db_options ::= db_options MAXROWS NK_INTEGER */
+ { 338, -3 }, /* (84) db_options ::= db_options MINROWS NK_INTEGER */
+ { 338, -3 }, /* (85) db_options ::= db_options KEEP integer_list */
+ { 338, -3 }, /* (86) db_options ::= db_options KEEP variable_list */
+ { 338, -3 }, /* (87) db_options ::= db_options PAGES NK_INTEGER */
+ { 338, -3 }, /* (88) db_options ::= db_options PAGESIZE NK_INTEGER */
+ { 338, -3 }, /* (89) db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */
+ { 338, -3 }, /* (90) db_options ::= db_options PRECISION NK_STRING */
+ { 338, -3 }, /* (91) db_options ::= db_options REPLICA NK_INTEGER */
+ { 338, -3 }, /* (92) db_options ::= db_options STRICT NK_STRING */
+ { 338, -3 }, /* (93) db_options ::= db_options VGROUPS NK_INTEGER */
+ { 338, -3 }, /* (94) db_options ::= db_options SINGLE_STABLE NK_INTEGER */
+ { 338, -3 }, /* (95) db_options ::= db_options RETENTIONS retention_list */
+ { 338, -3 }, /* (96) db_options ::= db_options SCHEMALESS NK_INTEGER */
+ { 338, -3 }, /* (97) db_options ::= db_options WAL_LEVEL NK_INTEGER */
+ { 338, -3 }, /* (98) db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */
+ { 338, -3 }, /* (99) db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */
+ { 338, -4 }, /* (100) db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */
+ { 338, -3 }, /* (101) db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */
+ { 338, -4 }, /* (102) db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */
+ { 338, -3 }, /* (103) db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */
+ { 338, -3 }, /* (104) db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */
+ { 338, -3 }, /* (105) db_options ::= db_options STT_TRIGGER NK_INTEGER */
+ { 338, -3 }, /* (106) db_options ::= db_options TABLE_PREFIX NK_INTEGER */
+ { 338, -3 }, /* (107) db_options ::= db_options TABLE_SUFFIX NK_INTEGER */
+ { 340, -1 }, /* (108) alter_db_options ::= alter_db_option */
+ { 340, -2 }, /* (109) alter_db_options ::= alter_db_options alter_db_option */
+ { 345, -2 }, /* (110) alter_db_option ::= BUFFER NK_INTEGER */
+ { 345, -2 }, /* (111) alter_db_option ::= CACHEMODEL NK_STRING */
+ { 345, -2 }, /* (112) alter_db_option ::= CACHESIZE NK_INTEGER */
+ { 345, -2 }, /* (113) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */
+ { 345, -2 }, /* (114) alter_db_option ::= KEEP integer_list */
+ { 345, -2 }, /* (115) alter_db_option ::= KEEP variable_list */
+ { 345, -2 }, /* (116) alter_db_option ::= PAGES NK_INTEGER */
+ { 345, -2 }, /* (117) alter_db_option ::= REPLICA NK_INTEGER */
+ { 345, -2 }, /* (118) alter_db_option ::= STRICT NK_STRING */
+ { 345, -2 }, /* (119) alter_db_option ::= WAL_LEVEL NK_INTEGER */
+ { 345, -2 }, /* (120) alter_db_option ::= STT_TRIGGER NK_INTEGER */
+ { 342, -1 }, /* (121) integer_list ::= NK_INTEGER */
+ { 342, -3 }, /* (122) integer_list ::= integer_list NK_COMMA NK_INTEGER */
+ { 343, -1 }, /* (123) variable_list ::= NK_VARIABLE */
+ { 343, -3 }, /* (124) variable_list ::= variable_list NK_COMMA NK_VARIABLE */
+ { 344, -1 }, /* (125) retention_list ::= retention */
+ { 344, -3 }, /* (126) retention_list ::= retention_list NK_COMMA retention */
+ { 346, -3 }, /* (127) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */
+ { 341, 0 }, /* (128) speed_opt ::= */
+ { 341, -2 }, /* (129) speed_opt ::= MAX_SPEED NK_INTEGER */
+ { 322, -9 }, /* (130) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */
+ { 322, -3 }, /* (131) cmd ::= CREATE TABLE multi_create_clause */
+ { 322, -9 }, /* (132) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */
+ { 322, -3 }, /* (133) cmd ::= DROP TABLE multi_drop_clause */
+ { 322, -4 }, /* (134) cmd ::= DROP STABLE exists_opt full_table_name */
+ { 322, -3 }, /* (135) cmd ::= ALTER TABLE alter_table_clause */
+ { 322, -3 }, /* (136) cmd ::= ALTER STABLE alter_table_clause */
+ { 354, -2 }, /* (137) alter_table_clause ::= full_table_name alter_table_options */
+ { 354, -5 }, /* (138) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */
+ { 354, -4 }, /* (139) alter_table_clause ::= full_table_name DROP COLUMN column_name */
+ { 354, -5 }, /* (140) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */
+ { 354, -5 }, /* (141) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */
+ { 354, -5 }, /* (142) alter_table_clause ::= full_table_name ADD TAG column_name type_name */
+ { 354, -4 }, /* (143) alter_table_clause ::= full_table_name DROP TAG column_name */
+ { 354, -5 }, /* (144) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */
+ { 354, -5 }, /* (145) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */
+ { 354, -6 }, /* (146) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */
+ { 351, -1 }, /* (147) multi_create_clause ::= create_subtable_clause */
+ { 351, -2 }, /* (148) multi_create_clause ::= multi_create_clause create_subtable_clause */
+ { 359, -10 }, /* (149) 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 */
+ { 353, -1 }, /* (150) multi_drop_clause ::= drop_table_clause */
+ { 353, -2 }, /* (151) multi_drop_clause ::= multi_drop_clause drop_table_clause */
+ { 362, -2 }, /* (152) drop_table_clause ::= exists_opt full_table_name */
+ { 360, 0 }, /* (153) specific_cols_opt ::= */
+ { 360, -3 }, /* (154) specific_cols_opt ::= NK_LP col_name_list NK_RP */
+ { 347, -1 }, /* (155) full_table_name ::= table_name */
+ { 347, -3 }, /* (156) full_table_name ::= db_name NK_DOT table_name */
+ { 348, -1 }, /* (157) column_def_list ::= column_def */
+ { 348, -3 }, /* (158) column_def_list ::= column_def_list NK_COMMA column_def */
+ { 365, -2 }, /* (159) column_def ::= column_name type_name */
+ { 365, -4 }, /* (160) column_def ::= column_name type_name COMMENT NK_STRING */
+ { 357, -1 }, /* (161) type_name ::= BOOL */
+ { 357, -1 }, /* (162) type_name ::= TINYINT */
+ { 357, -1 }, /* (163) type_name ::= SMALLINT */
+ { 357, -1 }, /* (164) type_name ::= INT */
+ { 357, -1 }, /* (165) type_name ::= INTEGER */
+ { 357, -1 }, /* (166) type_name ::= BIGINT */
+ { 357, -1 }, /* (167) type_name ::= FLOAT */
+ { 357, -1 }, /* (168) type_name ::= DOUBLE */
+ { 357, -4 }, /* (169) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */
+ { 357, -1 }, /* (170) type_name ::= TIMESTAMP */
+ { 357, -4 }, /* (171) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */
+ { 357, -2 }, /* (172) type_name ::= TINYINT UNSIGNED */
+ { 357, -2 }, /* (173) type_name ::= SMALLINT UNSIGNED */
+ { 357, -2 }, /* (174) type_name ::= INT UNSIGNED */
+ { 357, -2 }, /* (175) type_name ::= BIGINT UNSIGNED */
+ { 357, -1 }, /* (176) type_name ::= JSON */
+ { 357, -4 }, /* (177) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */
+ { 357, -1 }, /* (178) type_name ::= MEDIUMBLOB */
+ { 357, -1 }, /* (179) type_name ::= BLOB */
+ { 357, -4 }, /* (180) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */
+ { 357, -1 }, /* (181) type_name ::= DECIMAL */
+ { 357, -4 }, /* (182) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */
+ { 357, -6 }, /* (183) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */
+ { 349, 0 }, /* (184) tags_def_opt ::= */
+ { 349, -1 }, /* (185) tags_def_opt ::= tags_def */
+ { 352, -4 }, /* (186) tags_def ::= TAGS NK_LP column_def_list NK_RP */
+ { 350, 0 }, /* (187) table_options ::= */
+ { 350, -3 }, /* (188) table_options ::= table_options COMMENT NK_STRING */
+ { 350, -3 }, /* (189) table_options ::= table_options MAX_DELAY duration_list */
+ { 350, -3 }, /* (190) table_options ::= table_options WATERMARK duration_list */
+ { 350, -5 }, /* (191) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */
+ { 350, -3 }, /* (192) table_options ::= table_options TTL NK_INTEGER */
+ { 350, -5 }, /* (193) table_options ::= table_options SMA NK_LP col_name_list NK_RP */
+ { 350, -3 }, /* (194) table_options ::= table_options DELETE_MARK duration_list */
+ { 355, -1 }, /* (195) alter_table_options ::= alter_table_option */
+ { 355, -2 }, /* (196) alter_table_options ::= alter_table_options alter_table_option */
+ { 368, -2 }, /* (197) alter_table_option ::= COMMENT NK_STRING */
+ { 368, -2 }, /* (198) alter_table_option ::= TTL NK_INTEGER */
+ { 366, -1 }, /* (199) duration_list ::= duration_literal */
+ { 366, -3 }, /* (200) duration_list ::= duration_list NK_COMMA duration_literal */
+ { 367, -1 }, /* (201) rollup_func_list ::= rollup_func_name */
+ { 367, -3 }, /* (202) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */
+ { 370, -1 }, /* (203) rollup_func_name ::= function_name */
+ { 370, -1 }, /* (204) rollup_func_name ::= FIRST */
+ { 370, -1 }, /* (205) rollup_func_name ::= LAST */
+ { 363, -1 }, /* (206) col_name_list ::= col_name */
+ { 363, -3 }, /* (207) col_name_list ::= col_name_list NK_COMMA col_name */
+ { 372, -1 }, /* (208) col_name ::= column_name */
+ { 322, -2 }, /* (209) cmd ::= SHOW DNODES */
+ { 322, -2 }, /* (210) cmd ::= SHOW USERS */
+ { 322, -3 }, /* (211) cmd ::= SHOW USER PRIVILEGES */
+ { 322, -2 }, /* (212) cmd ::= SHOW DATABASES */
+ { 322, -4 }, /* (213) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */
+ { 322, -4 }, /* (214) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */
+ { 322, -3 }, /* (215) cmd ::= SHOW db_name_cond_opt VGROUPS */
+ { 322, -2 }, /* (216) cmd ::= SHOW MNODES */
+ { 322, -2 }, /* (217) cmd ::= SHOW QNODES */
+ { 322, -2 }, /* (218) cmd ::= SHOW FUNCTIONS */
+ { 322, -5 }, /* (219) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */
+ { 322, -2 }, /* (220) cmd ::= SHOW STREAMS */
+ { 322, -2 }, /* (221) cmd ::= SHOW ACCOUNTS */
+ { 322, -2 }, /* (222) cmd ::= SHOW APPS */
+ { 322, -2 }, /* (223) cmd ::= SHOW CONNECTIONS */
+ { 322, -2 }, /* (224) cmd ::= SHOW LICENCES */
+ { 322, -2 }, /* (225) cmd ::= SHOW GRANTS */
+ { 322, -4 }, /* (226) cmd ::= SHOW CREATE DATABASE db_name */
+ { 322, -4 }, /* (227) cmd ::= SHOW CREATE TABLE full_table_name */
+ { 322, -4 }, /* (228) cmd ::= SHOW CREATE STABLE full_table_name */
+ { 322, -2 }, /* (229) cmd ::= SHOW QUERIES */
+ { 322, -2 }, /* (230) cmd ::= SHOW SCORES */
+ { 322, -2 }, /* (231) cmd ::= SHOW TOPICS */
+ { 322, -2 }, /* (232) cmd ::= SHOW VARIABLES */
+ { 322, -3 }, /* (233) cmd ::= SHOW CLUSTER VARIABLES */
+ { 322, -3 }, /* (234) cmd ::= SHOW LOCAL VARIABLES */
+ { 322, -5 }, /* (235) cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */
+ { 322, -2 }, /* (236) cmd ::= SHOW BNODES */
+ { 322, -2 }, /* (237) cmd ::= SHOW SNODES */
+ { 322, -2 }, /* (238) cmd ::= SHOW CLUSTER */
+ { 322, -2 }, /* (239) cmd ::= SHOW TRANSACTIONS */
+ { 322, -4 }, /* (240) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */
+ { 322, -2 }, /* (241) cmd ::= SHOW CONSUMERS */
+ { 322, -2 }, /* (242) cmd ::= SHOW SUBSCRIPTIONS */
+ { 322, -5 }, /* (243) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */
+ { 322, -7 }, /* (244) cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */
+ { 322, -3 }, /* (245) cmd ::= SHOW VNODES NK_INTEGER */
+ { 322, -3 }, /* (246) cmd ::= SHOW VNODES NK_STRING */
+ { 373, 0 }, /* (247) db_name_cond_opt ::= */
+ { 373, -2 }, /* (248) db_name_cond_opt ::= db_name NK_DOT */
+ { 374, 0 }, /* (249) like_pattern_opt ::= */
+ { 374, -2 }, /* (250) like_pattern_opt ::= LIKE NK_STRING */
+ { 375, -1 }, /* (251) table_name_cond ::= table_name */
+ { 376, 0 }, /* (252) from_db_opt ::= */
+ { 376, -2 }, /* (253) from_db_opt ::= FROM db_name */
+ { 377, 0 }, /* (254) tag_list_opt ::= */
+ { 377, -1 }, /* (255) tag_list_opt ::= tag_item */
+ { 377, -3 }, /* (256) tag_list_opt ::= tag_list_opt NK_COMMA tag_item */
+ { 378, -1 }, /* (257) tag_item ::= TBNAME */
+ { 378, -1 }, /* (258) tag_item ::= QTAGS */
+ { 378, -1 }, /* (259) tag_item ::= column_name */
+ { 378, -2 }, /* (260) tag_item ::= column_name column_alias */
+ { 378, -3 }, /* (261) tag_item ::= column_name AS column_alias */
+ { 322, -8 }, /* (262) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */
+ { 322, -4 }, /* (263) cmd ::= DROP INDEX exists_opt full_table_name */
+ { 380, -10 }, /* (264) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */
+ { 380, -12 }, /* (265) 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 */
+ { 381, -1 }, /* (266) func_list ::= func */
+ { 381, -3 }, /* (267) func_list ::= func_list NK_COMMA func */
+ { 384, -4 }, /* (268) func ::= function_name NK_LP expression_list NK_RP */
+ { 383, 0 }, /* (269) sma_stream_opt ::= */
+ { 383, -3 }, /* (270) sma_stream_opt ::= sma_stream_opt WATERMARK duration_literal */
+ { 383, -3 }, /* (271) sma_stream_opt ::= sma_stream_opt MAX_DELAY duration_literal */
+ { 383, -3 }, /* (272) sma_stream_opt ::= sma_stream_opt DELETE_MARK duration_literal */
+ { 322, -6 }, /* (273) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */
+ { 322, -7 }, /* (274) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */
+ { 322, -9 }, /* (275) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */
+ { 322, -7 }, /* (276) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */
+ { 322, -9 }, /* (277) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */
+ { 322, -4 }, /* (278) cmd ::= DROP TOPIC exists_opt topic_name */
+ { 322, -7 }, /* (279) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */
+ { 322, -2 }, /* (280) cmd ::= DESC full_table_name */
+ { 322, -2 }, /* (281) cmd ::= DESCRIBE full_table_name */
+ { 322, -3 }, /* (282) cmd ::= RESET QUERY CACHE */
+ { 322, -4 }, /* (283) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */
+ { 387, 0 }, /* (284) analyze_opt ::= */
+ { 387, -1 }, /* (285) analyze_opt ::= ANALYZE */
+ { 388, 0 }, /* (286) explain_options ::= */
+ { 388, -3 }, /* (287) explain_options ::= explain_options VERBOSE NK_BOOL */
+ { 388, -3 }, /* (288) explain_options ::= explain_options RATIO NK_FLOAT */
+ { 322, -10 }, /* (289) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */
+ { 322, -4 }, /* (290) cmd ::= DROP FUNCTION exists_opt function_name */
+ { 389, 0 }, /* (291) agg_func_opt ::= */
+ { 389, -1 }, /* (292) agg_func_opt ::= AGGREGATE */
+ { 390, 0 }, /* (293) bufsize_opt ::= */
+ { 390, -2 }, /* (294) bufsize_opt ::= BUFSIZE NK_INTEGER */
+ { 322, -11 }, /* (295) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */
+ { 322, -4 }, /* (296) cmd ::= DROP STREAM exists_opt stream_name */
+ { 392, 0 }, /* (297) stream_options ::= */
+ { 392, -3 }, /* (298) stream_options ::= stream_options TRIGGER AT_ONCE */
+ { 392, -3 }, /* (299) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */
+ { 392, -4 }, /* (300) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */
+ { 392, -3 }, /* (301) stream_options ::= stream_options WATERMARK duration_literal */
+ { 392, -4 }, /* (302) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */
+ { 392, -3 }, /* (303) stream_options ::= stream_options FILL_HISTORY NK_INTEGER */
+ { 393, 0 }, /* (304) subtable_opt ::= */
+ { 393, -4 }, /* (305) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */
+ { 322, -3 }, /* (306) cmd ::= KILL CONNECTION NK_INTEGER */
+ { 322, -3 }, /* (307) cmd ::= KILL QUERY NK_STRING */
+ { 322, -3 }, /* (308) cmd ::= KILL TRANSACTION NK_INTEGER */
+ { 322, -2 }, /* (309) cmd ::= BALANCE VGROUP */
+ { 322, -4 }, /* (310) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */
+ { 322, -4 }, /* (311) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */
+ { 322, -3 }, /* (312) cmd ::= SPLIT VGROUP NK_INTEGER */
+ { 395, -2 }, /* (313) dnode_list ::= DNODE NK_INTEGER */
+ { 395, -3 }, /* (314) dnode_list ::= dnode_list DNODE NK_INTEGER */
+ { 322, -4 }, /* (315) cmd ::= DELETE FROM full_table_name where_clause_opt */
+ { 322, -1 }, /* (316) cmd ::= query_or_subquery */
+ { 322, -7 }, /* (317) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */
+ { 322, -4 }, /* (318) cmd ::= INSERT INTO full_table_name query_or_subquery */
+ { 325, -1 }, /* (319) literal ::= NK_INTEGER */
+ { 325, -1 }, /* (320) literal ::= NK_FLOAT */
+ { 325, -1 }, /* (321) literal ::= NK_STRING */
+ { 325, -1 }, /* (322) literal ::= NK_BOOL */
+ { 325, -2 }, /* (323) literal ::= TIMESTAMP NK_STRING */
+ { 325, -1 }, /* (324) literal ::= duration_literal */
+ { 325, -1 }, /* (325) literal ::= NULL */
+ { 325, -1 }, /* (326) literal ::= NK_QUESTION */
+ { 369, -1 }, /* (327) duration_literal ::= NK_VARIABLE */
+ { 397, -1 }, /* (328) signed ::= NK_INTEGER */
+ { 397, -2 }, /* (329) signed ::= NK_PLUS NK_INTEGER */
+ { 397, -2 }, /* (330) signed ::= NK_MINUS NK_INTEGER */
+ { 397, -1 }, /* (331) signed ::= NK_FLOAT */
+ { 397, -2 }, /* (332) signed ::= NK_PLUS NK_FLOAT */
+ { 397, -2 }, /* (333) signed ::= NK_MINUS NK_FLOAT */
+ { 358, -1 }, /* (334) signed_literal ::= signed */
+ { 358, -1 }, /* (335) signed_literal ::= NK_STRING */
+ { 358, -1 }, /* (336) signed_literal ::= NK_BOOL */
+ { 358, -2 }, /* (337) signed_literal ::= TIMESTAMP NK_STRING */
+ { 358, -1 }, /* (338) signed_literal ::= duration_literal */
+ { 358, -1 }, /* (339) signed_literal ::= NULL */
+ { 358, -1 }, /* (340) signed_literal ::= literal_func */
+ { 358, -1 }, /* (341) signed_literal ::= NK_QUESTION */
+ { 399, -1 }, /* (342) literal_list ::= signed_literal */
+ { 399, -3 }, /* (343) literal_list ::= literal_list NK_COMMA signed_literal */
+ { 333, -1 }, /* (344) db_name ::= NK_ID */
+ { 364, -1 }, /* (345) table_name ::= NK_ID */
+ { 356, -1 }, /* (346) column_name ::= NK_ID */
+ { 371, -1 }, /* (347) function_name ::= NK_ID */
+ { 400, -1 }, /* (348) table_alias ::= NK_ID */
+ { 379, -1 }, /* (349) column_alias ::= NK_ID */
+ { 327, -1 }, /* (350) user_name ::= NK_ID */
+ { 334, -1 }, /* (351) topic_name ::= NK_ID */
+ { 391, -1 }, /* (352) stream_name ::= NK_ID */
+ { 386, -1 }, /* (353) cgroup_name ::= NK_ID */
+ { 401, -1 }, /* (354) expr_or_subquery ::= expression */
+ { 394, -1 }, /* (355) expression ::= literal */
+ { 394, -1 }, /* (356) expression ::= pseudo_column */
+ { 394, -1 }, /* (357) expression ::= column_reference */
+ { 394, -1 }, /* (358) expression ::= function_expression */
+ { 394, -1 }, /* (359) expression ::= case_when_expression */
+ { 394, -3 }, /* (360) expression ::= NK_LP expression NK_RP */
+ { 394, -2 }, /* (361) expression ::= NK_PLUS expr_or_subquery */
+ { 394, -2 }, /* (362) expression ::= NK_MINUS expr_or_subquery */
+ { 394, -3 }, /* (363) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */
+ { 394, -3 }, /* (364) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */
+ { 394, -3 }, /* (365) expression ::= expr_or_subquery NK_STAR expr_or_subquery */
+ { 394, -3 }, /* (366) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */
+ { 394, -3 }, /* (367) expression ::= expr_or_subquery NK_REM expr_or_subquery */
+ { 394, -3 }, /* (368) expression ::= column_reference NK_ARROW NK_STRING */
+ { 394, -3 }, /* (369) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */
+ { 394, -3 }, /* (370) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */
+ { 361, -1 }, /* (371) expression_list ::= expr_or_subquery */
+ { 361, -3 }, /* (372) expression_list ::= expression_list NK_COMMA expr_or_subquery */
+ { 403, -1 }, /* (373) column_reference ::= column_name */
+ { 403, -3 }, /* (374) column_reference ::= table_name NK_DOT column_name */
+ { 402, -1 }, /* (375) pseudo_column ::= ROWTS */
+ { 402, -1 }, /* (376) pseudo_column ::= TBNAME */
+ { 402, -3 }, /* (377) pseudo_column ::= table_name NK_DOT TBNAME */
+ { 402, -1 }, /* (378) pseudo_column ::= QSTART */
+ { 402, -1 }, /* (379) pseudo_column ::= QEND */
+ { 402, -1 }, /* (380) pseudo_column ::= QDURATION */
+ { 402, -1 }, /* (381) pseudo_column ::= WSTART */
+ { 402, -1 }, /* (382) pseudo_column ::= WEND */
+ { 402, -1 }, /* (383) pseudo_column ::= WDURATION */
+ { 402, -1 }, /* (384) pseudo_column ::= IROWTS */
+ { 402, -1 }, /* (385) pseudo_column ::= QTAGS */
+ { 404, -4 }, /* (386) function_expression ::= function_name NK_LP expression_list NK_RP */
+ { 404, -4 }, /* (387) function_expression ::= star_func NK_LP star_func_para_list NK_RP */
+ { 404, -6 }, /* (388) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */
+ { 404, -1 }, /* (389) function_expression ::= literal_func */
+ { 398, -3 }, /* (390) literal_func ::= noarg_func NK_LP NK_RP */
+ { 398, -1 }, /* (391) literal_func ::= NOW */
+ { 408, -1 }, /* (392) noarg_func ::= NOW */
+ { 408, -1 }, /* (393) noarg_func ::= TODAY */
+ { 408, -1 }, /* (394) noarg_func ::= TIMEZONE */
+ { 408, -1 }, /* (395) noarg_func ::= DATABASE */
+ { 408, -1 }, /* (396) noarg_func ::= CLIENT_VERSION */
+ { 408, -1 }, /* (397) noarg_func ::= SERVER_VERSION */
+ { 408, -1 }, /* (398) noarg_func ::= SERVER_STATUS */
+ { 408, -1 }, /* (399) noarg_func ::= CURRENT_USER */
+ { 408, -1 }, /* (400) noarg_func ::= USER */
+ { 406, -1 }, /* (401) star_func ::= COUNT */
+ { 406, -1 }, /* (402) star_func ::= FIRST */
+ { 406, -1 }, /* (403) star_func ::= LAST */
+ { 406, -1 }, /* (404) star_func ::= LAST_ROW */
+ { 407, -1 }, /* (405) star_func_para_list ::= NK_STAR */
+ { 407, -1 }, /* (406) star_func_para_list ::= other_para_list */
+ { 409, -1 }, /* (407) other_para_list ::= star_func_para */
+ { 409, -3 }, /* (408) other_para_list ::= other_para_list NK_COMMA star_func_para */
+ { 410, -1 }, /* (409) star_func_para ::= expr_or_subquery */
+ { 410, -3 }, /* (410) star_func_para ::= table_name NK_DOT NK_STAR */
+ { 405, -4 }, /* (411) case_when_expression ::= CASE when_then_list case_when_else_opt END */
+ { 405, -5 }, /* (412) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */
+ { 411, -1 }, /* (413) when_then_list ::= when_then_expr */
+ { 411, -2 }, /* (414) when_then_list ::= when_then_list when_then_expr */
+ { 414, -4 }, /* (415) when_then_expr ::= WHEN common_expression THEN common_expression */
+ { 412, 0 }, /* (416) case_when_else_opt ::= */
+ { 412, -2 }, /* (417) case_when_else_opt ::= ELSE common_expression */
+ { 415, -3 }, /* (418) predicate ::= expr_or_subquery compare_op expr_or_subquery */
+ { 415, -5 }, /* (419) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */
+ { 415, -6 }, /* (420) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */
+ { 415, -3 }, /* (421) predicate ::= expr_or_subquery IS NULL */
+ { 415, -4 }, /* (422) predicate ::= expr_or_subquery IS NOT NULL */
+ { 415, -3 }, /* (423) predicate ::= expr_or_subquery in_op in_predicate_value */
+ { 416, -1 }, /* (424) compare_op ::= NK_LT */
+ { 416, -1 }, /* (425) compare_op ::= NK_GT */
+ { 416, -1 }, /* (426) compare_op ::= NK_LE */
+ { 416, -1 }, /* (427) compare_op ::= NK_GE */
+ { 416, -1 }, /* (428) compare_op ::= NK_NE */
+ { 416, -1 }, /* (429) compare_op ::= NK_EQ */
+ { 416, -1 }, /* (430) compare_op ::= LIKE */
+ { 416, -2 }, /* (431) compare_op ::= NOT LIKE */
+ { 416, -1 }, /* (432) compare_op ::= MATCH */
+ { 416, -1 }, /* (433) compare_op ::= NMATCH */
+ { 416, -1 }, /* (434) compare_op ::= CONTAINS */
+ { 417, -1 }, /* (435) in_op ::= IN */
+ { 417, -2 }, /* (436) in_op ::= NOT IN */
+ { 418, -3 }, /* (437) in_predicate_value ::= NK_LP literal_list NK_RP */
+ { 419, -1 }, /* (438) boolean_value_expression ::= boolean_primary */
+ { 419, -2 }, /* (439) boolean_value_expression ::= NOT boolean_primary */
+ { 419, -3 }, /* (440) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */
+ { 419, -3 }, /* (441) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */
+ { 420, -1 }, /* (442) boolean_primary ::= predicate */
+ { 420, -3 }, /* (443) boolean_primary ::= NK_LP boolean_value_expression NK_RP */
+ { 413, -1 }, /* (444) common_expression ::= expr_or_subquery */
+ { 413, -1 }, /* (445) common_expression ::= boolean_value_expression */
+ { 421, 0 }, /* (446) from_clause_opt ::= */
+ { 421, -2 }, /* (447) from_clause_opt ::= FROM table_reference_list */
+ { 422, -1 }, /* (448) table_reference_list ::= table_reference */
+ { 422, -3 }, /* (449) table_reference_list ::= table_reference_list NK_COMMA table_reference */
+ { 423, -1 }, /* (450) table_reference ::= table_primary */
+ { 423, -1 }, /* (451) table_reference ::= joined_table */
+ { 424, -2 }, /* (452) table_primary ::= table_name alias_opt */
+ { 424, -4 }, /* (453) table_primary ::= db_name NK_DOT table_name alias_opt */
+ { 424, -2 }, /* (454) table_primary ::= subquery alias_opt */
+ { 424, -1 }, /* (455) table_primary ::= parenthesized_joined_table */
+ { 426, 0 }, /* (456) alias_opt ::= */
+ { 426, -1 }, /* (457) alias_opt ::= table_alias */
+ { 426, -2 }, /* (458) alias_opt ::= AS table_alias */
+ { 428, -3 }, /* (459) parenthesized_joined_table ::= NK_LP joined_table NK_RP */
+ { 428, -3 }, /* (460) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */
+ { 425, -6 }, /* (461) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
+ { 429, 0 }, /* (462) join_type ::= */
+ { 429, -1 }, /* (463) join_type ::= INNER */
+ { 431, -12 }, /* (464) 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 */
+ { 432, 0 }, /* (465) set_quantifier_opt ::= */
+ { 432, -1 }, /* (466) set_quantifier_opt ::= DISTINCT */
+ { 432, -1 }, /* (467) set_quantifier_opt ::= ALL */
+ { 433, -1 }, /* (468) select_list ::= select_item */
+ { 433, -3 }, /* (469) select_list ::= select_list NK_COMMA select_item */
+ { 441, -1 }, /* (470) select_item ::= NK_STAR */
+ { 441, -1 }, /* (471) select_item ::= common_expression */
+ { 441, -2 }, /* (472) select_item ::= common_expression column_alias */
+ { 441, -3 }, /* (473) select_item ::= common_expression AS column_alias */
+ { 441, -3 }, /* (474) select_item ::= table_name NK_DOT NK_STAR */
+ { 396, 0 }, /* (475) where_clause_opt ::= */
+ { 396, -2 }, /* (476) where_clause_opt ::= WHERE search_condition */
+ { 434, 0 }, /* (477) partition_by_clause_opt ::= */
+ { 434, -3 }, /* (478) partition_by_clause_opt ::= PARTITION BY partition_list */
+ { 442, -1 }, /* (479) partition_list ::= partition_item */
+ { 442, -3 }, /* (480) partition_list ::= partition_list NK_COMMA partition_item */
+ { 443, -1 }, /* (481) partition_item ::= expr_or_subquery */
+ { 443, -2 }, /* (482) partition_item ::= expr_or_subquery column_alias */
+ { 443, -3 }, /* (483) partition_item ::= expr_or_subquery AS column_alias */
+ { 438, 0 }, /* (484) twindow_clause_opt ::= */
+ { 438, -6 }, /* (485) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
+ { 438, -4 }, /* (486) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */
+ { 438, -6 }, /* (487) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
+ { 438, -8 }, /* (488) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
+ { 382, 0 }, /* (489) sliding_opt ::= */
+ { 382, -4 }, /* (490) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */
+ { 437, 0 }, /* (491) fill_opt ::= */
+ { 437, -4 }, /* (492) fill_opt ::= FILL NK_LP fill_mode NK_RP */
+ { 437, -6 }, /* (493) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
+ { 444, -1 }, /* (494) fill_mode ::= NONE */
+ { 444, -1 }, /* (495) fill_mode ::= PREV */
+ { 444, -1 }, /* (496) fill_mode ::= NULL */
+ { 444, -1 }, /* (497) fill_mode ::= LINEAR */
+ { 444, -1 }, /* (498) fill_mode ::= NEXT */
+ { 439, 0 }, /* (499) group_by_clause_opt ::= */
+ { 439, -3 }, /* (500) group_by_clause_opt ::= GROUP BY group_by_list */
+ { 445, -1 }, /* (501) group_by_list ::= expr_or_subquery */
+ { 445, -3 }, /* (502) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */
+ { 440, 0 }, /* (503) having_clause_opt ::= */
+ { 440, -2 }, /* (504) having_clause_opt ::= HAVING search_condition */
+ { 435, 0 }, /* (505) range_opt ::= */
+ { 435, -6 }, /* (506) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */
+ { 436, 0 }, /* (507) every_opt ::= */
+ { 436, -4 }, /* (508) every_opt ::= EVERY NK_LP duration_literal NK_RP */
+ { 446, -4 }, /* (509) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */
+ { 447, -1 }, /* (510) query_simple ::= query_specification */
+ { 447, -1 }, /* (511) query_simple ::= union_query_expression */
+ { 451, -4 }, /* (512) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */
+ { 451, -3 }, /* (513) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */
+ { 452, -1 }, /* (514) query_simple_or_subquery ::= query_simple */
+ { 452, -1 }, /* (515) query_simple_or_subquery ::= subquery */
+ { 385, -1 }, /* (516) query_or_subquery ::= query_expression */
+ { 385, -1 }, /* (517) query_or_subquery ::= subquery */
+ { 448, 0 }, /* (518) order_by_clause_opt ::= */
+ { 448, -3 }, /* (519) order_by_clause_opt ::= ORDER BY sort_specification_list */
+ { 449, 0 }, /* (520) slimit_clause_opt ::= */
+ { 449, -2 }, /* (521) slimit_clause_opt ::= SLIMIT NK_INTEGER */
+ { 449, -4 }, /* (522) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
+ { 449, -4 }, /* (523) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ { 450, 0 }, /* (524) limit_clause_opt ::= */
+ { 450, -2 }, /* (525) limit_clause_opt ::= LIMIT NK_INTEGER */
+ { 450, -4 }, /* (526) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */
+ { 450, -4 }, /* (527) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ { 427, -3 }, /* (528) subquery ::= NK_LP query_expression NK_RP */
+ { 427, -3 }, /* (529) subquery ::= NK_LP subquery NK_RP */
+ { 430, -1 }, /* (530) search_condition ::= common_expression */
+ { 453, -1 }, /* (531) sort_specification_list ::= sort_specification */
+ { 453, -3 }, /* (532) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */
+ { 454, -3 }, /* (533) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */
+ { 455, 0 }, /* (534) ordering_specification_opt ::= */
+ { 455, -1 }, /* (535) ordering_specification_opt ::= ASC */
+ { 455, -1 }, /* (536) ordering_specification_opt ::= DESC */
+ { 456, 0 }, /* (537) null_ordering_opt ::= */
+ { 456, -2 }, /* (538) null_ordering_opt ::= NULLS FIRST */
+ { 456, -2 }, /* (539) null_ordering_opt ::= NULLS LAST */
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -3688,11 +3575,11 @@ static YYACTIONTYPE yy_reduce(
YYMINORTYPE yylhsminor;
case 0: /* cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */
{ pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
- yy_destructor(yypParser,320,&yymsp[0].minor);
+ yy_destructor(yypParser,323,&yymsp[0].minor);
break;
case 1: /* cmd ::= ALTER ACCOUNT NK_ID alter_account_options */
{ pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
- yy_destructor(yypParser,321,&yymsp[0].minor);
+ yy_destructor(yypParser,324,&yymsp[0].minor);
break;
case 2: /* account_options ::= */
{ }
@@ -3706,20 +3593,20 @@ static YYACTIONTYPE yy_reduce(
case 9: /* account_options ::= account_options USERS literal */ yytestcase(yyruleno==9);
case 10: /* account_options ::= account_options CONNS literal */ yytestcase(yyruleno==10);
case 11: /* account_options ::= account_options STATE literal */ yytestcase(yyruleno==11);
-{ yy_destructor(yypParser,320,&yymsp[-2].minor);
+{ yy_destructor(yypParser,323,&yymsp[-2].minor);
{ }
- yy_destructor(yypParser,322,&yymsp[0].minor);
+ yy_destructor(yypParser,325,&yymsp[0].minor);
}
break;
case 12: /* alter_account_options ::= alter_account_option */
-{ yy_destructor(yypParser,323,&yymsp[0].minor);
+{ yy_destructor(yypParser,326,&yymsp[0].minor);
{ }
}
break;
case 13: /* alter_account_options ::= alter_account_options alter_account_option */
-{ yy_destructor(yypParser,321,&yymsp[-1].minor);
+{ yy_destructor(yypParser,324,&yymsp[-1].minor);
{ }
- yy_destructor(yypParser,323,&yymsp[0].minor);
+ yy_destructor(yypParser,326,&yymsp[0].minor);
}
break;
case 14: /* alter_account_option ::= PASS literal */
@@ -3733,1489 +3620,1503 @@ static YYACTIONTYPE yy_reduce(
case 22: /* alter_account_option ::= CONNS literal */ yytestcase(yyruleno==22);
case 23: /* alter_account_option ::= STATE literal */ yytestcase(yyruleno==23);
{ }
- yy_destructor(yypParser,322,&yymsp[0].minor);
+ yy_destructor(yypParser,325,&yymsp[0].minor);
break;
case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */
-{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy593, &yymsp[-1].minor.yy0, yymsp[0].minor.yy687); }
+{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy199, &yymsp[-1].minor.yy0, yymsp[0].minor.yy33); }
break;
case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */
-{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); }
+{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy199, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); }
break;
case 26: /* cmd ::= ALTER USER user_name ENABLE NK_INTEGER */
-{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); }
+{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy199, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); }
break;
case 27: /* cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */
-{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); }
+{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy199, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); }
break;
case 28: /* cmd ::= DROP USER user_name */
-{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy593); }
+{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy199); }
break;
case 29: /* sysinfo_opt ::= */
-{ yymsp[1].minor.yy687 = 1; }
+{ yymsp[1].minor.yy33 = 1; }
break;
case 30: /* sysinfo_opt ::= SYSINFO NK_INTEGER */
-{ yymsp[-1].minor.yy687 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); }
+{ yymsp[-1].minor.yy33 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); }
break;
case 31: /* cmd ::= GRANT privileges ON priv_level TO user_name */
-{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy577, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); }
+{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy525, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy199); }
break;
case 32: /* cmd ::= REVOKE privileges ON priv_level FROM user_name */
-{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy577, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); }
+{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy525, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy199); }
break;
case 33: /* privileges ::= ALL */
-{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_ALL; }
+{ yymsp[0].minor.yy525 = PRIVILEGE_TYPE_ALL; }
break;
case 34: /* privileges ::= priv_type_list */
- case 35: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==35);
-{ yylhsminor.yy577 = yymsp[0].minor.yy577; }
- yymsp[0].minor.yy577 = yylhsminor.yy577;
+ case 36: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==36);
+{ yylhsminor.yy525 = yymsp[0].minor.yy525; }
+ yymsp[0].minor.yy525 = yylhsminor.yy525;
+ break;
+ case 35: /* privileges ::= SUBSCRIBE */
+{ yymsp[0].minor.yy525 = PRIVILEGE_TYPE_SUBSCRIBE; }
+ break;
+ case 37: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */
+{ yylhsminor.yy525 = yymsp[-2].minor.yy525 | yymsp[0].minor.yy525; }
+ yymsp[-2].minor.yy525 = yylhsminor.yy525;
break;
- case 36: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */
-{ yylhsminor.yy577 = yymsp[-2].minor.yy577 | yymsp[0].minor.yy577; }
- yymsp[-2].minor.yy577 = yylhsminor.yy577;
+ case 38: /* priv_type ::= READ */
+{ yymsp[0].minor.yy525 = PRIVILEGE_TYPE_READ; }
break;
- case 37: /* priv_type ::= READ */
-{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_READ; }
+ case 39: /* priv_type ::= WRITE */
+{ yymsp[0].minor.yy525 = PRIVILEGE_TYPE_WRITE; }
break;
- case 38: /* priv_type ::= WRITE */
-{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_WRITE; }
+ case 40: /* priv_level ::= NK_STAR NK_DOT NK_STAR */
+{ yylhsminor.yy199 = yymsp[-2].minor.yy0; }
+ yymsp[-2].minor.yy199 = yylhsminor.yy199;
break;
- case 39: /* priv_level ::= NK_STAR NK_DOT NK_STAR */
-{ yylhsminor.yy593 = yymsp[-2].minor.yy0; }
- yymsp[-2].minor.yy593 = yylhsminor.yy593;
+ case 41: /* priv_level ::= db_name NK_DOT NK_STAR */
+{ yylhsminor.yy199 = yymsp[-2].minor.yy199; }
+ yymsp[-2].minor.yy199 = yylhsminor.yy199;
break;
- case 40: /* priv_level ::= db_name NK_DOT NK_STAR */
-{ yylhsminor.yy593 = yymsp[-2].minor.yy593; }
- yymsp[-2].minor.yy593 = yylhsminor.yy593;
+ case 42: /* priv_level ::= topic_name */
+ case 457: /* alias_opt ::= table_alias */ yytestcase(yyruleno==457);
+{ yylhsminor.yy199 = yymsp[0].minor.yy199; }
+ yymsp[0].minor.yy199 = yylhsminor.yy199;
break;
- case 41: /* cmd ::= CREATE DNODE dnode_endpoint */
-{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy593, NULL); }
+ case 43: /* cmd ::= CREATE DNODE dnode_endpoint */
+{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy199, NULL); }
break;
- case 42: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */
-{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0); }
+ case 44: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */
+{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy0); }
break;
- case 43: /* cmd ::= DROP DNODE NK_INTEGER force_opt */
-{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy193); }
+ case 45: /* cmd ::= DROP DNODE NK_INTEGER force_opt */
+{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy397); }
break;
- case 44: /* cmd ::= DROP DNODE dnode_endpoint force_opt */
-{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy193); }
+ case 46: /* cmd ::= DROP DNODE dnode_endpoint force_opt */
+{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy199, yymsp[0].minor.yy397); }
break;
- case 45: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */
+ case 47: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */
{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); }
break;
- case 46: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */
+ case 48: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */
{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-2].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
break;
- case 47: /* cmd ::= ALTER ALL DNODES NK_STRING */
+ case 49: /* cmd ::= ALTER ALL DNODES NK_STRING */
{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &yymsp[0].minor.yy0, NULL); }
break;
- case 48: /* cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */
+ case 50: /* cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */
{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, NULL, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
break;
- 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 339: /* db_name ::= NK_ID */ yytestcase(yyruleno==339);
- case 340: /* table_name ::= NK_ID */ yytestcase(yyruleno==340);
- case 341: /* column_name ::= NK_ID */ yytestcase(yyruleno==341);
- case 342: /* function_name ::= NK_ID */ yytestcase(yyruleno==342);
- case 343: /* table_alias ::= NK_ID */ yytestcase(yyruleno==343);
- case 344: /* column_alias ::= NK_ID */ yytestcase(yyruleno==344);
- case 345: /* user_name ::= NK_ID */ yytestcase(yyruleno==345);
- case 346: /* topic_name ::= NK_ID */ yytestcase(yyruleno==346);
- case 347: /* stream_name ::= NK_ID */ yytestcase(yyruleno==347);
- case 348: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==348);
- case 388: /* noarg_func ::= NOW */ yytestcase(yyruleno==388);
- case 389: /* noarg_func ::= TODAY */ yytestcase(yyruleno==389);
- case 390: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==390);
- case 391: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==391);
- case 392: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==392);
- case 393: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==393);
- case 394: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==394);
- case 395: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==395);
- case 396: /* noarg_func ::= USER */ yytestcase(yyruleno==396);
- case 397: /* star_func ::= COUNT */ yytestcase(yyruleno==397);
- case 398: /* star_func ::= FIRST */ yytestcase(yyruleno==398);
- case 399: /* star_func ::= LAST */ yytestcase(yyruleno==399);
- case 400: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==400);
-{ yylhsminor.yy593 = yymsp[0].minor.yy0; }
- yymsp[0].minor.yy593 = yylhsminor.yy593;
- break;
- case 52: /* force_opt ::= */
- case 71: /* not_exists_opt ::= */ yytestcase(yyruleno==71);
- case 73: /* exists_opt ::= */ yytestcase(yyruleno==73);
- case 279: /* analyze_opt ::= */ yytestcase(yyruleno==279);
- case 286: /* agg_func_opt ::= */ yytestcase(yyruleno==286);
- case 461: /* set_quantifier_opt ::= */ yytestcase(yyruleno==461);
-{ yymsp[1].minor.yy193 = false; }
- break;
- case 53: /* force_opt ::= FORCE */
- case 280: /* analyze_opt ::= ANALYZE */ yytestcase(yyruleno==280);
- case 287: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==287);
- case 462: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==462);
-{ yymsp[0].minor.yy193 = true; }
- break;
- case 54: /* cmd ::= ALTER LOCAL NK_STRING */
+ case 51: /* dnode_endpoint ::= NK_STRING */
+ case 52: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==52);
+ case 53: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==53);
+ case 344: /* db_name ::= NK_ID */ yytestcase(yyruleno==344);
+ case 345: /* table_name ::= NK_ID */ yytestcase(yyruleno==345);
+ case 346: /* column_name ::= NK_ID */ yytestcase(yyruleno==346);
+ case 347: /* function_name ::= NK_ID */ yytestcase(yyruleno==347);
+ case 348: /* table_alias ::= NK_ID */ yytestcase(yyruleno==348);
+ case 349: /* column_alias ::= NK_ID */ yytestcase(yyruleno==349);
+ case 350: /* user_name ::= NK_ID */ yytestcase(yyruleno==350);
+ case 351: /* topic_name ::= NK_ID */ yytestcase(yyruleno==351);
+ case 352: /* stream_name ::= NK_ID */ yytestcase(yyruleno==352);
+ case 353: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==353);
+ case 392: /* noarg_func ::= NOW */ yytestcase(yyruleno==392);
+ case 393: /* noarg_func ::= TODAY */ yytestcase(yyruleno==393);
+ case 394: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==394);
+ case 395: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==395);
+ case 396: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==396);
+ case 397: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==397);
+ case 398: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==398);
+ case 399: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==399);
+ case 400: /* noarg_func ::= USER */ yytestcase(yyruleno==400);
+ case 401: /* star_func ::= COUNT */ yytestcase(yyruleno==401);
+ case 402: /* star_func ::= FIRST */ yytestcase(yyruleno==402);
+ case 403: /* star_func ::= LAST */ yytestcase(yyruleno==403);
+ case 404: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==404);
+{ yylhsminor.yy199 = yymsp[0].minor.yy0; }
+ yymsp[0].minor.yy199 = yylhsminor.yy199;
+ break;
+ case 54: /* force_opt ::= */
+ case 73: /* not_exists_opt ::= */ yytestcase(yyruleno==73);
+ case 75: /* exists_opt ::= */ yytestcase(yyruleno==75);
+ case 284: /* analyze_opt ::= */ yytestcase(yyruleno==284);
+ case 291: /* agg_func_opt ::= */ yytestcase(yyruleno==291);
+ case 465: /* set_quantifier_opt ::= */ yytestcase(yyruleno==465);
+{ yymsp[1].minor.yy397 = false; }
+ break;
+ case 55: /* force_opt ::= FORCE */
+ case 285: /* analyze_opt ::= ANALYZE */ yytestcase(yyruleno==285);
+ case 292: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==292);
+ case 466: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==466);
+{ yymsp[0].minor.yy397 = true; }
+ break;
+ case 56: /* cmd ::= ALTER LOCAL NK_STRING */
{ pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); }
break;
- case 55: /* cmd ::= ALTER LOCAL NK_STRING NK_STRING */
+ case 57: /* cmd ::= ALTER LOCAL NK_STRING NK_STRING */
{ pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
break;
- case 56: /* cmd ::= CREATE QNODE ON DNODE NK_INTEGER */
+ case 58: /* cmd ::= CREATE QNODE ON DNODE NK_INTEGER */
{ pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_QNODE_STMT, &yymsp[0].minor.yy0); }
break;
- case 57: /* cmd ::= DROP QNODE ON DNODE NK_INTEGER */
+ case 59: /* cmd ::= DROP QNODE ON DNODE NK_INTEGER */
{ pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_QNODE_STMT, &yymsp[0].minor.yy0); }
break;
- case 58: /* cmd ::= CREATE BNODE ON DNODE NK_INTEGER */
+ case 60: /* cmd ::= CREATE BNODE ON DNODE NK_INTEGER */
{ pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_BNODE_STMT, &yymsp[0].minor.yy0); }
break;
- case 59: /* cmd ::= DROP BNODE ON DNODE NK_INTEGER */
+ case 61: /* cmd ::= DROP BNODE ON DNODE NK_INTEGER */
{ pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_BNODE_STMT, &yymsp[0].minor.yy0); }
break;
- case 60: /* cmd ::= CREATE SNODE ON DNODE NK_INTEGER */
+ case 62: /* cmd ::= CREATE SNODE ON DNODE NK_INTEGER */
{ pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_SNODE_STMT, &yymsp[0].minor.yy0); }
break;
- case 61: /* cmd ::= DROP SNODE ON DNODE NK_INTEGER */
+ case 63: /* cmd ::= DROP SNODE ON DNODE NK_INTEGER */
{ pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_SNODE_STMT, &yymsp[0].minor.yy0); }
break;
- case 62: /* cmd ::= CREATE MNODE ON DNODE NK_INTEGER */
+ case 64: /* cmd ::= CREATE MNODE ON DNODE NK_INTEGER */
{ pCxt->pRootNode = createCreateComponentNodeStmt(pCxt, QUERY_NODE_CREATE_MNODE_STMT, &yymsp[0].minor.yy0); }
break;
- case 63: /* cmd ::= DROP MNODE ON DNODE NK_INTEGER */
+ case 65: /* cmd ::= DROP MNODE ON DNODE NK_INTEGER */
{ pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_MNODE_STMT, &yymsp[0].minor.yy0); }
break;
- case 64: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */
-{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy193, &yymsp[-1].minor.yy593, yymsp[0].minor.yy164); }
+ case 66: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */
+{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy397, &yymsp[-1].minor.yy199, yymsp[0].minor.yy148); }
break;
- case 65: /* cmd ::= DROP DATABASE exists_opt db_name */
-{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); }
+ case 67: /* cmd ::= DROP DATABASE exists_opt db_name */
+{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy397, &yymsp[0].minor.yy199); }
break;
- case 66: /* cmd ::= USE db_name */
-{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy593); }
+ case 68: /* cmd ::= USE db_name */
+{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy199); }
break;
- case 67: /* cmd ::= ALTER DATABASE db_name alter_db_options */
-{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy164); }
+ case 69: /* cmd ::= ALTER DATABASE db_name alter_db_options */
+{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy199, yymsp[0].minor.yy148); }
break;
- case 68: /* cmd ::= FLUSH DATABASE db_name */
-{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy593); }
+ case 70: /* cmd ::= FLUSH DATABASE db_name */
+{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy199); }
break;
- case 69: /* cmd ::= TRIM DATABASE db_name speed_opt */
-{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy512); }
+ case 71: /* cmd ::= TRIM DATABASE db_name speed_opt */
+{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy199, yymsp[0].minor.yy706); }
break;
- case 70: /* not_exists_opt ::= IF NOT EXISTS */
-{ yymsp[-2].minor.yy193 = true; }
+ case 72: /* not_exists_opt ::= IF NOT EXISTS */
+{ yymsp[-2].minor.yy397 = true; }
break;
- case 72: /* exists_opt ::= IF EXISTS */
-{ yymsp[-1].minor.yy193 = true; }
+ case 74: /* exists_opt ::= IF EXISTS */
+{ yymsp[-1].minor.yy397 = true; }
break;
- case 74: /* db_options ::= */
-{ yymsp[1].minor.yy164 = createDefaultDatabaseOptions(pCxt); }
+ case 76: /* db_options ::= */
+{ yymsp[1].minor.yy148 = createDefaultDatabaseOptions(pCxt); }
break;
- case 75: /* db_options ::= db_options BUFFER NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 77: /* db_options ::= db_options BUFFER NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 76: /* db_options ::= db_options CACHEMODEL NK_STRING */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 78: /* db_options ::= db_options CACHEMODEL NK_STRING */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 77: /* db_options ::= db_options CACHESIZE NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 79: /* db_options ::= db_options CACHESIZE NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 78: /* db_options ::= db_options COMP NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_COMP, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 80: /* db_options ::= db_options COMP NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_COMP, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 79: /* db_options ::= db_options DURATION NK_INTEGER */
- case 80: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==80);
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_DAYS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 81: /* db_options ::= db_options DURATION NK_INTEGER */
+ case 82: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==82);
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_DAYS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 81: /* db_options ::= db_options MAXROWS NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 83: /* db_options ::= db_options MAXROWS NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 82: /* db_options ::= db_options MINROWS NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 84: /* db_options ::= db_options MINROWS NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 83: /* db_options ::= db_options KEEP integer_list */
- case 84: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==84);
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_KEEP, yymsp[0].minor.yy648); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 85: /* db_options ::= db_options KEEP integer_list */
+ case 86: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==86);
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_KEEP, yymsp[0].minor.yy404); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 85: /* db_options ::= db_options PAGES NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PAGES, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 87: /* db_options ::= db_options PAGES NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_PAGES, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 86: /* db_options ::= db_options PAGESIZE NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 88: /* db_options ::= db_options PAGESIZE NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 87: /* db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 89: /* db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 88: /* db_options ::= db_options PRECISION NK_STRING */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 90: /* db_options ::= db_options PRECISION NK_STRING */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 89: /* db_options ::= db_options REPLICA NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 91: /* db_options ::= db_options REPLICA NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 90: /* db_options ::= db_options STRICT NK_STRING */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_STRICT, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 92: /* db_options ::= db_options STRICT NK_STRING */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_STRICT, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 91: /* db_options ::= db_options VGROUPS NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 93: /* db_options ::= db_options VGROUPS NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 92: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 94: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 93: /* db_options ::= db_options RETENTIONS retention_list */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_RETENTIONS, yymsp[0].minor.yy648); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 95: /* db_options ::= db_options RETENTIONS retention_list */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_RETENTIONS, yymsp[0].minor.yy404); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 94: /* db_options ::= db_options SCHEMALESS NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 96: /* db_options ::= db_options SCHEMALESS NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 95: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 97: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_WAL, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 96: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 98: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 97: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 99: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 98: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */
+ case 100: /* db_options ::= db_options WAL_RETENTION_PERIOD 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;
- yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-3].minor.yy164, DB_OPTION_WAL_RETENTION_PERIOD, &t);
+ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-3].minor.yy148, DB_OPTION_WAL_RETENTION_PERIOD, &t);
}
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 99: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 101: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 100: /* db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */
+ case 102: /* db_options ::= db_options WAL_RETENTION_SIZE 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;
- yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-3].minor.yy164, DB_OPTION_WAL_RETENTION_SIZE, &t);
+ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-3].minor.yy148, DB_OPTION_WAL_RETENTION_SIZE, &t);
}
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
- break;
- case 101: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 102: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 103: /* db_options ::= db_options STT_TRIGGER NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 104: /* db_options ::= db_options TABLE_PREFIX NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 105: /* db_options ::= db_options TABLE_SUFFIX NK_INTEGER */
-{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 106: /* alter_db_options ::= alter_db_option */
-{ yylhsminor.yy164 = createAlterDatabaseOptions(pCxt); yylhsminor.yy164 = setAlterDatabaseOption(pCxt, yylhsminor.yy164, &yymsp[0].minor.yy213); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 107: /* alter_db_options ::= alter_db_options alter_db_option */
-{ yylhsminor.yy164 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy164, &yymsp[0].minor.yy213); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
- break;
- case 108: /* alter_db_option ::= BUFFER NK_INTEGER */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 109: /* alter_db_option ::= CACHEMODEL NK_STRING */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 110: /* alter_db_option ::= CACHESIZE NK_INTEGER */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 111: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 112: /* alter_db_option ::= KEEP integer_list */
- case 113: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==113);
-{ yymsp[-1].minor.yy213.type = DB_OPTION_KEEP; yymsp[-1].minor.yy213.pList = yymsp[0].minor.yy648; }
- break;
- case 114: /* alter_db_option ::= PAGES NK_INTEGER */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_PAGES; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 115: /* alter_db_option ::= REPLICA NK_INTEGER */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 116: /* alter_db_option ::= STRICT NK_STRING */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_STRICT; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 117: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_WAL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 118: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */
-{ yymsp[-1].minor.yy213.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
- break;
- case 119: /* integer_list ::= NK_INTEGER */
-{ yylhsminor.yy648 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy648 = yylhsminor.yy648;
- break;
- case 120: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */
- case 309: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==309);
-{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
- yymsp[-2].minor.yy648 = yylhsminor.yy648;
- break;
- case 121: /* variable_list ::= NK_VARIABLE */
-{ yylhsminor.yy648 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy648 = yylhsminor.yy648;
- break;
- case 122: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */
-{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[-2].minor.yy648 = yylhsminor.yy648;
- break;
- case 123: /* retention_list ::= retention */
- case 145: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==145);
- case 148: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==148);
- case 155: /* column_def_list ::= column_def */ yytestcase(yyruleno==155);
- case 198: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==198);
- case 203: /* col_name_list ::= col_name */ yytestcase(yyruleno==203);
- case 251: /* tag_list_opt ::= tag_item */ yytestcase(yyruleno==251);
- case 262: /* func_list ::= func */ yytestcase(yyruleno==262);
- case 337: /* literal_list ::= signed_literal */ yytestcase(yyruleno==337);
- case 403: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==403);
- case 409: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==409);
- case 464: /* select_list ::= select_item */ yytestcase(yyruleno==464);
- case 475: /* partition_list ::= partition_item */ yytestcase(yyruleno==475);
- case 527: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==527);
-{ yylhsminor.yy648 = createNodeList(pCxt, yymsp[0].minor.yy164); }
- yymsp[0].minor.yy648 = yylhsminor.yy648;
- break;
- case 124: /* retention_list ::= retention_list NK_COMMA retention */
- case 156: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==156);
- case 199: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==199);
- case 204: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==204);
- case 252: /* tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ yytestcase(yyruleno==252);
- case 263: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==263);
- case 338: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==338);
- case 404: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==404);
- case 465: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==465);
- case 476: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==476);
- case 528: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==528);
-{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); }
- yymsp[-2].minor.yy648 = yylhsminor.yy648;
- break;
- case 125: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */
-{ yylhsminor.yy164 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 126: /* speed_opt ::= */
- case 288: /* bufsize_opt ::= */ yytestcase(yyruleno==288);
-{ yymsp[1].minor.yy512 = 0; }
- break;
- case 127: /* speed_opt ::= MAX_SPEED NK_INTEGER */
- case 289: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==289);
-{ yymsp[-1].minor.yy512 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); }
- break;
- case 128: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */
- case 130: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==130);
-{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy193, yymsp[-5].minor.yy164, yymsp[-3].minor.yy648, yymsp[-1].minor.yy648, yymsp[0].minor.yy164); }
- break;
- case 129: /* cmd ::= CREATE TABLE multi_create_clause */
-{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy648); }
- break;
- case 131: /* cmd ::= DROP TABLE multi_drop_clause */
-{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy648); }
- break;
- case 132: /* cmd ::= DROP STABLE exists_opt full_table_name */
-{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); }
- break;
- case 133: /* cmd ::= ALTER TABLE alter_table_clause */
- case 311: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==311);
-{ pCxt->pRootNode = yymsp[0].minor.yy164; }
- break;
- case 134: /* cmd ::= ALTER STABLE alter_table_clause */
-{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy164); }
- break;
- case 135: /* alter_table_clause ::= full_table_name alter_table_options */
-{ yylhsminor.yy164 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
- break;
- case 136: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */
-{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
- break;
- case 137: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */
-{ yylhsminor.yy164 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy164, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy593); }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
- break;
- case 138: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */
-{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
- break;
- case 139: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */
-{ yylhsminor.yy164 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
- break;
- case 140: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */
-{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
- break;
- case 141: /* alter_table_clause ::= full_table_name DROP TAG column_name */
-{ yylhsminor.yy164 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy164, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy593); }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
- break;
- case 142: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */
-{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
- break;
- case 143: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */
-{ yylhsminor.yy164 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
- break;
- case 144: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */
-{ yylhsminor.yy164 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy164, &yymsp[-2].minor.yy593, yymsp[0].minor.yy164); }
- yymsp[-5].minor.yy164 = yylhsminor.yy164;
- break;
- case 146: /* multi_create_clause ::= multi_create_clause create_subtable_clause */
- case 149: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==149);
- case 410: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==410);
-{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-1].minor.yy648, yymsp[0].minor.yy164); }
- yymsp[-1].minor.yy648 = yylhsminor.yy648;
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 103: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 104: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 105: /* db_options ::= db_options STT_TRIGGER NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 106: /* db_options ::= db_options TABLE_PREFIX NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 107: /* db_options ::= db_options TABLE_SUFFIX NK_INTEGER */
+{ yylhsminor.yy148 = setDatabaseOption(pCxt, yymsp[-2].minor.yy148, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 108: /* alter_db_options ::= alter_db_option */
+{ yylhsminor.yy148 = createAlterDatabaseOptions(pCxt); yylhsminor.yy148 = setAlterDatabaseOption(pCxt, yylhsminor.yy148, &yymsp[0].minor.yy123); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 109: /* alter_db_options ::= alter_db_options alter_db_option */
+{ yylhsminor.yy148 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy148, &yymsp[0].minor.yy123); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 110: /* alter_db_option ::= BUFFER NK_INTEGER */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 111: /* alter_db_option ::= CACHEMODEL NK_STRING */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 112: /* alter_db_option ::= CACHESIZE NK_INTEGER */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 113: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 114: /* alter_db_option ::= KEEP integer_list */
+ case 115: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==115);
+{ yymsp[-1].minor.yy123.type = DB_OPTION_KEEP; yymsp[-1].minor.yy123.pList = yymsp[0].minor.yy404; }
+ break;
+ case 116: /* alter_db_option ::= PAGES NK_INTEGER */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_PAGES; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 117: /* alter_db_option ::= REPLICA NK_INTEGER */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 118: /* alter_db_option ::= STRICT NK_STRING */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_STRICT; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 119: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_WAL; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 120: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */
+{ yymsp[-1].minor.yy123.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
+ break;
+ case 121: /* integer_list ::= NK_INTEGER */
+{ yylhsminor.yy404 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy404 = yylhsminor.yy404;
+ break;
+ case 122: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */
+ case 314: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==314);
+{ yylhsminor.yy404 = addNodeToList(pCxt, yymsp[-2].minor.yy404, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
+ yymsp[-2].minor.yy404 = yylhsminor.yy404;
+ break;
+ case 123: /* variable_list ::= NK_VARIABLE */
+{ yylhsminor.yy404 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy404 = yylhsminor.yy404;
+ break;
+ case 124: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */
+{ yylhsminor.yy404 = addNodeToList(pCxt, yymsp[-2].minor.yy404, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[-2].minor.yy404 = yylhsminor.yy404;
+ break;
+ case 125: /* retention_list ::= retention */
+ case 147: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==147);
+ case 150: /* multi_drop_clause ::= drop_table_clause */ yytestcase(yyruleno==150);
+ case 157: /* column_def_list ::= column_def */ yytestcase(yyruleno==157);
+ case 201: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==201);
+ case 206: /* col_name_list ::= col_name */ yytestcase(yyruleno==206);
+ case 255: /* tag_list_opt ::= tag_item */ yytestcase(yyruleno==255);
+ case 266: /* func_list ::= func */ yytestcase(yyruleno==266);
+ case 342: /* literal_list ::= signed_literal */ yytestcase(yyruleno==342);
+ case 407: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==407);
+ case 413: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==413);
+ case 468: /* select_list ::= select_item */ yytestcase(yyruleno==468);
+ case 479: /* partition_list ::= partition_item */ yytestcase(yyruleno==479);
+ case 531: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==531);
+{ yylhsminor.yy404 = createNodeList(pCxt, yymsp[0].minor.yy148); }
+ yymsp[0].minor.yy404 = yylhsminor.yy404;
+ break;
+ case 126: /* retention_list ::= retention_list NK_COMMA retention */
+ case 158: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==158);
+ case 202: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==202);
+ case 207: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==207);
+ case 256: /* tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ yytestcase(yyruleno==256);
+ case 267: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==267);
+ case 343: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==343);
+ case 408: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==408);
+ case 469: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==469);
+ case 480: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==480);
+ case 532: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==532);
+{ yylhsminor.yy404 = addNodeToList(pCxt, yymsp[-2].minor.yy404, yymsp[0].minor.yy148); }
+ yymsp[-2].minor.yy404 = yylhsminor.yy404;
+ break;
+ case 127: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */
+{ yylhsminor.yy148 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 128: /* speed_opt ::= */
+ case 293: /* bufsize_opt ::= */ yytestcase(yyruleno==293);
+{ yymsp[1].minor.yy706 = 0; }
+ break;
+ case 129: /* speed_opt ::= MAX_SPEED NK_INTEGER */
+ case 294: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==294);
+{ yymsp[-1].minor.yy706 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); }
+ break;
+ case 130: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */
+ case 132: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==132);
+{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy397, yymsp[-5].minor.yy148, yymsp[-3].minor.yy404, yymsp[-1].minor.yy404, yymsp[0].minor.yy148); }
+ break;
+ case 131: /* cmd ::= CREATE TABLE multi_create_clause */
+{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy404); }
+ break;
+ case 133: /* cmd ::= DROP TABLE multi_drop_clause */
+{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy404); }
+ break;
+ case 134: /* cmd ::= DROP STABLE exists_opt full_table_name */
+{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy397, yymsp[0].minor.yy148); }
+ break;
+ case 135: /* cmd ::= ALTER TABLE alter_table_clause */
+ case 316: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==316);
+{ pCxt->pRootNode = yymsp[0].minor.yy148; }
+ break;
+ case 136: /* cmd ::= ALTER STABLE alter_table_clause */
+{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy148); }
+ break;
+ case 137: /* alter_table_clause ::= full_table_name alter_table_options */
+{ yylhsminor.yy148 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy148, yymsp[0].minor.yy148); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 138: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */
+{ yylhsminor.yy148 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy148, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy199, yymsp[0].minor.yy530); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 139: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */
+{ yylhsminor.yy148 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy148, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy199); }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 140: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */
+{ yylhsminor.yy148 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy148, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy199, yymsp[0].minor.yy530); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 141: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */
+{ yylhsminor.yy148 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy148, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy199, &yymsp[0].minor.yy199); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 142: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */
+{ yylhsminor.yy148 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy148, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy199, yymsp[0].minor.yy530); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 143: /* alter_table_clause ::= full_table_name DROP TAG column_name */
+{ yylhsminor.yy148 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy148, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy199); }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 144: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */
+{ yylhsminor.yy148 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy148, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy199, yymsp[0].minor.yy530); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 145: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */
+{ yylhsminor.yy148 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy148, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy199, &yymsp[0].minor.yy199); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 146: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */
+{ yylhsminor.yy148 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy148, &yymsp[-2].minor.yy199, yymsp[0].minor.yy148); }
+ yymsp[-5].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 148: /* multi_create_clause ::= multi_create_clause create_subtable_clause */
+ case 151: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==151);
+ case 414: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==414);
+{ yylhsminor.yy404 = addNodeToList(pCxt, yymsp[-1].minor.yy404, yymsp[0].minor.yy148); }
+ yymsp[-1].minor.yy404 = yylhsminor.yy404;
break;
- case 147: /* 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.yy164 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy193, yymsp[-8].minor.yy164, yymsp[-6].minor.yy164, yymsp[-5].minor.yy648, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); }
- yymsp[-9].minor.yy164 = yylhsminor.yy164;
+ case 149: /* 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.yy148 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy397, yymsp[-8].minor.yy148, yymsp[-6].minor.yy148, yymsp[-5].minor.yy404, yymsp[-2].minor.yy404, yymsp[0].minor.yy148); }
+ yymsp[-9].minor.yy148 = yylhsminor.yy148;
break;
- case 150: /* drop_table_clause ::= exists_opt full_table_name */
-{ yylhsminor.yy164 = createDropTableClause(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ case 152: /* drop_table_clause ::= exists_opt full_table_name */
+{ yylhsminor.yy148 = createDropTableClause(pCxt, yymsp[-1].minor.yy397, yymsp[0].minor.yy148); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 151: /* specific_cols_opt ::= */
- case 182: /* tags_def_opt ::= */ yytestcase(yyruleno==182);
- case 250: /* tag_list_opt ::= */ yytestcase(yyruleno==250);
- case 473: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==473);
- case 495: /* group_by_clause_opt ::= */ yytestcase(yyruleno==495);
- case 514: /* order_by_clause_opt ::= */ yytestcase(yyruleno==514);
-{ yymsp[1].minor.yy648 = NULL; }
+ case 153: /* specific_cols_opt ::= */
+ case 184: /* tags_def_opt ::= */ yytestcase(yyruleno==184);
+ case 254: /* tag_list_opt ::= */ yytestcase(yyruleno==254);
+ case 477: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==477);
+ case 499: /* group_by_clause_opt ::= */ yytestcase(yyruleno==499);
+ case 518: /* order_by_clause_opt ::= */ yytestcase(yyruleno==518);
+{ yymsp[1].minor.yy404 = NULL; }
break;
- case 152: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */
-{ yymsp[-2].minor.yy648 = yymsp[-1].minor.yy648; }
+ case 154: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */
+{ yymsp[-2].minor.yy404 = yymsp[-1].minor.yy404; }
break;
- case 153: /* full_table_name ::= table_name */
-{ yylhsminor.yy164 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy593, NULL); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 155: /* full_table_name ::= table_name */
+{ yylhsminor.yy148 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy199, NULL); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
break;
- case 154: /* full_table_name ::= db_name NK_DOT table_name */
-{ yylhsminor.yy164 = createRealTableNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593, NULL); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 156: /* full_table_name ::= db_name NK_DOT table_name */
+{ yylhsminor.yy148 = createRealTableNode(pCxt, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy199, NULL); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 157: /* column_def ::= column_name type_name */
-{ yylhsminor.yy164 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720, NULL); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ case 159: /* column_def ::= column_name type_name */
+{ yylhsminor.yy148 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy199, yymsp[0].minor.yy530, NULL); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 158: /* column_def ::= column_name type_name COMMENT NK_STRING */
-{ yylhsminor.yy164 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-2].minor.yy720, &yymsp[0].minor.yy0); }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ case 160: /* column_def ::= column_name type_name COMMENT NK_STRING */
+{ yylhsminor.yy148 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy199, yymsp[-2].minor.yy530, &yymsp[0].minor.yy0); }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 159: /* type_name ::= BOOL */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BOOL); }
+ case 161: /* type_name ::= BOOL */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_BOOL); }
break;
- case 160: /* type_name ::= TINYINT */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_TINYINT); }
+ case 162: /* type_name ::= TINYINT */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_TINYINT); }
break;
- case 161: /* type_name ::= SMALLINT */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_SMALLINT); }
+ case 163: /* type_name ::= SMALLINT */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_SMALLINT); }
break;
- case 162: /* type_name ::= INT */
- case 163: /* type_name ::= INTEGER */ yytestcase(yyruleno==163);
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_INT); }
+ case 164: /* type_name ::= INT */
+ case 165: /* type_name ::= INTEGER */ yytestcase(yyruleno==165);
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_INT); }
break;
- case 164: /* type_name ::= BIGINT */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BIGINT); }
+ case 166: /* type_name ::= BIGINT */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_BIGINT); }
break;
- case 165: /* type_name ::= FLOAT */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_FLOAT); }
+ case 167: /* type_name ::= FLOAT */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_FLOAT); }
break;
- case 166: /* type_name ::= DOUBLE */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_DOUBLE); }
+ case 168: /* type_name ::= DOUBLE */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_DOUBLE); }
break;
- case 167: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); }
+ case 169: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */
+{ yymsp[-3].minor.yy530 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); }
break;
- case 168: /* type_name ::= TIMESTAMP */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); }
+ case 170: /* type_name ::= TIMESTAMP */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); }
break;
- case 169: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); }
+ case 171: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */
+{ yymsp[-3].minor.yy530 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); }
break;
- case 170: /* type_name ::= TINYINT UNSIGNED */
-{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UTINYINT); }
+ case 172: /* type_name ::= TINYINT UNSIGNED */
+{ yymsp[-1].minor.yy530 = createDataType(TSDB_DATA_TYPE_UTINYINT); }
break;
- case 171: /* type_name ::= SMALLINT UNSIGNED */
-{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_USMALLINT); }
+ case 173: /* type_name ::= SMALLINT UNSIGNED */
+{ yymsp[-1].minor.yy530 = createDataType(TSDB_DATA_TYPE_USMALLINT); }
break;
- case 172: /* type_name ::= INT UNSIGNED */
-{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UINT); }
+ case 174: /* type_name ::= INT UNSIGNED */
+{ yymsp[-1].minor.yy530 = createDataType(TSDB_DATA_TYPE_UINT); }
break;
- case 173: /* type_name ::= BIGINT UNSIGNED */
-{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UBIGINT); }
+ case 175: /* type_name ::= BIGINT UNSIGNED */
+{ yymsp[-1].minor.yy530 = createDataType(TSDB_DATA_TYPE_UBIGINT); }
break;
- case 174: /* type_name ::= JSON */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_JSON); }
+ case 176: /* type_name ::= JSON */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_JSON); }
break;
- case 175: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); }
+ case 177: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */
+{ yymsp[-3].minor.yy530 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); }
break;
- case 176: /* type_name ::= MEDIUMBLOB */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); }
+ case 178: /* type_name ::= MEDIUMBLOB */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); }
break;
- case 177: /* type_name ::= BLOB */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BLOB); }
+ case 179: /* type_name ::= BLOB */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_BLOB); }
break;
- case 178: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); }
+ case 180: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */
+{ yymsp[-3].minor.yy530 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); }
break;
- case 179: /* type_name ::= DECIMAL */
-{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
+ case 181: /* type_name ::= DECIMAL */
+{ yymsp[0].minor.yy530 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
break;
- case 180: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
+ case 182: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */
+{ yymsp[-3].minor.yy530 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
break;
- case 181: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */
-{ yymsp[-5].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
+ case 183: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */
+{ yymsp[-5].minor.yy530 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
break;
- case 183: /* tags_def_opt ::= tags_def */
- case 402: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==402);
-{ yylhsminor.yy648 = yymsp[0].minor.yy648; }
- yymsp[0].minor.yy648 = yylhsminor.yy648;
+ case 185: /* tags_def_opt ::= tags_def */
+ case 406: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==406);
+{ yylhsminor.yy404 = yymsp[0].minor.yy404; }
+ yymsp[0].minor.yy404 = yylhsminor.yy404;
break;
- case 184: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */
-{ yymsp[-3].minor.yy648 = yymsp[-1].minor.yy648; }
+ case 186: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */
+{ yymsp[-3].minor.yy404 = yymsp[-1].minor.yy404; }
break;
- case 185: /* table_options ::= */
-{ yymsp[1].minor.yy164 = createDefaultTableOptions(pCxt); }
+ case 187: /* table_options ::= */
+{ yymsp[1].minor.yy148 = createDefaultTableOptions(pCxt); }
break;
- case 186: /* table_options ::= table_options COMMENT NK_STRING */
-{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 188: /* table_options ::= table_options COMMENT NK_STRING */
+{ yylhsminor.yy148 = setTableOption(pCxt, yymsp[-2].minor.yy148, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 187: /* table_options ::= table_options MAX_DELAY duration_list */
-{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy648); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 189: /* table_options ::= table_options MAX_DELAY duration_list */
+{ yylhsminor.yy148 = setTableOption(pCxt, yymsp[-2].minor.yy148, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy404); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 188: /* table_options ::= table_options WATERMARK duration_list */
-{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy648); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 190: /* table_options ::= table_options WATERMARK duration_list */
+{ yylhsminor.yy148 = setTableOption(pCxt, yymsp[-2].minor.yy148, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy404); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 189: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */
-{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-4].minor.yy164, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy648); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
+ case 191: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */
+{ yylhsminor.yy148 = setTableOption(pCxt, yymsp[-4].minor.yy148, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy404); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
break;
- case 190: /* table_options ::= table_options TTL NK_INTEGER */
-{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 192: /* table_options ::= table_options TTL NK_INTEGER */
+{ yylhsminor.yy148 = setTableOption(pCxt, yymsp[-2].minor.yy148, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 191: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */
-{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-4].minor.yy164, TABLE_OPTION_SMA, yymsp[-1].minor.yy648); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
+ case 193: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */
+{ yylhsminor.yy148 = setTableOption(pCxt, yymsp[-4].minor.yy148, TABLE_OPTION_SMA, yymsp[-1].minor.yy404); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
break;
- case 192: /* alter_table_options ::= alter_table_option */
-{ yylhsminor.yy164 = createAlterTableOptions(pCxt); yylhsminor.yy164 = setTableOption(pCxt, yylhsminor.yy164, yymsp[0].minor.yy213.type, &yymsp[0].minor.yy213.val); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 194: /* table_options ::= table_options DELETE_MARK duration_list */
+{ yylhsminor.yy148 = setTableOption(pCxt, yymsp[-2].minor.yy148, TABLE_OPTION_DELETE_MARK, yymsp[0].minor.yy404); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 193: /* alter_table_options ::= alter_table_options alter_table_option */
-{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy213.type, &yymsp[0].minor.yy213.val); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ case 195: /* alter_table_options ::= alter_table_option */
+{ yylhsminor.yy148 = createAlterTableOptions(pCxt); yylhsminor.yy148 = setTableOption(pCxt, yylhsminor.yy148, yymsp[0].minor.yy123.type, &yymsp[0].minor.yy123.val); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
break;
- case 194: /* alter_table_option ::= COMMENT NK_STRING */
-{ yymsp[-1].minor.yy213.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
+ case 196: /* alter_table_options ::= alter_table_options alter_table_option */
+{ yylhsminor.yy148 = setTableOption(pCxt, yymsp[-1].minor.yy148, yymsp[0].minor.yy123.type, &yymsp[0].minor.yy123.val); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 195: /* alter_table_option ::= TTL NK_INTEGER */
-{ yymsp[-1].minor.yy213.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
+ case 197: /* alter_table_option ::= COMMENT NK_STRING */
+{ yymsp[-1].minor.yy123.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
break;
- case 196: /* duration_list ::= duration_literal */
- case 367: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==367);
-{ yylhsminor.yy648 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); }
- yymsp[0].minor.yy648 = yylhsminor.yy648;
+ case 198: /* alter_table_option ::= TTL NK_INTEGER */
+{ yymsp[-1].minor.yy123.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy123.val = yymsp[0].minor.yy0; }
break;
- case 197: /* duration_list ::= duration_list NK_COMMA duration_literal */
- case 368: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==368);
-{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); }
- yymsp[-2].minor.yy648 = yylhsminor.yy648;
+ case 199: /* duration_list ::= duration_literal */
+ case 371: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==371);
+{ yylhsminor.yy404 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy148)); }
+ yymsp[0].minor.yy404 = yylhsminor.yy404;
break;
- case 200: /* rollup_func_name ::= function_name */
-{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[0].minor.yy593, NULL); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 200: /* duration_list ::= duration_list NK_COMMA duration_literal */
+ case 372: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==372);
+{ yylhsminor.yy404 = addNodeToList(pCxt, yymsp[-2].minor.yy404, releaseRawExprNode(pCxt, yymsp[0].minor.yy148)); }
+ yymsp[-2].minor.yy404 = yylhsminor.yy404;
break;
- case 201: /* rollup_func_name ::= FIRST */
- case 202: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==202);
- case 254: /* tag_item ::= QTAGS */ yytestcase(yyruleno==254);
-{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 203: /* rollup_func_name ::= function_name */
+{ yylhsminor.yy148 = createFunctionNode(pCxt, &yymsp[0].minor.yy199, NULL); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
break;
- case 205: /* col_name ::= column_name */
- case 255: /* tag_item ::= column_name */ yytestcase(yyruleno==255);
-{ yylhsminor.yy164 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy593); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 204: /* rollup_func_name ::= FIRST */
+ case 205: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==205);
+ case 258: /* tag_item ::= QTAGS */ yytestcase(yyruleno==258);
+{ yylhsminor.yy148 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
break;
- case 206: /* cmd ::= SHOW DNODES */
+ case 208: /* col_name ::= column_name */
+ case 259: /* tag_item ::= column_name */ yytestcase(yyruleno==259);
+{ yylhsminor.yy148 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy199); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 209: /* cmd ::= SHOW DNODES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); }
break;
- case 207: /* cmd ::= SHOW USERS */
+ case 210: /* cmd ::= SHOW USERS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USERS_STMT); }
break;
- case 208: /* cmd ::= SHOW DATABASES */
+ case 211: /* cmd ::= SHOW USER PRIVILEGES */
+{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_USER_PRIVILEGES_STMT); }
+ break;
+ case 212: /* cmd ::= SHOW DATABASES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); }
break;
- case 209: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, OP_TYPE_LIKE); }
+ case 213: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy148, yymsp[0].minor.yy148, OP_TYPE_LIKE); }
break;
- case 210: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, OP_TYPE_LIKE); }
+ case 214: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy148, yymsp[0].minor.yy148, OP_TYPE_LIKE); }
break;
- case 211: /* cmd ::= SHOW db_name_cond_opt VGROUPS */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy164, NULL, OP_TYPE_LIKE); }
+ case 215: /* cmd ::= SHOW db_name_cond_opt VGROUPS */
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy148, NULL, OP_TYPE_LIKE); }
break;
- case 212: /* cmd ::= SHOW MNODES */
+ case 216: /* cmd ::= SHOW MNODES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); }
break;
- case 213: /* cmd ::= SHOW QNODES */
+ case 217: /* cmd ::= SHOW QNODES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QNODES_STMT); }
break;
- case 214: /* cmd ::= SHOW FUNCTIONS */
+ case 218: /* cmd ::= SHOW FUNCTIONS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); }
break;
- case 215: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy164, yymsp[-1].minor.yy164, OP_TYPE_EQUAL); }
+ case 219: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy148, yymsp[-1].minor.yy148, OP_TYPE_EQUAL); }
break;
- case 216: /* cmd ::= SHOW STREAMS */
+ case 220: /* cmd ::= SHOW STREAMS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); }
break;
- case 217: /* cmd ::= SHOW ACCOUNTS */
+ case 221: /* cmd ::= SHOW ACCOUNTS */
{ pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
break;
- case 218: /* cmd ::= SHOW APPS */
+ case 222: /* cmd ::= SHOW APPS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_APPS_STMT); }
break;
- case 219: /* cmd ::= SHOW CONNECTIONS */
+ case 223: /* cmd ::= SHOW CONNECTIONS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONNECTIONS_STMT); }
break;
- case 220: /* cmd ::= SHOW LICENCES */
- case 221: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==221);
+ case 224: /* cmd ::= SHOW LICENCES */
+ case 225: /* cmd ::= SHOW GRANTS */ yytestcase(yyruleno==225);
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCES_STMT); }
break;
- case 222: /* cmd ::= SHOW CREATE DATABASE db_name */
-{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy593); }
+ case 226: /* cmd ::= SHOW CREATE DATABASE db_name */
+{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy199); }
break;
- case 223: /* cmd ::= SHOW CREATE TABLE full_table_name */
-{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy164); }
+ case 227: /* cmd ::= SHOW CREATE TABLE full_table_name */
+{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy148); }
break;
- case 224: /* cmd ::= SHOW CREATE STABLE full_table_name */
-{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy164); }
+ case 228: /* cmd ::= SHOW CREATE STABLE full_table_name */
+{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy148); }
break;
- case 225: /* cmd ::= SHOW QUERIES */
+ case 229: /* cmd ::= SHOW QUERIES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); }
break;
- case 226: /* cmd ::= SHOW SCORES */
+ case 230: /* cmd ::= SHOW SCORES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SCORES_STMT); }
break;
- case 227: /* cmd ::= SHOW TOPICS */
+ case 231: /* cmd ::= SHOW TOPICS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TOPICS_STMT); }
break;
- case 228: /* cmd ::= SHOW VARIABLES */
- case 229: /* cmd ::= SHOW CLUSTER VARIABLES */ yytestcase(yyruleno==229);
+ case 232: /* cmd ::= SHOW VARIABLES */
+ case 233: /* cmd ::= SHOW CLUSTER VARIABLES */ yytestcase(yyruleno==233);
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); }
break;
- case 230: /* cmd ::= SHOW LOCAL VARIABLES */
+ case 234: /* cmd ::= SHOW LOCAL VARIABLES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); }
break;
- case 231: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */
-{ pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-2].minor.yy0), yymsp[0].minor.yy164); }
+ case 235: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */
+{ pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-2].minor.yy0), yymsp[0].minor.yy148); }
break;
- case 232: /* cmd ::= SHOW BNODES */
+ case 236: /* cmd ::= SHOW BNODES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); }
break;
- case 233: /* cmd ::= SHOW SNODES */
+ case 237: /* cmd ::= SHOW SNODES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); }
break;
- case 234: /* cmd ::= SHOW CLUSTER */
+ case 238: /* cmd ::= SHOW CLUSTER */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CLUSTER_STMT); }
break;
- case 235: /* cmd ::= SHOW TRANSACTIONS */
+ case 239: /* cmd ::= SHOW TRANSACTIONS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); }
break;
- case 236: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */
-{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy164); }
+ case 240: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */
+{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy148); }
break;
- case 237: /* cmd ::= SHOW CONSUMERS */
+ case 241: /* cmd ::= SHOW CONSUMERS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); }
break;
- case 238: /* cmd ::= SHOW SUBSCRIPTIONS */
+ case 242: /* cmd ::= SHOW SUBSCRIPTIONS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); }
break;
- case 239: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy164, yymsp[-1].minor.yy164, OP_TYPE_EQUAL); }
+ case 243: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy148, yymsp[-1].minor.yy148, OP_TYPE_EQUAL); }
break;
- case 240: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */
-{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164, yymsp[-3].minor.yy648); }
+ case 244: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */
+{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, yymsp[-1].minor.yy148, yymsp[0].minor.yy148, yymsp[-3].minor.yy404); }
break;
- case 241: /* cmd ::= SHOW VNODES NK_INTEGER */
+ case 245: /* cmd ::= SHOW VNODES NK_INTEGER */
{ pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0), NULL); }
break;
- case 242: /* cmd ::= SHOW VNODES NK_STRING */
+ case 246: /* cmd ::= SHOW VNODES NK_STRING */
{ pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &yymsp[0].minor.yy0)); }
break;
- case 243: /* db_name_cond_opt ::= */
- case 248: /* from_db_opt ::= */ yytestcase(yyruleno==248);
-{ yymsp[1].minor.yy164 = createDefaultDatabaseCondValue(pCxt); }
+ case 247: /* db_name_cond_opt ::= */
+ case 252: /* from_db_opt ::= */ yytestcase(yyruleno==252);
+{ yymsp[1].minor.yy148 = createDefaultDatabaseCondValue(pCxt); }
break;
- case 244: /* db_name_cond_opt ::= db_name NK_DOT */
-{ yylhsminor.yy164 = createIdentifierValueNode(pCxt, &yymsp[-1].minor.yy593); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ case 248: /* db_name_cond_opt ::= db_name NK_DOT */
+{ yylhsminor.yy148 = createIdentifierValueNode(pCxt, &yymsp[-1].minor.yy199); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 245: /* like_pattern_opt ::= */
- case 299: /* subtable_opt ::= */ yytestcase(yyruleno==299);
- case 412: /* case_when_else_opt ::= */ yytestcase(yyruleno==412);
- case 442: /* from_clause_opt ::= */ yytestcase(yyruleno==442);
- case 471: /* where_clause_opt ::= */ yytestcase(yyruleno==471);
- case 480: /* twindow_clause_opt ::= */ yytestcase(yyruleno==480);
- case 485: /* sliding_opt ::= */ yytestcase(yyruleno==485);
- case 487: /* fill_opt ::= */ yytestcase(yyruleno==487);
- case 499: /* having_clause_opt ::= */ yytestcase(yyruleno==499);
- case 501: /* range_opt ::= */ yytestcase(yyruleno==501);
- case 503: /* every_opt ::= */ yytestcase(yyruleno==503);
- case 516: /* slimit_clause_opt ::= */ yytestcase(yyruleno==516);
- case 520: /* limit_clause_opt ::= */ yytestcase(yyruleno==520);
-{ yymsp[1].minor.yy164 = NULL; }
+ case 249: /* like_pattern_opt ::= */
+ case 304: /* subtable_opt ::= */ yytestcase(yyruleno==304);
+ case 416: /* case_when_else_opt ::= */ yytestcase(yyruleno==416);
+ case 446: /* from_clause_opt ::= */ yytestcase(yyruleno==446);
+ case 475: /* where_clause_opt ::= */ yytestcase(yyruleno==475);
+ case 484: /* twindow_clause_opt ::= */ yytestcase(yyruleno==484);
+ case 489: /* sliding_opt ::= */ yytestcase(yyruleno==489);
+ case 491: /* fill_opt ::= */ yytestcase(yyruleno==491);
+ case 503: /* having_clause_opt ::= */ yytestcase(yyruleno==503);
+ case 505: /* range_opt ::= */ yytestcase(yyruleno==505);
+ case 507: /* every_opt ::= */ yytestcase(yyruleno==507);
+ case 520: /* slimit_clause_opt ::= */ yytestcase(yyruleno==520);
+ case 524: /* limit_clause_opt ::= */ yytestcase(yyruleno==524);
+{ yymsp[1].minor.yy148 = NULL; }
break;
- case 246: /* like_pattern_opt ::= LIKE NK_STRING */
-{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
+ case 250: /* like_pattern_opt ::= LIKE NK_STRING */
+{ yymsp[-1].minor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
break;
- case 247: /* table_name_cond ::= table_name */
-{ yylhsminor.yy164 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy593); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 251: /* table_name_cond ::= table_name */
+{ yylhsminor.yy148 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy199); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
break;
- case 249: /* from_db_opt ::= FROM db_name */
-{ yymsp[-1].minor.yy164 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy593); }
+ case 253: /* from_db_opt ::= FROM db_name */
+{ yymsp[-1].minor.yy148 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy199); }
break;
- case 253: /* tag_item ::= TBNAME */
-{ yylhsminor.yy164 = setProjectionAlias(pCxt, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL), &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 257: /* tag_item ::= TBNAME */
+{ yylhsminor.yy148 = setProjectionAlias(pCxt, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL), &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
break;
- case 256: /* tag_item ::= column_name column_alias */
-{ yylhsminor.yy164 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy593), &yymsp[0].minor.yy593); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ case 260: /* tag_item ::= column_name column_alias */
+{ yylhsminor.yy148 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy199), &yymsp[0].minor.yy199); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 257: /* tag_item ::= column_name AS column_alias */
-{ yylhsminor.yy164 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-2].minor.yy593), &yymsp[0].minor.yy593); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 261: /* tag_item ::= column_name AS column_alias */
+{ yylhsminor.yy148 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-2].minor.yy199), &yymsp[0].minor.yy199); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 258: /* 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.yy193, yymsp[-3].minor.yy164, yymsp[-1].minor.yy164, NULL, yymsp[0].minor.yy164); }
+ case 262: /* 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.yy397, yymsp[-3].minor.yy148, yymsp[-1].minor.yy148, NULL, yymsp[0].minor.yy148); }
break;
- case 259: /* cmd ::= DROP INDEX exists_opt full_table_name */
-{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); }
+ case 263: /* cmd ::= DROP INDEX exists_opt full_table_name */
+{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy397, yymsp[0].minor.yy148); }
break;
- case 260: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */
-{ yymsp[-9].minor.yy164 = createIndexOption(pCxt, yymsp[-7].minor.yy648, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
+ case 264: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */
+{ yymsp[-9].minor.yy148 = createIndexOption(pCxt, yymsp[-7].minor.yy404, releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), NULL, yymsp[-1].minor.yy148, yymsp[0].minor.yy148); }
break;
- case 261: /* 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.yy164 = createIndexOption(pCxt, yymsp[-9].minor.yy648, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
+ case 265: /* 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.yy148 = createIndexOption(pCxt, yymsp[-9].minor.yy404, releaseRawExprNode(pCxt, yymsp[-5].minor.yy148), releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), yymsp[-1].minor.yy148, yymsp[0].minor.yy148); }
break;
- case 264: /* func ::= function_name NK_LP expression_list NK_RP */
-{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-1].minor.yy648); }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ case 268: /* func ::= function_name NK_LP expression_list NK_RP */
+{ yylhsminor.yy148 = createFunctionNode(pCxt, &yymsp[-3].minor.yy199, yymsp[-1].minor.yy404); }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 265: /* sma_stream_opt ::= */
- case 292: /* stream_options ::= */ yytestcase(yyruleno==292);
-{ yymsp[1].minor.yy164 = createStreamOptions(pCxt); }
+ case 269: /* sma_stream_opt ::= */
+ case 297: /* stream_options ::= */ yytestcase(yyruleno==297);
+{ yymsp[1].minor.yy148 = createStreamOptions(pCxt); }
break;
- case 266: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */
- case 296: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==296);
-{ ((SStreamOptions*)yymsp[-2].minor.yy164)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-2].minor.yy164; }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 270: /* sma_stream_opt ::= sma_stream_opt WATERMARK duration_literal */
+ case 301: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==301);
+{ ((SStreamOptions*)yymsp[-2].minor.yy148)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy148); yylhsminor.yy148 = yymsp[-2].minor.yy148; }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 267: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */
-{ ((SStreamOptions*)yymsp[-2].minor.yy164)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-2].minor.yy164; }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 271: /* sma_stream_opt ::= sma_stream_opt MAX_DELAY duration_literal */
+{ ((SStreamOptions*)yymsp[-2].minor.yy148)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy148); yylhsminor.yy148 = yymsp[-2].minor.yy148; }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 268: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */
-{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy193, &yymsp[-2].minor.yy593, yymsp[0].minor.yy164); }
+ case 272: /* sma_stream_opt ::= sma_stream_opt DELETE_MARK duration_literal */
+{ ((SStreamOptions*)yymsp[-2].minor.yy148)->pDeleteMark = releaseRawExprNode(pCxt, yymsp[0].minor.yy148); yylhsminor.yy148 = yymsp[-2].minor.yy148; }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 269: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */
-{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy193, &yymsp[-3].minor.yy593, &yymsp[0].minor.yy593, false); }
+ case 273: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */
+{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy397, &yymsp[-2].minor.yy199, yymsp[0].minor.yy148); }
break;
- case 270: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */
-{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy193, &yymsp[-5].minor.yy593, &yymsp[0].minor.yy593, true); }
+ case 274: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */
+{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy397, &yymsp[-3].minor.yy199, &yymsp[0].minor.yy199, false); }
break;
- case 271: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */
-{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy193, &yymsp[-3].minor.yy593, yymsp[0].minor.yy164, false); }
+ case 275: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */
+{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy397, &yymsp[-5].minor.yy199, &yymsp[0].minor.yy199, true); }
break;
- case 272: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */
-{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy193, &yymsp[-5].minor.yy593, yymsp[0].minor.yy164, true); }
+ case 276: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */
+{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy397, &yymsp[-3].minor.yy199, yymsp[0].minor.yy148, false); }
break;
- case 273: /* cmd ::= DROP TOPIC exists_opt topic_name */
-{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); }
+ case 277: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */
+{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy397, &yymsp[-5].minor.yy199, yymsp[0].minor.yy148, true); }
break;
- case 274: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */
-{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy193, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); }
+ case 278: /* cmd ::= DROP TOPIC exists_opt topic_name */
+{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy397, &yymsp[0].minor.yy199); }
break;
- case 275: /* cmd ::= DESC full_table_name */
- case 276: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==276);
-{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy164); }
+ case 279: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */
+{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy397, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy199); }
break;
- case 277: /* cmd ::= RESET QUERY CACHE */
+ case 280: /* cmd ::= DESC full_table_name */
+ case 281: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==281);
+{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy148); }
+ break;
+ case 282: /* cmd ::= RESET QUERY CACHE */
{ pCxt->pRootNode = createResetQueryCacheStmt(pCxt); }
break;
- case 278: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */
-{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy193, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
+ case 283: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */
+{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy397, yymsp[-1].minor.yy148, yymsp[0].minor.yy148); }
break;
- case 281: /* explain_options ::= */
-{ yymsp[1].minor.yy164 = createDefaultExplainOptions(pCxt); }
+ case 286: /* explain_options ::= */
+{ yymsp[1].minor.yy148 = createDefaultExplainOptions(pCxt); }
break;
- case 282: /* explain_options ::= explain_options VERBOSE NK_BOOL */
-{ yylhsminor.yy164 = setExplainVerbose(pCxt, yymsp[-2].minor.yy164, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 287: /* explain_options ::= explain_options VERBOSE NK_BOOL */
+{ yylhsminor.yy148 = setExplainVerbose(pCxt, yymsp[-2].minor.yy148, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 283: /* explain_options ::= explain_options RATIO NK_FLOAT */
-{ yylhsminor.yy164 = setExplainRatio(pCxt, yymsp[-2].minor.yy164, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 288: /* explain_options ::= explain_options RATIO NK_FLOAT */
+{ yylhsminor.yy148 = setExplainRatio(pCxt, yymsp[-2].minor.yy148, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 284: /* 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.yy193, yymsp[-8].minor.yy193, &yymsp[-5].minor.yy593, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy720, yymsp[0].minor.yy512); }
+ case 289: /* 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.yy397, yymsp[-8].minor.yy397, &yymsp[-5].minor.yy199, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy530, yymsp[0].minor.yy706); }
break;
- case 285: /* cmd ::= DROP FUNCTION exists_opt function_name */
-{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); }
+ case 290: /* cmd ::= DROP FUNCTION exists_opt function_name */
+{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy397, &yymsp[0].minor.yy199); }
break;
- case 290: /* 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.yy193, &yymsp[-7].minor.yy593, yymsp[-4].minor.yy164, yymsp[-6].minor.yy164, yymsp[-3].minor.yy648, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); }
+ case 295: /* 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.yy397, &yymsp[-7].minor.yy199, yymsp[-4].minor.yy148, yymsp[-6].minor.yy148, yymsp[-3].minor.yy404, yymsp[-2].minor.yy148, yymsp[0].minor.yy148); }
break;
- case 291: /* cmd ::= DROP STREAM exists_opt stream_name */
-{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); }
+ case 296: /* cmd ::= DROP STREAM exists_opt stream_name */
+{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy397, &yymsp[0].minor.yy199); }
break;
- case 293: /* stream_options ::= stream_options TRIGGER AT_ONCE */
-{ ((SStreamOptions*)yymsp[-2].minor.yy164)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy164 = yymsp[-2].minor.yy164; }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 298: /* stream_options ::= stream_options TRIGGER AT_ONCE */
+{ ((SStreamOptions*)yymsp[-2].minor.yy148)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy148 = yymsp[-2].minor.yy148; }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 294: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */
-{ ((SStreamOptions*)yymsp[-2].minor.yy164)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy164 = yymsp[-2].minor.yy164; }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 299: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */
+{ ((SStreamOptions*)yymsp[-2].minor.yy148)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy148 = yymsp[-2].minor.yy148; }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 295: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */
-{ ((SStreamOptions*)yymsp[-3].minor.yy164)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy164)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-3].minor.yy164; }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ case 300: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */
+{ ((SStreamOptions*)yymsp[-3].minor.yy148)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy148)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy148); yylhsminor.yy148 = yymsp[-3].minor.yy148; }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 297: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */
-{ ((SStreamOptions*)yymsp[-3].minor.yy164)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy164 = yymsp[-3].minor.yy164; }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ case 302: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */
+{ ((SStreamOptions*)yymsp[-3].minor.yy148)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy148 = yymsp[-3].minor.yy148; }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 298: /* stream_options ::= stream_options FILL_HISTORY NK_INTEGER */
-{ ((SStreamOptions*)yymsp[-2].minor.yy164)->fillHistory = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy164 = yymsp[-2].minor.yy164; }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 303: /* stream_options ::= stream_options FILL_HISTORY NK_INTEGER */
+{ ((SStreamOptions*)yymsp[-2].minor.yy148)->fillHistory = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy148 = yymsp[-2].minor.yy148; }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 300: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */
- case 486: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==486);
- case 504: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==504);
-{ yymsp[-3].minor.yy164 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy164); }
+ case 305: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */
+ case 490: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==490);
+ case 508: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==508);
+{ yymsp[-3].minor.yy148 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy148); }
break;
- case 301: /* cmd ::= KILL CONNECTION NK_INTEGER */
+ case 306: /* cmd ::= KILL CONNECTION NK_INTEGER */
{ pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); }
break;
- case 302: /* cmd ::= KILL QUERY NK_STRING */
+ case 307: /* cmd ::= KILL QUERY NK_STRING */
{ pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); }
break;
- case 303: /* cmd ::= KILL TRANSACTION NK_INTEGER */
+ case 308: /* cmd ::= KILL TRANSACTION NK_INTEGER */
{ pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); }
break;
- case 304: /* cmd ::= BALANCE VGROUP */
+ case 309: /* cmd ::= BALANCE VGROUP */
{ pCxt->pRootNode = createBalanceVgroupStmt(pCxt); }
break;
- case 305: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */
+ case 310: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */
{ pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
break;
- case 306: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */
-{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy648); }
+ case 311: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */
+{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy404); }
break;
- case 307: /* cmd ::= SPLIT VGROUP NK_INTEGER */
+ case 312: /* cmd ::= SPLIT VGROUP NK_INTEGER */
{ pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); }
break;
- case 308: /* dnode_list ::= DNODE NK_INTEGER */
-{ yymsp[-1].minor.yy648 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
- break;
- case 310: /* cmd ::= DELETE FROM full_table_name where_clause_opt */
-{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
- break;
- case 312: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */
-{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy164, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); }
- break;
- case 313: /* cmd ::= INSERT INTO full_table_name query_or_subquery */
-{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy164, NULL, yymsp[0].minor.yy164); }
- break;
- case 314: /* literal ::= NK_INTEGER */
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 315: /* literal ::= NK_FLOAT */
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 316: /* literal ::= NK_STRING */
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 317: /* literal ::= NK_BOOL */
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 318: /* literal ::= TIMESTAMP NK_STRING */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
- break;
- case 319: /* literal ::= duration_literal */
- case 329: /* signed_literal ::= signed */ yytestcase(yyruleno==329);
- case 349: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==349);
- case 350: /* expr_or_subquery ::= subquery */ yytestcase(yyruleno==350);
- case 351: /* expression ::= literal */ yytestcase(yyruleno==351);
- case 352: /* expression ::= pseudo_column */ yytestcase(yyruleno==352);
- case 353: /* expression ::= column_reference */ yytestcase(yyruleno==353);
- case 354: /* expression ::= function_expression */ yytestcase(yyruleno==354);
- case 355: /* expression ::= case_when_expression */ yytestcase(yyruleno==355);
- case 385: /* function_expression ::= literal_func */ yytestcase(yyruleno==385);
- case 434: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==434);
- case 438: /* boolean_primary ::= predicate */ yytestcase(yyruleno==438);
- case 440: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==440);
- case 441: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==441);
- case 444: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==444);
- case 446: /* table_reference ::= table_primary */ yytestcase(yyruleno==446);
- case 447: /* table_reference ::= joined_table */ yytestcase(yyruleno==447);
- case 451: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==451);
- case 506: /* query_simple ::= query_specification */ yytestcase(yyruleno==506);
- case 507: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==507);
- case 510: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==510);
- case 512: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==512);
-{ yylhsminor.yy164 = yymsp[0].minor.yy164; }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 320: /* literal ::= NULL */
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 321: /* literal ::= NK_QUESTION */
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 322: /* duration_literal ::= NK_VARIABLE */
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 323: /* signed ::= NK_INTEGER */
-{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 324: /* signed ::= NK_PLUS NK_INTEGER */
-{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); }
- break;
- case 325: /* signed ::= NK_MINUS NK_INTEGER */
+ case 313: /* dnode_list ::= DNODE NK_INTEGER */
+{ yymsp[-1].minor.yy404 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
+ break;
+ case 315: /* cmd ::= DELETE FROM full_table_name where_clause_opt */
+{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy148, yymsp[0].minor.yy148); }
+ break;
+ case 317: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */
+{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy148, yymsp[-2].minor.yy404, yymsp[0].minor.yy148); }
+ break;
+ case 318: /* cmd ::= INSERT INTO full_table_name query_or_subquery */
+{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy148, NULL, yymsp[0].minor.yy148); }
+ break;
+ case 319: /* literal ::= NK_INTEGER */
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 320: /* literal ::= NK_FLOAT */
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 321: /* literal ::= NK_STRING */
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 322: /* literal ::= NK_BOOL */
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 323: /* literal ::= TIMESTAMP NK_STRING */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 324: /* literal ::= duration_literal */
+ case 334: /* signed_literal ::= signed */ yytestcase(yyruleno==334);
+ case 354: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==354);
+ case 355: /* expression ::= literal */ yytestcase(yyruleno==355);
+ case 356: /* expression ::= pseudo_column */ yytestcase(yyruleno==356);
+ case 357: /* expression ::= column_reference */ yytestcase(yyruleno==357);
+ case 358: /* expression ::= function_expression */ yytestcase(yyruleno==358);
+ case 359: /* expression ::= case_when_expression */ yytestcase(yyruleno==359);
+ case 389: /* function_expression ::= literal_func */ yytestcase(yyruleno==389);
+ case 438: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==438);
+ case 442: /* boolean_primary ::= predicate */ yytestcase(yyruleno==442);
+ case 444: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==444);
+ case 445: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==445);
+ case 448: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==448);
+ case 450: /* table_reference ::= table_primary */ yytestcase(yyruleno==450);
+ case 451: /* table_reference ::= joined_table */ yytestcase(yyruleno==451);
+ case 455: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==455);
+ case 510: /* query_simple ::= query_specification */ yytestcase(yyruleno==510);
+ case 511: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==511);
+ case 514: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==514);
+ case 516: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==516);
+{ yylhsminor.yy148 = yymsp[0].minor.yy148; }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 325: /* literal ::= NULL */
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 326: /* literal ::= NK_QUESTION */
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 327: /* duration_literal ::= NK_VARIABLE */
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 328: /* signed ::= NK_INTEGER */
+{ yylhsminor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 329: /* signed ::= NK_PLUS NK_INTEGER */
+{ yymsp[-1].minor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); }
+ break;
+ case 330: /* 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;
- yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t);
+ yylhsminor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t);
}
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 326: /* signed ::= NK_FLOAT */
-{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 331: /* signed ::= NK_FLOAT */
+{ yylhsminor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
break;
- case 327: /* signed ::= NK_PLUS NK_FLOAT */
-{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); }
+ case 332: /* signed ::= NK_PLUS NK_FLOAT */
+{ yymsp[-1].minor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); }
break;
- case 328: /* signed ::= NK_MINUS NK_FLOAT */
+ case 333: /* 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;
- yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t);
+ yylhsminor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t);
}
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
- break;
- case 330: /* signed_literal ::= NK_STRING */
-{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 331: /* signed_literal ::= NK_BOOL */
-{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 332: /* signed_literal ::= TIMESTAMP NK_STRING */
-{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); }
- break;
- case 333: /* signed_literal ::= duration_literal */
- case 335: /* signed_literal ::= literal_func */ yytestcase(yyruleno==335);
- case 405: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==405);
- case 467: /* select_item ::= common_expression */ yytestcase(yyruleno==467);
- case 477: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==477);
- case 511: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==511);
- case 513: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==513);
- case 526: /* search_condition ::= common_expression */ yytestcase(yyruleno==526);
-{ yylhsminor.yy164 = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 334: /* signed_literal ::= NULL */
-{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 336: /* signed_literal ::= NK_QUESTION */
-{ yylhsminor.yy164 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 356: /* expression ::= NK_LP expression NK_RP */
- case 439: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==439);
- case 525: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==525);
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 357: /* expression ::= NK_PLUS expr_or_subquery */
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 335: /* signed_literal ::= NK_STRING */
+{ yylhsminor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 336: /* signed_literal ::= NK_BOOL */
+{ yylhsminor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 337: /* signed_literal ::= TIMESTAMP NK_STRING */
+{ yymsp[-1].minor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); }
+ break;
+ case 338: /* signed_literal ::= duration_literal */
+ case 340: /* signed_literal ::= literal_func */ yytestcase(yyruleno==340);
+ case 409: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==409);
+ case 471: /* select_item ::= common_expression */ yytestcase(yyruleno==471);
+ case 481: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==481);
+ case 515: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==515);
+ case 517: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==517);
+ case 530: /* search_condition ::= common_expression */ yytestcase(yyruleno==530);
+{ yylhsminor.yy148 = releaseRawExprNode(pCxt, yymsp[0].minor.yy148); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 339: /* signed_literal ::= NULL */
+{ yylhsminor.yy148 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 341: /* signed_literal ::= NK_QUESTION */
+{ yylhsminor.yy148 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 360: /* expression ::= NK_LP expression NK_RP */
+ case 443: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==443);
+ case 529: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==529);
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy148)); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 361: /* expression ::= NK_PLUS expr_or_subquery */
{
- SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy164));
+ SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy148));
}
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 358: /* expression ::= NK_MINUS expr_or_subquery */
+ case 362: /* expression ::= NK_MINUS expr_or_subquery */
{
- SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy164), NULL));
+ SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy148), NULL));
}
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 359: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */
+ case 363: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 360: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */
+ case 364: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 361: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */
+ case 365: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 362: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */
+ case 366: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 363: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */
+ case 367: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 364: /* expression ::= column_reference NK_ARROW NK_STRING */
+ case 368: /* expression ::= column_reference NK_ARROW NK_STRING */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 365: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */
+ case 369: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 366: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */
+ case 370: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 369: /* column_reference ::= column_name */
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy593, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy593)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 370: /* column_reference ::= table_name NK_DOT column_name */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593, createColumnNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593)); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 371: /* pseudo_column ::= ROWTS */
- case 372: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==372);
- case 374: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==374);
- case 375: /* pseudo_column ::= QEND */ yytestcase(yyruleno==375);
- case 376: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==376);
- case 377: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==377);
- case 378: /* pseudo_column ::= WEND */ yytestcase(yyruleno==378);
- case 379: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==379);
- case 380: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==380);
- case 381: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==381);
- case 387: /* literal_func ::= NOW */ yytestcase(yyruleno==387);
-{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
- break;
- case 373: /* pseudo_column ::= table_name NK_DOT TBNAME */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy593)))); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 382: /* function_expression ::= function_name NK_LP expression_list NK_RP */
- case 383: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==383);
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-1].minor.yy648)); }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
- break;
- case 384: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy720)); }
- yymsp[-5].minor.yy164 = yylhsminor.yy164;
- break;
- case 386: /* literal_func ::= noarg_func NK_LP NK_RP */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy593, NULL)); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 401: /* star_func_para_list ::= NK_STAR */
-{ yylhsminor.yy648 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy648 = yylhsminor.yy648;
- break;
- case 406: /* star_func_para ::= table_name NK_DOT NK_STAR */
- case 470: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==470);
-{ yylhsminor.yy164 = createColumnNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 407: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy648, yymsp[-1].minor.yy164)); }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
- break;
- case 408: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-2].minor.yy648, yymsp[-1].minor.yy164)); }
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
- break;
- case 411: /* when_then_expr ::= WHEN common_expression THEN common_expression */
-{ yymsp[-3].minor.yy164 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); }
- break;
- case 413: /* case_when_else_opt ::= ELSE common_expression */
-{ yymsp[-1].minor.yy164 = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); }
- break;
- case 414: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */
- case 419: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==419);
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 373: /* column_reference ::= column_name */
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy199, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy199)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 374: /* column_reference ::= table_name NK_DOT column_name */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy199, createColumnNode(pCxt, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy199)); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 375: /* pseudo_column ::= ROWTS */
+ case 376: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==376);
+ case 378: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==378);
+ case 379: /* pseudo_column ::= QEND */ yytestcase(yyruleno==379);
+ case 380: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==380);
+ case 381: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==381);
+ case 382: /* pseudo_column ::= WEND */ yytestcase(yyruleno==382);
+ case 383: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==383);
+ case 384: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==384);
+ case 385: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==385);
+ case 391: /* literal_func ::= NOW */ yytestcase(yyruleno==391);
+{ yylhsminor.yy148 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 377: /* pseudo_column ::= table_name NK_DOT TBNAME */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy199)))); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 386: /* function_expression ::= function_name NK_LP expression_list NK_RP */
+ case 387: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==387);
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy199, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy199, yymsp[-1].minor.yy404)); }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 388: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), yymsp[-1].minor.yy530)); }
+ yymsp[-5].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 390: /* literal_func ::= noarg_func NK_LP NK_RP */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy199, NULL)); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 405: /* star_func_para_list ::= NK_STAR */
+{ yylhsminor.yy404 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy404 = yylhsminor.yy404;
+ break;
+ case 410: /* star_func_para ::= table_name NK_DOT NK_STAR */
+ case 474: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==474);
+{ yylhsminor.yy148 = createColumnNode(pCxt, &yymsp[-2].minor.yy199, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 411: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy404, yymsp[-1].minor.yy148)); }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 412: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), yymsp[-2].minor.yy404, yymsp[-1].minor.yy148)); }
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
+ break;
+ case 415: /* when_then_expr ::= WHEN common_expression THEN common_expression */
+{ yymsp[-3].minor.yy148 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)); }
+ break;
+ case 417: /* case_when_else_opt ::= ELSE common_expression */
+{ yymsp[-1].minor.yy148 = releaseRawExprNode(pCxt, yymsp[0].minor.yy148); }
+ break;
+ case 418: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */
+ case 423: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==423);
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy656, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy20, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 415: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */
+ case 419: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy164), releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy148), releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-4].minor.yy164 = yylhsminor.yy164;
+ yymsp[-4].minor.yy148 = yylhsminor.yy148;
break;
- case 416: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */
+ case 420: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy148), releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-5].minor.yy164 = yylhsminor.yy164;
+ yymsp[-5].minor.yy148 = yylhsminor.yy148;
break;
- case 417: /* predicate ::= expr_or_subquery IS NULL */
+ case 421: /* predicate ::= expr_or_subquery IS NULL */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), NULL));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), NULL));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 418: /* predicate ::= expr_or_subquery IS NOT NULL */
+ case 422: /* predicate ::= expr_or_subquery IS NOT NULL */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), NULL));
}
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 420: /* compare_op ::= NK_LT */
-{ yymsp[0].minor.yy656 = OP_TYPE_LOWER_THAN; }
+ case 424: /* compare_op ::= NK_LT */
+{ yymsp[0].minor.yy20 = OP_TYPE_LOWER_THAN; }
break;
- case 421: /* compare_op ::= NK_GT */
-{ yymsp[0].minor.yy656 = OP_TYPE_GREATER_THAN; }
+ case 425: /* compare_op ::= NK_GT */
+{ yymsp[0].minor.yy20 = OP_TYPE_GREATER_THAN; }
break;
- case 422: /* compare_op ::= NK_LE */
-{ yymsp[0].minor.yy656 = OP_TYPE_LOWER_EQUAL; }
+ case 426: /* compare_op ::= NK_LE */
+{ yymsp[0].minor.yy20 = OP_TYPE_LOWER_EQUAL; }
break;
- case 423: /* compare_op ::= NK_GE */
-{ yymsp[0].minor.yy656 = OP_TYPE_GREATER_EQUAL; }
+ case 427: /* compare_op ::= NK_GE */
+{ yymsp[0].minor.yy20 = OP_TYPE_GREATER_EQUAL; }
break;
- case 424: /* compare_op ::= NK_NE */
-{ yymsp[0].minor.yy656 = OP_TYPE_NOT_EQUAL; }
+ case 428: /* compare_op ::= NK_NE */
+{ yymsp[0].minor.yy20 = OP_TYPE_NOT_EQUAL; }
break;
- case 425: /* compare_op ::= NK_EQ */
-{ yymsp[0].minor.yy656 = OP_TYPE_EQUAL; }
+ case 429: /* compare_op ::= NK_EQ */
+{ yymsp[0].minor.yy20 = OP_TYPE_EQUAL; }
break;
- case 426: /* compare_op ::= LIKE */
-{ yymsp[0].minor.yy656 = OP_TYPE_LIKE; }
+ case 430: /* compare_op ::= LIKE */
+{ yymsp[0].minor.yy20 = OP_TYPE_LIKE; }
break;
- case 427: /* compare_op ::= NOT LIKE */
-{ yymsp[-1].minor.yy656 = OP_TYPE_NOT_LIKE; }
+ case 431: /* compare_op ::= NOT LIKE */
+{ yymsp[-1].minor.yy20 = OP_TYPE_NOT_LIKE; }
break;
- case 428: /* compare_op ::= MATCH */
-{ yymsp[0].minor.yy656 = OP_TYPE_MATCH; }
+ case 432: /* compare_op ::= MATCH */
+{ yymsp[0].minor.yy20 = OP_TYPE_MATCH; }
break;
- case 429: /* compare_op ::= NMATCH */
-{ yymsp[0].minor.yy656 = OP_TYPE_NMATCH; }
+ case 433: /* compare_op ::= NMATCH */
+{ yymsp[0].minor.yy20 = OP_TYPE_NMATCH; }
break;
- case 430: /* compare_op ::= CONTAINS */
-{ yymsp[0].minor.yy656 = OP_TYPE_JSON_CONTAINS; }
+ case 434: /* compare_op ::= CONTAINS */
+{ yymsp[0].minor.yy20 = OP_TYPE_JSON_CONTAINS; }
break;
- case 431: /* in_op ::= IN */
-{ yymsp[0].minor.yy656 = OP_TYPE_IN; }
+ case 435: /* in_op ::= IN */
+{ yymsp[0].minor.yy20 = OP_TYPE_IN; }
break;
- case 432: /* in_op ::= NOT IN */
-{ yymsp[-1].minor.yy656 = OP_TYPE_NOT_IN; }
+ case 436: /* in_op ::= NOT IN */
+{ yymsp[-1].minor.yy20 = OP_TYPE_NOT_IN; }
break;
- case 433: /* in_predicate_value ::= NK_LP literal_list NK_RP */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy648)); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 437: /* in_predicate_value ::= NK_LP literal_list NK_RP */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy404)); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 435: /* boolean_value_expression ::= NOT boolean_primary */
+ case 439: /* boolean_value_expression ::= NOT boolean_primary */
{
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy164), NULL));
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy148), NULL));
}
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 436: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */
+ case 440: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 437: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */
+ case 441: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
- yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy148);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy148);
+ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), releaseRawExprNode(pCxt, yymsp[0].minor.yy148)));
}
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
- break;
- case 443: /* from_clause_opt ::= FROM table_reference_list */
- case 472: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==472);
- case 500: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==500);
-{ yymsp[-1].minor.yy164 = yymsp[0].minor.yy164; }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 445: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */
-{ yylhsminor.yy164 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, NULL); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 447: /* from_clause_opt ::= FROM table_reference_list */
+ case 476: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==476);
+ case 504: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==504);
+{ yymsp[-1].minor.yy148 = yymsp[0].minor.yy148; }
break;
- case 448: /* table_primary ::= table_name alias_opt */
-{ yylhsminor.yy164 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ case 449: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */
+{ yylhsminor.yy148 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy148, yymsp[0].minor.yy148, NULL); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 449: /* table_primary ::= db_name NK_DOT table_name alias_opt */
-{ yylhsminor.yy164 = createRealTableNode(pCxt, &yymsp[-3].minor.yy593, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ case 452: /* table_primary ::= table_name alias_opt */
+{ yylhsminor.yy148 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy199, &yymsp[0].minor.yy199); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 450: /* table_primary ::= subquery alias_opt */
-{ yylhsminor.yy164 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164), &yymsp[0].minor.yy593); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ case 453: /* table_primary ::= db_name NK_DOT table_name alias_opt */
+{ yylhsminor.yy148 = createRealTableNode(pCxt, &yymsp[-3].minor.yy199, &yymsp[-1].minor.yy199, &yymsp[0].minor.yy199); }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 452: /* alias_opt ::= */
-{ yymsp[1].minor.yy593 = nil_token; }
+ case 454: /* table_primary ::= subquery alias_opt */
+{ yylhsminor.yy148 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy148), &yymsp[0].minor.yy199); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 453: /* alias_opt ::= table_alias */
-{ yylhsminor.yy593 = yymsp[0].minor.yy593; }
- yymsp[0].minor.yy593 = yylhsminor.yy593;
+ case 456: /* alias_opt ::= */
+{ yymsp[1].minor.yy199 = nil_token; }
break;
- case 454: /* alias_opt ::= AS table_alias */
-{ yymsp[-1].minor.yy593 = yymsp[0].minor.yy593; }
+ case 458: /* alias_opt ::= AS table_alias */
+{ yymsp[-1].minor.yy199 = yymsp[0].minor.yy199; }
break;
- case 455: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */
- case 456: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==456);
-{ yymsp[-2].minor.yy164 = yymsp[-1].minor.yy164; }
+ case 459: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */
+ case 460: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==460);
+{ yymsp[-2].minor.yy148 = yymsp[-1].minor.yy148; }
break;
- case 457: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
-{ yylhsminor.yy164 = createJoinTableNode(pCxt, yymsp[-4].minor.yy868, yymsp[-5].minor.yy164, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); }
- yymsp[-5].minor.yy164 = yylhsminor.yy164;
+ case 461: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
+{ yylhsminor.yy148 = createJoinTableNode(pCxt, yymsp[-4].minor.yy470, yymsp[-5].minor.yy148, yymsp[-2].minor.yy148, yymsp[0].minor.yy148); }
+ yymsp[-5].minor.yy148 = yylhsminor.yy148;
break;
- case 458: /* join_type ::= */
-{ yymsp[1].minor.yy868 = JOIN_TYPE_INNER; }
+ case 462: /* join_type ::= */
+{ yymsp[1].minor.yy470 = JOIN_TYPE_INNER; }
break;
- case 459: /* join_type ::= INNER */
-{ yymsp[0].minor.yy868 = JOIN_TYPE_INNER; }
+ case 463: /* join_type ::= INNER */
+{ yymsp[0].minor.yy470 = JOIN_TYPE_INNER; }
break;
- case 460: /* 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 464: /* 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.yy164 = createSelectStmt(pCxt, yymsp[-10].minor.yy193, yymsp[-9].minor.yy648, yymsp[-8].minor.yy164);
- yymsp[-11].minor.yy164 = addWhereClause(pCxt, yymsp[-11].minor.yy164, yymsp[-7].minor.yy164);
- yymsp[-11].minor.yy164 = addPartitionByClause(pCxt, yymsp[-11].minor.yy164, yymsp[-6].minor.yy648);
- yymsp[-11].minor.yy164 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy164, yymsp[-2].minor.yy164);
- yymsp[-11].minor.yy164 = addGroupByClause(pCxt, yymsp[-11].minor.yy164, yymsp[-1].minor.yy648);
- yymsp[-11].minor.yy164 = addHavingClause(pCxt, yymsp[-11].minor.yy164, yymsp[0].minor.yy164);
- yymsp[-11].minor.yy164 = addRangeClause(pCxt, yymsp[-11].minor.yy164, yymsp[-5].minor.yy164);
- yymsp[-11].minor.yy164 = addEveryClause(pCxt, yymsp[-11].minor.yy164, yymsp[-4].minor.yy164);
- yymsp[-11].minor.yy164 = addFillClause(pCxt, yymsp[-11].minor.yy164, yymsp[-3].minor.yy164);
+ yymsp[-11].minor.yy148 = createSelectStmt(pCxt, yymsp[-10].minor.yy397, yymsp[-9].minor.yy404, yymsp[-8].minor.yy148);
+ yymsp[-11].minor.yy148 = addWhereClause(pCxt, yymsp[-11].minor.yy148, yymsp[-7].minor.yy148);
+ yymsp[-11].minor.yy148 = addPartitionByClause(pCxt, yymsp[-11].minor.yy148, yymsp[-6].minor.yy404);
+ yymsp[-11].minor.yy148 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy148, yymsp[-2].minor.yy148);
+ yymsp[-11].minor.yy148 = addGroupByClause(pCxt, yymsp[-11].minor.yy148, yymsp[-1].minor.yy404);
+ yymsp[-11].minor.yy148 = addHavingClause(pCxt, yymsp[-11].minor.yy148, yymsp[0].minor.yy148);
+ yymsp[-11].minor.yy148 = addRangeClause(pCxt, yymsp[-11].minor.yy148, yymsp[-5].minor.yy148);
+ yymsp[-11].minor.yy148 = addEveryClause(pCxt, yymsp[-11].minor.yy148, yymsp[-4].minor.yy148);
+ yymsp[-11].minor.yy148 = addFillClause(pCxt, yymsp[-11].minor.yy148, yymsp[-3].minor.yy148);
}
break;
- case 463: /* set_quantifier_opt ::= ALL */
-{ yymsp[0].minor.yy193 = false; }
+ case 467: /* set_quantifier_opt ::= ALL */
+{ yymsp[0].minor.yy397 = false; }
break;
- case 466: /* select_item ::= NK_STAR */
-{ yylhsminor.yy164 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy164 = yylhsminor.yy164;
+ case 470: /* select_item ::= NK_STAR */
+{ yylhsminor.yy148 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy148 = yylhsminor.yy148;
break;
- case 468: /* select_item ::= common_expression column_alias */
- case 478: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==478);
-{ yylhsminor.yy164 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164), &yymsp[0].minor.yy593); }
- yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ case 472: /* select_item ::= common_expression column_alias */
+ case 482: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==482);
+{ yylhsminor.yy148 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy148), &yymsp[0].minor.yy199); }
+ yymsp[-1].minor.yy148 = yylhsminor.yy148;
break;
- case 469: /* select_item ::= common_expression AS column_alias */
- case 479: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==479);
-{ yylhsminor.yy164 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), &yymsp[0].minor.yy593); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 473: /* select_item ::= common_expression AS column_alias */
+ case 483: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==483);
+{ yylhsminor.yy148 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), &yymsp[0].minor.yy199); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 474: /* partition_by_clause_opt ::= PARTITION BY partition_list */
- case 496: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==496);
- case 515: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==515);
-{ yymsp[-2].minor.yy648 = yymsp[0].minor.yy648; }
+ case 478: /* partition_by_clause_opt ::= PARTITION BY partition_list */
+ case 500: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==500);
+ case 519: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==519);
+{ yymsp[-2].minor.yy404 = yymsp[0].minor.yy404; }
break;
- case 481: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
-{ yymsp[-5].minor.yy164 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); }
+ case 485: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
+{ yymsp[-5].minor.yy148 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), releaseRawExprNode(pCxt, yymsp[-1].minor.yy148)); }
break;
- case 482: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */
-{ yymsp[-3].minor.yy164 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); }
+ case 486: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */
+{ yymsp[-3].minor.yy148 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy148)); }
break;
- case 483: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
-{ yymsp[-5].minor.yy164 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
+ case 487: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
+{ yymsp[-5].minor.yy148 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), NULL, yymsp[-1].minor.yy148, yymsp[0].minor.yy148); }
break;
- case 484: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
-{ yymsp[-7].minor.yy164 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
+ case 488: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
+{ yymsp[-7].minor.yy148 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy148), releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), yymsp[-1].minor.yy148, yymsp[0].minor.yy148); }
break;
- case 488: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */
-{ yymsp[-3].minor.yy164 = createFillNode(pCxt, yymsp[-1].minor.yy638, NULL); }
+ case 492: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */
+{ yymsp[-3].minor.yy148 = createFillNode(pCxt, yymsp[-1].minor.yy334, NULL); }
break;
- case 489: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
-{ yymsp[-5].minor.yy164 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy648)); }
+ case 493: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
+{ yymsp[-5].minor.yy148 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy404)); }
break;
- case 490: /* fill_mode ::= NONE */
-{ yymsp[0].minor.yy638 = FILL_MODE_NONE; }
+ case 494: /* fill_mode ::= NONE */
+{ yymsp[0].minor.yy334 = FILL_MODE_NONE; }
break;
- case 491: /* fill_mode ::= PREV */
-{ yymsp[0].minor.yy638 = FILL_MODE_PREV; }
+ case 495: /* fill_mode ::= PREV */
+{ yymsp[0].minor.yy334 = FILL_MODE_PREV; }
break;
- case 492: /* fill_mode ::= NULL */
-{ yymsp[0].minor.yy638 = FILL_MODE_NULL; }
+ case 496: /* fill_mode ::= NULL */
+{ yymsp[0].minor.yy334 = FILL_MODE_NULL; }
break;
- case 493: /* fill_mode ::= LINEAR */
-{ yymsp[0].minor.yy638 = FILL_MODE_LINEAR; }
+ case 497: /* fill_mode ::= LINEAR */
+{ yymsp[0].minor.yy334 = FILL_MODE_LINEAR; }
break;
- case 494: /* fill_mode ::= NEXT */
-{ yymsp[0].minor.yy638 = FILL_MODE_NEXT; }
+ case 498: /* fill_mode ::= NEXT */
+{ yymsp[0].minor.yy334 = FILL_MODE_NEXT; }
break;
- case 497: /* group_by_list ::= expr_or_subquery */
-{ yylhsminor.yy648 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); }
- yymsp[0].minor.yy648 = yylhsminor.yy648;
+ case 501: /* group_by_list ::= expr_or_subquery */
+{ yylhsminor.yy404 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy148))); }
+ yymsp[0].minor.yy404 = yylhsminor.yy404;
break;
- case 498: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */
-{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); }
- yymsp[-2].minor.yy648 = yylhsminor.yy648;
+ case 502: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */
+{ yylhsminor.yy404 = addNodeToList(pCxt, yymsp[-2].minor.yy404, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy148))); }
+ yymsp[-2].minor.yy404 = yylhsminor.yy404;
break;
- case 502: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */
-{ yymsp[-5].minor.yy164 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); }
+ case 506: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */
+{ yymsp[-5].minor.yy148 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy148), releaseRawExprNode(pCxt, yymsp[-1].minor.yy148)); }
break;
- case 505: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */
+ case 509: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */
{
- yylhsminor.yy164 = addOrderByClause(pCxt, yymsp[-3].minor.yy164, yymsp[-2].minor.yy648);
- yylhsminor.yy164 = addSlimitClause(pCxt, yylhsminor.yy164, yymsp[-1].minor.yy164);
- yylhsminor.yy164 = addLimitClause(pCxt, yylhsminor.yy164, yymsp[0].minor.yy164);
+ yylhsminor.yy148 = addOrderByClause(pCxt, yymsp[-3].minor.yy148, yymsp[-2].minor.yy404);
+ yylhsminor.yy148 = addSlimitClause(pCxt, yylhsminor.yy148, yymsp[-1].minor.yy148);
+ yylhsminor.yy148 = addLimitClause(pCxt, yylhsminor.yy148, yymsp[0].minor.yy148);
}
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 508: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */
-{ yylhsminor.yy164 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy164, yymsp[0].minor.yy164); }
- yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ case 512: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */
+{ yylhsminor.yy148 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy148, yymsp[0].minor.yy148); }
+ yymsp[-3].minor.yy148 = yylhsminor.yy148;
break;
- case 509: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */
-{ yylhsminor.yy164 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 513: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */
+{ yylhsminor.yy148 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy148, yymsp[0].minor.yy148); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 517: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */
- case 521: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==521);
-{ yymsp[-1].minor.yy164 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); }
+ case 521: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */
+ case 525: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==525);
+{ yymsp[-1].minor.yy148 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); }
break;
- case 518: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
- case 522: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==522);
-{ yymsp[-3].minor.yy164 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); }
+ case 522: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
+ case 526: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==526);
+{ yymsp[-3].minor.yy148 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); }
break;
- case 519: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- case 523: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==523);
-{ yymsp[-3].minor.yy164 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); }
+ case 523: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ case 527: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==527);
+{ yymsp[-3].minor.yy148 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); }
break;
- case 524: /* subquery ::= NK_LP query_expression NK_RP */
-{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy164); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 528: /* subquery ::= NK_LP query_expression NK_RP */
+{ yylhsminor.yy148 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy148); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 529: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */
-{ yylhsminor.yy164 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), yymsp[-1].minor.yy238, yymsp[0].minor.yy153); }
- yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ case 533: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */
+{ yylhsminor.yy148 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy148), yymsp[-1].minor.yy898, yymsp[0].minor.yy499); }
+ yymsp[-2].minor.yy148 = yylhsminor.yy148;
break;
- case 530: /* ordering_specification_opt ::= */
-{ yymsp[1].minor.yy238 = ORDER_ASC; }
+ case 534: /* ordering_specification_opt ::= */
+{ yymsp[1].minor.yy898 = ORDER_ASC; }
break;
- case 531: /* ordering_specification_opt ::= ASC */
-{ yymsp[0].minor.yy238 = ORDER_ASC; }
+ case 535: /* ordering_specification_opt ::= ASC */
+{ yymsp[0].minor.yy898 = ORDER_ASC; }
break;
- case 532: /* ordering_specification_opt ::= DESC */
-{ yymsp[0].minor.yy238 = ORDER_DESC; }
+ case 536: /* ordering_specification_opt ::= DESC */
+{ yymsp[0].minor.yy898 = ORDER_DESC; }
break;
- case 533: /* null_ordering_opt ::= */
-{ yymsp[1].minor.yy153 = NULL_ORDER_DEFAULT; }
+ case 537: /* null_ordering_opt ::= */
+{ yymsp[1].minor.yy499 = NULL_ORDER_DEFAULT; }
break;
- case 534: /* null_ordering_opt ::= NULLS FIRST */
-{ yymsp[-1].minor.yy153 = NULL_ORDER_FIRST; }
+ case 538: /* null_ordering_opt ::= NULLS FIRST */
+{ yymsp[-1].minor.yy499 = NULL_ORDER_FIRST; }
break;
- case 535: /* null_ordering_opt ::= NULLS LAST */
-{ yymsp[-1].minor.yy153 = NULL_ORDER_LAST; }
+ case 539: /* null_ordering_opt ::= NULLS LAST */
+{ yymsp[-1].minor.yy499 = NULL_ORDER_LAST; }
break;
default:
break;
diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp
index 8f051c67a00b5b6fe15f6aa5c8198d9063bc0747..ae702ec02f1570ab9d92976abdb18059cd727175 100644
--- a/source/libs/parser/test/mockCatalog.cpp
+++ b/source/libs/parser/test/mockCatalog.cpp
@@ -65,9 +65,10 @@ void generateInformationSchema(MockCatalogService* mcs) {
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
.addColumn("stable_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLES, TSDB_SYSTEM_TABLE, 2)
- .addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLES, TSDB_SYSTEM_TABLE, 3)
.addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
+ .addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
+ .addColumn("stable_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
.done();
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLE_DISTRIBUTED, TSDB_SYSTEM_TABLE, 2)
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
@@ -101,6 +102,10 @@ void generateInformationSchema(MockCatalogService* mcs) {
.addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
.done();
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USER_PRIVILEGES, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("user_name", TSDB_DATA_TYPE_BINARY, TSDB_USER_LEN)
+ .addColumn("privilege", TSDB_DATA_TYPE_BINARY, 10)
+ .done();
}
void generatePerformanceSchema(MockCatalogService* mcs) {
@@ -136,7 +141,7 @@ void generatePerformanceSchema(MockCatalogService* mcs) {
void generateTestTables(MockCatalogService* mcs, const std::string& db) {
mcs->createTableBuilder(db, "t1", TSDB_NORMAL_TABLE, 6)
.setPrecision(TSDB_TIME_PRECISION_MILLI)
- .setVgid(1)
+ .setVgid(2)
.addColumn("ts", TSDB_DATA_TYPE_TIMESTAMP)
.addColumn("c1", TSDB_DATA_TYPE_INT)
.addColumn("c2", TSDB_DATA_TYPE_BINARY, 20)
@@ -178,9 +183,9 @@ void generateTestStables(MockCatalogService* mcs, const std::string& db) {
.addTag("tag2", TSDB_DATA_TYPE_BINARY, 20)
.addTag("tag3", TSDB_DATA_TYPE_TIMESTAMP);
builder.done();
- mcs->createSubTable(db, "st1", "st1s1", 1);
- mcs->createSubTable(db, "st1", "st1s2", 2);
- mcs->createSubTable(db, "st1", "st1s3", 1);
+ mcs->createSubTable(db, "st1", "st1s1", 2);
+ mcs->createSubTable(db, "st1", "st1s2", 3);
+ mcs->createSubTable(db, "st1", "st1s3", 2);
}
{
ITableBuilder& builder = mcs->createTableBuilder(db, "st2", TSDB_SUPER_TABLE, 3, 1)
@@ -190,8 +195,8 @@ void generateTestStables(MockCatalogService* mcs, const std::string& db) {
.addColumn("c2", TSDB_DATA_TYPE_BINARY, 20)
.addTag("jtag", TSDB_DATA_TYPE_JSON);
builder.done();
- mcs->createSubTable(db, "st2", "st2s1", 1);
- mcs->createSubTable(db, "st2", "st2s2", 2);
+ mcs->createSubTable(db, "st2", "st2s1", 2);
+ mcs->createSubTable(db, "st2", "st2s2", 3);
}
}
@@ -243,13 +248,20 @@ int32_t __catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableNam
return code;
}
+int32_t __catalogGetCachedTableVgMeta(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, STableMeta** pTableMeta) {
+ int32_t code = g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta, true);
+ if (code) return code;
+ code = g_mockCatalogService->catalogGetTableHashVgroup(pTableName, pVgroup, true);
+ return code;
+}
+
int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
SArray** pVgList) {
return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
}
-int32_t __catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId,
- int32_t* tableNum, int64_t* stateTs) {
+int32_t __catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t* tableNum,
+ int64_t* stateTs) {
return 0;
}
@@ -311,6 +323,7 @@ void initMetaDataEnv() {
stub.set(catalogGetCachedSTableMeta, __catalogGetCachedTableMeta);
stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup);
stub.set(catalogGetCachedTableHashVgroup, __catalogGetCachedTableHashVgroup);
+ stub.set(catalogGetCachedTableVgMeta, __catalogGetCachedTableVgMeta);
stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo);
stub.set(catalogGetDBVgVersion, __catalogGetDBVgVersion);
stub.set(catalogGetDBVgList, __catalogGetDBVgList);
diff --git a/source/libs/parser/test/mockCatalogService.cpp b/source/libs/parser/test/mockCatalogService.cpp
index 95f7af435de89954b054b4ed0d19ca9b97d3953d..9cc55a7cd55a0060635e9a9044ac076ce5a77119 100644
--- a/source/libs/parser/test/mockCatalogService.cpp
+++ b/source/libs/parser/test/mockCatalogService.cpp
@@ -20,15 +20,19 @@
#include