未验证 提交 6fec4b9f 编写于 作者: G Ganlin Zhao 提交者: GitHub

Merge branch 'develop' into enhance/TD-10532

如何使用 taosdemo 进行性能测试
==
自从 TDengine 2019年 7 月开源以来,凭借创新的数据建模设计、快捷的安装方式、易用的编程接口和强大的数据写入查询性能博得了大量时序数据开发者的青睐。其中写入和查询性能往往令刚接触 TDengine 的用户称叹不已。为了便于用户在最短时间内就可以体验到 TDengine 的高性能特点,我们专门开发了一个应用程序 taosdemo 用于对 TDengine 进行写入和查询的性能测试,用户可以通过 taosdemo 轻松模拟大量设备产生海量数据的场景,并且可以通过 taosdemo 参数灵活控制表的列数、数据类型、乱序比例以及并发线程数量。
运行 taosdemo 很简单,通过下载 TDengine 安装包(https://www.taosdata.com/cn/all-downloads/)或者自行下载 TDengine 代码(https://github.com/taosdata/TDengine)编译都可以在安装目录或者编译结果目录中找到并运行。
接下来本文为大家讲解 taosdemo 的使用介绍及注意事项。
使用 taosdemo 进行写入测试
--
不使用任何参数的情况下执行 taosdemo 命令,输出如下:
```
$ taosdemo
taosdemo is simulating data generated by power equipment monitoring...
host: 127.0.0.1:6030
user: root
password: taosdata
configDir:
resultFile: ./output.txt
thread num of insert data: 8
thread num of create table: 8
top insert interval: 0
number of records per req: 30000
max sql length: 1048576
database count: 1
database[0]:
database[0] name: test
drop: yes
replica: 1
precision: ms
super table count: 1
super table[0]:
stbName: meters
autoCreateTable: no
childTblExists: no
childTblCount: 10000
childTblPrefix: d
dataSource: rand
iface: taosc
insertRows: 10000
interlaceRows: 0
disorderRange: 1000
disorderRatio: 0
maxSqlLen: 1048576
timeStampStep: 1
startTimestamp: 2017-07-14 10:40:00.000
sampleFormat:
sampleFile:
tagsFile:
columnCount: 3
column[0]:FLOAT column[1]:INT column[2]:FLOAT
tagCount: 2
tag[0]:INT tag[1]:BINARY(16)
Press enter key to continue or Ctrl-C to stop
```
这里显示的是接下来 taosdemo 进行数据写入的各项参数。默认不输入任何命令行参数的情况下 taosdemo 将模拟生成一个电力行业典型应用的电表数据采集场景数据。即建立一个名为 test 的数据库,并创建一个名为 meters 的超级表,其中表结构为:
```
taos> describe test.meters;
Field | Type | Length | Note |
=================================================================================
ts | TIMESTAMP | 8 | |
current | FLOAT | 4 | |
voltage | INT | 4 | |
phase | FLOAT | 4 | |
groupid | INT | 4 | TAG |
location | BINARY | 64 | TAG |
Query OK, 6 row(s) in set (0.002972s)
```
按任意键后 taosdemo 将建立数据库 test 和超级表 meters,并按照 TDengine 数据建模的最佳实践,以 meters 超级表为模板生成一万个子表,代表一万个独立上报数据的电表设备。
```
taos> use test;
Database changed.
taos> show stables;
name | created_time | columns | tags | tables |
============================================================================================
meters | 2021-08-27 11:21:01.209 | 4 | 2 | 10000 |
Query OK, 1 row(s) in set (0.001740s)
```
然后 taosdemo 为每个电表设备模拟生成一万条记录:
```
...
====thread[3] completed total inserted rows: 6250000, total affected rows: 6250000. 347626.22 records/second====
[1]:100%
====thread[1] completed total inserted rows: 6250000, total affected rows: 6250000. 347481.98 records/second====
[4]:100%
====thread[4] completed total inserted rows: 6250000, total affected rows: 6250000. 347149.44 records/second====
[8]:100%
====thread[8] completed total inserted rows: 6250000, total affected rows: 6250000. 347082.43 records/second====
[6]:99%
[6]:100%
====thread[6] completed total inserted rows: 6250000, total affected rows: 6250000. 345586.35 records/second====
Spent 18.0863 seconds to insert rows: 100000000, affected rows: 100000000 with 16 thread(s) into test.meters. 5529049.90 records/second
insert delay, avg: 28.64ms, max: 112.92ms, min: 9.35ms
```
以上信息是在一台具备 8个CPU 64G 内存的普通 PC 服务器上进行实测的结果。显示 taosdemo 用了 18 秒的时间插入了 100000000 (一亿)条记录,平均每秒钟插入 552 万 9千零49 条记录。
TDengine 还提供性能更好的参数绑定接口,而在同样的硬件上使用参数绑定接口 (taosdemo -I stmt )进行相同数据量的写入,结果如下:
```
...
====thread[14] completed total inserted rows: 6250000, total affected rows: 6250000. 1097331.55 records/second====
[9]:97%
[4]:97%
[3]:97%
[3]:98%
[4]:98%
[9]:98%
[3]:99%
[4]:99%
[3]:100%
====thread[3] completed total inserted rows: 6250000, total affected rows: 6250000. 1089038.19 records/second====
[9]:99%
[4]:100%
====thread[4] completed total inserted rows: 6250000, total affected rows: 6250000. 1087123.09 records/second====
[9]:100%
====thread[9] completed total inserted rows: 6250000, total affected rows: 6250000. 1085689.38 records/second====
[11]:91%
[11]:92%
[11]:93%
[11]:94%
[11]:95%
[11]:96%
[11]:97%
[11]:98%
[11]:99%
[11]:100%
====thread[11] completed total inserted rows: 6250000, total affected rows: 6250000. 1039087.65 records/second====
Spent 6.0257 seconds to insert rows: 100000000, affected rows: 100000000 with 16 thread(s) into test.meters. 16595590.52 records/second
insert delay, avg: 8.31ms, max: 860.12ms, min: 2.00ms
```
显示 taosdemo 用了 6 秒的时间插入了一亿条记录,每秒钟插入性能高达 1659 万 5 千 590 条记录。
由于 taosdemo 使用起来非常方便,我们又对 taosdemo 做了更多的功能扩充,使其支持更复杂的参数设置,便于进行快速原型开发的样例数据准备和验证工作。
完整的 taosdemo 命令行参数列表可以通过 taosdemo --help 显示如下:
```
$ taosdemo --help
-f, --file=FILE The meta file to the execution procedure.
-u, --user=USER The user name to use when connecting to the server.
-p, --password The password to use when connecting to the server.
-c, --config-dir=CONFIG_DIR Configuration directory.
-h, --host=HOST TDengine server FQDN to connect. The default host is localhost.
-P, --port=PORT The TCP/IP port number to use for the connection.
-I, --interface=INTERFACE The interface (taosc, rest, and stmt) taosdemo uses. By default use 'taosc'.
-d, --database=DATABASE Destination database. By default is 'test'.
-a, --replica=REPLICA Set the replica parameters of the database, By default use 1, min: 1, max: 3.
-m, --table-prefix=TABLEPREFIX Table prefix name. By default use 'd'.
-s, --sql-file=FILE The select sql file.
-N, --normal-table Use normal table flag.
-o, --output=FILE Direct output to the named file. By default use './output.txt'.
-q, --query-mode=MODE Query mode -- 0: SYNC, 1: ASYNC. By default use SYNC.
-b, --data-type=DATATYPE The data_type of columns, By default use: FLOAT, INT, FLOAT.
-w, --binwidth=WIDTH The width of data_type 'BINARY' or 'NCHAR'. By default use 64
-l, --columns=COLUMNS The number of columns per record. Demo mode by default is 1 (float, int, float). Max values is 4095
All of the new column(s) type is INT. If use -b to specify column type, -l will be ignored.
-T, --threads=NUMBER The number of threads. By default use 8.
-i, --insert-interval=NUMBER The sleep time (ms) between insertion. By default is 0.
-S, --time-step=TIME_STEP The timestamp step between insertion. By default is 1.
-B, --interlace-rows=NUMBER The interlace rows of insertion. By default is 0.
-r, --rec-per-req=NUMBER The number of records per request. By default is 30000.
-t, --tables=NUMBER The number of tables. By default is 10000.
-n, --records=NUMBER The number of records per table. By default is 10000.
-M, --random The value of records generated are totally random.
By default to simulate power equipment scenario.
-x, --aggr-func Test aggregation functions after insertion.
-y, --answer-yes Input yes for prompt.
-O, --disorder=NUMBER Insert order mode--0: In order, 1 ~ 50: disorder ratio. By default is in order.
-R, --disorder-range=NUMBER Out of order data's range. Unit is ms. By default is 1000.
-g, --debug Print debug info.
-?, --help Give this help list
--usage Give a short usage message
-V, --version Print program version.
Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
Report bugs to <support@taosdata.com>.
```
taosdemo 的参数是为了满足数据模拟的需求来设计的。下面介绍几个常用的参数:
```
-I, --interface=INTERFACE The interface (taosc, rest, and stmt) taosdemo uses. Default is 'taosc'.
```
前面介绍 taosdemo 不同接口的性能差异已经提到, -I 参数为选择不同的接口,目前支持 taosc、stmt 和 rest 几种。其中 taosc 为使用 SQL 语句方式进行数据写入;stmt 为使用参数绑定接口进行数据写入;rest 为使用 RESTful 协议进行数据写入。
```
-T, --threads=NUMBER The number of threads. Default is 8.
```
-T 参数设置 taosdemo 使用多少个线程进行数据同步写入,通过多线程可以尽最大可能压榨硬件的处理能力。
```
-b, --data-type=DATATYPE The data_type of columns, default: FLOAT, INT, FLOAT.
-w, --binwidth=WIDTH The width of data_type 'BINARY' or 'NCHAR'. Default is 64
-l, --columns=COLUMNS The number of columns per record. Demo mode by default is 3 (float, int, float). Max values is 4095
```
前文提到,taosdemo 默认创建一个典型电表数据采集应用场景,每个设备包含电流电压相位3个采集量。对于需要定义不同的采集量,可以使用 -b 参数。TDengine 支持 BOOL、TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、BINARY、NCHAR、TIMESTAMP 等多种数据类型。通过 -b 加上以“ , ”(英文逗号)分割定制类型的列表可以使 taosdemo 建立对应的超级表和子表并插入相应模拟数据。通过 -w 参数可以指定 BINARY 和 NCHAR 数据类型的列的宽度(默认为 64 )。-l 参数可以在 -b 参数指定数据类型的几列之后补充以 INT 型的总的列数,特别多列的情况下可以减少手工输入的过程,最多支持到 4095 列。
```
-r, --rec-per-req=NUMBER The number of records per request. Default is 30000.
```
为了达到 TDengine 性能极限,可以使用多客户端、多线程以及一次插入多条数据来进行数据写入。 -r 参数为设置一次写入请求可以拼接的记录条数,默认为30000条。有效的拼接记录条数还和客户端缓冲区大小有关,目前的缓冲区为 1M Bytes,如果记录的列宽度比较大,最大拼接记录条数可以通过 1M 除以列宽(以字节为单位)计算得出。
```
-t, --tables=NUMBER The number of tables. Default is 10000.
-n, --records=NUMBER The number of records per table. Default is 10000.
-M, --random The value of records generated are totally random. The default is to simulate power equipment senario.
```
前面提到 taosdemo 默认创建 10000 个表,每个表写入 10000 条记录。可以通过 -t 和 -n 设置表的数量和每个表的记录的数量。默认无参数生成的数据为模拟真实场景,模拟生成的数据为电流电压相位值增加一定的抖动,可以更真实表现 TDengine 高效的数据压缩能力。如果需要模拟生成完全随机数据,可以通过 -M 参数。
```
-y, --answer-yes Default input yes for prompt.
```
前面我们可以看到 taosdemo 默认在进行创建数据库或插入数据之前输出将要进行操作的参数列表,方便使用者在插入之前了解即将进行的数据写入的内容。为了方便进行自动测试,-y 参数可以使 taosdemo 输出参数后立刻进行数据写入操作。
```
-O, --disorder=NUMBER Insert order mode--0: In order, 1 ~ 50: disorder ratio. Default is in order.
-R, --disorder-range=NUMBER Out of order data's range, ms, default is 1000.
```
在某些场景,接收到的数据并不是完全按时间顺序到来,而是包含一定比例的乱序数据,TDengine 也能进行很好的处理。为了模拟乱序数据的写入,taosdemo 提供 -O 和 -R 参数进行设置。-O 参数为 0 和不使用 -O 参数相同为完全有序数据写入。1 到 50 为数据中包含乱序数据的比例。-R 参数为乱序数据时间戳偏移的范围,默认为 1000 毫秒。另外注意,时序数据以时间戳为唯一标识,所以乱序数据可能会生成和之前已经写入数据完全相同的时间戳,这样的数据会根据数据库创建的 update 值或者被丢弃(update 0)或者覆盖已有数据(update 1 或 2),而总的数据条数可能和期待的条数不一致的情况。
```
-g, --debug Print debug info.
```
如果对 taosdemo 写入数据过程感兴趣或者数据写入结果不符合预期,可以使用 -g 参数使 taosdemo 打印执行过程中间调试信息到屏幕上,或通过 Linux 重定向命令导入到另外一个文件,方便找到发生问题的原因。另外 taosdemo 在执行失败后也会把相应执行的语句和调试原因输出到屏幕。可以搜索 reason 来找到 TDengine 服务端返回的错误原因信息。
```
-x, --aggr-func Test aggregation funtions after insertion.
```
TDengine 不仅仅是插入性能非常强大,由于其先进的数据库引擎设计使查询性能也异常强大。taosdemo 提供一个 -x 函数,可以在插入数据结束后进行常用查询操作并输出查询消耗时间。以下为在前述服务器上进行插入一亿条记录后进行常用查询的结果。
可以看到 select * 取出一亿条记录(不输出到屏幕)操作仅消耗1.26秒。而对一亿条记录进行常用的聚合函数操作通常仅需要二十几毫秒,时间最长的 count 函数也不到四十毫秒。
```
taosdemo -I stmt -T 48 -y -x
...
...
select * took 1.266835 second(s)
...
select count(*) took 0.039684 second(s)
...
Where condition: groupid = 1
select avg(current) took 0.025897 second(s)
...
select sum(current) took 0.025622 second(s)
...
select max(current) took 0.026124 second(s)
...
...
select min(current) took 0.025812 second(s)
...
select first(current) took 0.024105 second(s)
...
```
除了命令行方式, taosdemo 还支持接受指定一个 JSON 文件做为传入参数的方式来提供更丰富的设置。一个典型的 JSON 文件内容如下:
```
{
"filetype": "insert",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"thread_count": 4,
"thread_count_create_tbl": 4,
"result_file": "./insert_res.txt",
"confirm_parameter_prompt": "no",
"insert_interval": 0,
"interlace_rows": 100,
"num_of_records_per_req": 100,
"databases": [{
"dbinfo": {
"name": "db",
"drop": "yes",
"replica": 1,
"days": 10,
"cache": 16,
"blocks": 8,
"precision": "ms",
"keep": 3650,
"minRows": 100,
"maxRows": 4096,
"comp":2,
"walLevel":1,
"cachelast":0,
"quorum":1,
"fsync":3000,
"update": 0
},
"super_tables": [{
"name": "stb",
"child_table_exists":"no",
"childtable_count": 100,
"childtable_prefix": "stb_",
"auto_create_table": "no",
"batch_create_tbl_num": 5,
"data_source": "rand",
"insert_mode": "taosc",
"insert_rows": 100000,
"childtable_limit": 10,
"childtable_offset":100,
"interlace_rows": 0,
"insert_interval":0,
"max_sql_len": 1024000,
"disorder_ratio": 0,
"disorder_range": 1000,
"timestamp_step": 10,
"start_timestamp": "2020-10-01 00:00:00.000",
"sample_format": "csv",
"sample_file": "./sample.csv",
"tags_file": "",
"columns": [{"type": "INT"}, {"type": "DOUBLE", "count":10}, {"type": "BINARY", "len": 16, "count":3}, {"type": "BINARY", "len": 32, "count":6}],
"tags": [{"type": "TINYINT", "count":2}, {"type": "BINARY", "len": 16, "count":5}]
}]
}]
}
```
例如:我们可以通过 "thread_count" 和 "thread_count_create_tbl" 来为建表和插入数据指定不同数量的线程。可以通过 "child_table_exists"、"childtable_limit" 和 "childtable_offset" 的组合来使用多个 taosdemo 进程(甚至可以在不同的电脑上)对同一个超级表的不同范围子表进行同时写入。也可以通过 "data_source" 和 "sample_file" 来指定数据来源为 csv 文件,来实现导入已有数据的功能。
使用 taosdemo 进行查询和订阅测试
--
taosdemo 不仅仅可以进行数据写入,也可以执行查询和订阅功能。但一个 taosdemo 实例只能支持其中的一种功能,不能同时支持三种功能,通过配置文件来指定进行哪种功能的测试。
以下为一个典型查询 JSON 示例文件内容:
```
{
"filetype": "query",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"confirm_parameter_prompt": "no",
"databases": "db",
"query_times": 2,
"query_mode": "taosc",
"specified_table_query": {
"query_interval": 1,
"concurrent": 3,
"sqls": [
{
"sql": "select last_row(*) from stb0 ",
"result": "./query_res0.txt"
},
{
"sql": "select count(*) from stb00_1",
"result": "./query_res1.txt"
}
]
},
"super_table_query": {
"stblname": "stb1",
"query_interval": 1,
"threads": 3,
"sqls": [
{
"sql": "select last_row(ts) from xxxx",
"result": "./query_res2.txt"
}
]
}
}
```
以下为 JSON 文件中和查询相关的特有参数含义:
"query_times": 每种查询类型的查询次数
"query_mode": 查询数据接口,"taosc":调用TDengine的c接口;“resetful”:使用restfule接口。可选项。缺省是“taosc”。
"specified_table_query": { 指定表的查询
"query_interval": 执行sqls的间隔,单位是秒。可选项,缺省是0。
"concurrent": 并发执行sqls的线程数,可选项,缺省是1。每个线程都执行所有的sqls。
"sqls": 可以添加多个sql语句,最多支持100条。
"sql": 查询语句。必选项。
"result": 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。
"super_table_query": { 对超级表中所有子表的查询
"stblname": 超级表名称。必选项。
"query_interval": 执行sqls的间隔,单位是秒。可选项,缺省是0。
"threads": 并发执行sqls的线程数,可选项,缺省是1。每个线程负责一部分子表,执行所有的sqls。
"sql": "select count(*) from xxxx"。查询超级表内所有子表的查询语句,其中表名必须写成 “xxxx”,实例会自动替换成子表名。
"result": 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。
以下为一个典型订阅 JSON 示例文件内容:
```
{
"filetype":"subscribe",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"databases": "db",
"confirm_parameter_prompt": "no",
"specified_table_query":
{
"concurrent":1,
"mode":"sync",
"interval":0,
"restart":"yes",
"keepProgress":"yes",
"sqls": [
{
"sql": "select * from stb00_0 ;",
"result": "./subscribe_res0.txt"
}]
},
"super_table_query":
{
"stblname": "stb0",
"threads":1,
"mode":"sync",
"interval":10000,
"restart":"yes",
"keepProgress":"yes",
"sqls": [
{
"sql": "select * from xxxx where ts > '2021-02-25 11:35:00.000' ;",
"result": "./subscribe_res1.txt"
}]
}
}
```
以下为订阅功能相关的特有参数含义:
"interval": 执行订阅的间隔,单位是秒。可选项,缺省是0。
"restart": 订阅重启。"yes":如果订阅已经存在,重新开始,"no": 继续之前的订阅。(请注意执行用户需要对 dataDir 目录有读写权限)
"keepProgress": 保留订阅信息进度。yes表示保留订阅信息,no表示不保留。该值为yes,restart为no时,才能继续之前的订阅。
"resubAfterConsume": 配合 keepProgress 使用,在订阅消费了相应次数后调用 unsubscribe 取消订阅并再次订阅。
"result": 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。 注意:每条sql语句后的保存结果的文件不能重名,且生成结果文件时,文件名会附加线程号。
结语
--
TDengine是涛思数据专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。TDengine 由于数据库内核中创新的数据存储和查询引擎设计,展现出远超同类产品的高效性能。并且由于支持 SQL 语法和多种编程语言的连接器(目前支持 Java, Python, Go, C#, NodeJS, Rust 等),易用性极强,学习成本为零。为了便于运维需求,我们还提供数据迁移和监控功能等相关生态工具软件。
为了刚接触 TDengine 的使用者方便进行技术评估和压力测试,我们为 taosdemo 开发了丰富的特性。本文即为对 taosdemo 的一个简单介绍,随着 TDengine 新功能的不断增加,taosdemo 也会继续演化和改进。taosdemo 的代码做为 TDengine 的一部分在 GitHub 上完全开源。欢迎就 taosdemo 或 TDengine 的使用或实现在 GitHub 或者涛思数据的用户群提出建议或批评。
附录 - 完整 taosdemo 参数介绍
--
taosdemo支持两种配置参数的模式,一种是命令行参数,一种是使用json格式的配置文件。
一、命令行参数
-f:指定taosdemo所需参数的meta文件。当使用该参数时,其他所有命令行参数都失效。可选项,缺省是NULL。
-u: 用户名。可选项,缺省是“root“。
-p: 密码。可选项,缺省是“taosdata"。指定密码需要使用 MySQL 风格,即密码和 -p 贴紧方式,中间无空格。
-c: 配置文件taos.cfg所在的路径。因为taosdemo通过包含taos的动态库,去链接taosd服务,所以需要做好配置文件。可选项,缺省是 "/etc/taos"路径。
-h:taosd服务的FQDN。可选项,缺省是“localhost“。
-P: taosd服务的端口号。可选项,缺省是6030。
-d:数据库名称。可选项,缺省是“test”。
-a:副本个数,可选项。1 - 3,缺省是1。
-m:表名的前缀。可选项,缺省是“t”。
-s::执行该文件包含的多条 SQL 查询命令。
-N:使用普通建表模式。有该选项时,全部创建普通表,否则缺省创建超级表,再根据超级表创建子表;
-o:指定执行结果输出文件的路径。可选项,缺省是./output.txt。
-q:查询模式,0:同步模式;1:异步模式。可选项,缺省是0。
-b:列的类型。可选项,缺省是:FLOAT,INT,FLOAT。NCHAR和BINARY也可以自定义长度,例如: NCHAR(16), BINARY(8)
-w:BINARY或NCHAR数据类型的长度。可选项,缺省是16。
-l:列的个数。可选项,缺省是3。
-T:并发线程数。可选项,缺省是10。
-i:两次sql插入的休眠时间间隔,缺省是0。
-S:两次插入间隔时间戳步长,缺省是1。
-B:交错(interlace)写入模式,缺省是0(顺序写入模式)。
-r:每条插入请求包含的记录数,缺省是30000。
-t:表的个数。可选项,缺省是10000。
-n:每个表插入的记录数。可选项,缺省是10000。
-M: 插入数据为完全随机。可选项,缺省为模拟能源设备真实场景(数据在固定范围小幅波动)。
-x:不仅仅插入数据。有该选项时,taosdemo还会进行聚合函数查询操作。
-y:提示询问输入时缺省输入yes。
-O:插入乱序数据的比例,0:顺序插入;> 0:乱序数据的百分比。可选项,缺省是0。、
-R:乱序百分比不为0时,乱序时间戳范围,单位:毫秒。可选项,缺省是1000。
-g:打印debug信息
-V: 打印taosdemo的debug信息。
--help: 打印命令参数列表。
二、json格式的配置文件中所有参数说明
taosdemo支持3种功能的测试,包括插入、查询、订阅。但一个taosdemo实例不能同时支持三种功能,一个 taosdemo 实例只能支持其中的一种功能,通过配置文件来指定进行哪种功能的测试。
1、插入功能测试的json配置文件
{
"filetype": "insert",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"thread_count": 4,
"thread_count_create_tbl": 4,
"result_file": "./insert_res.txt",
"confirm_parameter_prompt": "no",
"insert_interval": 0,
"interlace_rows": 100,
"num_of_records_per_req": 100,
"databases": [{
"dbinfo": {
"name": "db",
"drop": "yes",
"replica": 1,
"days": 10,
"cache": 16,
"blocks": 8,
"precision": "ms",
"keep": 3650,
"minRows": 100,
"maxRows": 4096,
"comp":2,
"walLevel":1,
"cachelast":0,
"quorum":1,
"fsync":3000,
"update": 0
},
"super_tables": [{
"name": "stb",
"child_table_exists":"no",
"childtable_count": 100,
"childtable_prefix": "stb_",
"auto_create_table": "no",
"batch_create_tbl_num": 5,
"data_source": "rand",
"insert_mode": "taosc",
"insert_rows": 100000,
"childtable_limit": 10,
"childtable_offset":100,
"interlace_rows": 0,
"insert_interval":0,
"max_sql_len": 1024000,
"disorder_ratio": 0,
"disorder_range": 1000,
"timestamp_step": 10,
"start_timestamp": "2020-10-01 00:00:00.000",
"sample_format": "csv",
"sample_file": "./sample.csv",
"use_sameple_ts": "no",
"tags_file": "",
"columns": [{"type": "INT"}, {"type": "DOUBLE", "count":10}, {"type": "BINARY", "len": 16, "count":3}, {"type": "BINARY", "len": 32, "count":6}],
"tags": [{"type": "TINYINT", "count":2}, {"type": "BINARY", "len": 16, "count":5}]
}]
}]
}
"filetype": 本taosdemo实例进行哪种功能测试。"insert"表示数据插入功能。必选项。
"cfgdir": 配置文件taos.cfg所在的路径。因为taosdemo通过包含taos的动态库,去链接taosd服务,所以需要做好配置文件。可选项,缺省是 "/etc/taos"路径。
"host": taosd服务的FQDN。可选项,缺省是“localhost“。
"port": taosd服务的端口号。可选项,缺省是6030。
"user": 用户名。可选项,缺省是“root“。
"password": 密码。可选项,缺省是“taosdata"。
"thread_count": 插入数据时的并发线程数。可选项,缺省是1。
"thread_count_create_tbl": 建子表时的并发线程数。可选项,缺省是1。
"result_file": 测试完成后结果保存文件。可选项,缺省是本实例启动目录下的"./insert_res.txt"。
"confirm_parameter_prompt": 执行过程中提示是否确认,为no时,执行过程无需手工输入enter。可选项,缺省是no。
"insert_interval": 两次发送请求的间隔时间。可选项,缺省是0,代表无人工设置的时间间隔,单位为ms。。
"interlace_rows": 设置轮询插入每个单表数据的条目数,如果interlace_rows*childtable_count*supertable_num小于num_of_records_per_req时,则请求插入的数目以interlace_rows*childtable_count*supertable_num为准。可选项,缺省是0。
"num_of_records_per_req": 每条请求数据内容包含的插入数据记录数目,该数据组成的sql不能大于maxsqllen,如果过大,则取taood限制的1M长度(1048576)。可选项,缺省是INT64_MAX 32766(受服务端限制)。0代表不插入数据,建议配置大于0。
"databases": [{
"dbinfo": { ​ "name": 数据库名称。必选项。
"drop": 如果数据库已经存在,”yes“:删除后重建;”no“:不删除,直接使用。可选项,缺省是”no“。drop = yes 会使其他子表创建相关条目无效。
"replica": 副本个数,可选项。1 - 3,缺省是1。
"days": 数据文件存储数据的时间跨度,可选项。缺省是10天。
"cache": 内存块的大小,单位是MB,可选项。缺省是16MB。
"blocks": 每个VNODE(TSDB)中有多少cache大小的内存块,可选项。缺省是6块。
"precision": 数据库时间精度,可选项。"ms":毫秒, “us”:微秒。缺省是“ms”。in
"keep": 数据保留的天数,可选项。缺省是3650天。
"minRows": 文件块中记录的最小条数,可选项。缺省是100。
"maxRows": 文件块中记录的最大条数,可选项。缺省是4096.
"comp":文件压缩标志位,可选项。0:关闭,1:一阶段压缩,2:两阶段压缩。缺省是2。
"walLevel":WAL级别,可选项。1:写wal, 但不执行fsync; 2:写wal, 而且执行fsync。缺省是1。
"cachelast":允许在内存中保留每张表的最后一条记录。1表示允许。
"quorum":异步写入成功所需应答之法定数,1-3,可选项。缺省是1。
"fsync":当wal设置为2时,执行fsync的周期,单位是毫秒,最小为0,表示每次写入,立即执行fsync. 最大为180000,可选项。缺省是3000。
"update": 支持数据更新,0:否;1:是。可选项。缺省是0。 ​ },
"super_tables": [{ ​ "name": 超级表名称,必选项。
"child_table_exists": 子表是否已经存在,“yes”:是;"no":否。指定“是”后,不再建子表,后面相关子表的参数就无效了。可选项,缺省是“no”。database 设置 drop = yes 时,无论配置文件内容,此参数将自动置为 no。
"childtable_count": 建立子表个数 。该值需要大于0。当child_table_exists为“no”时,必选项,否则就是无效项。
"childtable_prefix": 子表名称前缀。当child_table_exists为“no”时,必选项,否则就是无效项。确保数据库中表名没有重复。
"auto_create_table": 子表的创建方式,“yes”:自动建表;"no":提前建表。可选项,缺省是“no”。当 child_table_exists 为 “yes” 时此参数将自动置为 no 。
"batch_create_tbl_num": 一个sql批量创建子表的数目。
"data_source": 插入数据来源,"rand":实例随机生成;“sample”:从样例文件中读取。可选项。缺省是“rand”。
"insert_mode": 插入数据接口,"taosc":调用TDengine的c接口;“rest”:使用restful接口;“stmt”:使用 stmt (参数绑定)接口 (目前仅在 develop 分支代码中)。可选项。缺省是“taosc”。
"insert_rows": 插入记录数,0:一直插入,永不退出;>0:每个子表插入记录数,完成后实例退出。可选项,缺省是0。
"childtable_offset": 插入数据时,子表起始值。只在drop=no && child_table_exists= yes,该字段生效。
"childtable_limit": 插入数据时,子表从offset开始,偏移的表数目。使用者可以运行多个 taosdemo 实例(甚至可以在不同的机器上)通过使用不同的 childtable_offset 和 childtable_limit 配置值来实现同时写入相同数据库相同超级表下多个子表。只在drop=no && child_table_exists= yes,该字段生效。
"interlace_rows": 跟上面的配置一致,不过该处的配置优先,每个stable可以有自己单独的配置。最大不超过 num_of_records_per_req。
"insert_interval": 同上。
"max_sql_len": 同上</u>
"disorder_ratio": 插入数据时的乱序百分比,可选项,缺省是0。
"disorder_range": 乱序百分比不为0时,乱序时间戳范围,单位:ms。可选项,缺省是1000,即1秒或1000毫秒。
"timestamp_step": 每个子表中记录时间戳的步长,单位:ms。可选项,缺省是1,即1毫秒。
"start_timestamp": 子表中记录时间戳的起始值,支持"2020-10-01 00:00:00.000"和“now”两种格式,可选项,缺省是“now”。
"sample_format": 当插入数据源选择“sample”时,sample文件的格式,"csv":csv格式,每列的值与子表的columns保持一致,但不包含第1列的时间戳。可选项,缺省是”csv”。目前仅仅支持csv格式的sample文件。
"sample_file":sample文件,包含路径和文件名。当插入数据源选择“sample”时,该项为必选项。
"use_sample_ts":sample文件是否包含第一列时间戳,可选项: "yes" 和 "no", 默认 "no"。(注意:若为yes,则disorder_ratio 和 disorder_range失效)
"tags_file": 子表tags值文件,只能是csv文件格式,且必须与超级表的tags保持一致。当该项为非空时,表示子表的tags值从文件中获取;为空时,实例随机生成。可选项,缺省是空。
"columns": [{ 超级表的column列表,最大支持1024列(指所有普通列+超级列总和)。默认的第一列为时间类型,程序自动添加,不需要手工添加。
"type": 该列的数据类型 ,必选项。
"len": 该列的长度,只有type是BINARY或NCHAR时有效,可选项,缺省值是8。
"count":该类型的连续列个数,可选项,缺省是1。
}],
"tags": [{ 超级表的tags列表,type不能是timestamp类型, 最大支持128个。
"type": 该列的数据类型 ,必选项。
"len": 该列的长度,只有type是BINARY或NCHAR时有效,可选项,缺省值是8。
"count":该类型的连续列个数,可选项,缺省是1。
}]
2、查询功能测试的json配置文件
{
"filetype": "query",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"confirm_parameter_prompt": "no",
"databases": "db",
"query_times": 2,
"query_mode": "taosc",
"specified_table_query": {
"query_interval": 1,
"concurrent": 3,
"sqls": [
{
"sql": "select last_row(*) from stb0 ",
"result": "./query_res0.txt"
},
{
"sql": "select count(*) from stb00_1",
"result": "./query_res1.txt"
}
]
},
"super_table_query": {
"stblname": "stb1",
"query_interval": 1,
"threads": 3,
"sqls": [
{
"sql": "select last_row(ts) from xxxx",
"result": "./query_res2.txt"
}
]
}
}
"filetype": 本taosdemo实例进行哪种功能测试。"query"表示数据查询功能。必选项。
"cfgdir": 配置文件taos.cfg所在的路径。因为taosdemo通过包含taos的动态库,去链接taosd服务,所以需要做好配置文件。可选项,缺省是 "/etc/taos"路径。
"host": taosd服务的FQDN。可选项,缺省是“localhost“。
"port": taosd服务的端口号。可选项,缺省是6030。
"user": 用户名。可选项,缺省是“root“。
"password": 密码。可选项,缺省是“taosdata"。
"confirm_parameter_prompt": 执行过程中提示是否确认,为no时,执行过程无需手工输入enter。可选项,缺省是no。
"databases": 数据库名称。必选项。
"query_times": 每种查询类型的查询次数
"query_mode": 查询数据接口,"taosc":调用TDengine的c接口;“resetful”:使用restfule接口。可选项。缺省是“taosc”。
"specified_table_query": { 指定表的查询
"query_interval": 执行sqls的间隔,单位是秒。可选项,缺省是0。
"concurrent": 并发执行sqls的线程数,可选项,缺省是1。每个线程都执行所有的sqls。
"sqls": 可以添加多个sql语句,最多支持100条。
"sql": 查询语句。必选项。
"result": 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。
"super_table_query": { 对超级表中所有子表的查询
"stblname": 超级表名称。必选项。
"query_interval": 执行sqls的间隔,单位是秒。可选项,缺省是0。
"threads": 并发执行sqls的线程数,可选项,缺省是1。每个线程负责一部分子表,执行所有的sqls。
"sql": "select count(*) from xxxx"。查询超级表内所有子表的查询语句,其中表名必须写成 “xxxx”,实例会自动替换成子表名。
"result": 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。
注意:每条sql语句后的保存结果的文件不能重名,且生成结果文件时,文件名会附加线程号。
查询结果显示:如果查询线程结束一次查询距开始执行时间超过30秒打印一次查询次数、用时和QPS。所有查询结束时,汇总打印总的查询次数和QPS。
3、订阅功能测试的json配置文件
{
"filetype":"subscribe",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"databases": "db",
"confirm_parameter_prompt": "no",
"specified_table_query":
{
"concurrent":1,
"mode":"sync",
"interval":0,
"restart":"yes",
"keepProgress":"yes",
"sqls": [
{
"sql": "select * from stb00_0 ;",
"result": "./subscribe_res0.txt"
}]
},
"super_table_query":
{
"stblname": "stb0",
"threads":1,
"mode":"sync",
"interval":10000,
"restart":"yes",
"keepProgress":"yes",
"sqls": [
{
"sql": "select * from xxxx where ts > '2021-02-25 11:35:00.000' ;",
"result": "./subscribe_res1.txt"
}]
}
}
"filetype": 本taosdemo实例进行哪种功能测试。"subscribe"表示数据查询功能。必选项。**
"cfgdir": 配置文件taos.cfg所在的路径。因为taosdemo通过包含taos的动态库,去链接taosd服务,所以需要做好配置文件。可选项,缺省是 "/etc/taos"路径。
"host": taosd服务的FQDN。可选项,缺省是“localhost“。
"port": taosd服务的端口号。可选项,缺省是6030。
"user": 用户名。可选项,缺省是“root“。
"password": 密码。可选项,缺省是“taosdata"。
"databases": 数据库名称。必选项。**
"confirm_parameter_prompt": 执行过程中提示是否确认,为no时,执行过程无需手工输入enter。可选项,缺省是no。
注意:这里的订阅查询sql目前只支持select * ,其余不支持。
"specified_table_query": 指定表的订阅。
"concurrent": 并发执行sqls的线程数,可选项,缺省是1。每个线程都执行所有的sqls。
"mode": 订阅模式。目前支持同步和异步订阅,缺省是sync。
"interval": 执行订阅的间隔,单位是秒。可选项,缺省是0。
"restart": 订阅重启。"yes":如果订阅已经存在,重新开始,"no": 继续之前的订阅。(请注意执行用户需要对 dataDir 目录有读写权限)
"keepProgress": 保留订阅信息进度。yes表示保留订阅信息,no表示不保留。该值为yes,restart为no时,才能继续之前的订阅。
"resubAfterConsume": 配合 keepProgress 使用,在订阅消费了相应次数后调用 unsubscribe 取消订阅并再次订阅。
"sql": 查询语句。必选项。
"result": 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。
"super_table_query": 对超级表中所有子表的订阅。
"stblname": 超级表名称。必选项。
"threads": 并发执行sqls的线程数,可选项,缺省是1。每个线程都执行所有的sqls。
"mode": 订阅模式。
"interval": 执行sqls的间隔,单位是秒。可选项,缺省是0。
"restart": 订阅重启。"yes":如果订阅已经存在,重新开始,"no": 继续之前的订阅。
"keepProgress": 保留订阅信息进度。yes表示保留订阅信息,no表示不保留。该值为yes,restart为no时,才能继续之前的订阅。
"resubAfterConsume": 配合 keepProgress 使用,在订阅消费了相应次数后调用 unsubscribe 取消订阅并再次订阅。
"sql": " select count(*) from xxxx "。查询语句,其中表名必须写成 “xxxx”,实例会自动替换成子表名。
​ "result": 查询结果写入的文件名。可选项,缺省是空,表示查询结果不写入文件。 注意:每条sql语句后的保存结果的文件不能重名,且生成结果文件时,文件名会附加线程号。
...@@ -177,6 +177,7 @@ taos> select avg(current), max(voltage), min(phase) from test.d10 interval(10s); ...@@ -177,6 +177,7 @@ taos> select avg(current), max(voltage), min(phase) from test.d10 interval(10s);
``` ```
**Note:** taosdemo 命令本身带有很多选项,配置表的数目、记录条数等等,请执行 `taosdemo --help` 详细列出。您可以设置不同参数进行体验。 **Note:** taosdemo 命令本身带有很多选项,配置表的数目、记录条数等等,请执行 `taosdemo --help` 详细列出。您可以设置不同参数进行体验。
taosdemo 详细使用方法请参照 [如何使用taosdemo对TDengine进行性能测试?](https://www.taosdata.com/cn/documentation/getting-started/taosdemo )
## 客户端和报警模块 ## 客户端和报警模块
......
# TDengine数据建模 # TDengine 数据建模
TDengine采用关系型数据模型,需要建库、建表。因此对于一个具体的应用场景,需要考虑库、超级表和普通表的设计。本节不讨论细致的语法规则,只介绍概念。 TDengine 采用关系型数据模型,需要建库、建表。因此对于一个具体的应用场景,需要考虑库、超级表和普通表的设计。本节不讨论细致的语法规则,只介绍概念。
关于数据建模请参考[视频教程](https://www.taosdata.com/blog/2020/11/11/1945.html) 关于数据建模请参考[视频教程](https://www.taosdata.com/blog/2020/11/11/1945.html)
## <a class="anchor" id="create-db"></a>创建库 ## <a class="anchor" id="create-db"></a> 创建库
不同类型的数据采集点往往具有不同的数据特征,包括数据采集频率的高低,数据保留时间的长短,副本的数目,数据块的大小,是否允许更新数据等等。为了在各种场景下TDengine都能最大效率的工作,TDengine建议将不同数据特征的表创建在不同的库里,因为每个库可以配置不同的存储策略。创建一个库时,除SQL标准的选项外,应用还可以指定保留时长、副本数、内存块个数、时间精度、文件块里最大最小记录条数、是否压缩、一个数据文件覆盖的天数等多种参数。比如: 不同类型的数据采集点往往具有不同的数据特征,包括数据采集频率的高低,数据保留时间的长短,副本的数目,数据块的大小,是否允许更新数据等等。为了在各种场景下 TDengine 都能最大效率的工作,TDengine 建议将不同数据特征的表创建在不同的库里,因为每个库可以配置不同的存储策略。创建一个库时,除SQL标准的选项外,应用还可以指定保留时长、副本数、内存块个数、时间精度、文件块里最大最小记录条数、是否压缩、一个数据文件覆盖的天数等多种参数。比如:
```mysql ```mysql
CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 6 UPDATE 1; CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 6 UPDATE 1;
``` ```
上述语句将创建一个名为power的库,这个库的数据将保留365天(超过365天将被自动删除),每10天一个数据文件,内存块数为6,允许更新数据。详细的语法及参数请见 [TAOS SQL 的数据管理](https://www.taosdata.com/cn/documentation/taos-sql#management) 章节。 上述语句将创建一个名为 power 的库,这个库的数据将保留 365 天(超过 365 天将被自动删除),每 10 天一个数据文件,内存块数为 6,允许更新数据。详细的语法及参数请见 [TAOS SQL 的数据管理](https://www.taosdata.com/cn/documentation/taos-sql#management) 章节。
创建库之后,需要使用SQL命令USE将当前库切换过来,例如: 创建库之后,需要使用 SQL 命令 USE 将当前库切换过来,例如:
```mysql ```mysql
USE power; USE power;
``` ```
将当前连接里操作的库换为power,否则对具体表操作前,需要使用“库名.表名”来指定库的名字。 将当前连接里操作的库换为 power,否则对具体表操作前,需要使用“库名.表名”来指定库的名字。
**注意:** **注意:**
- 任何一张表或超级表是属于一个库的,在创建表之前,必须先创建库。 - 任何一张表或超级表是属于一个库的,在创建表之前,必须先创建库。
- 处于两个不同库的表是不能进行JOIN操作的。 - 处于两个不同库的表是不能进行 JOIN 操作的。
- 创建并插入记录、查询历史记录的时候,均需要指定时间戳。 - 创建并插入记录、查询历史记录的时候,均需要指定时间戳。
## <a class="anchor" id="create-stable"></a>创建超级表 ## <a class="anchor" id="create-stable"></a> 创建超级表
一个物联网系统,往往存在多种类型的设备,比如对于电网,存在智能电表、变压器、母线、开关等等。为便于多表之间的聚合,使用TDengine, 需要对每个类型的数据采集点创建一个超级表。以[表1](https://www.taosdata.com/cn/documentation/architecture#model_table1)中的智能电表为例,可以使用如下的SQL命令创建超级表: 一个物联网系统,往往存在多种类型的设备,比如对于电网,存在智能电表、变压器、母线、开关等等。为便于多表之间的聚合,使用 TDengine, 需要对每个类型的数据采集点创建一个超级表。以[表1](https://www.taosdata.com/cn/documentation/architecture#model_table1) 中的智能电表为例,可以使用如下的 SQL 命令创建超级表:
```mysql ```mysql
CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int); CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);
...@@ -39,25 +39,25 @@ CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAG ...@@ -39,25 +39,25 @@ CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAG
**注意:**这一指令中的 STABLE 关键字,在 2.0.15 之前的版本中需写作 TABLE 。 **注意:**这一指令中的 STABLE 关键字,在 2.0.15 之前的版本中需写作 TABLE 。
与创建普通表一样,创建表时,需要提供表名(示例中为meters),表结构Schema,即数据列的定义。第一列必须为时间戳(示例中为ts),其他列为采集的物理量(示例中为current, voltage, phase),数据类型可以为整型、浮点型、字符串等。除此之外,还需要提供标签的schema (示例中为location, groupId),标签的数据类型可以为整型、浮点型、字符串等。采集点的静态属性往往可以作为标签,比如采集点的地理位置、设备型号、设备组ID、管理员ID等等。标签的schema可以事后增加、删除、修改。具体定义以及细节请见 [TAOS SQL 的超级表管理](https://www.taosdata.com/cn/documentation/taos-sql#super-table) 章节。 与创建普通表一样,创建表时,需要提供表名(示例中为 meters),表结构 Schema,即数据列的定义。第一列必须为时间戳(示例中为 ts),其他列为采集的物理量(示例中为 current, voltage, phase),数据类型可以为整型、浮点型、字符串等。除此之外,还需要提供标签的 schema (示例中为 location, groupId),标签的数据类型可以为整型、浮点型、字符串等。采集点的静态属性往往可以作为标签,比如采集点的地理位置、设备型号、设备组 ID、管理员 ID 等等。标签的 schema 可以事后增加、删除、修改。具体定义以及细节请见 [TAOS SQL 的超级表管理](https://www.taosdata.com/cn/documentation/taos-sql#super-table) 章节。
每一种类型的数据采集点需要建立一个超级表,因此一个物联网系统,往往会有多个超级表。对于电网,我们就需要对智能电表、变压器、母线、开关等都建立一个超级表。在物联网中,一个设备就可能有多个数据采集点(比如一台风力发电的风机,有的采集点采集电流、电压等电参数,有的采集点采集温度、湿度、风向等环境参数),这个时候,对这一类型的设备,需要建立多张超级表。一张超级表里包含的采集物理量必须是同时采集的(时间戳是一致的)。 每一种类型的数据采集点需要建立一个超级表,因此一个物联网系统,往往会有多个超级表。对于电网,我们就需要对智能电表、变压器、母线、开关等都建立一个超级表。在物联网中,一个设备就可能有多个数据采集点(比如一台风力发电的风机,有的采集点采集电流、电压等电参数,有的采集点采集温度、湿度、风向等环境参数),这个时候,对这一类型的设备,需要建立多张超级表。一张超级表里包含的采集物理量必须是同时采集的(时间戳是一致的)。
一张超级表最多容许 1024 列,如果一个采集点采集的物理量个数超过 1024,需要建多张超级表来处理。一个系统可以有多个 DB,一个 DB 里可以有一到多个超级表。(从 2.1.7.0 版本开始,列数限制由 1024 列放宽到了 4096 列。) 一张超级表最多容许 1024 列,如果一个采集点采集的物理量个数超过 1024,需要建多张超级表来处理。一个系统可以有多个 DB,一个 DB 里可以有一到多个超级表。(从 2.1.7.0 版本开始,列数限制由 1024 列放宽到了 4096 列。)
## <a class="anchor" id="create-table"></a>创建表 ## <a class="anchor" id="create-table"></a> 创建表
TDengine对每个数据采集点需要独立建表。与标准的关系型数据库一样,一张表有表名,Schema,但除此之外,还可以带有一到多个标签。创建时,需要使用超级表做模板,同时指定标签的具体值。以[表1](https://www.taosdata.com/cn/documentation/architecture#model_table1)中的智能电表为例,可以使用如下的SQL命令建表: TDengine 对每个数据采集点需要独立建表。与标准的关系型数据库一样,一张表有表名,Schema,但除此之外,还可以带有一到多个标签。创建时,需要使用超级表做模板,同时指定标签的具体值。以[表1](https://www.taosdata.com/cn/documentation/architecture#model_table1)中的智能电表为例,可以使用如下的SQL命令建表:
```mysql ```mysql
CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2); CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);
``` ```
其中d1001是表名,meters是超级表的表名,后面紧跟标签Location的具体标签值”Beijing.Chaoyang",标签groupId的具体标签值2。虽然在创建表时,需要指定标签值,但可以事后修改。详细细则请见 [TAOS SQL 的表管理](https://www.taosdata.com/cn/documentation/taos-sql#table) 章节。 其中 d1001 是表名,meters 是超级表的表名,后面紧跟标签 Location 的具体标签值 ”Beijing.Chaoyang",标签 groupId 的具体标签值 2。虽然在创建表时,需要指定标签值,但可以事后修改。详细细则请见 [TAOS SQL 的表管理](https://www.taosdata.com/cn/documentation/taos-sql#table) 章节。
**注意:**目前 TDengine 没有从技术层面限制使用一个 database (dbA)的超级表作为模板建立另一个 database (dbB)的子表,后续会禁止这种用法,不建议使用这种方法建表。 **注意:**目前 TDengine 没有从技术层面限制使用一个 database (dbA)的超级表作为模板建立另一个 database (dbB)的子表,后续会禁止这种用法,不建议使用这种方法建表。
TDengine建议将数据采集点的全局唯一ID作为表名(比如设备序列号)。但对于有的场景,并没有唯一的ID,可以将多个ID组合成一个唯一的ID。不建议将具有唯一性的ID作为标签值。 TDengine 建议将数据采集点的全局唯一 ID 作为表名(比如设备序列号)。但对于有的场景,并没有唯一的 ID,可以将多个 ID 组合成一个唯一的 ID。不建议将具有唯一性的 ID 作为标签值。
**自动建表**:在某些特殊场景中,用户在写数据时并不确定某个数据采集点的表是否存在,此时可在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。比如: **自动建表**:在某些特殊场景中,用户在写数据时并不确定某个数据采集点的表是否存在,此时可在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。比如:
...@@ -65,13 +65,13 @@ TDengine建议将数据采集点的全局唯一ID作为表名(比如设备序列 ...@@ -65,13 +65,13 @@ TDengine建议将数据采集点的全局唯一ID作为表名(比如设备序列
INSERT INTO d1001 USING meters TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32); INSERT INTO d1001 USING meters TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);
``` ```
上述SQL语句将记录 (now, 10.2, 219, 0.32) 插入表d1001。如果表d1001还未创建,则使用超级表meters做模板自动创建,同时打上标签值 `“Beijing.Chaoyang", 2` 上述 SQL 语句将记录(now, 10.2, 219, 0.32)插入表 d1001。如果表 d1001 还未创建,则使用超级表 meters 做模板自动创建,同时打上标签值 `“Beijing.Chaoyang", 2`
关于自动建表的详细语法请参见 [插入记录时自动建表](https://www.taosdata.com/cn/documentation/taos-sql#auto_create_table) 章节。 关于自动建表的详细语法请参见 [插入记录时自动建表](https://www.taosdata.com/cn/documentation/taos-sql#auto_create_table) 章节。
## 多列模型 vs 单列模型 ## 多列模型 vs 单列模型
TDengine支持多列模型,只要物理量是一个数据采集点同时采集的(时间戳一致),这些量就可以作为不同列放在一张超级表里。但还有一种极限的设计,单列模型,每个采集的物理量都单独建表,因此每种类型的物理量都单独建立一超级表。比如电流、电压、相位,就建三张超级表。 TDengine 支持多列模型,只要物理量是一个数据采集点同时采集的(时间戳一致),这些量就可以作为不同列放在一张超级表里。但还有一种极限的设计,单列模型,每个采集的物理量都单独建表,因此每种类型的物理量都单独建立一超级表。比如电流、电压、相位,就建三张超级表。
TDengine建议尽可能采用多列模型,因为插入效率以及存储效率更高。但对于有些场景,一个采集点的采集量的种类经常变化,这个时候,如果采用多列模型,就需要频繁修改超级表的结构定义,让应用变的复杂,这个时候,采用单列模型会显得更简单。 TDengine 建议尽可能采用多列模型,因为插入效率以及存储效率更高。但对于有些场景,一个采集点的采集量的种类经常变化,这个时候,如果采用多列模型,就需要频繁修改超级表的结构定义,让应用变的复杂,这个时候,采用单列模型会显得更简单。
...@@ -107,7 +107,7 @@ gcc -g -O0 -fPIC -shared add_one.c -o add_one.so ...@@ -107,7 +107,7 @@ gcc -g -O0 -fPIC -shared add_one.c -o add_one.so
例如,如下语句可以把 add_one.so 创建为系统中可用的 UDF: 例如,如下语句可以把 add_one.so 创建为系统中可用的 UDF:
```sql ```sql
CREATE FUNCTION add_one AS "/home/taos/udf_example/add_one.so" OUTPUTTYPE INT bufsize 128; CREATE FUNCTION add_one AS "/home/taos/udf_example/add_one.so" OUTPUTTYPE INT;
``` ```
- 创建聚合函数:`CREATE AGGREGATE FUNCTION ids(X) AS ids(Y) OUTPUTTYPE typename(Z) bufsize B;` - 创建聚合函数:`CREATE AGGREGATE FUNCTION ids(X) AS ids(Y) OUTPUTTYPE typename(Z) bufsize B;`
...@@ -116,9 +116,9 @@ gcc -g -O0 -fPIC -shared add_one.c -o add_one.so ...@@ -116,9 +116,9 @@ gcc -g -O0 -fPIC -shared add_one.c -o add_one.so
* typename(Z):此函数计算结果的数据类型,与上文中 udfNormalFunc 的 itype 参数不同,这里不是使用数字表示法,而是直接写类型名称即可; * typename(Z):此函数计算结果的数据类型,与上文中 udfNormalFunc 的 itype 参数不同,这里不是使用数字表示法,而是直接写类型名称即可;
* B:系统使用的中间临时缓冲区大小,单位是字节,最小 0,最大 512,通常可以设置为 128。 * B:系统使用的中间临时缓冲区大小,单位是字节,最小 0,最大 512,通常可以设置为 128。
例如,如下语句可以把 add_one.so 创建为系统中可用的 UDF: 例如,如下语句可以把 abs_max.so 创建为系统中可用的 UDF:
```sql ```sql
CREATE FUNCTION abs_max AS "/home/taos/udf_example/abs_max.so" OUTPUTTYPE BIGINT bufsize 128; CREATE AGGREGATE FUNCTION abs_max AS "/home/taos/udf_example/abs_max.so" OUTPUTTYPE BIGINT bufsize 128;
``` ```
### 管理 UDF ### 管理 UDF
......
...@@ -72,6 +72,14 @@ TDengine 缺省的时间戳是毫秒精度,但通过在 CREATE DATABASE 时传 ...@@ -72,6 +72,14 @@ TDengine 缺省的时间戳是毫秒精度,但通过在 CREATE DATABASE 时传
2) UPDATE 标志数据库支持更新相同时间戳数据;(从 2.1.7.0 版本开始此参数支持设为 2,表示允许部分列更新,也即更新数据行时未被设置的列会保留原值。)(从 2.0.8.0 版本开始支持此参数。注意此参数不能通过 `ALTER DATABASE` 指令进行修改。) 2) UPDATE 标志数据库支持更新相同时间戳数据;(从 2.1.7.0 版本开始此参数支持设为 2,表示允许部分列更新,也即更新数据行时未被设置的列会保留原值。)(从 2.0.8.0 版本开始支持此参数。注意此参数不能通过 `ALTER DATABASE` 指令进行修改。)
1) UPDATE设为0时,表示不允许更新数据,后发送的相同时间戳的数据会被直接丢弃;
2) UPDATE设为1时,表示更新全部列数据,即如果更新一个数据行,其中某些列没有提供取值,那么这些列会被设为 NULL;
3) UPDATE设为2时,表示支持更新部分列数据,即如果更新一个数据行,其中某些列没有提供取值,那么这些列会保持原有数据行中的对应值;
4) 更多关于UPDATE参数的用法,请参考[FAQ](https://www.taosdata.com/cn/documentation/faq)。
3) 数据库名最大长度为33; 3) 数据库名最大长度为33;
4) 一条SQL 语句的最大长度为65480个字符; 4) 一条SQL 语句的最大长度为65480个字符;
......
Since TDengine was open sourced in July 2019, it has gained a lot of popularity among time-series database developers with its innovative data modeling design, simple installation mehtod, easy programming interface, and powerful data insertion and query performance. The insertion and querying performance is often astonishing to users who are new to TDengine. In order to help users to experience the high performance and functions of TDengine in the shortest time, we developed an application called taosdemo for insertion and querying performance testing of TDengine. Then user can easily simulate the scenario of a large number of devices generating a very large amount of data. User can easily maniplate the number of columns, data types, disorder ratio, and number of concurrent threads with taosdemo customized parameters.
Running taosdemo is very simple. Just download the TDengine installation package (https://www.taosdata.com/cn/all-downloads/) or compiling the TDengine code yourself (https://github.com/taosdata/TDengine). It can be found and run in the installation directory or in the compiled results directory.
To run an insertion test with taosdemo
--
Executing taosdemo without any parameters results in the following output.
```
$ taosdemo
taosdemo is simulating data generated by power equipment monitoring...
host: 127.0.0.1:6030
user: root
password: taosdata
configDir:
resultFile: ./output.txt
thread num of insert data: 8
thread num of create table: 8
top insert interval: 0
number of records per req: 30000
max sql length: 1048576
database count: 1
database[0]:
database[0] name: test
drop: yes
replica: 1
precision: ms
super table count: 1
super table[0]:
stbName: meters
autoCreateTable: no
childTblExists: no
childTblCount: 10000
childTblPrefix: d
dataSource: rand
iface: taosc
insertRows: 10000
interlaceRows: 0
disorderRange: 1000
disorderRatio: 0
maxSqlLen: 1048576
timeStampStep: 1
startTimestamp: 2017-07-14 10:40:00.000
sampleFormat:
sampleFile:
tagsFile:
columnCount: 3
column[0]:FLOAT column[1]:INT column[2]:FLOAT
tagCount: 2
tag[0]:INT tag[1]:BINARY(16)
Press enter key to continue or Ctrl-C to stop
```
The parameters here shows for what taosdemo will use for data insertion. By default, taosdemo without entering any command line arguments will simulate a city power grid system's meter data collection scenario as a typical application in the power industry. That is, a database named test will be created, and a super table named meters will be created, where the super table schema is following:
```
taos> describe test.meters;
Field | Type | Length | Note |
=================================================================================
ts | TIMESTAMP | 8 | |
current | FLOAT | 4 | |
voltage | INT | 4 | |
phase | FLOAT | 4 | |
groupid | INT | 4 | TAG |
location | BINARY | 64 | TAG |
Query OK, 6 row(s) in set (0.002972s)
```
After pressing any key taosdemo will create the database test and super table meters and generate 10,000 sub-tables representing 10,000 individule meter devices that report data. That means they independently using the super table meters as a template according to TDengine data modeling best practices.
```
taos> use test;
Database changed.
taos> show stables;
name | created_time | columns | tags | tables |
============================================================================================
meters | 2021-08-27 11:21:01.209 | 4 | 2 | 10000 |
Query OK, 1 row(s) in set (0.001740s)
```
```
taos> use test;
Database changed.
taos> show stables;
name | created_time | columns | tags | tables |
============================================================================================
meters | 2021-08-27 11:21:01.209 | 4 | 2 | 10000 |
Query OK, 1 row(s) in set (0.001740s)
```
Then taosdemo generates 10,000 records for each meter device.
```
...
====thread[3] completed total inserted rows: 6250000, total affected rows: 6250000. 347626.22 records/second====
[1]:100%
====thread[1] completed total inserted rows: 6250000, total affected rows: 6250000. 347481.98 records/second====
[4]:100%
====thread[4] completed total inserted rows: 6250000, total affected rows: 6250000. 347149.44 records/second====
[8]:100%
====thread[8] completed total inserted rows: 6250000, total affected rows: 6250000. 347082.43 records/second====
[6]:99%
[6]:100%
====thread[6] completed total inserted rows: 6250000, total affected rows: 6250000. 345586.35 records/second====
Spent 18.0863 seconds to insert rows: 100000000, affected rows: 100000000 with 16 thread(s) into test.meters. 5529049.90 records/second
insert delay, avg: 28.64ms, max: 112.92ms, min: 9.35ms
```
The above information is the result of a real test on a normal PC server with 8 CPUs and 64G RAM. It shows that taosdemo inserted 100,000,000 (no need to count, 100 million) records in 18 seconds, or an average of 552,909,049 records per second.
TDengine also offers a parameter-bind interface for better performance, and using the parameter-bind interface (taosdemo -I stmt) on the same hardware for the same amount of data writes, the results are as follows.
```
...
====thread[14] completed total inserted rows: 6250000, total affected rows: 6250000. 1097331.55 records/second====
[9]:97%
[4]:97%
[3]:97%
[3]:98%
[4]:98%
[9]:98%
[3]:99%
[4]:99%
[3]:100%
====thread[3] completed total inserted rows: 6250000, total affected rows: 6250000. 1089038.19 records/second====
[9]:99%
[4]:100%
====thread[4] completed total inserted rows: 6250000, total affected rows: 6250000. 1087123.09 records/second====
[9]:100%
====thread[9] completed total inserted rows: 6250000, total affected rows: 6250000. 1085689.38 records/second====
[11]:91%
[11]:92%
[11]:93%
[11]:94%
[11]:95%
[11]:96%
[11]:97%
[11]:98%
[11]:99%
[11]:100%
====thread[11] completed total inserted rows: 6250000, total affected rows: 6250000. 1039087.65 records/second====
Spent 6.0257 seconds to insert rows: 100000000, affected rows: 100000000 with 16 thread(s) into test.meters. 16595590.52 records/second
insert delay, avg: 8.31ms, max: 860.12ms, min: 2.00ms
```
It shows that taosdemo inserted 100 million records in 6 seconds, with a much more higher insertion performance, 1,659,590 records wer inserted per second.
Because taosdemo is so easy to use, so we have extended it with more features to support more complex parameter settings for sample data preparation and validation for rapid prototyping.
The complete list of taosdemo command-line arguments can be displayed via taosdemo --help as follows.
```
$ taosdemo --help
-f, --file=FILE The meta file to the execution procedure.
-u, --user=USER The user name to use when connecting to the server.
-p, --password The password to use when connecting to the server.
-c, --config-dir=CONFIG_DIR Configuration directory.
-h, --host=HOST TDengine server FQDN to connect. The default host is localhost.
-P, --port=PORT The TCP/IP port number to use for the connection.
-I, --interface=INTERFACE The interface (taosc, rest, and stmt) taosdemo uses. By default use 'taosc'.
-d, --database=DATABASE Destination database. By default is 'test'.
-a, --replica=REPLICA Set the replica parameters of the database, By default use 1, min: 1, max: 3.
-m, --table-prefix=TABLEPREFIX Table prefix name. By default use 'd'.
-s, --sql-file=FILE The select sql file.
-N, --normal-table Use normal table flag.
-o, --output=FILE Direct output to the named file. By default use './output.txt'.
-q, --query-mode=MODE Query mode -- 0: SYNC, 1: ASYNC. By default use SYNC.
-b, --data-type=DATATYPE The data_type of columns, By default use: FLOAT, INT, FLOAT.
-w, --binwidth=WIDTH The width of data_type 'BINARY' or 'NCHAR'. By default use 64
-l, --columns=COLUMNS The number of columns per record. Demo mode by default is 1 (float, int, float). Max values is 4095
All of the new column(s) type is INT. If use -b to specify column type, -l will be ignored.
-T, --threads=NUMBER The number of threads. By default use 8.
-i, --insert-interval=NUMBER The sleep time (ms) between insertion. By default is 0.
-S, --time-step=TIME_STEP The timestamp step between insertion. By default is 1.
-B, --interlace-rows=NUMBER The interlace rows of insertion. By default is 0.
-r, --rec-per-req=NUMBER The number of records per request. By default is 30000.
-t, --tables=NUMBER The number of tables. By default is 10000.
-n, --records=NUMBER The number of records per table. By default is 10000.
-M, --random The value of records generated are totally random.
By default to simulate power equipment scenario.
-x, --aggr-func Test aggregation functions after insertion.
-y, --answer-yes Input yes for prompt.
-O, --disorder=NUMBER Insert order mode--0: In order, 1 ~ 50: disorder ratio. By default is in order.
-R, --disorder-range=NUMBER Out of order data's range. Unit is ms. By default is 1000.
-g, --debug Print debug info.
-?, --help Give this help list
--usage Give a short usage message
-V, --version Print program version.
Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
Report bugs to <support@taosdata.com>.
```
taosdemo's parameters are designed to meet the needs of data simulation. A few commonly used parameters are described below.
```
-I, --interface=INTERFACE The interface (taosc, rest, and stmt) taosdemo uses. Default is 'taosc'.
```
The performance difference between different interfaces of taosdemo has been mentioned earlier, the -I parameter is used to select different interfaces, currently taosc, stmt and rest are supported. The -I parameter is used to select different interfaces, currently taosc, stmt and rest are supported. taosc uses SQL statements to write data, stmt uses parameter binding interface to write data, and rest uses RESTful protocol to write data.
```
-T, --threads=NUMBER The number of threads. Default is 8.
```
The -T parameter sets how many threads taosdemo uses to synchronize data writes, so that multiple threads can squeeze as much processing power out of the hardware as possible.
```
-b, --data-type=DATATYPE The data_type of columns, default: FLOAT, INT, FLOAT.
-w, --binwidth=WIDTH The width of data_type 'BINARY' or 'NCHAR'. Default is 64
-l, --columns=COLUMNS The number of columns per record. Demo mode by default is 3 (float, int, float). Max values is 4095
```
As mentioned earlier, tadosdemo creates a typical meter data reporting scenario by default, with each device containing three columns. They are current, voltage and phases. TDengine supports BOOL, TINYINT, SMALLINT, INT, BIGINT, FLOAT, DOUBLE, BINARY, NCHAR, TIMESTAMP data types. By using -b with a list of types allows you to specify the column list with customized data type. Using -w to specify the width of the columns of the BINARY and NCHAR data types (default is 64). The -l parameter can be added to the columns of the data type specified by the -b parameter with the total number of columns of the INT type, which reduces the manual input process in case of a particularly large number of columns, up to 4095 columns.
```
-r, --rec-per-req=NUMBER The number of records per request. Default is 30000.
```
To reach TDengine performance limits, data insertion can be executed by using multiple clients, multiple threads, and batch data insertions at once. The -r parameter sets the number of records batch that can be stitched together in a single write request, the default is 30,000. The effective number of spliced records is also related to the client buffer size, which is currently 1M Bytes. If the record column width is large, the maximum number of spliced records can be calculated by dividing 1M by the column width (in bytes).
```
-t, --tables=NUMBER The number of tables. Default is 10000.
-n, --records=NUMBER The number of records per table. Default is 10000.
-M, --random The value of records generated are totally random. The default is to simulate power equipment senario.
```
As mentioned earlier, taosdemo creates 10,000 tables by default, and each table writes 10,000 records. taosdemo can set the number of tables and the number of records in each table by -t and -n. The data generated by default without parameters are simulated real scenarios, and the simulated data are current and voltage phase values with certain jitter, which can more realistically show TDengine's efficient data compression ability. If you need to simulate the generation of completely random data, you can pass the -M parameter.
```
-y, --answer-yes Default input yes for prompt.
```
As we can see above, taosdemo outputs a list of parameters for the upcoming operation by default before creating a database or inserting data, so that the user can know what data is about to be written before inserting. To facilitate automatic testing, the -y parameter allows taosdemo to write data immediately after outputting the parameters.
```
-O, --disorder=NUMBER Insert order mode--0: In order, 1 ~ 50: disorder ratio. Default is in order.
-R, --disorder-range=NUMBER Out of order data's range, ms, default is 1000.
```
In some scenarios, the received data does not arrive in exact order, but contains a certain percentage of out-of-order data, which TDengine can also handle very well. In order to simulate the writing of out-of-order data, tadosdemo provides -O and -R parameters to be set. The -O parameter is the same as the -O parameter for fully ordered data writes. 1 to 50 is the percentage of data that contains out-of-order data. The -R parameter is the range of the timestamp offset of the out-of-order data, default is 1000 milliseconds. Also note that temporal data is uniquely identified by a timestamp, so garbled data may generate the exact same timestamp as previously written data, and such data may either be discarded (update 0) or overwrite existing data (update 1 or 2) depending on the update value created by the database, and the total number of data entries may not match the expected number of entries.
```
-g, --debug Print debug info.
```
If you are interested in the taosdemo insertion process or if the data insertion result is not as expected, you can use the -g parameter to make taosdemo print the debugging information in the process of the execution to the screen or import it to another file with the Linux redirect command to easily find the cause of the problem. In addition, taosdemo will also output the corresponding executed statements and debugging reasons to the screen after the execution fails. You can search the word "reason" to find the error reason information returned by the TDengine server.
```
-x, --aggr-func Test aggregation funtions after insertion.
```
TDengine is not only very powerful in insertion performance, but also in query performance due to its advanced database engine design. tadosdemo provides a -x function that performs the usual query operations and outputs the query consumption time after the insertion of data. The following is the result of a common query after inserting 100 million rows on the aforementioned server.
You can see that the select * fetch 100 million rows (not output to the screen) operation consumes only 1.26 seconds. The most of normal aggregation function for 100 million records usually takes only about 20 milliseconds, and even the longest count function takes less than 40 milliseconds.
```
taosdemo -I stmt -T 48 -y -x
...
...
select * took 1.266835 second(s)
...
select count(*) took 0.039684 second(s)
...
Where condition: groupid = 1
select avg(current) took 0.025897 second(s)
...
select sum(current) took 0.025622 second(s)
...
select max(current) took 0.026124 second(s)
...
...
select min(current) took 0.025812 second(s)
...
select first(current) took 0.024105 second(s)
...
```
In addition to the command line approach, taosdemo also supports take a JSON file as an incoming parameter to provide a richer set of settings. A typical JSON file would look like this.
```
{
"filetype": "insert",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"thread_count": 4,
"thread_count_create_tbl": 4,
"result_file": "./insert_res.txt",
"confirm_parameter_prompt": "no",
"insert_interval": 0,
"interlace_rows": 100,
"num_of_records_per_req": 100,
"databases": [{
"dbinfo": {
"name": "db",
"drop": "yes",
"replica": 1,
"days": 10,
"cache": 16,
"blocks": 8,
"precision": "ms",
"keep": 3650,
"minRows": 100,
"maxRows": 4096,
"comp":2,
"walLevel":1,
"cachelast":0,
"quorum":1,
"fsync":3000,
"update": 0
},
"super_tables": [{
"name": "stb",
"child_table_exists":"no",
"childtable_count": 100,
"childtable_prefix": "stb_",
"auto_create_table": "no",
"batch_create_tbl_num": 5,
"data_source": "rand",
"insert_mode": "taosc",
"insert_rows": 100000,
"childtable_limit": 10,
"childtable_offset":100,
"interlace_rows": 0,
"insert_interval":0,
"max_sql_len": 1024000,
"disorder_ratio": 0,
"disorder_range": 1000,
"timestamp_step": 10,
"start_timestamp": "2020-10-01 00:00:00.000",
"sample_format": "csv",
"sample_file": "./sample.csv",
"tags_file": "",
"columns": [{"type": "INT"}, {"type": "DOUBLE", "count":10}, {"type": "BINARY", "len": 16, "count":3}, {"type": "BINARY", "len": 32, "count":6}],
"tags": [{"type": "TINYINT", "count":2}, {"type": "BINARY", "len": 16, "count":5}]
}]
}]
}
```
For example, we can specify different number of threads for table creation and data insertion with "thread_count" and "thread_count_create_tbl". You can use a combination of "child_table_exists", "childtable_limit" and "childtable_offset" to use multiple taosdemo processes (even on different computers) to write to different ranges of child tables of the same super table at the same time. You can also import existing data by specifying the data source as a csv file with "data_source" and "sample_file".
Use taosdemo for query and subscription testing
--
taosdemo can not only write data, but also perform query and subscription functions. However, a taosdemo instance can only support one of these functions, not all three, and the configuration file is used to specify which function to test.
The following is the content of a typical query JSON example file.
```
{
"filetype": "query",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"confirm_parameter_prompt": "no",
"databases": "db",
"query_times": 2,
"query_mode": "taosc",
"specified_table_query": {
"query_interval": 1,
"concurrent": 3,
"sqls": [
{
"sql": "select last_row(*) from stb0 ",
"result": "./query_res0.txt"
},
{
"sql": "select count(*) from stb00_1",
"result": "./query_res1.txt"
}
]
},
"super_table_query": {
"stblname": "stb1",
"query_interval": 1,
"threads": 3,
"sqls": [
{
"sql": "select last_row(ts) from xxxx",
"result": "./query_res2.txt"
}
]
}
}
```
The following parameters are specific to the query in the JSON file.
"query_times": the number of queries per query type
"query_mode": query data interface, "tosc": call TDengine's c interface; "resetful": use restfule interface. Options are available. Default is "taosc".
"specified_table_query": { query for the specified table
"query_interval": interval to execute sqls, in seconds. Optional, default is 0.
"concurrent": the number of threads to execute sqls concurrently, optional, default is 1. Each thread executes all sqls.
"sqls": multiple sql statements can be added, support up to 100 statements.
"sql": query statement. Mandatory.
"result": the name of the file where the query result will be written. Optional, default is null, means the query result will not be written to the file.
"super_table_query": { query for all sub-tables in the super table
"stblname": the name of the super table. Mandatory.
"query_interval": interval to execute sqls, in seconds. Optional, default is 0.
"threads": the number of threads to execute sqls concurrently, optional, default is 1. Each thread is responsible for a part of sub-tables and executes all sqls.
"sql": "select count(*) from xxxx". Query statement for all sub-tables in the super table, where the table name must be written as "xxxx" and the instance will be replaced with the sub-table name automatically.
"result": the name of the file to which the query result is written. Optional, the default is null, which means the query results are not written to a file.
The following is a typical subscription JSON example file content.
```
{
"filetype":"subscribe",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"databases": "db",
"confirm_parameter_prompt": "no",
"specified_table_query":
{
"concurrent":1,
"mode":"sync",
"interval":0,
"restart":"yes",
"keepProgress":"yes",
"sqls": [
{
"sql": "select * from stb00_0 ;",
"result": "./subscribe_res0.txt"
}]
},
"super_table_query":
{
"stblname": "stb0",
"threads":1,
"mode":"sync",
"interval":10000,
"restart":"yes",
"keepProgress":"yes",
"sqls": [
{
"sql": "select * from xxxx where ts > '2021-02-25 11:35:00.000' ;",
"result": "./subscribe_res1.txt"
}]
}
}
```
The following are the meanings of the parameters specific to the subscription function.
"interval": interval for executing subscriptions, in seconds. Optional, default is 0.
"restart": subscription restart." yes": restart the subscription if it already exists, "no": continue the previous subscription. (Please note that the executing user needs to have read/write access to the dataDir directory)
"keepProgress": keep the progress of the subscription information. yes means keep the subscription information, no means don't keep it. The value is yes and restart is no to continue the previous subscriptions.
"resubAfterConsume": Used in conjunction with keepProgress to call unsubscribe after the subscription has been consumed the appropriate number of times and to subscribe again.
"result": the name of the file to which the query result is written. Optional, default is null, means the query result will not be written to the file. Note: The file to save the result after each sql statement cannot be renamed, and the file name will be appended with the thread number when generating the result file.
Conclusion
--
TDengine is a big data platform designed and optimized for IoT, Telematics, Industrial Internet, DevOps, etc. TDengine shows a high performance that far exceeds similar products due to the innovative data storage and query engine design in the database kernel. And withSQL syntax support and connectors for multiple programming languages (currently Java, Python, Go, C#, NodeJS, Rust, etc. are supported), it is extremely easy to use and has zero learning cost. To facilitate the operation and maintenance needs, we also provide data migration and monitoring functions and other related ecological tools and software.
For users who are new to TDengine, we have developed rich features for taosdemo to facilitate technical evaluation and stress testing. This article is a brief introduction to taosdemo, which will continue to evolve and improve as new features are added to TDengine.
As part of TDengine, taosdemo's source code is fully open on the GitHub. Suggestions or advices about the use or implementation of taosdemo or TDengine are welcomed on GitHub or in the Taos Data user group.
...@@ -181,6 +181,7 @@ taos> select avg(f1), max(f2), min(f3) from test.t10 interval(10s); ...@@ -181,6 +181,7 @@ taos> select avg(f1), max(f2), min(f3) from test.t10 interval(10s);
``` ```
**Note**: you can run command `taosdemo` with many options, like number of tables, rows of records and so on. To know more about these options, you can execute `taosdemo --help` and then take a try using different options. **Note**: you can run command `taosdemo` with many options, like number of tables, rows of records and so on. To know more about these options, you can execute `taosdemo --help` and then take a try using different options.
Please refer to [How to use taosdemo to test the performance of TDengine](https://www.taosdata.com/en/documentation/getting-started/taosdemo) for detail.
## Client and Alarm Module ## Client and Alarm Module
......
...@@ -192,6 +192,11 @@ else ...@@ -192,6 +192,11 @@ else
allocator_macro="" allocator_macro=""
fi fi
if [[ "$dbName" == "pro" ]]; then
sed -i "s/taos config/prodb config/g" ${top_dir}/src/util/src/tconfig.c
fi
# check support cpu type # check support cpu type
if [[ "$cpuType" == "x64" ]] || [[ "$cpuType" == "aarch64" ]] || [[ "$cpuType" == "aarch32" ]] || [[ "$cpuType" == "mips64" ]] ; then if [[ "$cpuType" == "x64" ]] || [[ "$cpuType" == "aarch64" ]] || [[ "$cpuType" == "aarch32" ]] || [[ "$cpuType" == "mips64" ]] ; then
if [ "$verMode" != "cluster" ]; then if [ "$verMode" != "cluster" ]; then
......
...@@ -1002,6 +1002,7 @@ function install_TDengine() { ...@@ -1002,6 +1002,7 @@ function install_TDengine() {
echo echo
echo -e "\033[44;32;1mTDengine client is installed successfully!${NC}" echo -e "\033[44;32;1mTDengine client is installed successfully!${NC}"
fi fi
touch ~/.taos_history touch ~/.taos_history
rm -rf $(tar -tf taos.tar.gz) rm -rf $(tar -tf taos.tar.gz)
} }
......
...@@ -154,9 +154,9 @@ function install_main_path() { ...@@ -154,9 +154,9 @@ function install_main_path() {
${csudo} mkdir -p ${install_main_dir} ${csudo} mkdir -p ${install_main_dir}
${csudo} mkdir -p ${install_main_dir}/cfg ${csudo} mkdir -p ${install_main_dir}/cfg
${csudo} mkdir -p ${install_main_dir}/bin ${csudo} mkdir -p ${install_main_dir}/bin
${csudo} mkdir -p ${install_main_dir}/connector # ${csudo} mkdir -p ${install_main_dir}/connector
${csudo} mkdir -p ${install_main_dir}/driver ${csudo} mkdir -p ${install_main_dir}/driver
${csudo} mkdir -p ${install_main_dir}/examples # ${csudo} mkdir -p ${install_main_dir}/examples
${csudo} mkdir -p ${install_main_dir}/include ${csudo} mkdir -p ${install_main_dir}/include
${csudo} mkdir -p ${install_main_dir}/init.d ${csudo} mkdir -p ${install_main_dir}/init.d
if [ "$verMode" == "cluster" ]; then if [ "$verMode" == "cluster" ]; then
...@@ -779,10 +779,10 @@ function update_prodb() { ...@@ -779,10 +779,10 @@ function update_prodb() {
install_log install_log
install_header install_header
install_lib install_lib
if [ "$pagMode" != "lite" ]; then # if [ "$pagMode" != "lite" ]; then
install_connector # install_connector
fi # fi
install_examples # install_examples
if [ -z $1 ]; then if [ -z $1 ]; then
install_bin install_bin
install_service install_service
...@@ -853,10 +853,10 @@ function install_prodb() { ...@@ -853,10 +853,10 @@ function install_prodb() {
install_header install_header
install_lib install_lib
install_jemalloc install_jemalloc
if [ "$pagMode" != "lite" ]; then # if [ "$pagMode" != "lite" ]; then
install_connector # install_connector
fi # fi
install_examples # install_examples
if [ -z $1 ]; then # install service and client if [ -z $1 ]; then # install service and client
# For installing new # For installing new
......
文件模式从 100644 更改为 100755
...@@ -24,7 +24,7 @@ build_dir="${compile_dir}/build" ...@@ -24,7 +24,7 @@ build_dir="${compile_dir}/build"
code_dir="${top_dir}/src" code_dir="${top_dir}/src"
release_dir="${top_dir}/release" release_dir="${top_dir}/release"
#package_name='linux' # package_name='linux'
if [ "$verMode" == "cluster" ]; then if [ "$verMode" == "cluster" ]; then
install_dir="${release_dir}/ProDB-enterprise-server-${version}" install_dir="${release_dir}/ProDB-enterprise-server-${version}"
else else
...@@ -45,19 +45,13 @@ nginx_dir="${code_dir}/../../enterprise/src/plugins/web" ...@@ -45,19 +45,13 @@ nginx_dir="${code_dir}/../../enterprise/src/plugins/web"
mkdir -p ${install_dir} mkdir -p ${install_dir}
mkdir -p ${install_dir}/inc && cp ${header_files} ${install_dir}/inc mkdir -p ${install_dir}/inc && cp ${header_files} ${install_dir}/inc
mkdir -p ${install_dir}/cfg && cp ${cfg_dir}/taos.cfg ${install_dir}/cfg/taos.cfg mkdir -p ${install_dir}/cfg && cp ${cfg_dir}/taos.cfg ${install_dir}/cfg/taos.cfg
#mkdir -p ${install_dir}/bin && cp ${bin_files} ${install_dir}/bin && chmod a+x ${install_dir}/bin/* || :
mkdir -p ${install_dir}/bin mkdir -p ${install_dir}/bin
# bin
if [ "$pagMode" == "lite" ]; then if [ "$pagMode" == "lite" ]; then
strip ${build_dir}/bin/taosd strip ${build_dir}/bin/taosd
strip ${build_dir}/bin/taos strip ${build_dir}/bin/taos
cp ${build_dir}/bin/taos ${install_dir}/bin/prodbc
cp ${build_dir}/bin/taosd ${install_dir}/bin/prodbs
cp ${script_dir}/remove_pro.sh ${install_dir}/bin
else else
cp ${build_dir}/bin/taos ${install_dir}/bin/prodbc
cp ${build_dir}/bin/taosd ${install_dir}/bin/prodbs
cp ${script_dir}/remove_pro.sh ${install_dir}/bin
cp ${build_dir}/bin/taosdemo ${install_dir}/bin/prodemo cp ${build_dir}/bin/taosdemo ${install_dir}/bin/prodemo
cp ${build_dir}/bin/taosdump ${install_dir}/bin/prodump cp ${build_dir}/bin/taosdump ${install_dir}/bin/prodump
cp ${build_dir}/bin/tarbitrator ${install_dir}/bin cp ${build_dir}/bin/tarbitrator ${install_dir}/bin
...@@ -66,13 +60,16 @@ else ...@@ -66,13 +60,16 @@ else
cp ${script_dir}/startPre.sh ${install_dir}/bin cp ${script_dir}/startPre.sh ${install_dir}/bin
cp ${script_dir}/taosd-dump-cfg.gdb ${install_dir}/bin cp ${script_dir}/taosd-dump-cfg.gdb ${install_dir}/bin
fi fi
cp ${build_dir}/bin/taos ${install_dir}/bin/prodbc
cp ${build_dir}/bin/taosd ${install_dir}/bin/prodbs
cp ${script_dir}/remove_pro.sh ${install_dir}/bin
chmod a+x ${install_dir}/bin/* || : chmod a+x ${install_dir}/bin/* || :
# cluster
if [ "$verMode" == "cluster" ]; then if [ "$verMode" == "cluster" ]; then
sed 's/verMode=edge/verMode=cluster/g' ${install_dir}/bin/remove_pro.sh >> remove_prodb_temp.sh sed 's/verMode=edge/verMode=cluster/g' ${install_dir}/bin/remove_pro.sh >> remove_prodb_temp.sh
mv remove_prodb_temp.sh ${install_dir}/bin/remove_pro.sh mv remove_prodb_temp.sh ${install_dir}/bin/remove_pro.sh
mkdir -p ${install_dir}/nginxd && cp -r ${nginx_dir}/* ${install_dir}/nginxd mkdir -p ${install_dir}/nginxd && cp -r ${nginx_dir}/* ${install_dir}/nginxd
cp ${nginx_dir}/png/taos.png ${install_dir}/nginxd/admin/images/taos.png cp ${nginx_dir}/png/taos.png ${install_dir}/nginxd/admin/images/taos.png
rm -rf ${install_dir}/nginxd/png rm -rf ${install_dir}/nginxd/png
...@@ -85,14 +82,9 @@ if [ "$verMode" == "cluster" ]; then ...@@ -85,14 +82,9 @@ if [ "$verMode" == "cluster" ]; then
sed -i -e 's/<th style="font-weight: normal">taosd<\/th>/<th style="font-weight: normal">prodbs<\/th>/g' ${install_dir}/nginxd/admin/monitor.html sed -i -e 's/<th style="font-weight: normal">taosd<\/th>/<th style="font-weight: normal">prodbs<\/th>/g' ${install_dir}/nginxd/admin/monitor.html
sed -i -e "s/data:\['taosd', 'system'\],/data:\['prodbs', 'system'\],/g" ${install_dir}/nginxd/admin/monitor.html sed -i -e "s/data:\['taosd', 'system'\],/data:\['prodbs', 'system'\],/g" ${install_dir}/nginxd/admin/monitor.html
sed -i -e "s/name: 'taosd',/name: 'prodbs',/g" ${install_dir}/nginxd/admin/monitor.html sed -i -e "s/name: 'taosd',/name: 'prodbs',/g" ${install_dir}/nginxd/admin/monitor.html
sed -i "s/TDengine/ProDB/g" ${install_dir}/nginxd/admin/*.html sed -i "s/TDengine/ProDB/g" ${install_dir}/nginxd/admin/*.html
sed -i "s/TDengine/ProDB/g" ${install_dir}/nginxd/admin/js/*.js sed -i "s/TDengine/ProDB/g" ${install_dir}/nginxd/admin/js/*.js
sed -i '/dataDir/ {s/taos/ProDB/g}' ${install_dir}/cfg/taos.cfg
sed -i '/logDir/ {s/taos/ProDB/g}' ${install_dir}/cfg/taos.cfg
sed -i "s/TDengine/ProDB/g" ${install_dir}/cfg/taos.cfg
if [ "$cpuType" == "aarch64" ]; then if [ "$cpuType" == "aarch64" ]; then
cp -f ${install_dir}/nginxd/sbin/arm/64bit/nginx ${install_dir}/nginxd/sbin/ cp -f ${install_dir}/nginxd/sbin/arm/64bit/nginx ${install_dir}/nginxd/sbin/
elif [ "$cpuType" == "aarch32" ]; then elif [ "$cpuType" == "aarch32" ]; then
...@@ -101,6 +93,13 @@ if [ "$verMode" == "cluster" ]; then ...@@ -101,6 +93,13 @@ if [ "$verMode" == "cluster" ]; then
rm -rf ${install_dir}/nginxd/sbin/arm rm -rf ${install_dir}/nginxd/sbin/arm
fi fi
sed -i '/dataDir/ {s/taos/ProDB/g}' ${install_dir}/cfg/taos.cfg
sed -i '/logDir/ {s/taos/ProDB/g}' ${install_dir}/cfg/taos.cfg
sed -i "s/TDengine/ProDB/g" ${install_dir}/cfg/taos.cfg
sed -i "s/support@taosdata.com/support@hanatech.com.cn/g" ${install_dir}/cfg/taos.cfg
sed -i "s/taos client/prodbc/g" ${install_dir}/cfg/taos.cfg
sed -i "s/taosd/prodbs/g" ${install_dir}/cfg/taos.cfg
cd ${install_dir} cd ${install_dir}
tar -zcv -f prodb.tar.gz * --remove-files || : tar -zcv -f prodb.tar.gz * --remove-files || :
exitcode=$? exitcode=$?
...@@ -116,58 +115,62 @@ if [ "$verMode" == "cluster" ]; then ...@@ -116,58 +115,62 @@ if [ "$verMode" == "cluster" ]; then
mv install_prodb_temp.sh ${install_dir}/install_pro.sh mv install_prodb_temp.sh ${install_dir}/install_pro.sh
fi fi
if [ "$pagMode" == "lite" ]; then if [ "$pagMode" == "lite" ]; then
sed 's/pagMode=full/pagMode=lite/g' ${install_dir}/install.sh >> install_prodb_temp.sh sed -e "s/pagMode=full/pagMode=lite/g" -e "s/taos_history/prodb_history/g" ${install_dir}/install.sh >> install_prodb_temp.sh
mv install_prodb_temp.sh ${install_dir}/install_pro.sh mv install_prodb_temp.sh ${install_dir}/install_pro.sh
fi fi
sed -i "/install_connector$/d" ${install_dir}/install_pro.sh
sed -i "/install_examples$/d" ${install_dir}/install_pro.sh
chmod a+x ${install_dir}/install_pro.sh chmod a+x ${install_dir}/install_pro.sh
# Copy example code # Copy example code
mkdir -p ${install_dir}/examples #mkdir -p ${install_dir}/examples
examples_dir="${top_dir}/tests/examples" #examples_dir="${top_dir}/tests/examples"
cp -r ${examples_dir}/c ${install_dir}/examples #cp -r ${examples_dir}/c ${install_dir}/examples
sed -i '/passwd/ {s/taosdata/prodb/g}' ${install_dir}/examples/c/*.c #sed -i '/passwd/ {s/taosdata/prodb/g}' ${install_dir}/examples/c/*.c
sed -i '/root/ {s/taosdata/prodb/g}' ${install_dir}/examples/c/*.c #sed -i '/root/ {s/taosdata/prodb/g}' ${install_dir}/examples/c/*.c
#
if [[ "$pagMode" != "lite" ]] && [[ "$cpuType" != "aarch32" ]]; then #if [[ "$pagMode" != "lite" ]] && [[ "$cpuType" != "aarch32" ]]; then
cp -r ${examples_dir}/JDBC ${install_dir}/examples # cp -r ${examples_dir}/JDBC ${install_dir}/examples
cp -r ${examples_dir}/matlab ${install_dir}/examples # cp -r ${examples_dir}/matlab ${install_dir}/examples
mv ${install_dir}/examples/matlab/TDengineDemo.m ${install_dir}/examples/matlab/ProDBDemo.m # mv ${install_dir}/examples/matlab/TDengineDemo.m ${install_dir}/examples/matlab/ProDBDemo.m
sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/examples/matlab/ProDBDemo.m # sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/examples/matlab/ProDBDemo.m
cp -r ${examples_dir}/python ${install_dir}/examples # cp -r ${examples_dir}/python ${install_dir}/examples
sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/examples/python/read_example.py # sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/examples/python/read_example.py
cp -r ${examples_dir}/R ${install_dir}/examples # cp -r ${examples_dir}/R ${install_dir}/examples
sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/examples/R/command.txt # sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/examples/R/command.txt
cp -r ${examples_dir}/go ${install_dir}/examples # cp -r ${examples_dir}/go ${install_dir}/examples
mv ${install_dir}/examples/go/taosdemo.go ${install_dir}/examples/go/prodemo.go # mv ${install_dir}/examples/go/taosdemo.go ${install_dir}/examples/go/prodemo.go
sed -i '/root/ {s/taosdata/prodb/g}' ${install_dir}/examples/go/prodemo.go # sed -i '/root/ {s/taosdata/prodb/g}' ${install_dir}/examples/go/prodemo.go
fi #fi
# Copy driver # Copy driver
mkdir -p ${install_dir}/driver && cp ${lib_files} ${install_dir}/driver && echo "${versionComp}" > ${install_dir}/driver/vercomp.txt mkdir -p ${install_dir}/driver && cp ${lib_files} ${install_dir}/driver && echo "${versionComp}" > ${install_dir}/driver/vercomp.txt
# Copy connector # Copy connector
connector_dir="${code_dir}/connector" #connector_dir="${code_dir}/connector"
mkdir -p ${install_dir}/connector #mkdir -p ${install_dir}/connector
if [[ "$pagMode" != "lite" ]] && [[ "$cpuType" != "aarch32" ]]; then #if [[ "$pagMode" != "lite" ]] && [[ "$cpuType" != "aarch32" ]]; then
cp ${build_dir}/lib/*.jar ${install_dir}/connector ||: # cp ${build_dir}/lib/*.jar ${install_dir}/connector ||:
if [ -d "${connector_dir}/grafanaplugin/dist" ]; then # if [ -d "${connector_dir}/grafanaplugin/dist" ]; then
cp -r ${connector_dir}/grafanaplugin/dist ${install_dir}/connector/grafanaplugin # cp -r ${connector_dir}/grafanaplugin/dist ${install_dir}/connector/grafanaplugin
else # else
echo "WARNING: grafanaplugin bundled dir not found, please check if want to use it!" # echo "WARNING: grafanaplugin bundled dir not found, please check if want to use it!"
fi # fi
if find ${connector_dir}/go -mindepth 1 -maxdepth 1 | read; then # if find ${connector_dir}/go -mindepth 1 -maxdepth 1 | read; then
cp -r ${connector_dir}/go ${install_dir}/connector # cp -r ${connector_dir}/go ${install_dir}/connector
else # else
echo "WARNING: go connector not found, please check if want to use it!" # echo "WARNING: go connector not found, please check if want to use it!"
fi # fi
cp -r ${connector_dir}/python ${install_dir}/connector/ # cp -r ${connector_dir}/python ${install_dir}/connector/
mv ${install_dir}/connector/python/taos ${install_dir}/connector/python/prodb # mv ${install_dir}/connector/python/taos ${install_dir}/connector/python/prodb
sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/connector/python/prodb/cinterface.py # sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/connector/python/prodb/cinterface.py
sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/connector/python/prodb/subscription.py # sed -i '/password/ {s/taosdata/prodb/g}' ${install_dir}/connector/python/prodb/subscription.py
sed -i '/self._password/ {s/taosdata/prodb/g}' ${install_dir}/connector/python/prodb/connection.py # sed -i '/self._password/ {s/taosdata/prodb/g}' ${install_dir}/connector/python/prodb/connection.py
fi #fi
cd ${release_dir} cd ${release_dir}
......
...@@ -180,7 +180,7 @@ bool tscQueryBlockInfo(SQueryInfo* pQueryInfo); ...@@ -180,7 +180,7 @@ bool tscQueryBlockInfo(SQueryInfo* pQueryInfo);
SExprInfo* tscAddFuncInSelectClause(SQueryInfo* pQueryInfo, int32_t outputColIndex, int16_t functionId, SExprInfo* tscAddFuncInSelectClause(SQueryInfo* pQueryInfo, int32_t outputColIndex, int16_t functionId,
SColumnIndex* pIndex, SSchema* pColSchema, int16_t colType, int16_t colId); SColumnIndex* pIndex, SSchema* pColSchema, int16_t colType, int16_t colId);
int32_t tscSetTableFullName(SName* pName, SStrToken* pzTableName, SSqlObj* pSql); int32_t tscSetTableFullName(SName* pName, SStrToken* pzTableName, SSqlObj* pSql, bool dbIncluded);
void tscClearInterpInfo(SQueryInfo* pQueryInfo); void tscClearInterpInfo(SQueryInfo* pQueryInfo);
bool tscIsInsertData(char* sqlstr); bool tscIsInsertData(char* sqlstr);
...@@ -251,7 +251,7 @@ void tscColumnListCopyAll(SArray* dst, const SArray* src); ...@@ -251,7 +251,7 @@ void tscColumnListCopyAll(SArray* dst, const SArray* src);
void convertQueryResult(SSqlRes* pRes, SQueryInfo* pQueryInfo, uint64_t objId, bool convertNchar); void convertQueryResult(SSqlRes* pRes, SQueryInfo* pQueryInfo, uint64_t objId, bool convertNchar);
void tscDequoteAndTrimToken(SStrToken* pToken); void tscDequoteAndTrimToken(SStrToken* pToken);
int32_t tscValidateName(SStrToken* pToken); int32_t tscValidateName(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded);
void tscIncStreamExecutionCount(void* pStream); void tscIncStreamExecutionCount(void* pStream);
......
...@@ -398,7 +398,7 @@ static int32_t tscSCreateBuildResultFields(SSqlObj *pSql, BuildType type, const ...@@ -398,7 +398,7 @@ static int32_t tscSCreateBuildResultFields(SSqlObj *pSql, BuildType type, const
TAOS_FIELD f; TAOS_FIELD f;
if (type == SCREATE_BUILD_TABLE) { if (type == SCREATE_BUILD_TABLE) {
f.type = TSDB_DATA_TYPE_BINARY; f.type = TSDB_DATA_TYPE_BINARY;
f.bytes = (TSDB_COL_NAME_LEN - 1) + VARSTR_HEADER_SIZE; f.bytes = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE;
tstrncpy(f.name, "Table", sizeof(f.name)); tstrncpy(f.name, "Table", sizeof(f.name));
} else { } else {
f.type = TSDB_DATA_TYPE_BINARY; f.type = TSDB_DATA_TYPE_BINARY;
...@@ -465,7 +465,7 @@ int32_t tscRebuildCreateTableStatement(void *param,char *result) { ...@@ -465,7 +465,7 @@ int32_t tscRebuildCreateTableStatement(void *param,char *result) {
code = tscGetTableTagValue(builder, buf); code = tscGetTableTagValue(builder, buf);
if (code == TSDB_CODE_SUCCESS) { if (code == TSDB_CODE_SUCCESS) {
snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "CREATE TABLE %s USING %s TAGS %s", builder->buf, builder->sTableName, buf); snprintf(result + strlen(result), TSDB_MAX_BINARY_LEN - strlen(result), "CREATE TABLE `%s` USING `%s` TAGS %s", builder->buf, builder->sTableName, buf);
code = tscSCreateBuildResult(builder->pParentSql, SCREATE_BUILD_TABLE, builder->buf, result); code = tscSCreateBuildResult(builder->pParentSql, SCREATE_BUILD_TABLE, builder->buf, result);
} }
free(buf); free(buf);
...@@ -574,12 +574,14 @@ static int32_t tscRebuildDDLForSubTable(SSqlObj *pSql, const char *tableName, ch ...@@ -574,12 +574,14 @@ static int32_t tscRebuildDDLForSubTable(SSqlObj *pSql, const char *tableName, ch
} }
char fullName[TSDB_TABLE_FNAME_LEN * 2] = {0}; char fullName[TSDB_TABLE_FNAME_LEN * 2] = {0};
char tblName[TSDB_TABLE_NAME_LEN + 1] = {0};
tNameGetDbName(&pTableMetaInfo->name, fullName); tNameGetDbName(&pTableMetaInfo->name, fullName);
extractTableName(pMeta->sTableName, param->sTableName); extractTableName(pMeta->sTableName, param->sTableName);
snprintf(fullName + strlen(fullName), TSDB_TABLE_FNAME_LEN - strlen(fullName), ".%s", param->sTableName); snprintf(fullName + strlen(fullName), TSDB_TABLE_FNAME_LEN - strlen(fullName), ".`%s`", param->sTableName);
strncpy(param->buf, tNameGetTableName(&pTableMetaInfo->name), TSDB_TABLE_NAME_LEN); strncpy(param->buf, tNameGetTableName(&pTableMetaInfo->name), TSDB_TABLE_NAME_LEN);
tableNameToStr(tblName, param->buf, '\'');
param->pParentSql = pSql; param->pParentSql = pSql;
param->pInterSql = pInterSql; param->pInterSql = pInterSql;
...@@ -602,7 +604,7 @@ static int32_t tscRebuildDDLForSubTable(SSqlObj *pSql, const char *tableName, ch ...@@ -602,7 +604,7 @@ static int32_t tscRebuildDDLForSubTable(SSqlObj *pSql, const char *tableName, ch
return code; return code;
} }
snprintf(query + strlen(query), TSDB_MAX_BINARY_LEN - strlen(query), "SELECT %s FROM %s WHERE TBNAME IN(\'%s\')", columns, fullName, param->buf); snprintf(query + strlen(query), TSDB_MAX_BINARY_LEN - strlen(query), "SELECT %s FROM %s WHERE TBNAME IN(\'%s\')", columns, fullName, tblName);
doAsyncQuery(pSql->pTscObj, pInterSql, tscSCreateCallBack, param, query, strlen(query)); doAsyncQuery(pSql->pTscObj, pInterSql, tscSCreateCallBack, param, query, strlen(query));
free(query); free(query);
free(columns); free(columns);
...@@ -619,7 +621,7 @@ static int32_t tscRebuildDDLForNormalTable(SSqlObj *pSql, const char *tableName, ...@@ -619,7 +621,7 @@ static int32_t tscRebuildDDLForNormalTable(SSqlObj *pSql, const char *tableName,
SSchema *pSchema = tscGetTableSchema(pMeta); SSchema *pSchema = tscGetTableSchema(pMeta);
char *result = ddl; char *result = ddl;
sprintf(result, "create table %s (", tableName); sprintf(result, "create table `%s` (", tableName);
for (int32_t i = 0; i < numOfRows; ++i) { for (int32_t i = 0; i < numOfRows; ++i) {
uint8_t type = pSchema[i].type; uint8_t type = pSchema[i].type;
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) { if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
...@@ -646,7 +648,7 @@ static int32_t tscRebuildDDLForSuperTable(SSqlObj *pSql, const char *tableName, ...@@ -646,7 +648,7 @@ static int32_t tscRebuildDDLForSuperTable(SSqlObj *pSql, const char *tableName,
int32_t totalRows = numOfRows + tscGetNumOfTags(pMeta); int32_t totalRows = numOfRows + tscGetNumOfTags(pMeta);
SSchema *pSchema = tscGetTableSchema(pMeta); SSchema *pSchema = tscGetTableSchema(pMeta);
sprintf(result, "create table %s (", tableName); sprintf(result, "create table `%s` (", tableName);
for (int32_t i = 0; i < numOfRows; ++i) { for (int32_t i = 0; i < numOfRows; ++i) {
uint8_t type = pSchema[i].type; uint8_t type = pSchema[i].type;
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) { if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
......
...@@ -906,6 +906,18 @@ static int32_t doParseInsertStatement(SInsertStatementParam *pInsertParam, char ...@@ -906,6 +906,18 @@ static int32_t doParseInsertStatement(SInsertStatementParam *pInsertParam, char
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
int validateTableName(char *tblName, int len, SStrToken* psTblToken, bool *dbIncluded) {
tstrncpy(psTblToken->z, tblName, TSDB_TABLE_FNAME_LEN);
psTblToken->n = len;
psTblToken->type = TK_ID;
tGetToken(psTblToken->z, &psTblToken->type);
return tscValidateName(psTblToken, true, dbIncluded);
}
static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundColumn) { static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundColumn) {
int32_t index = 0; int32_t index = 0;
SStrToken sToken = {0}; SStrToken sToken = {0};
...@@ -968,13 +980,27 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC ...@@ -968,13 +980,27 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC
sToken = tStrGetToken(sql, &index, false); sToken = tStrGetToken(sql, &index, false);
sql += index; sql += index;
if (sToken.type == TK_ILLEGAL) {
return tscSQLSyntaxErrMsg(pCmd->payload, NULL, sql);
}
//the source super table is moved to the secondary position of the pTableMetaInfo list //the source super table is moved to the secondary position of the pTableMetaInfo list
if (pQueryInfo->numOfTables < 2) { if (pQueryInfo->numOfTables < 2) {
tscAddEmptyMetaInfo(pQueryInfo); tscAddEmptyMetaInfo(pQueryInfo);
} }
bool dbIncluded1 = false;
char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken;
sTblToken.z = buf;
code = validateTableName(sToken.z, sToken.n, &sTblToken, &dbIncluded1);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
STableMetaInfo *pSTableMetaInfo = tscGetMetaInfo(pQueryInfo, STABLE_INDEX); STableMetaInfo *pSTableMetaInfo = tscGetMetaInfo(pQueryInfo, STABLE_INDEX);
code = tscSetTableFullName(&pSTableMetaInfo->name, &sToken, pSql); code = tscSetTableFullName(&pSTableMetaInfo->name, &sTblToken, pSql, dbIncluded1);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -988,7 +1014,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC ...@@ -988,7 +1014,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC
} }
if (!UTIL_TABLE_IS_SUPER_TABLE(pSTableMetaInfo)) { if (!UTIL_TABLE_IS_SUPER_TABLE(pSTableMetaInfo)) {
return tscInvalidOperationMsg(pInsertParam->msg, "create table only from super table is allowed", sToken.z); return tscInvalidOperationMsg(pInsertParam->msg, "create table only from super table is allowed", sTblToken.z);
} }
SSchema *pTagSchema = tscGetTableTagSchema(pSTableMetaInfo->pTableMeta); SSchema *pTagSchema = tscGetTableTagSchema(pSTableMetaInfo->pTableMeta);
...@@ -1144,12 +1170,16 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC ...@@ -1144,12 +1170,16 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC
} }
sql = sToken.z; sql = sToken.z;
bool dbIncluded2 = false;
sTblToken.z = buf;
if (tscValidateName(&tableToken) != TSDB_CODE_SUCCESS) { code = validateTableName(tableToken.z, tableToken.n, &sTblToken, &dbIncluded2);
if (code != TSDB_CODE_SUCCESS) {
return tscInvalidOperationMsg(pInsertParam->msg, "invalid table name", *sqlstr); return tscInvalidOperationMsg(pInsertParam->msg, "invalid table name", *sqlstr);
} }
int32_t ret = tscSetTableFullName(&pTableMetaInfo->name, &tableToken, pSql); int32_t ret = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded2);
if (ret != TSDB_CODE_SUCCESS) { if (ret != TSDB_CODE_SUCCESS) {
return ret; return ret;
} }
...@@ -1179,16 +1209,6 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC ...@@ -1179,16 +1209,6 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql, char** boundC
return code; return code;
} }
int validateTableName(char *tblName, int len, SStrToken* psTblToken) {
tstrncpy(psTblToken->z, tblName, TSDB_TABLE_FNAME_LEN);
psTblToken->n = len;
psTblToken->type = TK_ID;
tGetToken(psTblToken->z, &psTblToken->type);
return tscValidateName(psTblToken);
}
static int32_t validateDataSource(SInsertStatementParam *pInsertParam, int32_t type, const char *sql) { static int32_t validateDataSource(SInsertStatementParam *pInsertParam, int32_t type, const char *sql) {
uint32_t *insertType = &pInsertParam->insertType; uint32_t *insertType = &pInsertParam->insertType;
if (*insertType == TSDB_QUERY_TYPE_STMT_INSERT && type == TSDB_QUERY_TYPE_INSERT) { if (*insertType == TSDB_QUERY_TYPE_STMT_INSERT && type == TSDB_QUERY_TYPE_INSERT) {
...@@ -1409,13 +1429,14 @@ int tsParseInsertSql(SSqlObj *pSql) { ...@@ -1409,13 +1429,14 @@ int tsParseInsertSql(SSqlObj *pSql) {
char buf[TSDB_TABLE_FNAME_LEN]; char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken; SStrToken sTblToken;
sTblToken.z = buf; sTblToken.z = buf;
bool dbIncluded = false;
// Check if the table name available or not // Check if the table name available or not
if (validateTableName(sToken.z, sToken.n, &sTblToken) != TSDB_CODE_SUCCESS) { if (validateTableName(sToken.z, sToken.n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS) {
code = tscInvalidOperationMsg(pInsertParam->msg, "table name invalid", sToken.z); code = tscInvalidOperationMsg(pInsertParam->msg, "table name invalid", sToken.z);
goto _clean; goto _clean;
} }
if ((code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql)) != TSDB_CODE_SUCCESS) { if ((code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded)) != TSDB_CODE_SUCCESS) {
goto _clean; goto _clean;
} }
......
...@@ -558,8 +558,10 @@ static int32_t retrieveTableMeta(TAOS* taos, char* tableName, STableMeta** pTabl ...@@ -558,8 +558,10 @@ static int32_t retrieveTableMeta(TAOS* taos, char* tableName, STableMeta** pTabl
registerSqlObj(pSql); registerSqlObj(pSql);
SStrToken tableToken = {.z = tableNameLowerCase, .n = (uint32_t)strlen(tableNameLowerCase), .type = TK_ID}; SStrToken tableToken = {.z = tableNameLowerCase, .n = (uint32_t)strlen(tableNameLowerCase), .type = TK_ID};
tGetToken(tableNameLowerCase, &tableToken.type); tGetToken(tableNameLowerCase, &tableToken.type);
bool dbIncluded = false;
// Check if the table name available or not // Check if the table name available or not
if (tscValidateName(&tableToken) != TSDB_CODE_SUCCESS) { if (tscValidateName(&tableToken, true, &dbIncluded) != TSDB_CODE_SUCCESS) {
code = TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH; code = TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH;
sprintf(pSql->cmd.payload, "table name is invalid"); sprintf(pSql->cmd.payload, "table name is invalid");
tscFreeRegisteredSqlObj(pSql); tscFreeRegisteredSqlObj(pSql);
...@@ -567,7 +569,7 @@ static int32_t retrieveTableMeta(TAOS* taos, char* tableName, STableMeta** pTabl ...@@ -567,7 +569,7 @@ static int32_t retrieveTableMeta(TAOS* taos, char* tableName, STableMeta** pTabl
} }
SName sname = {0}; SName sname = {0};
if ((code = tscSetTableFullName(&sname, &tableToken, pSql)) != TSDB_CODE_SUCCESS) { if ((code = tscSetTableFullName(&sname, &tableToken, pSql, dbIncluded)) != TSDB_CODE_SUCCESS) {
tscFreeRegisteredSqlObj(pSql); tscFreeRegisteredSqlObj(pSql);
return code; return code;
} }
......
...@@ -63,12 +63,7 @@ static int32_t parseTelnetMetric(TAOS_SML_DATA_POINT *pSml, const char **index, ...@@ -63,12 +63,7 @@ static int32_t parseTelnetMetric(TAOS_SML_DATA_POINT *pSml, const char **index,
} }
} }
//convert dot to underscore for now, will be removed once dot is allowed in tbname. pSml->stableName[len] = *cur;
if (*cur == '.') {
pSml->stableName[len] = '_';
} else {
pSml->stableName[len] = tolower(*cur);
}
cur++; cur++;
len++; len++;
...@@ -486,13 +481,6 @@ static int32_t parseMetricFromJSON(cJSON *root, TAOS_SML_DATA_POINT* pSml, SSmlL ...@@ -486,13 +481,6 @@ static int32_t parseMetricFromJSON(cJSON *root, TAOS_SML_DATA_POINT* pSml, SSmlL
return TSDB_CODE_TSC_INVALID_JSON; return TSDB_CODE_TSC_INVALID_JSON;
} }
//convert dot to underscore for now, will be removed once dot is allowed in tbname.
for (int i = 0; i < stableLen; ++i) {
if (metric->valuestring[i] == '.') {
metric->valuestring[i] = '_';
}
}
tstrncpy(pSml->stableName, metric->valuestring, stableLen + 1); tstrncpy(pSml->stableName, metric->valuestring, stableLen + 1);
strntolower_s(pSml->stableName, pSml->stableName, (int32_t)stableLen); strntolower_s(pSml->stableName, pSml->stableName, (int32_t)stableLen);
......
...@@ -1585,9 +1585,10 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags ...@@ -1585,9 +1585,10 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
SSqlObj* pSql = pStmt->pSql; SSqlObj* pSql = pStmt->pSql;
SSqlCmd* pCmd = &pSql->cmd; SSqlCmd* pCmd = &pSql->cmd;
uint32_t nameLen = (uint32_t)strlen(name);
if (name == NULL) { if (name == NULL || nameLen <= 0) {
tscError("0x%"PRIx64" name is NULL", pSql->self); tscError("0x%"PRIx64" tbname is NULL", pSql->self);
STMT_RET(invalidOperationMsg(tscGetErrorMsgPayload(&pStmt->pSql->cmd), "name is NULL")); STMT_RET(invalidOperationMsg(tscGetErrorMsgPayload(&pStmt->pSql->cmd), "name is NULL"));
} }
...@@ -1603,6 +1604,20 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags ...@@ -1603,6 +1604,20 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
pStmt->last = STMT_SETTBNAME; pStmt->last = STMT_SETTBNAME;
SStrToken tname = {0};
tname.type = TK_STRING;
tname.z = (char *)strdup(name);
tname.n = (uint32_t)strlen(name);
bool dbIncluded = false;
// Check if the table name available or not
if (tscValidateName(&tname, true, &dbIncluded) != TSDB_CODE_SUCCESS) {
tscError("0x%"PRIx64" tbname[%s] is invalid", pSql->self, name);
free(tname.z);
STMT_RET(invalidOperationMsg(tscGetErrorMsgPayload(&pStmt->pSql->cmd), "name is invalid"));
}
uint64_t* uid = (uint64_t*)taosHashGet(pStmt->mtb.pTableHash, name, strlen(name)); uint64_t* uid = (uint64_t*)taosHashGet(pStmt->mtb.pTableHash, name, strlen(name));
if (uid != NULL) { if (uid != NULL) {
pStmt->mtb.currentUid = *uid; pStmt->mtb.currentUid = *uid;
...@@ -1610,6 +1625,7 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags ...@@ -1610,6 +1625,7 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
STableDataBlocks** t1 = (STableDataBlocks**)taosHashGet(pStmt->mtb.pTableBlockHashList, (const char*)&pStmt->mtb.currentUid, sizeof(pStmt->mtb.currentUid)); STableDataBlocks** t1 = (STableDataBlocks**)taosHashGet(pStmt->mtb.pTableBlockHashList, (const char*)&pStmt->mtb.currentUid, sizeof(pStmt->mtb.currentUid));
if (t1 == NULL) { if (t1 == NULL) {
tscError("0x%"PRIx64" no table data block in hash list, uid:%" PRId64 , pSql->self, pStmt->mtb.currentUid); tscError("0x%"PRIx64" no table data block in hash list, uid:%" PRId64 , pSql->self, pStmt->mtb.currentUid);
free(tname.z);
STMT_RET(TSDB_CODE_TSC_APP_ERROR); STMT_RET(TSDB_CODE_TSC_APP_ERROR);
} }
...@@ -1624,6 +1640,7 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags ...@@ -1624,6 +1640,7 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
taosHashPut(pCmd->insertParam.pTableBlockHashList, (void *)&pStmt->mtb.currentUid, sizeof(pStmt->mtb.currentUid), (void*)t1, POINTER_BYTES); taosHashPut(pCmd->insertParam.pTableBlockHashList, (void *)&pStmt->mtb.currentUid, sizeof(pStmt->mtb.currentUid), (void*)t1, POINTER_BYTES);
tscDebug("0x%"PRIx64" table:%s is already prepared, uid:%" PRIu64, pSql->self, name, pStmt->mtb.currentUid); tscDebug("0x%"PRIx64" table:%s is already prepared, uid:%" PRIu64, pSql->self, name, pStmt->mtb.currentUid);
free(tname.z);
STMT_RET(TSDB_CODE_SUCCESS); STMT_RET(TSDB_CODE_SUCCESS);
} }
...@@ -1632,13 +1649,10 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags ...@@ -1632,13 +1649,10 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta; STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
char sTableName[TSDB_TABLE_FNAME_LEN] = {0}; char sTableName[TSDB_TABLE_FNAME_LEN] = {0};
tstrncpy(sTableName, pTableMeta->sTableName, sizeof(sTableName)); tstrncpy(sTableName, pTableMeta->sTableName, sizeof(sTableName));
SStrToken tname = {0};
tname.type = TK_STRING;
tname.z = (char *)name;
tname.n = (uint32_t)strlen(name);
SName fullname = {0}; SName fullname = {0};
tscSetTableFullName(&fullname, &tname, pSql);
tscSetTableFullName(&fullname, &tname, pSql, dbIncluded);
free(tname.z);
memcpy(&pTableMetaInfo->name, &fullname, sizeof(fullname)); memcpy(&pTableMetaInfo->name, &fullname, sizeof(fullname));
...@@ -1672,6 +1686,8 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags ...@@ -1672,6 +1686,8 @@ int taos_stmt_set_tbname_tags(TAOS_STMT* stmt, const char* name, TAOS_BIND* tags
STMT_RET(TSDB_CODE_SUCCESS); STMT_RET(TSDB_CODE_SUCCESS);
} }
free(tname.z);
if (pStmt->mtb.tagSet) { if (pStmt->mtb.tagSet) {
pStmt->mtb.tbname = tscReplaceStrToken(&pSql->sqlstr, &pStmt->mtb.tbname, name); pStmt->mtb.tbname = tscReplaceStrToken(&pSql->sqlstr, &pStmt->mtb.tbname, name);
} else { } else {
......
...@@ -142,6 +142,8 @@ static int32_t checkQueryRangeForFill(SSqlCmd* pCmd, SQueryInfo* pQueryInfo); ...@@ -142,6 +142,8 @@ static int32_t checkQueryRangeForFill(SSqlCmd* pCmd, SQueryInfo* pQueryInfo);
static int32_t loadAllTableMeta(SSqlObj* pSql, struct SSqlInfo* pInfo); static int32_t loadAllTableMeta(SSqlObj* pSql, struct SSqlInfo* pInfo);
static tSqlExpr* extractExprForSTable(SSqlCmd* pCmd, tSqlExpr** pExpr, SQueryInfo* pQueryInfo, int32_t tableIndex); static tSqlExpr* extractExprForSTable(SSqlCmd* pCmd, tSqlExpr** pExpr, SQueryInfo* pQueryInfo, int32_t tableIndex);
int validateTableName(char *tblName, int len, SStrToken* psTblToken, bool *dbIncluded);
static bool isTimeWindowQuery(SQueryInfo* pQueryInfo) { static bool isTimeWindowQuery(SQueryInfo* pQueryInfo) {
return pQueryInfo->interval.interval > 0 || pQueryInfo->sessionWindow.gap > 0; return pQueryInfo->interval.interval > 0 || pQueryInfo->sessionWindow.gap > 0;
} }
...@@ -567,9 +569,19 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -567,9 +569,19 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
const char* msg3 = "param name too long"; const char* msg3 = "param name too long";
SStrToken* pzName = taosArrayGet(pInfo->pMiscInfo->a, 0); SStrToken* pzName = taosArrayGet(pInfo->pMiscInfo->a, 0);
if ((pInfo->type != TSDB_SQL_DROP_DNODE) && (tscValidateName(pzName) != TSDB_CODE_SUCCESS)) { bool escapeEnabled = (pInfo->type == TSDB_SQL_DROP_TABLE) ? true: false;
bool dbIncluded = false;
char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken;
sTblToken.z = buf;
if (pInfo->type != TSDB_SQL_DROP_DNODE) {
if ((escapeEnabled && (validateTableName(pzName->z, pzName->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS)) ||
((!escapeEnabled) && (tscValidateName(pzName, escapeEnabled, &dbIncluded) != TSDB_CODE_SUCCESS))){
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
} }
}
if (pInfo->type == TSDB_SQL_DROP_DB) { if (pInfo->type == TSDB_SQL_DROP_DB) {
assert(taosArrayGetSize(pInfo->pMiscInfo->a) == 1); assert(taosArrayGetSize(pInfo->pMiscInfo->a) == 1);
...@@ -581,7 +593,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -581,7 +593,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
} else if (pInfo->type == TSDB_SQL_DROP_TABLE) { } else if (pInfo->type == TSDB_SQL_DROP_TABLE) {
assert(taosArrayGetSize(pInfo->pMiscInfo->a) == 1); assert(taosArrayGetSize(pInfo->pMiscInfo->a) == 1);
code = tscSetTableFullName(&pTableMetaInfo->name, pzName, pSql); code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded);
if(code != TSDB_CODE_SUCCESS) { if(code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -605,7 +617,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -605,7 +617,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
const char* msg = "invalid db name"; const char* msg = "invalid db name";
SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0); SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0);
if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) { if (tscValidateName(pToken, false, NULL) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg);
} }
...@@ -652,7 +664,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -652,7 +664,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
char buf[TSDB_DB_NAME_LEN] = {0}; char buf[TSDB_DB_NAME_LEN] = {0};
SStrToken token = taosTokenDup(&pCreateDB->dbname, buf, tListLen(buf)); SStrToken token = taosTokenDup(&pCreateDB->dbname, buf, tListLen(buf));
if (tscValidateName(&token) != TSDB_CODE_SUCCESS) { if (tscValidateName(&token, false, NULL) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
...@@ -699,7 +711,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -699,7 +711,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
} }
if (tscValidateName(pName) != TSDB_CODE_SUCCESS) { if (tscValidateName(pName, false, NULL) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
} }
...@@ -721,11 +733,17 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -721,11 +733,17 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
const char* msg1 = "invalid table name"; const char* msg1 = "invalid table name";
SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0); SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0);
if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) { bool dbIncluded = false;
char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken;
sTblToken.z = buf;
if (validateTableName(pToken->z, pToken->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
// additional msg has been attached already // additional msg has been attached already
code = tscSetTableFullName(&pTableMetaInfo->name, pToken, pSql); code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -737,11 +755,17 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -737,11 +755,17 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
const char* msg1 = "invalid table name"; const char* msg1 = "invalid table name";
SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0); SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0);
if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) {
bool dbIncluded = false;
char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken;
sTblToken.z = buf;
if (validateTableName(pToken->z, pToken->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
code = tscSetTableFullName(&pTableMetaInfo->name, pToken, pSql); code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -752,7 +776,8 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -752,7 +776,8 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
const char* msg1 = "invalid database name"; const char* msg1 = "invalid database name";
SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0); SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0);
if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) {
if (tscValidateName(pToken, false, NULL) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
...@@ -816,7 +841,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -816,7 +841,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
} }
if (tscValidateName(pName) != TSDB_CODE_SUCCESS) { if (tscValidateName(pName, false, NULL) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
} }
...@@ -1336,7 +1361,7 @@ int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSl ...@@ -1336,7 +1361,7 @@ int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSl
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
int32_t tscSetTableFullName(SName* pName, SStrToken* pTableName, SSqlObj* pSql) { int32_t tscSetTableFullName(SName* pName, SStrToken* pTableName, SSqlObj* pSql, bool dbIncluded) {
const char* msg1 = "name too long"; const char* msg1 = "name too long";
const char* msg2 = "acctId too long"; const char* msg2 = "acctId too long";
const char* msg3 = "no acctId"; const char* msg3 = "no acctId";
...@@ -1345,7 +1370,12 @@ int32_t tscSetTableFullName(SName* pName, SStrToken* pTableName, SSqlObj* pSql) ...@@ -1345,7 +1370,12 @@ int32_t tscSetTableFullName(SName* pName, SStrToken* pTableName, SSqlObj* pSql)
SSqlCmd* pCmd = &pSql->cmd; SSqlCmd* pCmd = &pSql->cmd;
int32_t code = TSDB_CODE_SUCCESS; int32_t code = TSDB_CODE_SUCCESS;
int32_t idx = getDelimiterIndex(pTableName); int32_t idx = -1;
if (dbIncluded) {
idx = getDelimiterIndex(pTableName);
}
if (idx != -1) { // db has been specified in sql string so we ignore current db path if (idx != -1) { // db has been specified in sql string so we ignore current db path
char* acctId = getAccountId(pSql); char* acctId = getAccountId(pSql);
if (acctId == NULL || strlen(acctId) <= 0) { if (acctId == NULL || strlen(acctId) <= 0) {
...@@ -3216,6 +3246,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -3216,6 +3246,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
const char* msg3 = "database name too long"; const char* msg3 = "database name too long";
const char* msg5 = "database name is empty"; const char* msg5 = "database name is empty";
const char* msg6 = "pattern string is empty"; const char* msg6 = "pattern string is empty";
const char* msg7 = "pattern is invalid";
/* /*
* database prefix in pInfo->pMiscInfo->a[0] * database prefix in pInfo->pMiscInfo->a[0]
...@@ -3235,8 +3266,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -3235,8 +3266,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
if (pDbPrefixToken->n <= 0) { if (pDbPrefixToken->n <= 0) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg5); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg5);
} }
if (tscValidateName(pDbPrefixToken, false, NULL) != TSDB_CODE_SUCCESS) {
if (tscValidateName(pDbPrefixToken) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
...@@ -3249,6 +3279,10 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -3249,6 +3279,10 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
// show table/stable like 'xxxx', set the like pattern for show tables // show table/stable like 'xxxx', set the like pattern for show tables
SStrToken* pPattern = &pShowInfo->pattern; SStrToken* pPattern = &pShowInfo->pattern;
if (pPattern->type != 0) { if (pPattern->type != 0) {
if (pPattern->type == TK_ID && pPattern->z[0] == TS_ESCAPE_CHAR) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg7);
}
pPattern->n = strdequote(pPattern->z); pPattern->n = strdequote(pPattern->z);
if (pPattern->n <= 0) { if (pPattern->n <= 0) {
...@@ -5898,12 +5932,13 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -5898,12 +5932,13 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
SQueryInfo* pQueryInfo = tscGetQueryInfo(pCmd); SQueryInfo* pQueryInfo = tscGetQueryInfo(pCmd);
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, DEFAULT_TABLE_INDEX); STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, DEFAULT_TABLE_INDEX);
bool dbIncluded = false;
if (tscValidateName(&(pAlterSQL->name)) != TSDB_CODE_SUCCESS) { if (tscValidateName(&(pAlterSQL->name), true, &dbIncluded) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
code = tscSetTableFullName(&pTableMetaInfo->name, &(pAlterSQL->name), pSql); code = tscSetTableFullName(&pTableMetaInfo->name, &(pAlterSQL->name), pSql, dbIncluded);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -7457,11 +7492,12 @@ int32_t doCheckForCreateTable(SSqlObj* pSql, int32_t subClauseIndex, SSqlInfo* p ...@@ -7457,11 +7492,12 @@ int32_t doCheckForCreateTable(SSqlObj* pSql, int32_t subClauseIndex, SSqlInfo* p
// if sql specifies db, use it, otherwise use default db // if sql specifies db, use it, otherwise use default db
SStrToken* pzTableName = &(pCreateTable->name); SStrToken* pzTableName = &(pCreateTable->name);
if (tscValidateName(pzTableName) != TSDB_CODE_SUCCESS) { bool dbIncluded = false;
if (tscValidateName(pzTableName, true, &dbIncluded) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
int32_t code = tscSetTableFullName(&pTableMetaInfo->name, pzTableName, pSql); int32_t code = tscSetTableFullName(&pTableMetaInfo->name, pzTableName, pSql, dbIncluded);
if(code != TSDB_CODE_SUCCESS) { if(code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -7521,11 +7557,18 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -7521,11 +7557,18 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) {
SCreatedTableInfo* pCreateTableInfo = taosArrayGet(pCreateTable->childTableInfo, j); SCreatedTableInfo* pCreateTableInfo = taosArrayGet(pCreateTable->childTableInfo, j);
SStrToken* pToken = &pCreateTableInfo->stableName; SStrToken* pToken = &pCreateTableInfo->stableName;
if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) {
bool dbIncluded = false;
char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken;
sTblToken.z = buf;
int32_t code = validateTableName(pToken->z, pToken->n, &sTblToken, &dbIncluded);
if (code != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
int32_t code = tscSetTableFullName(&pStableMetaInfo->name, pToken, pSql); code = tscSetTableFullName(&pStableMetaInfo->name, &sTblToken, pSql, dbIncluded);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -7695,13 +7738,14 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -7695,13 +7738,14 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) {
kvRowCpy(pTag->data, row); kvRowCpy(pTag->data, row);
free(row); free(row);
bool dbIncluded2 = false;
// table name // table name
if (tscValidateName(&(pCreateTableInfo->name)) != TSDB_CODE_SUCCESS) { if (tscValidateName(&(pCreateTableInfo->name), true, &dbIncluded2) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, TABLE_INDEX); STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, TABLE_INDEX);
ret = tscSetTableFullName(&pTableMetaInfo->name, &pCreateTableInfo->name, pSql); ret = tscSetTableFullName(&pTableMetaInfo->name, &pCreateTableInfo->name, pSql, dbIncluded2);
if (ret != TSDB_CODE_SUCCESS) { if (ret != TSDB_CODE_SUCCESS) {
return ret; return ret;
} }
...@@ -7738,8 +7782,9 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -7738,8 +7782,9 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
// if sql specifies db, use it, otherwise use default db // if sql specifies db, use it, otherwise use default db
SStrToken* pName = &(pCreateTable->name); SStrToken* pName = &(pCreateTable->name);
SSqlNode* pSqlNode = pCreateTable->pSelect; SSqlNode* pSqlNode = pCreateTable->pSelect;
bool dbIncluded1 = false;
if (tscValidateName(pName) != TSDB_CODE_SUCCESS) { if (tscValidateName(pName, true, &dbIncluded1) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
...@@ -7753,12 +7798,19 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -7753,12 +7798,19 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
} }
SRelElementPair* p1 = taosArrayGet(pFromInfo->list, 0); SRelElementPair* p1 = taosArrayGet(pFromInfo->list, 0);
SStrToken srcToken = {.z = p1->tableName.z, .n = p1->tableName.n, .type = TK_STRING}; SStrToken srcToken = {.z = p1->tableName.z, .n = p1->tableName.n, .type = p1->tableName.type};
if (tscValidateName(&srcToken) != TSDB_CODE_SUCCESS) {
bool dbIncluded2 = false;
char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken;
sTblToken.z = buf;
int32_t code = validateTableName(srcToken.z, srcToken.n, &sTblToken, &dbIncluded2);
if (code != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
int32_t code = tscSetTableFullName(&pTableMetaInfo->name, &srcToken, pSql); code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded2);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -7800,7 +7852,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -7800,7 +7852,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
} }
// set the created table[stream] name // set the created table[stream] name
code = tscSetTableFullName(&pTableMetaInfo->name, pName, pSql); code = tscSetTableFullName(&pTableMetaInfo->name, pName, pSql, dbIncluded1);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -8192,13 +8244,17 @@ static int32_t getTableNameFromSqlNode(SSqlNode* pSqlNode, SArray* tableNameList ...@@ -8192,13 +8244,17 @@ static int32_t getTableNameFromSqlNode(SSqlNode* pSqlNode, SArray* tableNameList
return invalidOperationMsg(msgBuf, msg1); return invalidOperationMsg(msgBuf, msg1);
} }
tscDequoteAndTrimToken(t); bool dbIncluded = false;
if (tscValidateName(t) != TSDB_CODE_SUCCESS) { char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken;
sTblToken.z = buf;
if (validateTableName(t->z, t->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(msgBuf, msg1); return invalidOperationMsg(msgBuf, msg1);
} }
SName name = {0}; SName name = {0};
int32_t code = tscSetTableFullName(&name, t, pSql); int32_t code = tscSetTableFullName(&name, &sTblToken, pSql, dbIncluded);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -8453,12 +8509,18 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNod ...@@ -8453,12 +8509,18 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNod
} }
tscDequoteAndTrimToken(oriName); tscDequoteAndTrimToken(oriName);
if (tscValidateName(oriName) != TSDB_CODE_SUCCESS) {
bool dbIncluded = false;
char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken;
sTblToken.z = buf;
if (validateTableName(oriName->z, oriName->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
} }
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, i); STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, i);
code = tscSetTableFullName(&pTableMetaInfo->name, oriName, pSql); code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
...@@ -8470,7 +8532,7 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNod ...@@ -8470,7 +8532,7 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNod
} }
tscDequoteAndTrimToken(aliasName); tscDequoteAndTrimToken(aliasName);
if (tscValidateName(aliasName) != TSDB_CODE_SUCCESS || aliasName->n >= TSDB_TABLE_NAME_LEN) { if (tscValidateName(aliasName, false, NULL) != TSDB_CODE_SUCCESS || aliasName->n >= TSDB_TABLE_NAME_LEN) {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3); return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
} }
...@@ -9004,6 +9066,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS ...@@ -9004,6 +9066,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
if (colSize > 0) { if (colSize > 0) {
SColIndex* idx = taosArrayGet(pCols, colSize - 1); SColIndex* idx = taosArrayGet(pCols, colSize - 1);
SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, idx->colIndex); SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, idx->colIndex);
// convert time by precision // convert time by precision
if (pSchema != NULL && TSDB_DATA_TYPE_TIMESTAMP == pSchema->type && TSDB_DATA_TYPE_BINARY == (*pExpr)->pVal->nType) { if (pSchema != NULL && TSDB_DATA_TYPE_TIMESTAMP == pSchema->type && TSDB_DATA_TYPE_BINARY == (*pExpr)->pVal->nType) {
......
...@@ -2870,7 +2870,7 @@ int32_t getMultiTableMetaFromMnode(SSqlObj *pSql, SArray* pNameList, SArray* pVg ...@@ -2870,7 +2870,7 @@ int32_t getMultiTableMetaFromMnode(SSqlObj *pSql, SArray* pNameList, SArray* pVg
for(int32_t i = 0; i < numOfTable; ++i) { for(int32_t i = 0; i < numOfTable; ++i) {
char* name = taosArrayGetP(pNameList, i); char* name = taosArrayGetP(pNameList, i);
if (i < numOfTable - 1 || numOfVgroupList > 0 || numOfUdf > 0) { if (i < numOfTable - 1 || numOfVgroupList > 0 || numOfUdf > 0) {
len = sprintf(start, "%s,", name); len = sprintf(start, "%s`", name);
} else { } else {
len = sprintf(start, "%s", name); len = sprintf(start, "%s", name);
} }
...@@ -2881,7 +2881,7 @@ int32_t getMultiTableMetaFromMnode(SSqlObj *pSql, SArray* pNameList, SArray* pVg ...@@ -2881,7 +2881,7 @@ int32_t getMultiTableMetaFromMnode(SSqlObj *pSql, SArray* pNameList, SArray* pVg
for(int32_t i = 0; i < numOfVgroupList; ++i) { for(int32_t i = 0; i < numOfVgroupList; ++i) {
char* name = taosArrayGetP(pVgroupNameList, i); char* name = taosArrayGetP(pVgroupNameList, i);
if (i < numOfVgroupList - 1 || numOfUdf > 0) { if (i < numOfVgroupList - 1 || numOfUdf > 0) {
len = sprintf(start, "%s,", name); len = sprintf(start, "%s`", name);
} else { } else {
len = sprintf(start, "%s", name); len = sprintf(start, "%s", name);
} }
...@@ -2892,7 +2892,7 @@ int32_t getMultiTableMetaFromMnode(SSqlObj *pSql, SArray* pNameList, SArray* pVg ...@@ -2892,7 +2892,7 @@ int32_t getMultiTableMetaFromMnode(SSqlObj *pSql, SArray* pNameList, SArray* pVg
for(int32_t i = 0; i < numOfUdf; ++i) { for(int32_t i = 0; i < numOfUdf; ++i) {
SUdfInfo * u = taosArrayGet(pUdfList, i); SUdfInfo * u = taosArrayGet(pUdfList, i);
if (i < numOfUdf - 1) { if (i < numOfUdf - 1) {
len = sprintf(start, "%s,", u->name); len = sprintf(start, "%s`", u->name);
} else { } else {
len = sprintf(start, "%s", u->name); len = sprintf(start, "%s", u->name);
} }
......
...@@ -2759,13 +2759,13 @@ void tscColumnListDestroy(SArray* pColumnList) { ...@@ -2759,13 +2759,13 @@ void tscColumnListDestroy(SArray* pColumnList) {
* 'first_part.second_part' * 'first_part.second_part'
* *
*/ */
static int32_t validateQuoteToken(SStrToken* pToken) { static int32_t validateQuoteToken(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded) {
tscDequoteAndTrimToken(pToken); tscDequoteAndTrimToken(pToken);
int32_t k = tGetToken(pToken->z, &pToken->type); int32_t k = tGetToken(pToken->z, &pToken->type);
if (pToken->type == TK_STRING) { if (pToken->type == TK_STRING) {
return tscValidateName(pToken); return tscValidateName(pToken, escapeEnabled, dbIncluded);
} }
if (k != pToken->n || pToken->type != TK_ID) { if (k != pToken->n || pToken->type != TK_ID) {
...@@ -2817,14 +2817,74 @@ void tscDequoteAndTrimToken(SStrToken* pToken) { ...@@ -2817,14 +2817,74 @@ void tscDequoteAndTrimToken(SStrToken* pToken) {
pToken->n = last - first; pToken->n = last - first;
} }
int32_t tscValidateName(SStrToken* pToken) { void tscRmEscapeAndTrimToken(SStrToken* pToken) {
if (pToken == NULL || pToken->z == NULL || uint32_t first = 0, last = pToken->n;
(pToken->type != TK_STRING && pToken->type != TK_ID)) {
// trim leading spaces
while (first < last) {
char c = pToken->z[first];
if (c != ' ' && c != '\t') {
break;
}
first++;
}
// trim ending spaces
while (first < last) {
char c = pToken->z[last - 1];
if (c != ' ' && c != '\t') {
break;
}
last--;
}
// there are still at least two characters
if (first < last - 1) {
char c = pToken->z[first];
// dequote
if ((c == '`') && c == pToken->z[last - 1]) {
first++;
last--;
}
}
// left shift the string and pad spaces
for (uint32_t i = 0; i + first < last; i++) {
pToken->z[i] = pToken->z[first + i];
}
for (uint32_t i = last - first; i < pToken->n; i++) {
pToken->z[i] = ' ';
}
// adjust token length
pToken->n = last - first;
}
int32_t tscValidateName(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded) {
if (pToken == NULL || pToken->z == NULL
|| (pToken->type != TK_STRING && pToken->type != TK_ID)) {
return TSDB_CODE_TSC_INVALID_OPERATION; return TSDB_CODE_TSC_INVALID_OPERATION;
} }
char* sep = strnchr(pToken->z, TS_PATH_DELIMITER[0], pToken->n, true); if ((!escapeEnabled) && pToken->type == TK_ID) {
if (pToken->z[0] == TS_ESCAPE_CHAR) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
}
char* sep = NULL;
if (escapeEnabled) {
sep = tableNameGetPosition(pToken, TS_PATH_DELIMITER[0]);
} else {
sep = strnchr(pToken->z, TS_PATH_DELIMITER[0], pToken->n, true);
}
if (sep == NULL) { // single part if (sep == NULL) { // single part
if (dbIncluded) *dbIncluded = false;
if (pToken->type == TK_STRING) { if (pToken->type == TK_STRING) {
tscDequoteAndTrimToken(pToken); tscDequoteAndTrimToken(pToken);
...@@ -2835,15 +2895,19 @@ int32_t tscValidateName(SStrToken* pToken) { ...@@ -2835,15 +2895,19 @@ int32_t tscValidateName(SStrToken* pToken) {
// single token, validate it // single token, validate it
if (len == pToken->n) { if (len == pToken->n) {
return validateQuoteToken(pToken); return validateQuoteToken(pToken, escapeEnabled, NULL);
} else { } else {
sep = strnchr(pToken->z, TS_PATH_DELIMITER[0], pToken->n, true); sep = strnchr(pToken->z, TS_PATH_DELIMITER[0], pToken->n, true);
if (sep == NULL) { if (sep == NULL) {
return TSDB_CODE_TSC_INVALID_OPERATION; return TSDB_CODE_TSC_INVALID_OPERATION;
} }
*dbIncluded = true;
return tscValidateName(pToken); return tscValidateName(pToken, escapeEnabled, NULL);
} }
} else if (pToken->type == TK_ID) {
tscRmEscapeAndTrimToken(pToken);
return TSDB_CODE_SUCCESS;
} else { } else {
if (isNumber(pToken)) { if (isNumber(pToken)) {
return TSDB_CODE_TSC_INVALID_OPERATION; return TSDB_CODE_TSC_INVALID_OPERATION;
...@@ -2852,6 +2916,9 @@ int32_t tscValidateName(SStrToken* pToken) { ...@@ -2852,6 +2916,9 @@ int32_t tscValidateName(SStrToken* pToken) {
} else { // two part } else { // two part
int32_t oldLen = pToken->n; int32_t oldLen = pToken->n;
char* pStr = pToken->z; char* pStr = pToken->z;
bool firstPartQuote = false;
if (dbIncluded) *dbIncluded = true;
if (pToken->type == TK_SPACE) { if (pToken->type == TK_SPACE) {
pToken->n = (uint32_t)strtrim(pToken->z); pToken->n = (uint32_t)strtrim(pToken->z);
...@@ -2866,8 +2933,13 @@ int32_t tscValidateName(SStrToken* pToken) { ...@@ -2866,8 +2933,13 @@ int32_t tscValidateName(SStrToken* pToken) {
return TSDB_CODE_TSC_INVALID_OPERATION; return TSDB_CODE_TSC_INVALID_OPERATION;
} }
if (pToken->type == TK_STRING && validateQuoteToken(pToken) != TSDB_CODE_SUCCESS) { if (pToken->type == TK_STRING) {
if (validateQuoteToken(pToken, escapeEnabled, NULL) != TSDB_CODE_SUCCESS) {
return TSDB_CODE_TSC_INVALID_OPERATION; return TSDB_CODE_TSC_INVALID_OPERATION;
} else {
tscStrToLower(pToken->z,pToken->n);
firstPartQuote = true;
}
} }
int32_t firstPartLen = pToken->n; int32_t firstPartLen = pToken->n;
...@@ -2879,12 +2951,20 @@ int32_t tscValidateName(SStrToken* pToken) { ...@@ -2879,12 +2951,20 @@ int32_t tscValidateName(SStrToken* pToken) {
return TSDB_CODE_TSC_INVALID_OPERATION; return TSDB_CODE_TSC_INVALID_OPERATION;
} }
if (pToken->type == TK_STRING && validateQuoteToken(pToken) != TSDB_CODE_SUCCESS) { if (pToken->type == TK_STRING) {
if (validateQuoteToken(pToken, escapeEnabled, NULL) != TSDB_CODE_SUCCESS) {
return TSDB_CODE_TSC_INVALID_OPERATION; return TSDB_CODE_TSC_INVALID_OPERATION;
} else {
tscStrToLower(pToken->z,pToken->n);
}
}
if (escapeEnabled && pToken->type == TK_ID) {
tscRmEscapeAndTrimToken(pToken);
} }
// re-build the whole name string // re-build the whole name string
if (pStr[firstPartLen] == TS_PATH_DELIMITER[0]) { if (!firstPartQuote) {
// first part do not have quote do nothing // first part do not have quote do nothing
} else { } else {
pStr[firstPartLen] = TS_PATH_DELIMITER[0]; pStr[firstPartLen] = TS_PATH_DELIMITER[0];
...@@ -2894,8 +2974,6 @@ int32_t tscValidateName(SStrToken* pToken) { ...@@ -2894,8 +2974,6 @@ int32_t tscValidateName(SStrToken* pToken) {
} }
pToken->n += (firstPartLen + sizeof(TS_PATH_DELIMITER[0])); pToken->n += (firstPartLen + sizeof(TS_PATH_DELIMITER[0]));
pToken->z = pStr; pToken->z = pStr;
tscStrToLower(pToken->z,pToken->n);
} }
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
...@@ -5009,14 +5087,16 @@ static int32_t doAddTableName(char* nextStr, char** str, SArray* pNameArray, SSq ...@@ -5009,14 +5087,16 @@ static int32_t doAddTableName(char* nextStr, char** str, SArray* pNameArray, SSq
SStrToken sToken = {.n = len, .type = TK_ID, .z = tablename}; SStrToken sToken = {.n = len, .type = TK_ID, .z = tablename};
tGetToken(tablename, &sToken.type); tGetToken(tablename, &sToken.type);
bool dbIncluded = false;
// Check if the table name available or not // Check if the table name available or not
if (tscValidateName(&sToken) != TSDB_CODE_SUCCESS) { if (tscValidateName(&sToken, true, &dbIncluded) != TSDB_CODE_SUCCESS) {
sprintf(pCmd->payload, "table name is invalid"); sprintf(pCmd->payload, "table name is invalid");
return TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH; return TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH;
} }
SName name = {0}; SName name = {0};
if ((code = tscSetTableFullName(&name, &sToken, pSql)) != TSDB_CODE_SUCCESS) { if ((code = tscSetTableFullName(&name, &sToken, pSql, dbIncluded)) != TSDB_CODE_SUCCESS) {
return code; return code;
} }
......
...@@ -92,6 +92,10 @@ size_t tableIdPrefix(const char* name, char* prefix, int32_t len); ...@@ -92,6 +92,10 @@ size_t tableIdPrefix(const char* name, char* prefix, int32_t len);
void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable); void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable);
char *tableNameGetPosition(SStrToken* pToken, char target);
char *tableNameToStr(char *dst, char *src, char quote);
SSchema tGetUserSpecifiedColumnSchema(tVariant* pVal, SStrToken* exprStr, const char* name); SSchema tGetUserSpecifiedColumnSchema(tVariant* pVal, SStrToken* exprStr, const char* name);
bool tscValidateTableNameLength(size_t len); bool tscValidateTableNameLength(size_t len);
......
...@@ -151,6 +151,63 @@ int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, in ...@@ -151,6 +151,63 @@ int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, in
#endif #endif
char *tableNameGetPosition(SStrToken* pToken, char target) {
bool inEscape = false;
bool inQuote = false;
char quotaStr = 0;
for (uint32_t i = 0; i < pToken->n; ++i) {
if (*(pToken->z + i) == target && (!inEscape) && (!inQuote)) {
return pToken->z + i;
}
if (*(pToken->z + i) == TS_ESCAPE_CHAR) {
if (!inQuote) {
inEscape = !inEscape;
}
}
if (*(pToken->z + i) == '\'' || *(pToken->z + i) == '"') {
if (!inEscape) {
if (!inQuote) {
quotaStr = *(pToken->z + i);
inQuote = !inQuote;
} else if (quotaStr == *(pToken->z + i)) {
inQuote = !inQuote;
}
}
}
}
return NULL;
}
char *tableNameToStr(char *dst, char *src, char quote) {
*dst = 0;
if (src == NULL) {
return NULL;
}
int32_t len = (int32_t)strlen(src);
if (len <= 0) {
return NULL;
}
int32_t j = 0;
for (int32_t i = 0; i < len; ++i) {
if (*(src + i) == quote) {
*(dst + j++) = '\\';
}
*(dst + j++) = *(src + i);
}
return dst;
}
/* /*
* tablePrefix.columnName * tablePrefix.columnName
* extract table name and save it in pTable, with only column name in pToken * extract table name and save it in pTable, with only column name in pToken
...@@ -162,11 +219,16 @@ void extractTableNameFromToken(SStrToken* pToken, SStrToken* pTable) { ...@@ -162,11 +219,16 @@ void extractTableNameFromToken(SStrToken* pToken, SStrToken* pTable) {
return; return;
} }
char* r = strnchr(pToken->z, sep, pToken->n, false); char* r = tableNameGetPosition(pToken, sep);
if (r != NULL) { // record the table name token if (r != NULL) { // record the table name token
if (pToken->z[0] == TS_ESCAPE_CHAR && *(r - 1) == TS_ESCAPE_CHAR) {
pTable->n = (uint32_t)(r - pToken->z - 2);
pTable->z = pToken->z + 1;
} else {
pTable->n = (uint32_t)(r - pToken->z); pTable->n = (uint32_t)(r - pToken->z);
pTable->z = pToken->z; pTable->z = pToken->z;
}
r += 1; r += 1;
pToken->n -= (uint32_t)(r - pToken->z); pToken->n -= (uint32_t)(r - pToken->z);
......
...@@ -81,7 +81,7 @@ void tVariantCreate(tVariant *pVar, SStrToken *token) { ...@@ -81,7 +81,7 @@ void tVariantCreate(tVariant *pVar, SStrToken *token) {
case TSDB_DATA_TYPE_BINARY: { case TSDB_DATA_TYPE_BINARY: {
pVar->pz = strndup(token->z, token->n); pVar->pz = strndup(token->z, token->n);
pVar->nLen = strRmquote(pVar->pz, token->n); pVar->nLen = strRmquoteEscape(pVar->pz, token->n);
break; break;
} }
case TSDB_DATA_TYPE_TIMESTAMP: { case TSDB_DATA_TYPE_TIMESTAMP: {
......
Subproject commit 016d8e82a24d72779be0ab0090580a372b4fffca Subproject commit 72ecc6d636453c6a9b71d78d3edce385165cc35f
...@@ -98,6 +98,7 @@ extern const int32_t TYPE_BYTES[15]; ...@@ -98,6 +98,7 @@ extern const int32_t TYPE_BYTES[15];
#define TSDB_ERR -1 #define TSDB_ERR -1
#define TS_PATH_DELIMITER "." #define TS_PATH_DELIMITER "."
#define TS_ESCAPE_CHAR '`'
#define TSDB_TIME_PRECISION_MILLI 0 #define TSDB_TIME_PRECISION_MILLI 0
#define TSDB_TIME_PRECISION_MICRO 1 #define TSDB_TIME_PRECISION_MICRO 1
......
...@@ -214,6 +214,8 @@ ...@@ -214,6 +214,8 @@
#define TK_VALUES 196 #define TK_VALUES 196
#define TK_SPACE 300 #define TK_SPACE 300
#define TK_COMMENT 301 #define TK_COMMENT 301
#define TK_ILLEGAL 302 #define TK_ILLEGAL 302
......
...@@ -27,7 +27,12 @@ ...@@ -27,7 +27,12 @@
#define MAX_IP_SIZE 20 #define MAX_IP_SIZE 20
#define MAX_HISTORY_SIZE 1000 #define MAX_HISTORY_SIZE 1000
#define MAX_COMMAND_SIZE 1048586 #define MAX_COMMAND_SIZE 1048586
#define HISTORY_FILE ".taos_history"
#ifdef _TD_PRO_
#define HISTORY_FILE ".prodb_history"
#else
#define HISTORY_FILE ".taos_history"
#endif
#define DEFAULT_RES_SHOW_NUM 100 #define DEFAULT_RES_SHOW_NUM 100
......
...@@ -250,6 +250,7 @@ int32_t shellRunCommand(TAOS* con, char* command) { ...@@ -250,6 +250,7 @@ int32_t shellRunCommand(TAOS* con, char* command) {
break; break;
case '\'': case '\'':
case '"': case '"':
case '`':
if (quote) { if (quote) {
*p++ = '\\'; *p++ = '\\';
} }
...@@ -271,7 +272,7 @@ int32_t shellRunCommand(TAOS* con, char* command) { ...@@ -271,7 +272,7 @@ int32_t shellRunCommand(TAOS* con, char* command) {
if (quote == c) { if (quote == c) {
quote = 0; quote = 0;
} else if (quote == 0 && (c == '\'' || c == '"')) { } else if (quote == 0 && (c == '\'' || c == '"' || c == '`')) {
quote = c; quote = c;
} }
...@@ -308,8 +309,8 @@ void shellRunCommandOnServer(TAOS *con, char command[]) { ...@@ -308,8 +309,8 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
char * fname = NULL; char * fname = NULL;
bool printMode = false; bool printMode = false;
if ((sptr = strstr(command, ">>")) != NULL) { if ((sptr = tstrstr(command, ">>", true)) != NULL) {
cptr = strstr(command, ";"); cptr = tstrstr(command, ";", true);
if (cptr != NULL) { if (cptr != NULL) {
*cptr = '\0'; *cptr = '\0';
} }
...@@ -322,8 +323,8 @@ void shellRunCommandOnServer(TAOS *con, char command[]) { ...@@ -322,8 +323,8 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
fname = full_path.we_wordv[0]; fname = full_path.we_wordv[0];
} }
if ((sptr = strstr(command, "\\G")) != NULL) { if ((sptr = tstrstr(command, "\\G", true)) != NULL) {
cptr = strstr(command, ";"); cptr = tstrstr(command, ";", true);
if (cptr != NULL) { if (cptr != NULL) {
*cptr = '\0'; *cptr = '\0';
} }
......
...@@ -1020,25 +1020,25 @@ static void dumpCreateMTableClause( ...@@ -1020,25 +1020,25 @@ static void dumpCreateMTableClause(
strcasecmp(tableDes->cols[counter].type, "nchar") == 0) { strcasecmp(tableDes->cols[counter].type, "nchar") == 0) {
//pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].note); //pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].note);
if (tableDes->cols[counter].var_value) { if (tableDes->cols[counter].var_value) {
pstr += sprintf(pstr, ", %s", pstr += sprintf(pstr, ", \'%s\'",
tableDes->cols[counter].var_value); tableDes->cols[counter].var_value);
} else { } else {
pstr += sprintf(pstr, ", %s", tableDes->cols[counter].value); pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].value);
} }
} else { } else {
pstr += sprintf(pstr, ", %s", tableDes->cols[counter].value); pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].value);
} }
} else { } else {
if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 || if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 ||
strcasecmp(tableDes->cols[counter].type, "nchar") == 0) { strcasecmp(tableDes->cols[counter].type, "nchar") == 0) {
//pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].note); //pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].note);
if (tableDes->cols[counter].var_value) { if (tableDes->cols[counter].var_value) {
pstr += sprintf(pstr, "%s", tableDes->cols[counter].var_value); pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].var_value);
} else { } else {
pstr += sprintf(pstr, "%s", tableDes->cols[counter].value); pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].value);
} }
} else { } else {
pstr += sprintf(pstr, "%s", tableDes->cols[counter].value); pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].value);
} }
/* pstr += sprintf(pstr, "%s", tableDes->cols[counter].note); */ /* pstr += sprintf(pstr, "%s", tableDes->cols[counter].note); */
} }
...@@ -1149,6 +1149,10 @@ static int64_t dumpNormalTable( ...@@ -1149,6 +1149,10 @@ static int64_t dumpNormalTable(
colCount = getTableDes(dbName, tbName, tableDes, false); colCount = getTableDes(dbName, tbName, tableDes, false);
if (colCount < 0) { if (colCount < 0) {
errorPrint("%s() LN%d, failed to get table[%s] schema\n",
__func__,
__LINE__,
tbName);
free(tableDes); free(tableDes);
return -1; return -1;
} }
...@@ -1160,6 +1164,10 @@ static int64_t dumpNormalTable( ...@@ -1160,6 +1164,10 @@ static int64_t dumpNormalTable(
colCount = getTableDes(dbName, tbName, tableDes, false); colCount = getTableDes(dbName, tbName, tableDes, false);
if (colCount < 0) { if (colCount < 0) {
errorPrint("%s() LN%d, failed to get table[%s] schema\n",
__func__,
__LINE__,
tbName);
free(tableDes); free(tableDes);
return -1; return -1;
} }
...@@ -1172,19 +1180,21 @@ static int64_t dumpNormalTable( ...@@ -1172,19 +1180,21 @@ static int64_t dumpNormalTable(
if (g_args.avro) { if (g_args.avro) {
if (0 != convertTbDesToAvroSchema( if (0 != convertTbDesToAvroSchema(
dbName, tbName, tableDes, colCount, &jsonAvroSchema)) { dbName, tbName, tableDes, colCount, &jsonAvroSchema)) {
errorPrint("%s() LN%d, convertTbDesToAvroSchema failed\n",
__func__,
__LINE__);
freeTbDes(tableDes); freeTbDes(tableDes);
return -1; return -1;
} }
} }
free(tableDes);
int64_t ret = 0; int64_t ret = 0;
if (!g_args.schemaonly) { if (!g_args.schemaonly) {
ret = dumpTableData(fp, tbName, dbName, precision, ret = dumpTableData(fp, tbName, dbName, precision,
jsonAvroSchema); jsonAvroSchema);
} }
freeTbDes(tableDes);
return ret; return ret;
} }
...@@ -1281,20 +1291,23 @@ static void *dumpNtbOfDb(void *arg) { ...@@ -1281,20 +1291,23 @@ static void *dumpNtbOfDb(void *arg) {
return NULL; return NULL;
} }
int64_t count;
for (int64_t i = 0; i < pThreadInfo->tablesOfDumpOut; i++) { for (int64_t i = 0; i < pThreadInfo->tablesOfDumpOut; i++) {
debugPrint("[%d] No.\t%"PRId64" table name: %s\n", debugPrint("[%d] No.\t%"PRId64" table name: %s\n",
pThreadInfo->threadIndex, i, pThreadInfo->threadIndex, i,
((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->name); ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->name);
dumpNormalTable( count = dumpNormalTable(
pThreadInfo->dbName, pThreadInfo->dbName,
((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->stable, ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->stable,
((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->name, ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->name,
pThreadInfo->precision, pThreadInfo->precision,
fp); fp);
if (count < 0) {
break;
}
} }
fclose(fp); fclose(fp);
return NULL; return NULL;
} }
...@@ -1340,16 +1353,20 @@ static void *dumpNormalTablesOfStb(void *arg) { ...@@ -1340,16 +1353,20 @@ static void *dumpNormalTablesOfStb(void *arg) {
TAOS_ROW row = NULL; TAOS_ROW row = NULL;
int64_t i = 0; int64_t i = 0;
int64_t count;
while((row = taos_fetch_row(res)) != NULL) { while((row = taos_fetch_row(res)) != NULL) {
debugPrint("[%d] sub table %"PRId64": name: %s\n", debugPrint("[%d] sub table %"PRId64": name: %s\n",
pThreadInfo->threadIndex, i++, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX]); pThreadInfo->threadIndex, i++, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
dumpNormalTable( count = dumpNormalTable(
pThreadInfo->dbName, pThreadInfo->dbName,
pThreadInfo->stbName, pThreadInfo->stbName,
(char *)row[TSDB_SHOW_TABLES_NAME_INDEX], (char *)row[TSDB_SHOW_TABLES_NAME_INDEX],
pThreadInfo->precision, pThreadInfo->precision,
fp); fp);
if (count < 0) {
break;
}
} }
fclose(fp); fclose(fp);
...@@ -2006,9 +2023,9 @@ static int getTableDes( ...@@ -2006,9 +2023,9 @@ static int getTableDes(
if (row[TSDB_SHOW_TABLES_NAME_INDEX] == NULL) { if (row[TSDB_SHOW_TABLES_NAME_INDEX] == NULL) {
sprintf(tableDes->cols[i].note, "%s", "NUL"); sprintf(tableDes->cols[i].note, "%s", "NUL");
sprintf(tableDes->cols[i].value, "%s", "NULL");
taos_free_result(res); taos_free_result(res);
res = NULL; res = NULL;
taos_close(taos);
continue; continue;
} }
...@@ -2050,26 +2067,22 @@ static int getTableDes( ...@@ -2050,26 +2067,22 @@ static int getTableDes(
int len = strlen((char *)row[0]); int len = strlen((char *)row[0]);
// FIXME for long value // FIXME for long value
if (len < (COL_VALUEBUF_LEN - 2)) { if (len < (COL_VALUEBUF_LEN - 2)) {
tableDes->cols[i].value[0] = '\'';
converStringToReadable( converStringToReadable(
(char *)row[0], (char *)row[0],
length[0], length[0],
tableDes->cols[i].value + 1, tableDes->cols[i].value,
len); len);
tableDes->cols[i].value[len+1] = '\'';
} else { } else {
tableDes->cols[i].var_value = calloc(1, len + 2); tableDes->cols[i].var_value = calloc(1, len * 2);
if (tableDes->cols[i].var_value == NULL) { if (tableDes->cols[i].var_value == NULL) {
errorPrint("%s() LN%d, memory alalocation failed!\n", errorPrint("%s() LN%d, memory alalocation failed!\n",
__func__, __LINE__); __func__, __LINE__);
taos_free_result(res); taos_free_result(res);
return -1; return -1;
} }
tableDes->cols[i].var_value[0] = '\'';
converStringToReadable((char *)row[0], converStringToReadable((char *)row[0],
length[0], length[0],
(char *)(tableDes->cols[i].var_value + 1), len); (char *)(tableDes->cols[i].var_value), len);
tableDes->cols[i].var_value[len+1] = '\'';
} }
break; break;
......
...@@ -2975,7 +2975,7 @@ static int32_t mnodeProcessMultiTableMetaMsg(SMnodeMsg *pMsg) { ...@@ -2975,7 +2975,7 @@ static int32_t mnodeProcessMultiTableMetaMsg(SMnodeMsg *pMsg) {
int32_t num = 0; int32_t num = 0;
int32_t code = TSDB_CODE_SUCCESS; int32_t code = TSDB_CODE_SUCCESS;
char* str = strndup(pInfo->tableNames, contLen); char* str = strndup(pInfo->tableNames, contLen);
char** nameList = strsplit(str, ",", &num); char** nameList = strsplit(str, "`", &num);
SArray* pList = taosArrayInit(4, POINTER_BYTES); SArray* pList = taosArrayInit(4, POINTER_BYTES);
SMultiTableMeta *pMultiMeta = NULL; SMultiTableMeta *pMultiMeta = NULL;
......
...@@ -162,6 +162,7 @@ cmd ::= DESCRIBE ids(X) cpxName(Y). { ...@@ -162,6 +162,7 @@ cmd ::= DESCRIBE ids(X) cpxName(Y). {
X.n += Y.n; X.n += Y.n;
setDCLSqlElems(pInfo, TSDB_SQL_DESCRIBE_TABLE, 1, &X); setDCLSqlElems(pInfo, TSDB_SQL_DESCRIBE_TABLE, 1, &X);
} }
cmd ::= DESC ids(X) cpxName(Y). { cmd ::= DESC ids(X) cpxName(Y). {
X.n += Y.n; X.n += Y.n;
setDCLSqlElems(pInfo, TSDB_SQL_DESCRIBE_TABLE, 1, &X); setDCLSqlElems(pInfo, TSDB_SQL_DESCRIBE_TABLE, 1, &X);
......
...@@ -1802,10 +1802,7 @@ int32_t filterInitValFieldData(SFilterInfo *info) { ...@@ -1802,10 +1802,7 @@ int32_t filterInitValFieldData(SFilterInfo *info) {
} }
if (unit->compare.optr == TSDB_RELATION_IN) { if (unit->compare.optr == TSDB_RELATION_IN) {
SSchema *sch = FILTER_UNIT_COL_DESC(info, unit); filterConvertSetFromBinary((void **)&fi->data, var->pz, var->nLen, type, false);
bool tolower = (sch->colId == -1) ? true : false;
filterConvertSetFromBinary((void **)&fi->data, var->pz, var->nLen, type, tolower);
CHK_LRET(fi->data == NULL, TSDB_CODE_QRY_APP_ERROR, "failed to convert in param"); CHK_LRET(fi->data == NULL, TSDB_CODE_QRY_APP_ERROR, "failed to convert in param");
FILTER_SET_FLAG(fi->flag, FLD_DATA_IS_HASH); FILTER_SET_FLAG(fi->flag, FLD_DATA_IS_HASH);
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include <stdio.h> #include <stdio.h>
#include <assert.h> #include <assert.h>
/************ Begin %include sections from the grammar ************************/ /************ Begin %include sections from the grammar ************************/
#line 23 "sql.y"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -38,7 +37,6 @@ ...@@ -38,7 +37,6 @@
#include "ttokendef.h" #include "ttokendef.h"
#include "tutil.h" #include "tutil.h"
#include "tvariant.h" #include "tvariant.h"
#line 42 "sql.c"
/**************** End of %include directives **********************************/ /**************** End of %include directives **********************************/
/* These constants specify the various numeric values for terminal symbols /* These constants specify the various numeric values for terminal symbols
** in a format understandable to "makeheaders". This section is blank unless ** in a format understandable to "makeheaders". This section is blank unless
...@@ -1515,9 +1513,7 @@ static void yy_destructor( ...@@ -1515,9 +1513,7 @@ static void yy_destructor(
case 250: /* selcollist */ case 250: /* selcollist */
case 264: /* sclp */ case 264: /* sclp */
{ {
#line 762 "sql.y"
tSqlExprListDestroy((yypminor->yy421)); tSqlExprListDestroy((yypminor->yy421));
#line 1521 "sql.c"
} }
break; break;
case 221: /* intitemlist */ case 221: /* intitemlist */
...@@ -1531,32 +1527,24 @@ tSqlExprListDestroy((yypminor->yy421)); ...@@ -1531,32 +1527,24 @@ tSqlExprListDestroy((yypminor->yy421));
case 272: /* sortlist */ case 272: /* sortlist */
case 276: /* grouplist */ case 276: /* grouplist */
{ {
#line 256 "sql.y"
taosArrayDestroy((yypminor->yy421)); taosArrayDestroy((yypminor->yy421));
#line 1537 "sql.c"
} }
break; break;
case 242: /* create_table_list */ case 242: /* create_table_list */
{ {
#line 364 "sql.y"
destroyCreateTableSql((yypminor->yy438)); destroyCreateTableSql((yypminor->yy438));
#line 1544 "sql.c"
} }
break; break;
case 247: /* select */ case 247: /* select */
{ {
#line 484 "sql.y"
destroySqlNode((yypminor->yy56)); destroySqlNode((yypminor->yy56));
#line 1551 "sql.c"
} }
break; break;
case 251: /* from */ case 251: /* from */
case 268: /* tablelist */ case 268: /* tablelist */
case 269: /* sub */ case 269: /* sub */
{ {
#line 539 "sql.y"
destroyRelationInfo((yypminor->yy8)); destroyRelationInfo((yypminor->yy8));
#line 1560 "sql.c"
} }
break; break;
case 252: /* where_opt */ case 252: /* where_opt */
...@@ -1564,23 +1552,17 @@ destroyRelationInfo((yypminor->yy8)); ...@@ -1564,23 +1552,17 @@ destroyRelationInfo((yypminor->yy8));
case 266: /* expr */ case 266: /* expr */
case 277: /* expritem */ case 277: /* expritem */
{ {
#line 691 "sql.y"
tSqlExprDestroy((yypminor->yy439)); tSqlExprDestroy((yypminor->yy439));
#line 1570 "sql.c"
} }
break; break;
case 263: /* union */ case 263: /* union */
{ {
#line 492 "sql.y"
destroyAllSqlNode((yypminor->yy421)); destroyAllSqlNode((yypminor->yy421));
#line 1577 "sql.c"
} }
break; break;
case 273: /* sortitem */ case 273: /* sortitem */
{ {
#line 624 "sql.y"
tVariantDestroy(&(yypminor->yy430)); tVariantDestroy(&(yypminor->yy430));
#line 1584 "sql.c"
} }
break; break;
/********* End destructor definitions *****************************************/ /********* End destructor definitions *****************************************/
...@@ -2555,347 +2537,227 @@ static YYACTIONTYPE yy_reduce( ...@@ -2555,347 +2537,227 @@ static YYACTIONTYPE yy_reduce(
case 139: /* cmd ::= CREATE TABLE create_table_args */ yytestcase(yyruleno==139); case 139: /* cmd ::= CREATE TABLE create_table_args */ yytestcase(yyruleno==139);
case 140: /* cmd ::= CREATE TABLE create_stable_args */ yytestcase(yyruleno==140); case 140: /* cmd ::= CREATE TABLE create_stable_args */ yytestcase(yyruleno==140);
case 141: /* cmd ::= CREATE STABLE create_stable_args */ yytestcase(yyruleno==141); case 141: /* cmd ::= CREATE STABLE create_stable_args */ yytestcase(yyruleno==141);
#line 63 "sql.y"
{} {}
#line 2561 "sql.c"
break; break;
case 1: /* cmd ::= SHOW DATABASES */ case 1: /* cmd ::= SHOW DATABASES */
#line 66 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_DB, 0, 0);} { setShowOptions(pInfo, TSDB_MGMT_TABLE_DB, 0, 0);}
#line 2566 "sql.c"
break; break;
case 2: /* cmd ::= SHOW TOPICS */ case 2: /* cmd ::= SHOW TOPICS */
#line 67 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_TP, 0, 0);} { setShowOptions(pInfo, TSDB_MGMT_TABLE_TP, 0, 0);}
#line 2571 "sql.c"
break; break;
case 3: /* cmd ::= SHOW FUNCTIONS */ case 3: /* cmd ::= SHOW FUNCTIONS */
#line 68 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_FUNCTION, 0, 0);} { setShowOptions(pInfo, TSDB_MGMT_TABLE_FUNCTION, 0, 0);}
#line 2576 "sql.c"
break; break;
case 4: /* cmd ::= SHOW MNODES */ case 4: /* cmd ::= SHOW MNODES */
#line 69 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_MNODE, 0, 0);} { setShowOptions(pInfo, TSDB_MGMT_TABLE_MNODE, 0, 0);}
#line 2581 "sql.c"
break; break;
case 5: /* cmd ::= SHOW DNODES */ case 5: /* cmd ::= SHOW DNODES */
#line 70 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_DNODE, 0, 0);} { setShowOptions(pInfo, TSDB_MGMT_TABLE_DNODE, 0, 0);}
#line 2586 "sql.c"
break; break;
case 6: /* cmd ::= SHOW ACCOUNTS */ case 6: /* cmd ::= SHOW ACCOUNTS */
#line 71 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_ACCT, 0, 0);} { setShowOptions(pInfo, TSDB_MGMT_TABLE_ACCT, 0, 0);}
#line 2591 "sql.c"
break; break;
case 7: /* cmd ::= SHOW USERS */ case 7: /* cmd ::= SHOW USERS */
#line 72 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_USER, 0, 0);} { setShowOptions(pInfo, TSDB_MGMT_TABLE_USER, 0, 0);}
#line 2596 "sql.c"
break; break;
case 8: /* cmd ::= SHOW MODULES */ case 8: /* cmd ::= SHOW MODULES */
#line 74 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_MODULE, 0, 0); } { setShowOptions(pInfo, TSDB_MGMT_TABLE_MODULE, 0, 0); }
#line 2601 "sql.c"
break; break;
case 9: /* cmd ::= SHOW QUERIES */ case 9: /* cmd ::= SHOW QUERIES */
#line 75 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_QUERIES, 0, 0); } { setShowOptions(pInfo, TSDB_MGMT_TABLE_QUERIES, 0, 0); }
#line 2606 "sql.c"
break; break;
case 10: /* cmd ::= SHOW CONNECTIONS */ case 10: /* cmd ::= SHOW CONNECTIONS */
#line 76 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_CONNS, 0, 0);} { setShowOptions(pInfo, TSDB_MGMT_TABLE_CONNS, 0, 0);}
#line 2611 "sql.c"
break; break;
case 11: /* cmd ::= SHOW STREAMS */ case 11: /* cmd ::= SHOW STREAMS */
#line 77 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_STREAMS, 0, 0); } { setShowOptions(pInfo, TSDB_MGMT_TABLE_STREAMS, 0, 0); }
#line 2616 "sql.c"
break; break;
case 12: /* cmd ::= SHOW VARIABLES */ case 12: /* cmd ::= SHOW VARIABLES */
#line 78 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_VARIABLES, 0, 0); } { setShowOptions(pInfo, TSDB_MGMT_TABLE_VARIABLES, 0, 0); }
#line 2621 "sql.c"
break; break;
case 13: /* cmd ::= SHOW SCORES */ case 13: /* cmd ::= SHOW SCORES */
#line 79 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_SCORES, 0, 0); } { setShowOptions(pInfo, TSDB_MGMT_TABLE_SCORES, 0, 0); }
#line 2626 "sql.c"
break; break;
case 14: /* cmd ::= SHOW GRANTS */ case 14: /* cmd ::= SHOW GRANTS */
#line 80 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_GRANTS, 0, 0); } { setShowOptions(pInfo, TSDB_MGMT_TABLE_GRANTS, 0, 0); }
#line 2631 "sql.c"
break; break;
case 15: /* cmd ::= SHOW VNODES */ case 15: /* cmd ::= SHOW VNODES */
#line 82 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_VNODES, 0, 0); } { setShowOptions(pInfo, TSDB_MGMT_TABLE_VNODES, 0, 0); }
#line 2636 "sql.c"
break; break;
case 16: /* cmd ::= SHOW VNODES ids */ case 16: /* cmd ::= SHOW VNODES ids */
#line 83 "sql.y"
{ setShowOptions(pInfo, TSDB_MGMT_TABLE_VNODES, &yymsp[0].minor.yy0, 0); } { setShowOptions(pInfo, TSDB_MGMT_TABLE_VNODES, &yymsp[0].minor.yy0, 0); }
#line 2641 "sql.c"
break; break;
case 17: /* dbPrefix ::= */ case 17: /* dbPrefix ::= */
#line 87 "sql.y"
{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.type = 0;} {yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.type = 0;}
#line 2646 "sql.c"
break; break;
case 18: /* dbPrefix ::= ids DOT */ case 18: /* dbPrefix ::= ids DOT */
#line 88 "sql.y"
{yylhsminor.yy0 = yymsp[-1].minor.yy0; } {yylhsminor.yy0 = yymsp[-1].minor.yy0; }
#line 2651 "sql.c"
yymsp[-1].minor.yy0 = yylhsminor.yy0; yymsp[-1].minor.yy0 = yylhsminor.yy0;
break; break;
case 19: /* cpxName ::= */ case 19: /* cpxName ::= */
#line 91 "sql.y"
{yymsp[1].minor.yy0.n = 0; } {yymsp[1].minor.yy0.n = 0; }
#line 2657 "sql.c"
break; break;
case 20: /* cpxName ::= DOT ids */ case 20: /* cpxName ::= DOT ids */
#line 92 "sql.y"
{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n += 1; } {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n += 1; }
#line 2662 "sql.c"
break; break;
case 21: /* cmd ::= SHOW CREATE TABLE ids cpxName */ case 21: /* cmd ::= SHOW CREATE TABLE ids cpxName */
#line 94 "sql.y"
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
setDCLSqlElems(pInfo, TSDB_SQL_SHOW_CREATE_TABLE, 1, &yymsp[-1].minor.yy0); setDCLSqlElems(pInfo, TSDB_SQL_SHOW_CREATE_TABLE, 1, &yymsp[-1].minor.yy0);
} }
#line 2670 "sql.c"
break; break;
case 22: /* cmd ::= SHOW CREATE STABLE ids cpxName */ case 22: /* cmd ::= SHOW CREATE STABLE ids cpxName */
#line 98 "sql.y"
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
setDCLSqlElems(pInfo, TSDB_SQL_SHOW_CREATE_STABLE, 1, &yymsp[-1].minor.yy0); setDCLSqlElems(pInfo, TSDB_SQL_SHOW_CREATE_STABLE, 1, &yymsp[-1].minor.yy0);
} }
#line 2678 "sql.c"
break; break;
case 23: /* cmd ::= SHOW CREATE DATABASE ids */ case 23: /* cmd ::= SHOW CREATE DATABASE ids */
#line 103 "sql.y"
{ {
setDCLSqlElems(pInfo, TSDB_SQL_SHOW_CREATE_DATABASE, 1, &yymsp[0].minor.yy0); setDCLSqlElems(pInfo, TSDB_SQL_SHOW_CREATE_DATABASE, 1, &yymsp[0].minor.yy0);
} }
#line 2685 "sql.c"
break; break;
case 24: /* cmd ::= SHOW dbPrefix TABLES */ case 24: /* cmd ::= SHOW dbPrefix TABLES */
#line 107 "sql.y"
{ {
setShowOptions(pInfo, TSDB_MGMT_TABLE_TABLE, &yymsp[-1].minor.yy0, 0); setShowOptions(pInfo, TSDB_MGMT_TABLE_TABLE, &yymsp[-1].minor.yy0, 0);
} }
#line 2692 "sql.c"
break; break;
case 25: /* cmd ::= SHOW dbPrefix TABLES LIKE ids */ case 25: /* cmd ::= SHOW dbPrefix TABLES LIKE ids */
#line 111 "sql.y"
{ {
setShowOptions(pInfo, TSDB_MGMT_TABLE_TABLE, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0); setShowOptions(pInfo, TSDB_MGMT_TABLE_TABLE, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0);
} }
#line 2699 "sql.c"
break; break;
case 26: /* cmd ::= SHOW dbPrefix STABLES */ case 26: /* cmd ::= SHOW dbPrefix STABLES */
#line 115 "sql.y"
{ {
setShowOptions(pInfo, TSDB_MGMT_TABLE_METRIC, &yymsp[-1].minor.yy0, 0); setShowOptions(pInfo, TSDB_MGMT_TABLE_METRIC, &yymsp[-1].minor.yy0, 0);
} }
#line 2706 "sql.c"
break; break;
case 27: /* cmd ::= SHOW dbPrefix STABLES LIKE ids */ case 27: /* cmd ::= SHOW dbPrefix STABLES LIKE ids */
#line 119 "sql.y"
{ {
SStrToken token; SStrToken token;
tSetDbName(&token, &yymsp[-3].minor.yy0); tSetDbName(&token, &yymsp[-3].minor.yy0);
setShowOptions(pInfo, TSDB_MGMT_TABLE_METRIC, &token, &yymsp[0].minor.yy0); setShowOptions(pInfo, TSDB_MGMT_TABLE_METRIC, &token, &yymsp[0].minor.yy0);
} }
#line 2715 "sql.c"
break; break;
case 28: /* cmd ::= SHOW dbPrefix VGROUPS */ case 28: /* cmd ::= SHOW dbPrefix VGROUPS */
#line 125 "sql.y"
{ {
SStrToken token; SStrToken token;
tSetDbName(&token, &yymsp[-1].minor.yy0); tSetDbName(&token, &yymsp[-1].minor.yy0);
setShowOptions(pInfo, TSDB_MGMT_TABLE_VGROUP, &token, 0); setShowOptions(pInfo, TSDB_MGMT_TABLE_VGROUP, &token, 0);
} }
#line 2724 "sql.c"
break; break;
case 29: /* cmd ::= SHOW dbPrefix VGROUPS ids */ case 29: /* cmd ::= SHOW dbPrefix VGROUPS ids */
#line 131 "sql.y"
{ {
SStrToken token; SStrToken token;
tSetDbName(&token, &yymsp[-2].minor.yy0); tSetDbName(&token, &yymsp[-2].minor.yy0);
setShowOptions(pInfo, TSDB_MGMT_TABLE_VGROUP, &token, &yymsp[0].minor.yy0); setShowOptions(pInfo, TSDB_MGMT_TABLE_VGROUP, &token, &yymsp[0].minor.yy0);
} }
#line 2733 "sql.c"
break; break;
case 30: /* cmd ::= DROP TABLE ifexists ids cpxName */ case 30: /* cmd ::= DROP TABLE ifexists ids cpxName */
#line 138 "sql.y"
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
setDropDbTableInfo(pInfo, TSDB_SQL_DROP_TABLE, &yymsp[-1].minor.yy0, &yymsp[-2].minor.yy0, -1, -1); setDropDbTableInfo(pInfo, TSDB_SQL_DROP_TABLE, &yymsp[-1].minor.yy0, &yymsp[-2].minor.yy0, -1, -1);
} }
#line 2741 "sql.c"
break; break;
case 31: /* cmd ::= DROP STABLE ifexists ids cpxName */ case 31: /* cmd ::= DROP STABLE ifexists ids cpxName */
#line 144 "sql.y"
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
setDropDbTableInfo(pInfo, TSDB_SQL_DROP_TABLE, &yymsp[-1].minor.yy0, &yymsp[-2].minor.yy0, -1, TSDB_SUPER_TABLE); setDropDbTableInfo(pInfo, TSDB_SQL_DROP_TABLE, &yymsp[-1].minor.yy0, &yymsp[-2].minor.yy0, -1, TSDB_SUPER_TABLE);
} }
#line 2749 "sql.c"
break; break;
case 32: /* cmd ::= DROP DATABASE ifexists ids */ case 32: /* cmd ::= DROP DATABASE ifexists ids */
#line 149 "sql.y"
{ setDropDbTableInfo(pInfo, TSDB_SQL_DROP_DB, &yymsp[0].minor.yy0, &yymsp[-1].minor.yy0, TSDB_DB_TYPE_DEFAULT, -1); } { setDropDbTableInfo(pInfo, TSDB_SQL_DROP_DB, &yymsp[0].minor.yy0, &yymsp[-1].minor.yy0, TSDB_DB_TYPE_DEFAULT, -1); }
#line 2754 "sql.c"
break; break;
case 33: /* cmd ::= DROP TOPIC ifexists ids */ case 33: /* cmd ::= DROP TOPIC ifexists ids */
#line 150 "sql.y"
{ setDropDbTableInfo(pInfo, TSDB_SQL_DROP_DB, &yymsp[0].minor.yy0, &yymsp[-1].minor.yy0, TSDB_DB_TYPE_TOPIC, -1); } { setDropDbTableInfo(pInfo, TSDB_SQL_DROP_DB, &yymsp[0].minor.yy0, &yymsp[-1].minor.yy0, TSDB_DB_TYPE_TOPIC, -1); }
#line 2759 "sql.c"
break; break;
case 34: /* cmd ::= DROP FUNCTION ids */ case 34: /* cmd ::= DROP FUNCTION ids */
#line 151 "sql.y"
{ setDropFuncInfo(pInfo, TSDB_SQL_DROP_FUNCTION, &yymsp[0].minor.yy0); } { setDropFuncInfo(pInfo, TSDB_SQL_DROP_FUNCTION, &yymsp[0].minor.yy0); }
#line 2764 "sql.c"
break; break;
case 35: /* cmd ::= DROP DNODE ids */ case 35: /* cmd ::= DROP DNODE ids */
#line 153 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_DROP_DNODE, 1, &yymsp[0].minor.yy0); } { setDCLSqlElems(pInfo, TSDB_SQL_DROP_DNODE, 1, &yymsp[0].minor.yy0); }
#line 2769 "sql.c"
break; break;
case 36: /* cmd ::= DROP USER ids */ case 36: /* cmd ::= DROP USER ids */
#line 154 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_DROP_USER, 1, &yymsp[0].minor.yy0); } { setDCLSqlElems(pInfo, TSDB_SQL_DROP_USER, 1, &yymsp[0].minor.yy0); }
#line 2774 "sql.c"
break; break;
case 37: /* cmd ::= DROP ACCOUNT ids */ case 37: /* cmd ::= DROP ACCOUNT ids */
#line 155 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_DROP_ACCT, 1, &yymsp[0].minor.yy0); } { setDCLSqlElems(pInfo, TSDB_SQL_DROP_ACCT, 1, &yymsp[0].minor.yy0); }
#line 2779 "sql.c"
break; break;
case 38: /* cmd ::= USE ids */ case 38: /* cmd ::= USE ids */
#line 158 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_USE_DB, 1, &yymsp[0].minor.yy0);} { setDCLSqlElems(pInfo, TSDB_SQL_USE_DB, 1, &yymsp[0].minor.yy0);}
#line 2784 "sql.c"
break; break;
case 39: /* cmd ::= DESCRIBE ids cpxName */ case 39: /* cmd ::= DESCRIBE ids cpxName */
case 40: /* cmd ::= DESC ids cpxName */ yytestcase(yyruleno==40); case 40: /* cmd ::= DESC ids cpxName */ yytestcase(yyruleno==40);
#line 161 "sql.y"
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
setDCLSqlElems(pInfo, TSDB_SQL_DESCRIBE_TABLE, 1, &yymsp[-1].minor.yy0); setDCLSqlElems(pInfo, TSDB_SQL_DESCRIBE_TABLE, 1, &yymsp[-1].minor.yy0);
} }
#line 2793 "sql.c"
break; break;
case 41: /* cmd ::= ALTER USER ids PASS ids */ case 41: /* cmd ::= ALTER USER ids PASS ids */
#line 170 "sql.y"
{ setAlterUserSql(pInfo, TSDB_ALTER_USER_PASSWD, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, NULL); } { setAlterUserSql(pInfo, TSDB_ALTER_USER_PASSWD, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, NULL); }
#line 2798 "sql.c"
break; break;
case 42: /* cmd ::= ALTER USER ids PRIVILEGE ids */ case 42: /* cmd ::= ALTER USER ids PRIVILEGE ids */
#line 171 "sql.y"
{ setAlterUserSql(pInfo, TSDB_ALTER_USER_PRIVILEGES, &yymsp[-2].minor.yy0, NULL, &yymsp[0].minor.yy0);} { setAlterUserSql(pInfo, TSDB_ALTER_USER_PRIVILEGES, &yymsp[-2].minor.yy0, NULL, &yymsp[0].minor.yy0);}
#line 2803 "sql.c"
break; break;
case 43: /* cmd ::= ALTER DNODE ids ids */ case 43: /* cmd ::= ALTER DNODE ids ids */
#line 172 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_CFG_DNODE, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } { setDCLSqlElems(pInfo, TSDB_SQL_CFG_DNODE, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
#line 2808 "sql.c"
break; break;
case 44: /* cmd ::= ALTER DNODE ids ids ids */ case 44: /* cmd ::= ALTER DNODE ids ids ids */
#line 173 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_CFG_DNODE, 3, &yymsp[-2].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } { setDCLSqlElems(pInfo, TSDB_SQL_CFG_DNODE, 3, &yymsp[-2].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
#line 2813 "sql.c"
break; break;
case 45: /* cmd ::= ALTER LOCAL ids */ case 45: /* cmd ::= ALTER LOCAL ids */
#line 174 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_CFG_LOCAL, 1, &yymsp[0].minor.yy0); } { setDCLSqlElems(pInfo, TSDB_SQL_CFG_LOCAL, 1, &yymsp[0].minor.yy0); }
#line 2818 "sql.c"
break; break;
case 46: /* cmd ::= ALTER LOCAL ids ids */ case 46: /* cmd ::= ALTER LOCAL ids ids */
#line 175 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } { setDCLSqlElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
#line 2823 "sql.c"
break; break;
case 47: /* cmd ::= ALTER DATABASE ids alter_db_optr */ case 47: /* cmd ::= ALTER DATABASE ids alter_db_optr */
case 48: /* cmd ::= ALTER TOPIC ids alter_topic_optr */ yytestcase(yyruleno==48); case 48: /* cmd ::= ALTER TOPIC ids alter_topic_optr */ yytestcase(yyruleno==48);
#line 176 "sql.y"
{ SStrToken t = {0}; setCreateDbInfo(pInfo, TSDB_SQL_ALTER_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy90, &t);} { SStrToken t = {0}; setCreateDbInfo(pInfo, TSDB_SQL_ALTER_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy90, &t);}
#line 2829 "sql.c"
break; break;
case 49: /* cmd ::= ALTER ACCOUNT ids acct_optr */ case 49: /* cmd ::= ALTER ACCOUNT ids acct_optr */
#line 179 "sql.y"
{ setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-1].minor.yy0, NULL, &yymsp[0].minor.yy171);} { setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-1].minor.yy0, NULL, &yymsp[0].minor.yy171);}
#line 2834 "sql.c"
break; break;
case 50: /* cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */ case 50: /* cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
#line 180 "sql.y"
{ setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy171);} { setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy171);}
#line 2839 "sql.c"
break; break;
case 51: /* cmd ::= COMPACT VNODES IN LP exprlist RP */ case 51: /* cmd ::= COMPACT VNODES IN LP exprlist RP */
#line 184 "sql.y"
{ setCompactVnodeSql(pInfo, TSDB_SQL_COMPACT_VNODE, yymsp[-1].minor.yy421);} { setCompactVnodeSql(pInfo, TSDB_SQL_COMPACT_VNODE, yymsp[-1].minor.yy421);}
#line 2844 "sql.c"
break; break;
case 52: /* ids ::= ID */ case 52: /* ids ::= ID */
case 53: /* ids ::= STRING */ yytestcase(yyruleno==53); case 53: /* ids ::= STRING */ yytestcase(yyruleno==53);
#line 190 "sql.y"
{yylhsminor.yy0 = yymsp[0].minor.yy0; } {yylhsminor.yy0 = yymsp[0].minor.yy0; }
#line 2850 "sql.c"
yymsp[0].minor.yy0 = yylhsminor.yy0; yymsp[0].minor.yy0 = yylhsminor.yy0;
break; break;
case 54: /* ifexists ::= IF EXISTS */ case 54: /* ifexists ::= IF EXISTS */
#line 194 "sql.y"
{ yymsp[-1].minor.yy0.n = 1;} { yymsp[-1].minor.yy0.n = 1;}
#line 2856 "sql.c"
break; break;
case 55: /* ifexists ::= */ case 55: /* ifexists ::= */
case 57: /* ifnotexists ::= */ yytestcase(yyruleno==57); case 57: /* ifnotexists ::= */ yytestcase(yyruleno==57);
case 181: /* distinct ::= */ yytestcase(yyruleno==181); case 181: /* distinct ::= */ yytestcase(yyruleno==181);
#line 195 "sql.y"
{ yymsp[1].minor.yy0.n = 0;} { yymsp[1].minor.yy0.n = 0;}
#line 2863 "sql.c"
break; break;
case 56: /* ifnotexists ::= IF NOT EXISTS */ case 56: /* ifnotexists ::= IF NOT EXISTS */
#line 198 "sql.y"
{ yymsp[-2].minor.yy0.n = 1;} { yymsp[-2].minor.yy0.n = 1;}
#line 2868 "sql.c"
break; break;
case 58: /* cmd ::= CREATE DNODE ids */ case 58: /* cmd ::= CREATE DNODE ids */
#line 203 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &yymsp[0].minor.yy0);} { setDCLSqlElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &yymsp[0].minor.yy0);}
#line 2873 "sql.c"
break; break;
case 59: /* cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */ case 59: /* cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
#line 205 "sql.y"
{ setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy171);} { setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy171);}
#line 2878 "sql.c"
break; break;
case 60: /* cmd ::= CREATE DATABASE ifnotexists ids db_optr */ case 60: /* cmd ::= CREATE DATABASE ifnotexists ids db_optr */
case 61: /* cmd ::= CREATE TOPIC ifnotexists ids topic_optr */ yytestcase(yyruleno==61); case 61: /* cmd ::= CREATE TOPIC ifnotexists ids topic_optr */ yytestcase(yyruleno==61);
#line 206 "sql.y"
{ setCreateDbInfo(pInfo, TSDB_SQL_CREATE_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy90, &yymsp[-2].minor.yy0);} { setCreateDbInfo(pInfo, TSDB_SQL_CREATE_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy90, &yymsp[-2].minor.yy0);}
#line 2884 "sql.c"
break; break;
case 62: /* cmd ::= CREATE FUNCTION ids AS ids OUTPUTTYPE typename bufsize */ case 62: /* cmd ::= CREATE FUNCTION ids AS ids OUTPUTTYPE typename bufsize */
#line 208 "sql.y"
{ setCreateFuncInfo(pInfo, TSDB_SQL_CREATE_FUNCTION, &yymsp[-5].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy183, &yymsp[0].minor.yy0, 1);} { setCreateFuncInfo(pInfo, TSDB_SQL_CREATE_FUNCTION, &yymsp[-5].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy183, &yymsp[0].minor.yy0, 1);}
#line 2889 "sql.c"
break; break;
case 63: /* cmd ::= CREATE AGGREGATE FUNCTION ids AS ids OUTPUTTYPE typename bufsize */ case 63: /* cmd ::= CREATE AGGREGATE FUNCTION ids AS ids OUTPUTTYPE typename bufsize */
#line 209 "sql.y"
{ setCreateFuncInfo(pInfo, TSDB_SQL_CREATE_FUNCTION, &yymsp[-5].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy183, &yymsp[0].minor.yy0, 2);} { setCreateFuncInfo(pInfo, TSDB_SQL_CREATE_FUNCTION, &yymsp[-5].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy183, &yymsp[0].minor.yy0, 2);}
#line 2894 "sql.c"
break; break;
case 64: /* cmd ::= CREATE USER ids PASS ids */ case 64: /* cmd ::= CREATE USER ids PASS ids */
#line 210 "sql.y"
{ setCreateUserSql(pInfo, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);} { setCreateUserSql(pInfo, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);}
#line 2899 "sql.c"
break; break;
case 65: /* bufsize ::= */ case 65: /* bufsize ::= */
case 67: /* pps ::= */ yytestcase(yyruleno==67); case 67: /* pps ::= */ yytestcase(yyruleno==67);
...@@ -2907,9 +2769,7 @@ static YYACTIONTYPE yy_reduce( ...@@ -2907,9 +2769,7 @@ static YYACTIONTYPE yy_reduce(
case 79: /* users ::= */ yytestcase(yyruleno==79); case 79: /* users ::= */ yytestcase(yyruleno==79);
case 81: /* conns ::= */ yytestcase(yyruleno==81); case 81: /* conns ::= */ yytestcase(yyruleno==81);
case 83: /* state ::= */ yytestcase(yyruleno==83); case 83: /* state ::= */ yytestcase(yyruleno==83);
#line 212 "sql.y"
{ yymsp[1].minor.yy0.n = 0; } { yymsp[1].minor.yy0.n = 0; }
#line 2913 "sql.c"
break; break;
case 66: /* bufsize ::= BUFSIZE INTEGER */ case 66: /* bufsize ::= BUFSIZE INTEGER */
case 68: /* pps ::= PPS INTEGER */ yytestcase(yyruleno==68); case 68: /* pps ::= PPS INTEGER */ yytestcase(yyruleno==68);
...@@ -2921,12 +2781,9 @@ static YYACTIONTYPE yy_reduce( ...@@ -2921,12 +2781,9 @@ static YYACTIONTYPE yy_reduce(
case 80: /* users ::= USERS INTEGER */ yytestcase(yyruleno==80); case 80: /* users ::= USERS INTEGER */ yytestcase(yyruleno==80);
case 82: /* conns ::= CONNS INTEGER */ yytestcase(yyruleno==82); case 82: /* conns ::= CONNS INTEGER */ yytestcase(yyruleno==82);
case 84: /* state ::= STATE ids */ yytestcase(yyruleno==84); case 84: /* state ::= STATE ids */ yytestcase(yyruleno==84);
#line 213 "sql.y"
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; } { yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
#line 2927 "sql.c"
break; break;
case 85: /* acct_optr ::= pps tseries storage streams qtime dbs users conns state */ case 85: /* acct_optr ::= pps tseries storage streams qtime dbs users conns state */
#line 243 "sql.y"
{ {
yylhsminor.yy171.maxUsers = (yymsp[-2].minor.yy0.n>0)?atoi(yymsp[-2].minor.yy0.z):-1; yylhsminor.yy171.maxUsers = (yymsp[-2].minor.yy0.n>0)?atoi(yymsp[-2].minor.yy0.z):-1;
yylhsminor.yy171.maxDbs = (yymsp[-3].minor.yy0.n>0)?atoi(yymsp[-3].minor.yy0.z):-1; yylhsminor.yy171.maxDbs = (yymsp[-3].minor.yy0.n>0)?atoi(yymsp[-3].minor.yy0.z):-1;
...@@ -2938,21 +2795,16 @@ static YYACTIONTYPE yy_reduce( ...@@ -2938,21 +2795,16 @@ static YYACTIONTYPE yy_reduce(
yylhsminor.yy171.maxConnections = (yymsp[-1].minor.yy0.n>0)?atoi(yymsp[-1].minor.yy0.z):-1; yylhsminor.yy171.maxConnections = (yymsp[-1].minor.yy0.n>0)?atoi(yymsp[-1].minor.yy0.z):-1;
yylhsminor.yy171.stat = yymsp[0].minor.yy0; yylhsminor.yy171.stat = yymsp[0].minor.yy0;
} }
#line 2942 "sql.c"
yymsp[-8].minor.yy171 = yylhsminor.yy171; yymsp[-8].minor.yy171 = yylhsminor.yy171;
break; break;
case 86: /* intitemlist ::= intitemlist COMMA intitem */ case 86: /* intitemlist ::= intitemlist COMMA intitem */
case 155: /* tagitemlist ::= tagitemlist COMMA tagitem */ yytestcase(yyruleno==155); case 155: /* tagitemlist ::= tagitemlist COMMA tagitem */ yytestcase(yyruleno==155);
#line 259 "sql.y"
{ yylhsminor.yy421 = tVariantListAppend(yymsp[-2].minor.yy421, &yymsp[0].minor.yy430, -1); } { yylhsminor.yy421 = tVariantListAppend(yymsp[-2].minor.yy421, &yymsp[0].minor.yy430, -1); }
#line 2949 "sql.c"
yymsp[-2].minor.yy421 = yylhsminor.yy421; yymsp[-2].minor.yy421 = yylhsminor.yy421;
break; break;
case 87: /* intitemlist ::= intitem */ case 87: /* intitemlist ::= intitem */
case 156: /* tagitemlist ::= tagitem */ yytestcase(yyruleno==156); case 156: /* tagitemlist ::= tagitem */ yytestcase(yyruleno==156);
#line 260 "sql.y"
{ yylhsminor.yy421 = tVariantListAppend(NULL, &yymsp[0].minor.yy430, -1); } { yylhsminor.yy421 = tVariantListAppend(NULL, &yymsp[0].minor.yy430, -1); }
#line 2956 "sql.c"
yymsp[0].minor.yy421 = yylhsminor.yy421; yymsp[0].minor.yy421 = yylhsminor.yy421;
break; break;
case 88: /* intitem ::= INTEGER */ case 88: /* intitem ::= INTEGER */
...@@ -2960,15 +2812,11 @@ static YYACTIONTYPE yy_reduce( ...@@ -2960,15 +2812,11 @@ static YYACTIONTYPE yy_reduce(
case 158: /* tagitem ::= FLOAT */ yytestcase(yyruleno==158); case 158: /* tagitem ::= FLOAT */ yytestcase(yyruleno==158);
case 159: /* tagitem ::= STRING */ yytestcase(yyruleno==159); case 159: /* tagitem ::= STRING */ yytestcase(yyruleno==159);
case 160: /* tagitem ::= BOOL */ yytestcase(yyruleno==160); case 160: /* tagitem ::= BOOL */ yytestcase(yyruleno==160);
#line 262 "sql.y"
{ toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy430, &yymsp[0].minor.yy0); } { toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy430, &yymsp[0].minor.yy0); }
#line 2966 "sql.c"
yymsp[0].minor.yy430 = yylhsminor.yy430; yymsp[0].minor.yy430 = yylhsminor.yy430;
break; break;
case 89: /* keep ::= KEEP intitemlist */ case 89: /* keep ::= KEEP intitemlist */
#line 266 "sql.y"
{ yymsp[-1].minor.yy421 = yymsp[0].minor.yy421; } { yymsp[-1].minor.yy421 = yymsp[0].minor.yy421; }
#line 2972 "sql.c"
break; break;
case 90: /* cache ::= CACHE INTEGER */ case 90: /* cache ::= CACHE INTEGER */
case 91: /* replica ::= REPLICA INTEGER */ yytestcase(yyruleno==91); case 91: /* replica ::= REPLICA INTEGER */ yytestcase(yyruleno==91);
...@@ -2985,142 +2833,99 @@ static YYACTIONTYPE yy_reduce( ...@@ -2985,142 +2833,99 @@ static YYACTIONTYPE yy_reduce(
case 102: /* update ::= UPDATE INTEGER */ yytestcase(yyruleno==102); case 102: /* update ::= UPDATE INTEGER */ yytestcase(yyruleno==102);
case 103: /* cachelast ::= CACHELAST INTEGER */ yytestcase(yyruleno==103); case 103: /* cachelast ::= CACHELAST INTEGER */ yytestcase(yyruleno==103);
case 104: /* partitions ::= PARTITIONS INTEGER */ yytestcase(yyruleno==104); case 104: /* partitions ::= PARTITIONS INTEGER */ yytestcase(yyruleno==104);
#line 268 "sql.y"
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; } { yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
#line 2991 "sql.c"
break; break;
case 105: /* db_optr ::= */ case 105: /* db_optr ::= */
#line 285 "sql.y"
{setDefaultCreateDbOption(&yymsp[1].minor.yy90); yymsp[1].minor.yy90.dbType = TSDB_DB_TYPE_DEFAULT;} {setDefaultCreateDbOption(&yymsp[1].minor.yy90); yymsp[1].minor.yy90.dbType = TSDB_DB_TYPE_DEFAULT;}
#line 2996 "sql.c"
break; break;
case 106: /* db_optr ::= db_optr cache */ case 106: /* db_optr ::= db_optr cache */
#line 287 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.cacheBlockSize = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.cacheBlockSize = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3001 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 107: /* db_optr ::= db_optr replica */ case 107: /* db_optr ::= db_optr replica */
case 124: /* alter_db_optr ::= alter_db_optr replica */ yytestcase(yyruleno==124); case 124: /* alter_db_optr ::= alter_db_optr replica */ yytestcase(yyruleno==124);
#line 288 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.replica = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.replica = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3008 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 108: /* db_optr ::= db_optr quorum */ case 108: /* db_optr ::= db_optr quorum */
case 125: /* alter_db_optr ::= alter_db_optr quorum */ yytestcase(yyruleno==125); case 125: /* alter_db_optr ::= alter_db_optr quorum */ yytestcase(yyruleno==125);
#line 289 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.quorum = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.quorum = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3015 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 109: /* db_optr ::= db_optr days */ case 109: /* db_optr ::= db_optr days */
#line 290 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.daysPerFile = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.daysPerFile = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3021 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 110: /* db_optr ::= db_optr minrows */ case 110: /* db_optr ::= db_optr minrows */
#line 291 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.minRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.minRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
#line 3027 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 111: /* db_optr ::= db_optr maxrows */ case 111: /* db_optr ::= db_optr maxrows */
#line 292 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.maxRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.maxRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
#line 3033 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 112: /* db_optr ::= db_optr blocks */ case 112: /* db_optr ::= db_optr blocks */
case 127: /* alter_db_optr ::= alter_db_optr blocks */ yytestcase(yyruleno==127); case 127: /* alter_db_optr ::= alter_db_optr blocks */ yytestcase(yyruleno==127);
#line 293 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.numOfBlocks = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.numOfBlocks = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3040 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 113: /* db_optr ::= db_optr ctime */ case 113: /* db_optr ::= db_optr ctime */
#line 294 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.commitTime = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.commitTime = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3046 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 114: /* db_optr ::= db_optr wal */ case 114: /* db_optr ::= db_optr wal */
#line 295 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.walLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.walLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3052 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 115: /* db_optr ::= db_optr fsync */ case 115: /* db_optr ::= db_optr fsync */
#line 296 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.fsyncPeriod = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.fsyncPeriod = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3058 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 116: /* db_optr ::= db_optr comp */ case 116: /* db_optr ::= db_optr comp */
case 128: /* alter_db_optr ::= alter_db_optr comp */ yytestcase(yyruleno==128); case 128: /* alter_db_optr ::= alter_db_optr comp */ yytestcase(yyruleno==128);
#line 297 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.compressionLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.compressionLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3065 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 117: /* db_optr ::= db_optr prec */ case 117: /* db_optr ::= db_optr prec */
#line 298 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.precision = yymsp[0].minor.yy0; } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.precision = yymsp[0].minor.yy0; }
#line 3071 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 118: /* db_optr ::= db_optr keep */ case 118: /* db_optr ::= db_optr keep */
case 126: /* alter_db_optr ::= alter_db_optr keep */ yytestcase(yyruleno==126); case 126: /* alter_db_optr ::= alter_db_optr keep */ yytestcase(yyruleno==126);
#line 299 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.keep = yymsp[0].minor.yy421; } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.keep = yymsp[0].minor.yy421; }
#line 3078 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 119: /* db_optr ::= db_optr update */ case 119: /* db_optr ::= db_optr update */
case 129: /* alter_db_optr ::= alter_db_optr update */ yytestcase(yyruleno==129); case 129: /* alter_db_optr ::= alter_db_optr update */ yytestcase(yyruleno==129);
#line 300 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.update = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.update = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3085 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 120: /* db_optr ::= db_optr cachelast */ case 120: /* db_optr ::= db_optr cachelast */
case 130: /* alter_db_optr ::= alter_db_optr cachelast */ yytestcase(yyruleno==130); case 130: /* alter_db_optr ::= alter_db_optr cachelast */ yytestcase(yyruleno==130);
#line 301 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.cachelast = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.cachelast = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3092 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 121: /* topic_optr ::= db_optr */ case 121: /* topic_optr ::= db_optr */
case 131: /* alter_topic_optr ::= alter_db_optr */ yytestcase(yyruleno==131); case 131: /* alter_topic_optr ::= alter_db_optr */ yytestcase(yyruleno==131);
#line 305 "sql.y"
{ yylhsminor.yy90 = yymsp[0].minor.yy90; yylhsminor.yy90.dbType = TSDB_DB_TYPE_TOPIC; } { yylhsminor.yy90 = yymsp[0].minor.yy90; yylhsminor.yy90.dbType = TSDB_DB_TYPE_TOPIC; }
#line 3099 "sql.c"
yymsp[0].minor.yy90 = yylhsminor.yy90; yymsp[0].minor.yy90 = yylhsminor.yy90;
break; break;
case 122: /* topic_optr ::= topic_optr partitions */ case 122: /* topic_optr ::= topic_optr partitions */
case 132: /* alter_topic_optr ::= alter_topic_optr partitions */ yytestcase(yyruleno==132); case 132: /* alter_topic_optr ::= alter_topic_optr partitions */ yytestcase(yyruleno==132);
#line 306 "sql.y"
{ yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.partitions = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy90 = yymsp[-1].minor.yy90; yylhsminor.yy90.partitions = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3106 "sql.c"
yymsp[-1].minor.yy90 = yylhsminor.yy90; yymsp[-1].minor.yy90 = yylhsminor.yy90;
break; break;
case 123: /* alter_db_optr ::= */ case 123: /* alter_db_optr ::= */
#line 309 "sql.y"
{ setDefaultCreateDbOption(&yymsp[1].minor.yy90); yymsp[1].minor.yy90.dbType = TSDB_DB_TYPE_DEFAULT;} { setDefaultCreateDbOption(&yymsp[1].minor.yy90); yymsp[1].minor.yy90.dbType = TSDB_DB_TYPE_DEFAULT;}
#line 3112 "sql.c"
break; break;
case 133: /* typename ::= ids */ case 133: /* typename ::= ids */
#line 329 "sql.y"
{ {
yymsp[0].minor.yy0.type = 0; yymsp[0].minor.yy0.type = 0;
tSetColumnType (&yylhsminor.yy183, &yymsp[0].minor.yy0); tSetColumnType (&yylhsminor.yy183, &yymsp[0].minor.yy0);
} }
#line 3120 "sql.c"
yymsp[0].minor.yy183 = yylhsminor.yy183; yymsp[0].minor.yy183 = yylhsminor.yy183;
break; break;
case 134: /* typename ::= ids LP signed RP */ case 134: /* typename ::= ids LP signed RP */
#line 335 "sql.y"
{ {
if (yymsp[-1].minor.yy325 <= 0) { if (yymsp[-1].minor.yy325 <= 0) {
yymsp[-3].minor.yy0.type = 0; yymsp[-3].minor.yy0.type = 0;
...@@ -3130,42 +2935,30 @@ static YYACTIONTYPE yy_reduce( ...@@ -3130,42 +2935,30 @@ static YYACTIONTYPE yy_reduce(
tSetColumnType(&yylhsminor.yy183, &yymsp[-3].minor.yy0); tSetColumnType(&yylhsminor.yy183, &yymsp[-3].minor.yy0);
} }
} }
#line 3134 "sql.c"
yymsp[-3].minor.yy183 = yylhsminor.yy183; yymsp[-3].minor.yy183 = yylhsminor.yy183;
break; break;
case 135: /* typename ::= ids UNSIGNED */ case 135: /* typename ::= ids UNSIGNED */
#line 346 "sql.y"
{ {
yymsp[-1].minor.yy0.type = 0; yymsp[-1].minor.yy0.type = 0;
yymsp[-1].minor.yy0.n = ((yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z); yymsp[-1].minor.yy0.n = ((yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z);
tSetColumnType (&yylhsminor.yy183, &yymsp[-1].minor.yy0); tSetColumnType (&yylhsminor.yy183, &yymsp[-1].minor.yy0);
} }
#line 3144 "sql.c"
yymsp[-1].minor.yy183 = yylhsminor.yy183; yymsp[-1].minor.yy183 = yylhsminor.yy183;
break; break;
case 136: /* signed ::= INTEGER */ case 136: /* signed ::= INTEGER */
#line 353 "sql.y"
{ yylhsminor.yy325 = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yylhsminor.yy325 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3150 "sql.c"
yymsp[0].minor.yy325 = yylhsminor.yy325; yymsp[0].minor.yy325 = yylhsminor.yy325;
break; break;
case 137: /* signed ::= PLUS INTEGER */ case 137: /* signed ::= PLUS INTEGER */
#line 354 "sql.y"
{ yymsp[-1].minor.yy325 = strtol(yymsp[0].minor.yy0.z, NULL, 10); } { yymsp[-1].minor.yy325 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
#line 3156 "sql.c"
break; break;
case 138: /* signed ::= MINUS INTEGER */ case 138: /* signed ::= MINUS INTEGER */
#line 355 "sql.y"
{ yymsp[-1].minor.yy325 = -strtol(yymsp[0].minor.yy0.z, NULL, 10);} { yymsp[-1].minor.yy325 = -strtol(yymsp[0].minor.yy0.z, NULL, 10);}
#line 3161 "sql.c"
break; break;
case 142: /* cmd ::= CREATE TABLE create_table_list */ case 142: /* cmd ::= CREATE TABLE create_table_list */
#line 361 "sql.y"
{ pInfo->type = TSDB_SQL_CREATE_TABLE; pInfo->pCreateTableInfo = yymsp[0].minor.yy438;} { pInfo->type = TSDB_SQL_CREATE_TABLE; pInfo->pCreateTableInfo = yymsp[0].minor.yy438;}
#line 3166 "sql.c"
break; break;
case 143: /* create_table_list ::= create_from_stable */ case 143: /* create_table_list ::= create_from_stable */
#line 365 "sql.y"
{ {
SCreateTableSql* pCreateTable = calloc(1, sizeof(SCreateTableSql)); SCreateTableSql* pCreateTable = calloc(1, sizeof(SCreateTableSql));
pCreateTable->childTableInfo = taosArrayInit(4, sizeof(SCreatedTableInfo)); pCreateTable->childTableInfo = taosArrayInit(4, sizeof(SCreatedTableInfo));
...@@ -3174,20 +2967,16 @@ static YYACTIONTYPE yy_reduce( ...@@ -3174,20 +2967,16 @@ static YYACTIONTYPE yy_reduce(
pCreateTable->type = TSQL_CREATE_TABLE_FROM_STABLE; pCreateTable->type = TSQL_CREATE_TABLE_FROM_STABLE;
yylhsminor.yy438 = pCreateTable; yylhsminor.yy438 = pCreateTable;
} }
#line 3178 "sql.c"
yymsp[0].minor.yy438 = yylhsminor.yy438; yymsp[0].minor.yy438 = yylhsminor.yy438;
break; break;
case 144: /* create_table_list ::= create_table_list create_from_stable */ case 144: /* create_table_list ::= create_table_list create_from_stable */
#line 374 "sql.y"
{ {
taosArrayPush(yymsp[-1].minor.yy438->childTableInfo, &yymsp[0].minor.yy152); taosArrayPush(yymsp[-1].minor.yy438->childTableInfo, &yymsp[0].minor.yy152);
yylhsminor.yy438 = yymsp[-1].minor.yy438; yylhsminor.yy438 = yymsp[-1].minor.yy438;
} }
#line 3187 "sql.c"
yymsp[-1].minor.yy438 = yylhsminor.yy438; yymsp[-1].minor.yy438 = yylhsminor.yy438;
break; break;
case 145: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP */ case 145: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
#line 380 "sql.y"
{ {
yylhsminor.yy438 = tSetCreateTableInfo(yymsp[-1].minor.yy421, NULL, NULL, TSQL_CREATE_TABLE); yylhsminor.yy438 = tSetCreateTableInfo(yymsp[-1].minor.yy421, NULL, NULL, TSQL_CREATE_TABLE);
setSqlInfo(pInfo, yylhsminor.yy438, NULL, TSDB_SQL_CREATE_TABLE); setSqlInfo(pInfo, yylhsminor.yy438, NULL, TSDB_SQL_CREATE_TABLE);
...@@ -3195,11 +2984,9 @@ static YYACTIONTYPE yy_reduce( ...@@ -3195,11 +2984,9 @@ static YYACTIONTYPE yy_reduce(
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-4].minor.yy0, &yymsp[-5].minor.yy0); setCreatedTableName(pInfo, &yymsp[-4].minor.yy0, &yymsp[-5].minor.yy0);
} }
#line 3199 "sql.c"
yymsp[-5].minor.yy438 = yylhsminor.yy438; yymsp[-5].minor.yy438 = yylhsminor.yy438;
break; break;
case 146: /* create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */ case 146: /* create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
#line 390 "sql.y"
{ {
yylhsminor.yy438 = tSetCreateTableInfo(yymsp[-5].minor.yy421, yymsp[-1].minor.yy421, NULL, TSQL_CREATE_STABLE); yylhsminor.yy438 = tSetCreateTableInfo(yymsp[-5].minor.yy421, yymsp[-1].minor.yy421, NULL, TSQL_CREATE_STABLE);
setSqlInfo(pInfo, yylhsminor.yy438, NULL, TSDB_SQL_CREATE_TABLE); setSqlInfo(pInfo, yylhsminor.yy438, NULL, TSDB_SQL_CREATE_TABLE);
...@@ -3207,43 +2994,33 @@ static YYACTIONTYPE yy_reduce( ...@@ -3207,43 +2994,33 @@ static YYACTIONTYPE yy_reduce(
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n; yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0); setCreatedTableName(pInfo, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
} }
#line 3211 "sql.c"
yymsp[-9].minor.yy438 = yylhsminor.yy438; yymsp[-9].minor.yy438 = yylhsminor.yy438;
break; break;
case 147: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */ case 147: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
#line 401 "sql.y"
{ {
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n; yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n; yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
yylhsminor.yy152 = createNewChildTableInfo(&yymsp[-5].minor.yy0, NULL, yymsp[-1].minor.yy421, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0); yylhsminor.yy152 = createNewChildTableInfo(&yymsp[-5].minor.yy0, NULL, yymsp[-1].minor.yy421, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
} }
#line 3221 "sql.c"
yymsp[-9].minor.yy152 = yylhsminor.yy152; yymsp[-9].minor.yy152 = yylhsminor.yy152;
break; break;
case 148: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName LP tagNamelist RP TAGS LP tagitemlist RP */ case 148: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName LP tagNamelist RP TAGS LP tagitemlist RP */
#line 407 "sql.y"
{ {
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n; yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
yymsp[-11].minor.yy0.n += yymsp[-10].minor.yy0.n; yymsp[-11].minor.yy0.n += yymsp[-10].minor.yy0.n;
yylhsminor.yy152 = createNewChildTableInfo(&yymsp[-8].minor.yy0, yymsp[-5].minor.yy421, yymsp[-1].minor.yy421, &yymsp[-11].minor.yy0, &yymsp[-12].minor.yy0); yylhsminor.yy152 = createNewChildTableInfo(&yymsp[-8].minor.yy0, yymsp[-5].minor.yy421, yymsp[-1].minor.yy421, &yymsp[-11].minor.yy0, &yymsp[-12].minor.yy0);
} }
#line 3231 "sql.c"
yymsp[-12].minor.yy152 = yylhsminor.yy152; yymsp[-12].minor.yy152 = yylhsminor.yy152;
break; break;
case 149: /* tagNamelist ::= tagNamelist COMMA ids */ case 149: /* tagNamelist ::= tagNamelist COMMA ids */
#line 415 "sql.y"
{taosArrayPush(yymsp[-2].minor.yy421, &yymsp[0].minor.yy0); yylhsminor.yy421 = yymsp[-2].minor.yy421; } {taosArrayPush(yymsp[-2].minor.yy421, &yymsp[0].minor.yy0); yylhsminor.yy421 = yymsp[-2].minor.yy421; }
#line 3237 "sql.c"
yymsp[-2].minor.yy421 = yylhsminor.yy421; yymsp[-2].minor.yy421 = yylhsminor.yy421;
break; break;
case 150: /* tagNamelist ::= ids */ case 150: /* tagNamelist ::= ids */
#line 416 "sql.y"
{yylhsminor.yy421 = taosArrayInit(4, sizeof(SStrToken)); taosArrayPush(yylhsminor.yy421, &yymsp[0].minor.yy0);} {yylhsminor.yy421 = taosArrayInit(4, sizeof(SStrToken)); taosArrayPush(yylhsminor.yy421, &yymsp[0].minor.yy0);}
#line 3243 "sql.c"
yymsp[0].minor.yy421 = yylhsminor.yy421; yymsp[0].minor.yy421 = yylhsminor.yy421;
break; break;
case 151: /* create_table_args ::= ifnotexists ids cpxName AS select */ case 151: /* create_table_args ::= ifnotexists ids cpxName AS select */
#line 420 "sql.y"
{ {
yylhsminor.yy438 = tSetCreateTableInfo(NULL, NULL, yymsp[0].minor.yy56, TSQL_CREATE_STREAM); yylhsminor.yy438 = tSetCreateTableInfo(NULL, NULL, yymsp[0].minor.yy56, TSQL_CREATE_STREAM);
setSqlInfo(pInfo, yylhsminor.yy438, NULL, TSDB_SQL_CREATE_TABLE); setSqlInfo(pInfo, yylhsminor.yy438, NULL, TSDB_SQL_CREATE_TABLE);
...@@ -3251,266 +3028,186 @@ static YYACTIONTYPE yy_reduce( ...@@ -3251,266 +3028,186 @@ static YYACTIONTYPE yy_reduce(
yymsp[-3].minor.yy0.n += yymsp[-2].minor.yy0.n; yymsp[-3].minor.yy0.n += yymsp[-2].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-3].minor.yy0, &yymsp[-4].minor.yy0); setCreatedTableName(pInfo, &yymsp[-3].minor.yy0, &yymsp[-4].minor.yy0);
} }
#line 3255 "sql.c"
yymsp[-4].minor.yy438 = yylhsminor.yy438; yymsp[-4].minor.yy438 = yylhsminor.yy438;
break; break;
case 152: /* columnlist ::= columnlist COMMA column */ case 152: /* columnlist ::= columnlist COMMA column */
#line 431 "sql.y"
{taosArrayPush(yymsp[-2].minor.yy421, &yymsp[0].minor.yy183); yylhsminor.yy421 = yymsp[-2].minor.yy421; } {taosArrayPush(yymsp[-2].minor.yy421, &yymsp[0].minor.yy183); yylhsminor.yy421 = yymsp[-2].minor.yy421; }
#line 3261 "sql.c"
yymsp[-2].minor.yy421 = yylhsminor.yy421; yymsp[-2].minor.yy421 = yylhsminor.yy421;
break; break;
case 153: /* columnlist ::= column */ case 153: /* columnlist ::= column */
#line 432 "sql.y"
{yylhsminor.yy421 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy421, &yymsp[0].minor.yy183);} {yylhsminor.yy421 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy421, &yymsp[0].minor.yy183);}
#line 3267 "sql.c"
yymsp[0].minor.yy421 = yylhsminor.yy421; yymsp[0].minor.yy421 = yylhsminor.yy421;
break; break;
case 154: /* column ::= ids typename */ case 154: /* column ::= ids typename */
#line 436 "sql.y"
{ {
tSetColumnInfo(&yylhsminor.yy183, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy183); tSetColumnInfo(&yylhsminor.yy183, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy183);
} }
#line 3275 "sql.c"
yymsp[-1].minor.yy183 = yylhsminor.yy183; yymsp[-1].minor.yy183 = yylhsminor.yy183;
break; break;
case 161: /* tagitem ::= NULL */ case 161: /* tagitem ::= NULL */
#line 451 "sql.y"
{ yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy430, &yymsp[0].minor.yy0); } { yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy430, &yymsp[0].minor.yy0); }
#line 3281 "sql.c"
yymsp[0].minor.yy430 = yylhsminor.yy430; yymsp[0].minor.yy430 = yylhsminor.yy430;
break; break;
case 162: /* tagitem ::= NOW */ case 162: /* tagitem ::= NOW */
#line 452 "sql.y"
{ yymsp[0].minor.yy0.type = TSDB_DATA_TYPE_TIMESTAMP; tVariantCreate(&yylhsminor.yy430, &yymsp[0].minor.yy0);} { yymsp[0].minor.yy0.type = TSDB_DATA_TYPE_TIMESTAMP; tVariantCreate(&yylhsminor.yy430, &yymsp[0].minor.yy0);}
#line 3287 "sql.c"
yymsp[0].minor.yy430 = yylhsminor.yy430; yymsp[0].minor.yy430 = yylhsminor.yy430;
break; break;
case 163: /* tagitem ::= MINUS INTEGER */ case 163: /* tagitem ::= MINUS INTEGER */
case 164: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==164); case 164: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==164);
case 165: /* tagitem ::= PLUS INTEGER */ yytestcase(yyruleno==165); case 165: /* tagitem ::= PLUS INTEGER */ yytestcase(yyruleno==165);
case 166: /* tagitem ::= PLUS FLOAT */ yytestcase(yyruleno==166); case 166: /* tagitem ::= PLUS FLOAT */ yytestcase(yyruleno==166);
#line 454 "sql.y"
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yymsp[-1].minor.yy0.type = yymsp[0].minor.yy0.type; yymsp[-1].minor.yy0.type = yymsp[0].minor.yy0.type;
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
tVariantCreate(&yylhsminor.yy430, &yymsp[-1].minor.yy0); tVariantCreate(&yylhsminor.yy430, &yymsp[-1].minor.yy0);
} }
#line 3301 "sql.c"
yymsp[-1].minor.yy430 = yylhsminor.yy430; yymsp[-1].minor.yy430 = yylhsminor.yy430;
break; break;
case 167: /* select ::= SELECT selcollist from where_opt interval_option sliding_opt session_option windowstate_option fill_opt groupby_opt having_opt orderby_opt slimit_opt limit_opt */ case 167: /* select ::= SELECT selcollist from where_opt interval_option sliding_opt session_option windowstate_option fill_opt groupby_opt having_opt orderby_opt slimit_opt limit_opt */
#line 485 "sql.y"
{ {
yylhsminor.yy56 = tSetQuerySqlNode(&yymsp[-13].minor.yy0, yymsp[-12].minor.yy421, yymsp[-11].minor.yy8, yymsp[-10].minor.yy439, yymsp[-4].minor.yy421, yymsp[-2].minor.yy421, &yymsp[-9].minor.yy400, &yymsp[-7].minor.yy147, &yymsp[-6].minor.yy40, &yymsp[-8].minor.yy0, yymsp[-5].minor.yy421, &yymsp[0].minor.yy166, &yymsp[-1].minor.yy166, yymsp[-3].minor.yy439); yylhsminor.yy56 = tSetQuerySqlNode(&yymsp[-13].minor.yy0, yymsp[-12].minor.yy421, yymsp[-11].minor.yy8, yymsp[-10].minor.yy439, yymsp[-4].minor.yy421, yymsp[-2].minor.yy421, &yymsp[-9].minor.yy400, &yymsp[-7].minor.yy147, &yymsp[-6].minor.yy40, &yymsp[-8].minor.yy0, yymsp[-5].minor.yy421, &yymsp[0].minor.yy166, &yymsp[-1].minor.yy166, yymsp[-3].minor.yy439);
} }
#line 3309 "sql.c"
yymsp[-13].minor.yy56 = yylhsminor.yy56; yymsp[-13].minor.yy56 = yylhsminor.yy56;
break; break;
case 168: /* select ::= LP select RP */ case 168: /* select ::= LP select RP */
#line 489 "sql.y"
{yymsp[-2].minor.yy56 = yymsp[-1].minor.yy56;} {yymsp[-2].minor.yy56 = yymsp[-1].minor.yy56;}
#line 3315 "sql.c"
break; break;
case 169: /* union ::= select */ case 169: /* union ::= select */
#line 493 "sql.y"
{ yylhsminor.yy421 = setSubclause(NULL, yymsp[0].minor.yy56); } { yylhsminor.yy421 = setSubclause(NULL, yymsp[0].minor.yy56); }
#line 3320 "sql.c"
yymsp[0].minor.yy421 = yylhsminor.yy421; yymsp[0].minor.yy421 = yylhsminor.yy421;
break; break;
case 170: /* union ::= union UNION ALL select */ case 170: /* union ::= union UNION ALL select */
#line 494 "sql.y"
{ yylhsminor.yy421 = appendSelectClause(yymsp[-3].minor.yy421, yymsp[0].minor.yy56); } { yylhsminor.yy421 = appendSelectClause(yymsp[-3].minor.yy421, yymsp[0].minor.yy56); }
#line 3326 "sql.c"
yymsp[-3].minor.yy421 = yylhsminor.yy421; yymsp[-3].minor.yy421 = yylhsminor.yy421;
break; break;
case 171: /* cmd ::= union */ case 171: /* cmd ::= union */
#line 496 "sql.y"
{ setSqlInfo(pInfo, yymsp[0].minor.yy421, NULL, TSDB_SQL_SELECT); } { setSqlInfo(pInfo, yymsp[0].minor.yy421, NULL, TSDB_SQL_SELECT); }
#line 3332 "sql.c"
break; break;
case 172: /* select ::= SELECT selcollist */ case 172: /* select ::= SELECT selcollist */
#line 503 "sql.y"
{ {
yylhsminor.yy56 = tSetQuerySqlNode(&yymsp[-1].minor.yy0, yymsp[0].minor.yy421, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); yylhsminor.yy56 = tSetQuerySqlNode(&yymsp[-1].minor.yy0, yymsp[0].minor.yy421, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
} }
#line 3339 "sql.c"
yymsp[-1].minor.yy56 = yylhsminor.yy56; yymsp[-1].minor.yy56 = yylhsminor.yy56;
break; break;
case 173: /* sclp ::= selcollist COMMA */ case 173: /* sclp ::= selcollist COMMA */
#line 515 "sql.y"
{yylhsminor.yy421 = yymsp[-1].minor.yy421;} {yylhsminor.yy421 = yymsp[-1].minor.yy421;}
#line 3345 "sql.c"
yymsp[-1].minor.yy421 = yylhsminor.yy421; yymsp[-1].minor.yy421 = yylhsminor.yy421;
break; break;
case 174: /* sclp ::= */ case 174: /* sclp ::= */
case 206: /* orderby_opt ::= */ yytestcase(yyruleno==206); case 206: /* orderby_opt ::= */ yytestcase(yyruleno==206);
#line 516 "sql.y"
{yymsp[1].minor.yy421 = 0;} {yymsp[1].minor.yy421 = 0;}
#line 3352 "sql.c"
break; break;
case 175: /* selcollist ::= sclp distinct expr as */ case 175: /* selcollist ::= sclp distinct expr as */
#line 517 "sql.y"
{ {
yylhsminor.yy421 = tSqlExprListAppend(yymsp[-3].minor.yy421, yymsp[-1].minor.yy439, yymsp[-2].minor.yy0.n? &yymsp[-2].minor.yy0:0, yymsp[0].minor.yy0.n?&yymsp[0].minor.yy0:0); yylhsminor.yy421 = tSqlExprListAppend(yymsp[-3].minor.yy421, yymsp[-1].minor.yy439, yymsp[-2].minor.yy0.n? &yymsp[-2].minor.yy0:0, yymsp[0].minor.yy0.n?&yymsp[0].minor.yy0:0);
} }
#line 3359 "sql.c"
yymsp[-3].minor.yy421 = yylhsminor.yy421; yymsp[-3].minor.yy421 = yylhsminor.yy421;
break; break;
case 176: /* selcollist ::= sclp STAR */ case 176: /* selcollist ::= sclp STAR */
#line 521 "sql.y"
{ {
tSqlExpr *pNode = tSqlExprCreateIdValue(NULL, TK_ALL); tSqlExpr *pNode = tSqlExprCreateIdValue(NULL, TK_ALL);
yylhsminor.yy421 = tSqlExprListAppend(yymsp[-1].minor.yy421, pNode, 0, 0); yylhsminor.yy421 = tSqlExprListAppend(yymsp[-1].minor.yy421, pNode, 0, 0);
} }
#line 3368 "sql.c"
yymsp[-1].minor.yy421 = yylhsminor.yy421; yymsp[-1].minor.yy421 = yylhsminor.yy421;
break; break;
case 177: /* as ::= AS ids */ case 177: /* as ::= AS ids */
#line 529 "sql.y"
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; } { yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
#line 3374 "sql.c"
break; break;
case 178: /* as ::= ids */ case 178: /* as ::= ids */
#line 530 "sql.y"
{ yylhsminor.yy0 = yymsp[0].minor.yy0; } { yylhsminor.yy0 = yymsp[0].minor.yy0; }
#line 3379 "sql.c"
yymsp[0].minor.yy0 = yylhsminor.yy0; yymsp[0].minor.yy0 = yylhsminor.yy0;
break; break;
case 179: /* as ::= */ case 179: /* as ::= */
#line 531 "sql.y"
{ yymsp[1].minor.yy0.n = 0; } { yymsp[1].minor.yy0.n = 0; }
#line 3385 "sql.c"
break; break;
case 180: /* distinct ::= DISTINCT */ case 180: /* distinct ::= DISTINCT */
#line 534 "sql.y"
{ yylhsminor.yy0 = yymsp[0].minor.yy0; } { yylhsminor.yy0 = yymsp[0].minor.yy0; }
#line 3390 "sql.c"
yymsp[0].minor.yy0 = yylhsminor.yy0; yymsp[0].minor.yy0 = yylhsminor.yy0;
break; break;
case 182: /* from ::= FROM tablelist */ case 182: /* from ::= FROM tablelist */
case 183: /* from ::= FROM sub */ yytestcase(yyruleno==183); case 183: /* from ::= FROM sub */ yytestcase(yyruleno==183);
#line 540 "sql.y"
{yymsp[-1].minor.yy8 = yymsp[0].minor.yy8;} {yymsp[-1].minor.yy8 = yymsp[0].minor.yy8;}
#line 3397 "sql.c"
break; break;
case 184: /* sub ::= LP union RP */ case 184: /* sub ::= LP union RP */
#line 545 "sql.y"
{yymsp[-2].minor.yy8 = addSubqueryElem(NULL, yymsp[-1].minor.yy421, NULL);} {yymsp[-2].minor.yy8 = addSubqueryElem(NULL, yymsp[-1].minor.yy421, NULL);}
#line 3402 "sql.c"
break; break;
case 185: /* sub ::= LP union RP ids */ case 185: /* sub ::= LP union RP ids */
#line 546 "sql.y"
{yymsp[-3].minor.yy8 = addSubqueryElem(NULL, yymsp[-2].minor.yy421, &yymsp[0].minor.yy0);} {yymsp[-3].minor.yy8 = addSubqueryElem(NULL, yymsp[-2].minor.yy421, &yymsp[0].minor.yy0);}
#line 3407 "sql.c"
break; break;
case 186: /* sub ::= sub COMMA LP union RP ids */ case 186: /* sub ::= sub COMMA LP union RP ids */
#line 547 "sql.y"
{yylhsminor.yy8 = addSubqueryElem(yymsp[-5].minor.yy8, yymsp[-2].minor.yy421, &yymsp[0].minor.yy0);} {yylhsminor.yy8 = addSubqueryElem(yymsp[-5].minor.yy8, yymsp[-2].minor.yy421, &yymsp[0].minor.yy0);}
#line 3412 "sql.c"
yymsp[-5].minor.yy8 = yylhsminor.yy8; yymsp[-5].minor.yy8 = yylhsminor.yy8;
break; break;
case 187: /* tablelist ::= ids cpxName */ case 187: /* tablelist ::= ids cpxName */
#line 551 "sql.y"
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yylhsminor.yy8 = setTableNameList(NULL, &yymsp[-1].minor.yy0, NULL); yylhsminor.yy8 = setTableNameList(NULL, &yymsp[-1].minor.yy0, NULL);
} }
#line 3421 "sql.c"
yymsp[-1].minor.yy8 = yylhsminor.yy8; yymsp[-1].minor.yy8 = yylhsminor.yy8;
break; break;
case 188: /* tablelist ::= ids cpxName ids */ case 188: /* tablelist ::= ids cpxName ids */
#line 556 "sql.y"
{ {
yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n; yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n;
yylhsminor.yy8 = setTableNameList(NULL, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); yylhsminor.yy8 = setTableNameList(NULL, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);
} }
#line 3430 "sql.c"
yymsp[-2].minor.yy8 = yylhsminor.yy8; yymsp[-2].minor.yy8 = yylhsminor.yy8;
break; break;
case 189: /* tablelist ::= tablelist COMMA ids cpxName */ case 189: /* tablelist ::= tablelist COMMA ids cpxName */
#line 561 "sql.y"
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yylhsminor.yy8 = setTableNameList(yymsp[-3].minor.yy8, &yymsp[-1].minor.yy0, NULL); yylhsminor.yy8 = setTableNameList(yymsp[-3].minor.yy8, &yymsp[-1].minor.yy0, NULL);
} }
#line 3439 "sql.c"
yymsp[-3].minor.yy8 = yylhsminor.yy8; yymsp[-3].minor.yy8 = yylhsminor.yy8;
break; break;
case 190: /* tablelist ::= tablelist COMMA ids cpxName ids */ case 190: /* tablelist ::= tablelist COMMA ids cpxName ids */
#line 566 "sql.y"
{ {
yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n; yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n;
yylhsminor.yy8 = setTableNameList(yymsp[-4].minor.yy8, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); yylhsminor.yy8 = setTableNameList(yymsp[-4].minor.yy8, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);
} }
#line 3448 "sql.c"
yymsp[-4].minor.yy8 = yylhsminor.yy8; yymsp[-4].minor.yy8 = yylhsminor.yy8;
break; break;
case 191: /* tmvar ::= VARIABLE */ case 191: /* tmvar ::= VARIABLE */
#line 573 "sql.y"
{yylhsminor.yy0 = yymsp[0].minor.yy0;} {yylhsminor.yy0 = yymsp[0].minor.yy0;}
#line 3454 "sql.c"
yymsp[0].minor.yy0 = yylhsminor.yy0; yymsp[0].minor.yy0 = yylhsminor.yy0;
break; break;
case 192: /* interval_option ::= intervalKey LP tmvar RP */ case 192: /* interval_option ::= intervalKey LP tmvar RP */
#line 576 "sql.y"
{yylhsminor.yy400.interval = yymsp[-1].minor.yy0; yylhsminor.yy400.offset.n = 0; yylhsminor.yy400.token = yymsp[-3].minor.yy104;} {yylhsminor.yy400.interval = yymsp[-1].minor.yy0; yylhsminor.yy400.offset.n = 0; yylhsminor.yy400.token = yymsp[-3].minor.yy104;}
#line 3460 "sql.c"
yymsp[-3].minor.yy400 = yylhsminor.yy400; yymsp[-3].minor.yy400 = yylhsminor.yy400;
break; break;
case 193: /* interval_option ::= intervalKey LP tmvar COMMA tmvar RP */ case 193: /* interval_option ::= intervalKey LP tmvar COMMA tmvar RP */
#line 577 "sql.y"
{yylhsminor.yy400.interval = yymsp[-3].minor.yy0; yylhsminor.yy400.offset = yymsp[-1].minor.yy0; yylhsminor.yy400.token = yymsp[-5].minor.yy104;} {yylhsminor.yy400.interval = yymsp[-3].minor.yy0; yylhsminor.yy400.offset = yymsp[-1].minor.yy0; yylhsminor.yy400.token = yymsp[-5].minor.yy104;}
#line 3466 "sql.c"
yymsp[-5].minor.yy400 = yylhsminor.yy400; yymsp[-5].minor.yy400 = yylhsminor.yy400;
break; break;
case 194: /* interval_option ::= */ case 194: /* interval_option ::= */
#line 578 "sql.y"
{memset(&yymsp[1].minor.yy400, 0, sizeof(yymsp[1].minor.yy400));} {memset(&yymsp[1].minor.yy400, 0, sizeof(yymsp[1].minor.yy400));}
#line 3472 "sql.c"
break; break;
case 195: /* intervalKey ::= INTERVAL */ case 195: /* intervalKey ::= INTERVAL */
#line 581 "sql.y"
{yymsp[0].minor.yy104 = TK_INTERVAL;} {yymsp[0].minor.yy104 = TK_INTERVAL;}
#line 3477 "sql.c"
break; break;
case 196: /* intervalKey ::= EVERY */ case 196: /* intervalKey ::= EVERY */
#line 582 "sql.y"
{yymsp[0].minor.yy104 = TK_EVERY; } {yymsp[0].minor.yy104 = TK_EVERY; }
#line 3482 "sql.c"
break; break;
case 197: /* session_option ::= */ case 197: /* session_option ::= */
#line 585 "sql.y"
{yymsp[1].minor.yy147.col.n = 0; yymsp[1].minor.yy147.gap.n = 0;} {yymsp[1].minor.yy147.col.n = 0; yymsp[1].minor.yy147.gap.n = 0;}
#line 3487 "sql.c"
break; break;
case 198: /* session_option ::= SESSION LP ids cpxName COMMA tmvar RP */ case 198: /* session_option ::= SESSION LP ids cpxName COMMA tmvar RP */
#line 586 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
yymsp[-6].minor.yy147.col = yymsp[-4].minor.yy0; yymsp[-6].minor.yy147.col = yymsp[-4].minor.yy0;
yymsp[-6].minor.yy147.gap = yymsp[-1].minor.yy0; yymsp[-6].minor.yy147.gap = yymsp[-1].minor.yy0;
} }
#line 3496 "sql.c"
break; break;
case 199: /* windowstate_option ::= */ case 199: /* windowstate_option ::= */
#line 593 "sql.y"
{ yymsp[1].minor.yy40.col.n = 0; yymsp[1].minor.yy40.col.z = NULL;} { yymsp[1].minor.yy40.col.n = 0; yymsp[1].minor.yy40.col.z = NULL;}
#line 3501 "sql.c"
break; break;
case 200: /* windowstate_option ::= STATE_WINDOW LP ids RP */ case 200: /* windowstate_option ::= STATE_WINDOW LP ids RP */
#line 594 "sql.y"
{ yymsp[-3].minor.yy40.col = yymsp[-1].minor.yy0; } { yymsp[-3].minor.yy40.col = yymsp[-1].minor.yy0; }
#line 3506 "sql.c"
break; break;
case 201: /* fill_opt ::= */ case 201: /* fill_opt ::= */
#line 598 "sql.y"
{ yymsp[1].minor.yy421 = 0; } { yymsp[1].minor.yy421 = 0; }
#line 3511 "sql.c"
break; break;
case 202: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */ case 202: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */
#line 599 "sql.y"
{ {
tVariant A = {0}; tVariant A = {0};
toTSDBType(yymsp[-3].minor.yy0.type); toTSDBType(yymsp[-3].minor.yy0.type);
...@@ -3519,402 +3216,272 @@ static YYACTIONTYPE yy_reduce( ...@@ -3519,402 +3216,272 @@ static YYACTIONTYPE yy_reduce(
tVariantListInsert(yymsp[-1].minor.yy421, &A, -1, 0); tVariantListInsert(yymsp[-1].minor.yy421, &A, -1, 0);
yymsp[-5].minor.yy421 = yymsp[-1].minor.yy421; yymsp[-5].minor.yy421 = yymsp[-1].minor.yy421;
} }
#line 3523 "sql.c"
break; break;
case 203: /* fill_opt ::= FILL LP ID RP */ case 203: /* fill_opt ::= FILL LP ID RP */
#line 608 "sql.y"
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-3].minor.yy421 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1); yymsp[-3].minor.yy421 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
} }
#line 3531 "sql.c"
break; break;
case 204: /* sliding_opt ::= SLIDING LP tmvar RP */ case 204: /* sliding_opt ::= SLIDING LP tmvar RP */
#line 614 "sql.y"
{yymsp[-3].minor.yy0 = yymsp[-1].minor.yy0; } {yymsp[-3].minor.yy0 = yymsp[-1].minor.yy0; }
#line 3536 "sql.c"
break; break;
case 205: /* sliding_opt ::= */ case 205: /* sliding_opt ::= */
#line 615 "sql.y"
{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = NULL; yymsp[1].minor.yy0.type = 0; } {yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = NULL; yymsp[1].minor.yy0.type = 0; }
#line 3541 "sql.c"
break; break;
case 207: /* orderby_opt ::= ORDER BY sortlist */ case 207: /* orderby_opt ::= ORDER BY sortlist */
#line 627 "sql.y"
{yymsp[-2].minor.yy421 = yymsp[0].minor.yy421;} {yymsp[-2].minor.yy421 = yymsp[0].minor.yy421;}
#line 3546 "sql.c"
break; break;
case 208: /* sortlist ::= sortlist COMMA item sortorder */ case 208: /* sortlist ::= sortlist COMMA item sortorder */
#line 629 "sql.y"
{ {
yylhsminor.yy421 = tVariantListAppend(yymsp[-3].minor.yy421, &yymsp[-1].minor.yy430, yymsp[0].minor.yy96); yylhsminor.yy421 = tVariantListAppend(yymsp[-3].minor.yy421, &yymsp[-1].minor.yy430, yymsp[0].minor.yy96);
} }
#line 3553 "sql.c"
yymsp[-3].minor.yy421 = yylhsminor.yy421; yymsp[-3].minor.yy421 = yylhsminor.yy421;
break; break;
case 209: /* sortlist ::= item sortorder */ case 209: /* sortlist ::= item sortorder */
#line 633 "sql.y"
{ {
yylhsminor.yy421 = tVariantListAppend(NULL, &yymsp[-1].minor.yy430, yymsp[0].minor.yy96); yylhsminor.yy421 = tVariantListAppend(NULL, &yymsp[-1].minor.yy430, yymsp[0].minor.yy96);
} }
#line 3561 "sql.c"
yymsp[-1].minor.yy421 = yylhsminor.yy421; yymsp[-1].minor.yy421 = yylhsminor.yy421;
break; break;
case 210: /* item ::= ids cpxName */ case 210: /* item ::= ids cpxName */
#line 638 "sql.y"
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
tVariantCreate(&yylhsminor.yy430, &yymsp[-1].minor.yy0); tVariantCreate(&yylhsminor.yy430, &yymsp[-1].minor.yy0);
} }
#line 3572 "sql.c"
yymsp[-1].minor.yy430 = yylhsminor.yy430; yymsp[-1].minor.yy430 = yylhsminor.yy430;
break; break;
case 211: /* sortorder ::= ASC */ case 211: /* sortorder ::= ASC */
#line 646 "sql.y"
{ yymsp[0].minor.yy96 = TSDB_ORDER_ASC; } { yymsp[0].minor.yy96 = TSDB_ORDER_ASC; }
#line 3578 "sql.c"
break; break;
case 212: /* sortorder ::= DESC */ case 212: /* sortorder ::= DESC */
#line 647 "sql.y"
{ yymsp[0].minor.yy96 = TSDB_ORDER_DESC;} { yymsp[0].minor.yy96 = TSDB_ORDER_DESC;}
#line 3583 "sql.c"
break; break;
case 213: /* sortorder ::= */ case 213: /* sortorder ::= */
#line 648 "sql.y"
{ yymsp[1].minor.yy96 = TSDB_ORDER_ASC; } { yymsp[1].minor.yy96 = TSDB_ORDER_ASC; }
#line 3588 "sql.c"
break; break;
case 214: /* groupby_opt ::= */ case 214: /* groupby_opt ::= */
#line 656 "sql.y"
{ yymsp[1].minor.yy421 = 0;} { yymsp[1].minor.yy421 = 0;}
#line 3593 "sql.c"
break; break;
case 215: /* groupby_opt ::= GROUP BY grouplist */ case 215: /* groupby_opt ::= GROUP BY grouplist */
#line 657 "sql.y"
{ yymsp[-2].minor.yy421 = yymsp[0].minor.yy421;} { yymsp[-2].minor.yy421 = yymsp[0].minor.yy421;}
#line 3598 "sql.c"
break; break;
case 216: /* grouplist ::= grouplist COMMA item */ case 216: /* grouplist ::= grouplist COMMA item */
#line 659 "sql.y"
{ {
yylhsminor.yy421 = tVariantListAppend(yymsp[-2].minor.yy421, &yymsp[0].minor.yy430, -1); yylhsminor.yy421 = tVariantListAppend(yymsp[-2].minor.yy421, &yymsp[0].minor.yy430, -1);
} }
#line 3605 "sql.c"
yymsp[-2].minor.yy421 = yylhsminor.yy421; yymsp[-2].minor.yy421 = yylhsminor.yy421;
break; break;
case 217: /* grouplist ::= item */ case 217: /* grouplist ::= item */
#line 663 "sql.y"
{ {
yylhsminor.yy421 = tVariantListAppend(NULL, &yymsp[0].minor.yy430, -1); yylhsminor.yy421 = tVariantListAppend(NULL, &yymsp[0].minor.yy430, -1);
} }
#line 3613 "sql.c"
yymsp[0].minor.yy421 = yylhsminor.yy421; yymsp[0].minor.yy421 = yylhsminor.yy421;
break; break;
case 218: /* having_opt ::= */ case 218: /* having_opt ::= */
case 228: /* where_opt ::= */ yytestcase(yyruleno==228); case 228: /* where_opt ::= */ yytestcase(yyruleno==228);
case 272: /* expritem ::= */ yytestcase(yyruleno==272); case 272: /* expritem ::= */ yytestcase(yyruleno==272);
#line 670 "sql.y"
{yymsp[1].minor.yy439 = 0;} {yymsp[1].minor.yy439 = 0;}
#line 3621 "sql.c"
break; break;
case 219: /* having_opt ::= HAVING expr */ case 219: /* having_opt ::= HAVING expr */
case 229: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==229); case 229: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==229);
#line 671 "sql.y"
{yymsp[-1].minor.yy439 = yymsp[0].minor.yy439;} {yymsp[-1].minor.yy439 = yymsp[0].minor.yy439;}
#line 3627 "sql.c"
break; break;
case 220: /* limit_opt ::= */ case 220: /* limit_opt ::= */
case 224: /* slimit_opt ::= */ yytestcase(yyruleno==224); case 224: /* slimit_opt ::= */ yytestcase(yyruleno==224);
#line 675 "sql.y"
{yymsp[1].minor.yy166.limit = -1; yymsp[1].minor.yy166.offset = 0;} {yymsp[1].minor.yy166.limit = -1; yymsp[1].minor.yy166.offset = 0;}
#line 3633 "sql.c"
break; break;
case 221: /* limit_opt ::= LIMIT signed */ case 221: /* limit_opt ::= LIMIT signed */
case 225: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==225); case 225: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==225);
#line 676 "sql.y"
{yymsp[-1].minor.yy166.limit = yymsp[0].minor.yy325; yymsp[-1].minor.yy166.offset = 0;} {yymsp[-1].minor.yy166.limit = yymsp[0].minor.yy325; yymsp[-1].minor.yy166.offset = 0;}
#line 3639 "sql.c"
break; break;
case 222: /* limit_opt ::= LIMIT signed OFFSET signed */ case 222: /* limit_opt ::= LIMIT signed OFFSET signed */
#line 678 "sql.y"
{ yymsp[-3].minor.yy166.limit = yymsp[-2].minor.yy325; yymsp[-3].minor.yy166.offset = yymsp[0].minor.yy325;} { yymsp[-3].minor.yy166.limit = yymsp[-2].minor.yy325; yymsp[-3].minor.yy166.offset = yymsp[0].minor.yy325;}
#line 3644 "sql.c"
break; break;
case 223: /* limit_opt ::= LIMIT signed COMMA signed */ case 223: /* limit_opt ::= LIMIT signed COMMA signed */
#line 680 "sql.y"
{ yymsp[-3].minor.yy166.limit = yymsp[0].minor.yy325; yymsp[-3].minor.yy166.offset = yymsp[-2].minor.yy325;} { yymsp[-3].minor.yy166.limit = yymsp[0].minor.yy325; yymsp[-3].minor.yy166.offset = yymsp[-2].minor.yy325;}
#line 3649 "sql.c"
break; break;
case 226: /* slimit_opt ::= SLIMIT signed SOFFSET signed */ case 226: /* slimit_opt ::= SLIMIT signed SOFFSET signed */
#line 686 "sql.y"
{yymsp[-3].minor.yy166.limit = yymsp[-2].minor.yy325; yymsp[-3].minor.yy166.offset = yymsp[0].minor.yy325;} {yymsp[-3].minor.yy166.limit = yymsp[-2].minor.yy325; yymsp[-3].minor.yy166.offset = yymsp[0].minor.yy325;}
#line 3654 "sql.c"
break; break;
case 227: /* slimit_opt ::= SLIMIT signed COMMA signed */ case 227: /* slimit_opt ::= SLIMIT signed COMMA signed */
#line 688 "sql.y"
{yymsp[-3].minor.yy166.limit = yymsp[0].minor.yy325; yymsp[-3].minor.yy166.offset = yymsp[-2].minor.yy325;} {yymsp[-3].minor.yy166.limit = yymsp[0].minor.yy325; yymsp[-3].minor.yy166.offset = yymsp[-2].minor.yy325;}
#line 3659 "sql.c"
break; break;
case 230: /* expr ::= LP expr RP */ case 230: /* expr ::= LP expr RP */
#line 701 "sql.y"
{yylhsminor.yy439 = yymsp[-1].minor.yy439; yylhsminor.yy439->exprToken.z = yymsp[-2].minor.yy0.z; yylhsminor.yy439->exprToken.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);} {yylhsminor.yy439 = yymsp[-1].minor.yy439; yylhsminor.yy439->exprToken.z = yymsp[-2].minor.yy0.z; yylhsminor.yy439->exprToken.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);}
#line 3664 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 231: /* expr ::= ID */ case 231: /* expr ::= ID */
#line 703 "sql.y"
{ yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_ID);} { yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_ID);}
#line 3670 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 232: /* expr ::= ID DOT ID */ case 232: /* expr ::= ID DOT ID */
#line 704 "sql.y"
{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-2].minor.yy0, TK_ID);} { yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-2].minor.yy0, TK_ID);}
#line 3676 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 233: /* expr ::= ID DOT STAR */ case 233: /* expr ::= ID DOT STAR */
#line 705 "sql.y"
{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-2].minor.yy0, TK_ALL);} { yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-2].minor.yy0, TK_ALL);}
#line 3682 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 234: /* expr ::= INTEGER */ case 234: /* expr ::= INTEGER */
#line 707 "sql.y"
{ yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_INTEGER);} { yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_INTEGER);}
#line 3688 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 235: /* expr ::= MINUS INTEGER */ case 235: /* expr ::= MINUS INTEGER */
case 236: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==236); case 236: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==236);
#line 708 "sql.y"
{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_INTEGER; yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-1].minor.yy0, TK_INTEGER);} { yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_INTEGER; yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-1].minor.yy0, TK_INTEGER);}
#line 3695 "sql.c"
yymsp[-1].minor.yy439 = yylhsminor.yy439; yymsp[-1].minor.yy439 = yylhsminor.yy439;
break; break;
case 237: /* expr ::= FLOAT */ case 237: /* expr ::= FLOAT */
#line 710 "sql.y"
{ yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_FLOAT);} { yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_FLOAT);}
#line 3701 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 238: /* expr ::= MINUS FLOAT */ case 238: /* expr ::= MINUS FLOAT */
case 239: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==239); case 239: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==239);
#line 711 "sql.y"
{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_FLOAT; yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-1].minor.yy0, TK_FLOAT);} { yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_FLOAT; yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-1].minor.yy0, TK_FLOAT);}
#line 3708 "sql.c"
yymsp[-1].minor.yy439 = yylhsminor.yy439; yymsp[-1].minor.yy439 = yylhsminor.yy439;
break; break;
case 240: /* expr ::= STRING */ case 240: /* expr ::= STRING */
#line 713 "sql.y"
{ yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_STRING);} { yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_STRING);}
#line 3714 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 241: /* expr ::= NOW */ case 241: /* expr ::= NOW */
#line 714 "sql.y"
{ yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_NOW); } { yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_NOW); }
#line 3720 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 242: /* expr ::= VARIABLE */ case 242: /* expr ::= VARIABLE */
#line 715 "sql.y"
{ yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_VARIABLE);} { yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_VARIABLE);}
#line 3726 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 243: /* expr ::= PLUS VARIABLE */ case 243: /* expr ::= PLUS VARIABLE */
case 244: /* expr ::= MINUS VARIABLE */ yytestcase(yyruleno==244); case 244: /* expr ::= MINUS VARIABLE */ yytestcase(yyruleno==244);
#line 716 "sql.y"
{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_VARIABLE; yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-1].minor.yy0, TK_VARIABLE);} { yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_VARIABLE; yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[-1].minor.yy0, TK_VARIABLE);}
#line 3733 "sql.c"
yymsp[-1].minor.yy439 = yylhsminor.yy439; yymsp[-1].minor.yy439 = yylhsminor.yy439;
break; break;
case 245: /* expr ::= BOOL */ case 245: /* expr ::= BOOL */
#line 718 "sql.y"
{ yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_BOOL);} { yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_BOOL);}
#line 3739 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 246: /* expr ::= NULL */ case 246: /* expr ::= NULL */
#line 719 "sql.y"
{ yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_NULL);} { yylhsminor.yy439 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_NULL);}
#line 3745 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 247: /* expr ::= ID LP exprlist RP */ case 247: /* expr ::= ID LP exprlist RP */
#line 722 "sql.y"
{ tStrTokenAppend(pInfo->funcs, &yymsp[-3].minor.yy0); yylhsminor.yy439 = tSqlExprCreateFunction(yymsp[-1].minor.yy421, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); } { tStrTokenAppend(pInfo->funcs, &yymsp[-3].minor.yy0); yylhsminor.yy439 = tSqlExprCreateFunction(yymsp[-1].minor.yy421, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
#line 3751 "sql.c"
yymsp[-3].minor.yy439 = yylhsminor.yy439; yymsp[-3].minor.yy439 = yylhsminor.yy439;
break; break;
case 248: /* expr ::= ID LP STAR RP */ case 248: /* expr ::= ID LP STAR RP */
#line 725 "sql.y"
{ tStrTokenAppend(pInfo->funcs, &yymsp[-3].minor.yy0); yylhsminor.yy439 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); } { tStrTokenAppend(pInfo->funcs, &yymsp[-3].minor.yy0); yylhsminor.yy439 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
#line 3757 "sql.c"
yymsp[-3].minor.yy439 = yylhsminor.yy439; yymsp[-3].minor.yy439 = yylhsminor.yy439;
break; break;
case 249: /* expr ::= expr IS NULL */ case 249: /* expr ::= expr IS NULL */
#line 728 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, NULL, TK_ISNULL);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, NULL, TK_ISNULL);}
#line 3763 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 250: /* expr ::= expr IS NOT NULL */ case 250: /* expr ::= expr IS NOT NULL */
#line 729 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-3].minor.yy439, NULL, TK_NOTNULL);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-3].minor.yy439, NULL, TK_NOTNULL);}
#line 3769 "sql.c"
yymsp[-3].minor.yy439 = yylhsminor.yy439; yymsp[-3].minor.yy439 = yylhsminor.yy439;
break; break;
case 251: /* expr ::= expr LT expr */ case 251: /* expr ::= expr LT expr */
#line 732 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_LT);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_LT);}
#line 3775 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 252: /* expr ::= expr GT expr */ case 252: /* expr ::= expr GT expr */
#line 733 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_GT);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_GT);}
#line 3781 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 253: /* expr ::= expr LE expr */ case 253: /* expr ::= expr LE expr */
#line 734 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_LE);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_LE);}
#line 3787 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 254: /* expr ::= expr GE expr */ case 254: /* expr ::= expr GE expr */
#line 735 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_GE);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_GE);}
#line 3793 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 255: /* expr ::= expr NE expr */ case 255: /* expr ::= expr NE expr */
#line 736 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_NE);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_NE);}
#line 3799 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 256: /* expr ::= expr EQ expr */ case 256: /* expr ::= expr EQ expr */
#line 737 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_EQ);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_EQ);}
#line 3805 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 257: /* expr ::= expr BETWEEN expr AND expr */ case 257: /* expr ::= expr BETWEEN expr AND expr */
#line 739 "sql.y"
{ tSqlExpr* X2 = tSqlExprClone(yymsp[-4].minor.yy439); yylhsminor.yy439 = tSqlExprCreate(tSqlExprCreate(yymsp[-4].minor.yy439, yymsp[-2].minor.yy439, TK_GE), tSqlExprCreate(X2, yymsp[0].minor.yy439, TK_LE), TK_AND);} { tSqlExpr* X2 = tSqlExprClone(yymsp[-4].minor.yy439); yylhsminor.yy439 = tSqlExprCreate(tSqlExprCreate(yymsp[-4].minor.yy439, yymsp[-2].minor.yy439, TK_GE), tSqlExprCreate(X2, yymsp[0].minor.yy439, TK_LE), TK_AND);}
#line 3811 "sql.c"
yymsp[-4].minor.yy439 = yylhsminor.yy439; yymsp[-4].minor.yy439 = yylhsminor.yy439;
break; break;
case 258: /* expr ::= expr AND expr */ case 258: /* expr ::= expr AND expr */
#line 741 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_AND);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_AND);}
#line 3817 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 259: /* expr ::= expr OR expr */ case 259: /* expr ::= expr OR expr */
#line 742 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_OR); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_OR); }
#line 3823 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 260: /* expr ::= expr PLUS expr */ case 260: /* expr ::= expr PLUS expr */
#line 745 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_PLUS); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_PLUS); }
#line 3829 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 261: /* expr ::= expr MINUS expr */ case 261: /* expr ::= expr MINUS expr */
#line 746 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_MINUS); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_MINUS); }
#line 3835 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 262: /* expr ::= expr STAR expr */ case 262: /* expr ::= expr STAR expr */
#line 747 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_STAR); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_STAR); }
#line 3841 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 263: /* expr ::= expr SLASH expr */ case 263: /* expr ::= expr SLASH expr */
#line 748 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_DIVIDE);} {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_DIVIDE);}
#line 3847 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 264: /* expr ::= expr REM expr */ case 264: /* expr ::= expr REM expr */
#line 749 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_REM); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_REM); }
#line 3853 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 265: /* expr ::= expr LIKE expr */ case 265: /* expr ::= expr LIKE expr */
#line 752 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_LIKE); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_LIKE); }
#line 3859 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 266: /* expr ::= expr MATCH expr */ case 266: /* expr ::= expr MATCH expr */
#line 755 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_MATCH); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_MATCH); }
#line 3865 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 267: /* expr ::= expr NMATCH expr */ case 267: /* expr ::= expr NMATCH expr */
#line 756 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_NMATCH); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-2].minor.yy439, yymsp[0].minor.yy439, TK_NMATCH); }
#line 3871 "sql.c"
yymsp[-2].minor.yy439 = yylhsminor.yy439; yymsp[-2].minor.yy439 = yylhsminor.yy439;
break; break;
case 268: /* expr ::= expr IN LP exprlist RP */ case 268: /* expr ::= expr IN LP exprlist RP */
#line 759 "sql.y"
{yylhsminor.yy439 = tSqlExprCreate(yymsp[-4].minor.yy439, (tSqlExpr*)yymsp[-1].minor.yy421, TK_IN); } {yylhsminor.yy439 = tSqlExprCreate(yymsp[-4].minor.yy439, (tSqlExpr*)yymsp[-1].minor.yy421, TK_IN); }
#line 3877 "sql.c"
yymsp[-4].minor.yy439 = yylhsminor.yy439; yymsp[-4].minor.yy439 = yylhsminor.yy439;
break; break;
case 269: /* exprlist ::= exprlist COMMA expritem */ case 269: /* exprlist ::= exprlist COMMA expritem */
#line 767 "sql.y"
{yylhsminor.yy421 = tSqlExprListAppend(yymsp[-2].minor.yy421,yymsp[0].minor.yy439,0, 0);} {yylhsminor.yy421 = tSqlExprListAppend(yymsp[-2].minor.yy421,yymsp[0].minor.yy439,0, 0);}
#line 3883 "sql.c"
yymsp[-2].minor.yy421 = yylhsminor.yy421; yymsp[-2].minor.yy421 = yylhsminor.yy421;
break; break;
case 270: /* exprlist ::= expritem */ case 270: /* exprlist ::= expritem */
#line 768 "sql.y"
{yylhsminor.yy421 = tSqlExprListAppend(0,yymsp[0].minor.yy439,0, 0);} {yylhsminor.yy421 = tSqlExprListAppend(0,yymsp[0].minor.yy439,0, 0);}
#line 3889 "sql.c"
yymsp[0].minor.yy421 = yylhsminor.yy421; yymsp[0].minor.yy421 = yylhsminor.yy421;
break; break;
case 271: /* expritem ::= expr */ case 271: /* expritem ::= expr */
#line 769 "sql.y"
{yylhsminor.yy439 = yymsp[0].minor.yy439;} {yylhsminor.yy439 = yymsp[0].minor.yy439;}
#line 3895 "sql.c"
yymsp[0].minor.yy439 = yylhsminor.yy439; yymsp[0].minor.yy439 = yylhsminor.yy439;
break; break;
case 273: /* cmd ::= RESET QUERY CACHE */ case 273: /* cmd ::= RESET QUERY CACHE */
#line 773 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_RESET_CACHE, 0);} { setDCLSqlElems(pInfo, TSDB_SQL_RESET_CACHE, 0);}
#line 3901 "sql.c"
break; break;
case 274: /* cmd ::= SYNCDB ids REPLICA */ case 274: /* cmd ::= SYNCDB ids REPLICA */
#line 776 "sql.y"
{ setDCLSqlElems(pInfo, TSDB_SQL_SYNC_DB_REPLICA, 1, &yymsp[-1].minor.yy0);} { setDCLSqlElems(pInfo, TSDB_SQL_SYNC_DB_REPLICA, 1, &yymsp[-1].minor.yy0);}
#line 3906 "sql.c"
break; break;
case 275: /* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */ case 275: /* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
#line 779 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, -1); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 3915 "sql.c"
break; break;
case 276: /* cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */ case 276: /* cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
#line 785 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -3924,28 +3491,22 @@ static YYACTIONTYPE yy_reduce( ...@@ -3924,28 +3491,22 @@ static YYACTIONTYPE yy_reduce(
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN, -1); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 3928 "sql.c"
break; break;
case 277: /* cmd ::= ALTER TABLE ids cpxName MODIFY COLUMN columnlist */ case 277: /* cmd ::= ALTER TABLE ids cpxName MODIFY COLUMN columnlist */
#line 795 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_CHANGE_COLUMN, -1); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_CHANGE_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 3937 "sql.c"
break; break;
case 278: /* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */ case 278: /* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
#line 802 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, -1); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 3946 "sql.c"
break; break;
case 279: /* cmd ::= ALTER TABLE ids cpxName DROP TAG ids */ case 279: /* cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
#line 807 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -3955,10 +3516,8 @@ static YYACTIONTYPE yy_reduce( ...@@ -3955,10 +3516,8 @@ static YYACTIONTYPE yy_reduce(
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, NULL, A, TSDB_ALTER_TABLE_DROP_TAG_COLUMN, -1); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, NULL, A, TSDB_ALTER_TABLE_DROP_TAG_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 3959 "sql.c"
break; break;
case 280: /* cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */ case 280: /* cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
#line 817 "sql.y"
{ {
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n; yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
...@@ -3971,10 +3530,8 @@ static YYACTIONTYPE yy_reduce( ...@@ -3971,10 +3530,8 @@ static YYACTIONTYPE yy_reduce(
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-5].minor.yy0, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN, -1); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-5].minor.yy0, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 3975 "sql.c"
break; break;
case 281: /* cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */ case 281: /* cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
#line 830 "sql.y"
{ {
yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n; yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n;
...@@ -3985,28 +3542,22 @@ static YYACTIONTYPE yy_reduce( ...@@ -3985,28 +3542,22 @@ static YYACTIONTYPE yy_reduce(
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-6].minor.yy0, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL, -1); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-6].minor.yy0, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 3989 "sql.c"
break; break;
case 282: /* cmd ::= ALTER TABLE ids cpxName MODIFY TAG columnlist */ case 282: /* cmd ::= ALTER TABLE ids cpxName MODIFY TAG columnlist */
#line 841 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_MODIFY_TAG_COLUMN, -1); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_MODIFY_TAG_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 3998 "sql.c"
break; break;
case 283: /* cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */ case 283: /* cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
#line 848 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 4007 "sql.c"
break; break;
case 284: /* cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */ case 284: /* cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
#line 854 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -4016,28 +3567,22 @@ static YYACTIONTYPE yy_reduce( ...@@ -4016,28 +3567,22 @@ static YYACTIONTYPE yy_reduce(
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 4020 "sql.c"
break; break;
case 285: /* cmd ::= ALTER STABLE ids cpxName MODIFY COLUMN columnlist */ case 285: /* cmd ::= ALTER STABLE ids cpxName MODIFY COLUMN columnlist */
#line 864 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_CHANGE_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_CHANGE_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 4029 "sql.c"
break; break;
case 286: /* cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */ case 286: /* cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
#line 871 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 4038 "sql.c"
break; break;
case 287: /* cmd ::= ALTER STABLE ids cpxName DROP TAG ids */ case 287: /* cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
#line 876 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -4047,10 +3592,8 @@ static YYACTIONTYPE yy_reduce( ...@@ -4047,10 +3592,8 @@ static YYACTIONTYPE yy_reduce(
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, NULL, A, TSDB_ALTER_TABLE_DROP_TAG_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, NULL, A, TSDB_ALTER_TABLE_DROP_TAG_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 4051 "sql.c"
break; break;
case 288: /* cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */ case 288: /* cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
#line 886 "sql.y"
{ {
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n; yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
...@@ -4063,10 +3606,8 @@ static YYACTIONTYPE yy_reduce( ...@@ -4063,10 +3606,8 @@ static YYACTIONTYPE yy_reduce(
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-5].minor.yy0, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-5].minor.yy0, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 4067 "sql.c"
break; break;
case 289: /* cmd ::= ALTER STABLE ids cpxName SET TAG ids EQ tagitem */ case 289: /* cmd ::= ALTER STABLE ids cpxName SET TAG ids EQ tagitem */
#line 899 "sql.y"
{ {
yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n; yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n;
...@@ -4077,31 +3618,22 @@ static YYACTIONTYPE yy_reduce( ...@@ -4077,31 +3618,22 @@ static YYACTIONTYPE yy_reduce(
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-6].minor.yy0, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-6].minor.yy0, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 4081 "sql.c"
break; break;
case 290: /* cmd ::= ALTER STABLE ids cpxName MODIFY TAG columnlist */ case 290: /* cmd ::= ALTER STABLE ids cpxName MODIFY TAG columnlist */
#line 910 "sql.y"
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_MODIFY_TAG_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tSetAlterTableInfo(&yymsp[-4].minor.yy0, yymsp[0].minor.yy421, NULL, TSDB_ALTER_TABLE_MODIFY_TAG_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
#line 4090 "sql.c"
break; break;
case 291: /* cmd ::= KILL CONNECTION INTEGER */ case 291: /* cmd ::= KILL CONNECTION INTEGER */
#line 917 "sql.y"
{setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);} {setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);}
#line 4095 "sql.c"
break; break;
case 292: /* cmd ::= KILL STREAM INTEGER COLON INTEGER */ case 292: /* cmd ::= KILL STREAM INTEGER COLON INTEGER */
#line 918 "sql.y"
{yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n); setKillSql(pInfo, TSDB_SQL_KILL_STREAM, &yymsp[-2].minor.yy0);} {yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n); setKillSql(pInfo, TSDB_SQL_KILL_STREAM, &yymsp[-2].minor.yy0);}
#line 4100 "sql.c"
break; break;
case 293: /* cmd ::= KILL QUERY INTEGER COLON INTEGER */ case 293: /* cmd ::= KILL QUERY INTEGER COLON INTEGER */
#line 919 "sql.y"
{yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n); setKillSql(pInfo, TSDB_SQL_KILL_QUERY, &yymsp[-2].minor.yy0);} {yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n); setKillSql(pInfo, TSDB_SQL_KILL_QUERY, &yymsp[-2].minor.yy0);}
#line 4105 "sql.c"
break; break;
default: default:
break; break;
...@@ -4163,7 +3695,6 @@ static void yy_syntax_error( ...@@ -4163,7 +3695,6 @@ static void yy_syntax_error(
ParseCTX_FETCH ParseCTX_FETCH
#define TOKEN yyminor #define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/ /************ Begin %syntax_error code ****************************************/
#line 37 "sql.y"
pInfo->valid = false; pInfo->valid = false;
int32_t outputBufLen = tListLen(pInfo->msg); int32_t outputBufLen = tListLen(pInfo->msg);
...@@ -4186,7 +3717,6 @@ static void yy_syntax_error( ...@@ -4186,7 +3717,6 @@ static void yy_syntax_error(
} }
assert(len <= outputBufLen); assert(len <= outputBufLen);
#line 4190 "sql.c"
/************ End %syntax_error code ******************************************/ /************ End %syntax_error code ******************************************/
ParseARG_STORE /* Suppress warning about unused %extra_argument variable */ ParseARG_STORE /* Suppress warning about unused %extra_argument variable */
ParseCTX_STORE ParseCTX_STORE
...@@ -4212,8 +3742,7 @@ static void yy_accept( ...@@ -4212,8 +3742,7 @@ static void yy_accept(
/* Here code is inserted which will be executed whenever the /* Here code is inserted which will be executed whenever the
** parser accepts */ ** parser accepts */
/*********** Begin %parse_accept code *****************************************/ /*********** Begin %parse_accept code *****************************************/
#line 61 "sql.y"
#line 4217 "sql.c"
/*********** End %parse_accept code *******************************************/ /*********** End %parse_accept code *******************************************/
ParseARG_STORE /* Suppress warning about unused %extra_argument variable */ ParseARG_STORE /* Suppress warning about unused %extra_argument variable */
ParseCTX_STORE ParseCTX_STORE
......
...@@ -23,7 +23,7 @@ int32_t testValidateName(char* name) { ...@@ -23,7 +23,7 @@ int32_t testValidateName(char* name) {
token.type = 0; token.type = 0;
tGetToken(name, &token.type); tGetToken(name, &token.type);
return tscValidateName(&token); return tscValidateName(&token, false, NULL);
} }
} }
......
...@@ -27,7 +27,9 @@ extern "C" { ...@@ -27,7 +27,9 @@ extern "C" {
int32_t strdequote(char *src); int32_t strdequote(char *src);
int32_t strRmquote(char *z, int32_t len); int32_t strRmquote(char *z, int32_t len);
int32_t strRmquoteEscape(char *z, int32_t len);
size_t strtrim(char *src); size_t strtrim(char *src);
char * tstrstr(char *src, char *dst, bool ignoreInEsc);
char * strnchr(char *haystack, char needle, int32_t len, bool skipquote); char * strnchr(char *haystack, char needle, int32_t len, bool skipquote);
char ** strsplit(char *src, const char *delim, int32_t *num); char ** strsplit(char *src, const char *delim, int32_t *num);
char * strtolower(char *dst, const char *src); char * strtolower(char *dst, const char *src);
......
...@@ -228,7 +228,7 @@ static SKeyword keywordTable[] = { ...@@ -228,7 +228,7 @@ static SKeyword keywordTable[] = {
{"FUNCTIONS", TK_FUNCTIONS}, {"FUNCTIONS", TK_FUNCTIONS},
{"OUTPUTTYPE", TK_OUTPUTTYPE}, {"OUTPUTTYPE", TK_OUTPUTTYPE},
{"AGGREGATE", TK_AGGREGATE}, {"AGGREGATE", TK_AGGREGATE},
{"BUFSIZE", TK_BUFSIZE}, {"BUFSIZE", TK_BUFSIZE}
}; };
static const char isIdChar[] = { static const char isIdChar[] = {
...@@ -442,6 +442,17 @@ uint32_t tGetToken(char* z, uint32_t* tokenId) { ...@@ -442,6 +442,17 @@ uint32_t tGetToken(char* z, uint32_t* tokenId) {
break; break;
} }
case '`': {
for (i = 1; z[i]; i++) {
if (z[i] == '`') {
i++;
*tokenId = TK_ID;
return i;
}
}
break;
}
case '.': { case '.': {
/* /*
* handle the the float number with out integer part * handle the the float number with out integer part
......
...@@ -84,6 +84,20 @@ int32_t strRmquote(char *z, int32_t len){ ...@@ -84,6 +84,20 @@ int32_t strRmquote(char *z, int32_t len){
return len - 2 - cnt; return len - 2 - cnt;
} }
int32_t strRmquoteEscape(char *z, int32_t len) {
if (len <= 0) return len;
if (z[0] == '\'' || z[0] == '\"') {
return strRmquote(z, len);
} else if (len > 1 && z[0] == TS_ESCAPE_CHAR && z[len - 1] == TS_ESCAPE_CHAR) {
memmove(z, z + 1, len - 2);
return len - 2;
}
return len;
}
size_t strtrim(char *z) { size_t strtrim(char *z) {
int32_t i = 0; int32_t i = 0;
...@@ -165,6 +179,43 @@ char *strnchr(char *haystack, char needle, int32_t len, bool skipquote) { ...@@ -165,6 +179,43 @@ char *strnchr(char *haystack, char needle, int32_t len, bool skipquote) {
return NULL; return NULL;
} }
char *tstrstr(char *src, char *dst, bool ignoreInEsc) {
if (!ignoreInEsc) {
return strstr(src, dst);
}
int32_t len = (int32_t)strlen(src);
bool inEsc = false;
char escChar = 0;
char *str = src, *res = NULL;
for (int32_t i = 0; i < len; ++i) {
if (src[i] == TS_ESCAPE_CHAR || src[i] == '\'' || src[i] == '\"') {
if (!inEsc) {
escChar = src[i];
src[i] = 0;
res = strstr(str, dst);
src[i] = escChar;
if (res) {
return res;
}
str = NULL;
} else {
if (src[i] != escChar) {
continue;
}
str = src + i + 1;
}
inEsc = !inEsc;
continue;
}
}
return str ? strstr(str, dst) : NULL;
}
char* strtolower(char *dst, const char *src) { char* strtolower(char *dst, const char *src) {
...@@ -195,7 +246,7 @@ char* strtolower(char *dst, const char *src) { ...@@ -195,7 +246,7 @@ char* strtolower(char *dst, const char *src) {
} }
char* strntolower(char *dst, const char *src, int32_t n) { char* strntolower(char *dst, const char *src, int32_t n) {
int esc = 0; int esc = 0, inEsc = 0;
char quote = 0, *p = dst, c; char quote = 0, *p = dst, c;
assert(dst != NULL); assert(dst != NULL);
...@@ -212,10 +263,16 @@ char* strntolower(char *dst, const char *src, int32_t n) { ...@@ -212,10 +263,16 @@ char* strntolower(char *dst, const char *src, int32_t n) {
} else if (c == quote) { } else if (c == quote) {
quote = 0; quote = 0;
} }
} else if (inEsc) {
if (c == '`') {
inEsc = 0;
}
} else if (c >= 'A' && c <= 'Z') { } else if (c >= 'A' && c <= 'Z') {
c -= 'A' - 'a'; c -= 'A' - 'a';
} else if (c == '\'' || c == '"') { } else if (inEsc == 0 && (c == '\'' || c == '"')) {
quote = c; quote = c;
} else if (c == '`' && quote == 0) {
inEsc = 1;
} }
*p++ = c; *p++ = c;
} }
......
...@@ -17,6 +17,7 @@ sys.path.insert(0, os.getcwd()) ...@@ -17,6 +17,7 @@ sys.path.insert(0, os.getcwd())
from util.log import * from util.log import *
from util.sql import * from util.sql import *
from util.dnodes import * from util.dnodes import *
import multiprocessing as mp
import taos import taos
...@@ -25,7 +26,6 @@ class TwoClients: ...@@ -25,7 +26,6 @@ class TwoClients:
self.host = "127.0.0.1" self.host = "127.0.0.1"
self.user = "root" self.user = "root"
self.password = "taosdata" self.password = "taosdata"
self.config = "/home/xp/git/TDengine/sim/dnode1/cfg"
def run(self): def run(self):
tdDnodes.init("") tdDnodes.init("")
...@@ -37,7 +37,7 @@ class TwoClients: ...@@ -37,7 +37,7 @@ class TwoClients:
tdDnodes.start(1) tdDnodes.start(1)
# first client create a stable and insert data # first client create a stable and insert data
conn1 = taos.connect(self.host, self.user, self.password, self.config) conn1 = taos.connect(host=self.host, user=self.user, password=self.password, config=tdDnodes.getSimCfgPath())
cursor1 = conn1.cursor() cursor1 = conn1.cursor()
cursor1.execute("drop database if exists db") cursor1.execute("drop database if exists db")
cursor1.execute("create database db") cursor1.execute("create database db")
...@@ -46,7 +46,7 @@ class TwoClients: ...@@ -46,7 +46,7 @@ class TwoClients:
cursor1.execute("insert into t0 using tb tags('beijing') values(now, 1)") cursor1.execute("insert into t0 using tb tags('beijing') values(now, 1)")
# second client alter the table created by cleint # second client alter the table created by cleint
conn2 = taos.connect(self.host, self.user, self.password, self.config) conn2 = taos.connect(host=self.host, user=self.user, password=self.password, config=tdDnodes.getSimCfgPath())
cursor2 = conn2.cursor() cursor2 = conn2.cursor()
cursor2.execute("use db") cursor2.execute("use db")
cursor2.execute("alter table tb add column name nchar(30)") cursor2.execute("alter table tb add column name nchar(30)")
......
...@@ -198,7 +198,7 @@ python3 ./test.py -f update/merge_commit_data2.py ...@@ -198,7 +198,7 @@ python3 ./test.py -f update/merge_commit_data2.py
python3 ./test.py -f update/merge_commit_data2_update0.py python3 ./test.py -f update/merge_commit_data2_update0.py
python3 ./test.py -f update/merge_commit_last-0.py python3 ./test.py -f update/merge_commit_last-0.py
python3 ./test.py -f update/merge_commit_last.py python3 ./test.py -f update/merge_commit_last.py
python3 ./test.py -f update/bug_td2279.py python3 ./test.py -f update/update_options.py
#======================p2-end=============== #======================p2-end===============
#======================p3-start=============== #======================p3-start===============
......
...@@ -49,7 +49,7 @@ class TDTestCase: ...@@ -49,7 +49,7 @@ class TDTestCase:
code = self._conn.schemaless_insert(payload, 2, None) code = self._conn.schemaless_insert(payload, 2, None)
print("schemaless_insert result {}".format(code)) print("schemaless_insert result {}".format(code))
tdSql.query("describe _stb_0_") tdSql.query("describe `.stb.0.`")
tdSql.checkRows(6) tdSql.checkRows(6)
### metric value ### ### metric value ###
......
...@@ -36,7 +36,7 @@ class TDTestCase: ...@@ -36,7 +36,7 @@ class TDTestCase:
"stb0_0 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_0 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
"stb0_1 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_1 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
"stb0_2 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_2 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
".stb0.3. 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "`.stb0.3.` 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
] ]
code = self._conn.schemaless_insert(lines0, 1, None) code = self._conn.schemaless_insert(lines0, 1, None)
...@@ -54,7 +54,7 @@ class TDTestCase: ...@@ -54,7 +54,7 @@ class TDTestCase:
tdSql.query("describe stb0_2") tdSql.query("describe stb0_2")
tdSql.checkRows(4) tdSql.checkRows(4)
tdSql.query("describe _stb0_3_") tdSql.query("describe `.stb0.3.`")
tdSql.checkRows(4) tdSql.checkRows(4)
### timestamp ### ### timestamp ###
......
...@@ -46,17 +46,17 @@ class TDTestCase: ...@@ -46,17 +46,17 @@ class TDTestCase:
## query where tbname in single ## query where tbname in single
tdSql.query(f'select * from {table_name} where tbname in ("{table_name_sub}1")') tdSql.query(f'select * from {table_name} where tbname in ("{table_name_sub}1")')
tdSql.checkRows(1) tdSql.checkRows(0)
tdSql.query(f'select * from {table_name} where tbname in ("{table_name_sub.upper()}1")') tdSql.query(f'select * from {table_name} where tbname in ("{table_name_sub.upper()}1")')
tdSql.checkRows(1) tdSql.checkRows(0)
tdSql.query(f'select * from {table_name} where tbname in ("{table_name_sub.lower()}1")') tdSql.query(f'select * from {table_name} where tbname in ("{table_name_sub.lower()}1")')
tdSql.checkRows(1) tdSql.checkRows(1)
tdSql.query(f'select * from {table_name} where tbname in ("{tb_name_lower}2")') tdSql.query(f'select * from {table_name} where tbname in ("{tb_name_lower}2")')
tdSql.checkRows(2) tdSql.checkRows(2)
tdSql.query(f'select * from {table_name} where tbname in ("{tb_name_lower.upper()}2")') tdSql.query(f'select * from {table_name} where tbname in ("{tb_name_lower.upper()}2")')
tdSql.checkRows(2) tdSql.checkRows(0)
tdSql.query(f'select * from {table_name} where tbname in ("{tb_name_upper}3")') tdSql.query(f'select * from {table_name} where tbname in ("{tb_name_upper}3")')
tdSql.checkRows(3) tdSql.checkRows(0)
tdSql.query(f'select * from {table_name} where tbname in ("{tb_name_upper.lower()}3")') tdSql.query(f'select * from {table_name} where tbname in ("{tb_name_upper.lower()}3")')
tdSql.checkRows(3) tdSql.checkRows(3)
...@@ -64,7 +64,7 @@ class TDTestCase: ...@@ -64,7 +64,7 @@ class TDTestCase:
tdSql.query(f'select * from {table_name} where id=5 and tbname in ("{table_name_sub}1", "{tb_name_lower.upper()}2", "{tb_name_upper.lower()}3")') tdSql.query(f'select * from {table_name} where id=5 and tbname in ("{table_name_sub}1", "{tb_name_lower.upper()}2", "{tb_name_upper.lower()}3")')
tdSql.checkRows(1) tdSql.checkRows(1)
tdSql.query(f'select * from {table_name} where tbname in ("{table_name_sub}1", "{tb_name_lower.upper()}2", "{tb_name_upper.lower()}3")') tdSql.query(f'select * from {table_name} where tbname in ("{table_name_sub}1", "{tb_name_lower.upper()}2", "{tb_name_upper.lower()}3")')
tdSql.checkRows(6) tdSql.checkRows(3)
def run(self): def run(self):
tdSql.prepare() tdSql.prepare()
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
import sys import sys
import taos import taos
import time
import os
from util.log import tdLog from util.log import tdLog
from util.cases import tdCases from util.cases import tdCases
from util.sql import tdSql from util.sql import tdSql
...@@ -23,7 +25,34 @@ class TDTestCase: ...@@ -23,7 +25,34 @@ class TDTestCase:
tdLog.debug("start to execute %s" % __file__) tdLog.debug("start to execute %s" % __file__)
tdSql.init(conn.cursor(), logSql) tdSql.init(conn.cursor(), logSql)
now = time.time()
self.ts = int(round(now * 1000))
def getBuildPath(self):
selfPath = os.path.dirname(os.path.realpath(__file__))
if ("community" in selfPath):
projPath = selfPath[:selfPath.find("community")]
else:
projPath = selfPath[:selfPath.find("tests")]
for root, dirs, files in os.walk(projPath):
if ("taosd" in files):
rootRealPath = os.path.dirname(os.path.realpath(root))
if ("packaging" not in rootRealPath):
buildPath = root[:len(root)-len("/build/bin")]
break
return buildPath
def run(self): def run(self):
buildPath = self.getBuildPath()
if (buildPath == ""):
tdLog.exit("taosd not found!")
else:
tdLog.info("taosd found in %s" % buildPath)
binPath = buildPath+ "/build/bin/"
os.system("rm -rf table/create1.py.sql")
tdSql.prepare() tdSql.prepare()
print("==============step1") print("==============step1")
...@@ -62,6 +91,267 @@ class TDTestCase: ...@@ -62,6 +91,267 @@ class TDTestCase:
tdSql.execute("create table stb(ts timestamp, c int) tags(t int)") tdSql.execute("create table stb(ts timestamp, c int) tags(t int)")
tdSql.error("insert into db2.tb6 using db2.stb tags(1) values(now 1) tb2 using db2. tags( )values(now 2)") tdSql.error("insert into db2.tb6 using db2.stb tags(1) values(now 1) tb2 using db2. tags( )values(now 2)")
print("==============new version [escape character] for stable==============")
print("==============step1,#create db.stable,db.table; insert db.table; show db.table; select db.table; drop db.table;")
print("prepare data")
self.stb1 = "stable_1~!@#$%^&*()-_+=[]{}':,<.>/?stST13579"
self.tb1 = "table_1~!@#$%^&*()-_+=[]{}':,<.>/?stST13579"
tdSql.execute("create stable db.`%s` (ts timestamp, i int) tags(j int)" %self.stb1)
tdSql.query("describe db.`%s` ; " %self.stb1)
tdSql.checkRows(3)
tdSql.query("select _block_dist() from db.`%s` ; " %self.stb1)
tdSql.checkRows(0)
tdSql.query("show create stable db.`%s` ; " %self.stb1)
tdSql.checkData(0, 0, self.stb1)
tdSql.checkData(0, 1, "create table `%s` (ts TIMESTAMP,i INT) TAGS (j INT)" %self.stb1)
tdSql.execute("create table db.`table!1` using db.`%s` tags(1)" %self.stb1)
tdSql.query("describe db.`table!1` ; ")
tdSql.checkRows(3)
time.sleep(10)
tdSql.query("show create table db.`table!1` ; ")
tdSql.checkData(0, 0, "table!1")
tdSql.checkData(0, 1, "CREATE TABLE `table!1` USING `%s` TAGS (1)" %self.stb1)
tdSql.execute("insert into db.`table!1` values(now, 1)")
tdSql.query("select * from db.`table!1`; ")
tdSql.checkRows(1)
tdSql.query("select count(*) from db.`table!1`; ")
tdSql.checkData(0, 0, 1)
tdSql.query("select _block_dist() from db.`%s` ; " %self.stb1)
tdSql.checkRows(1)
tdSql.execute("create table db.`%s` using db.`%s` tags(1)" %(self.tb1,self.stb1))
tdSql.query("describe db.`%s` ; " %self.tb1)
tdSql.checkRows(3)
tdSql.query("show create table db.`%s` ; " %self.tb1)
tdSql.checkData(0, 0, self.tb1)
tdSql.checkData(0, 1, "CREATE TABLE `%s` USING `%s` TAGS (1)" %(self.tb1,self.stb1))
tdSql.execute("insert into db.`%s` values(now, 1)" %self.tb1)
tdSql.query("select * from db.`%s` ; " %self.tb1)
tdSql.checkRows(1)
tdSql.query("select count(*) from db.`%s`; " %self.tb1)
tdSql.checkData(0, 0, 1)
#time.sleep(10)
tdSql.query("select * from db.`%s` ; " %self.stb1)
tdSql.checkRows(2)
tdSql.query("select count(*) from db.`%s`; " %self.stb1)
tdSql.checkData(0, 0, 2)
tdSql.query("select * from (select * from db.`%s`) ; " %self.stb1)
tdSql.checkRows(2)
tdSql.query("select count(*) from (select * from db.`%s`) ; " %self.stb1)
tdSql.checkData(0, 0, 2)
tdSql.query("show db.stables like 'stable_1%' ")
tdSql.checkRows(1)
tdSql.query("show db.tables like 'table%' ")
tdSql.checkRows(2)
#TD-10531 tbname is not support
# tdSql.execute("select * from db.`%s` where tbname = db.`%s`;" %(self.stb1,self.tb1))
# tdSql.checkRows(1)
# tdSql.execute("select count(*) from db.`%s` where tbname in (db.`%s`,db.`table!1`);" %(self.stb1,self.tb1))
# tdSql.checkRows(4)
print("==============old scene is not change, max length : database.name + table.name <= 192")
self.tb192old = "table192table192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192"
tdSql.execute("create table db.%s using db.st tags(1)" %self.tb192old)
tdSql.query("describe db.%s ; " %self.tb192old)
tdSql.checkRows(3)
tdSql.query("show db.tables like 'table192%' ")
tdSql.checkRows(1)
self.tb193old = "table193table192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192oldtable192o"
tdSql.error("create table db.%s using db.st tags(1)" %self.tb193old)
print("==============new scene `***` is change, max length : `table.name` <= 192 ,not include database.name")
self.tb192new = "table_192~!@#$%^&*()-_+=[]{}':,<.>/?stST0123456789table_192~!@#$%^&*()-_+=[]{}':,<.>/?stST0123456789table_192~!@#$%^&*()-_+=[]{}':,<.>/?stST0123456789table_192~!@#$%^&*()-_+=[]{}':,<.>/?stST12"
tdSql.execute("create table db.`%s` using db.`%s` tags(1)" %(self.tb192new,self.stb1))
tdSql.query("describe db.`%s` ; " %self.tb192new)
tdSql.checkRows(3)
tdSql.query("show db.tables like 'table_192%' ")
tdSql.checkRows(1)
self.tb193new = "table_193~!@#$%^&*()-_+=[]{}':,<.>/?stST0123456789table_192~!@#$%^&*()-_+=[]{}':,<.>/?stST0123456789table_192~!@#$%^&*()-_+=[]{}':,<.>/?stST0123456789table_192~!@#$%^&*()-_+=[]{}':,<.>/?stST123"
tdSql.error("create table db.`%s` using db.`%s` tags(1)" %(self.tb193new,self.stb1))
self.cr_tb1 = "create_table_1~!@#$%^&*()-_+=[]{}':,<.>/?stST13579"
tdSql.execute("create table db.`%s` as select avg(i) from db.`%s` where ts > now interval(1m) sliding(30s);" %(self.cr_tb1,self.stb1))
tdSql.query("show db.tables like 'create_table_%' ")
tdSql.checkRows(1)
print("==============drop table\stable")
try:
tdSql.execute("drop table db.`%s` " %self.tb1)
except Exception as e:
tdLog.exit(e)
tdSql.error("select * from db.`%s`" %self.tb1)
tdSql.query("show db.stables like 'stable_1%' ")
tdSql.checkRows(1)
try:
tdSql.execute("drop table db.`%s` " %self.stb1)
except Exception as e:
tdLog.exit(e)
tdSql.error("select * from db.`%s`" %self.tb1)
tdSql.error("select * from db.`%s`" %self.stb1)
print("==============step2,#create stable,table; insert table; show table; select table; drop table")
self.stb2 = "stable_2~!@#$%^&*()-_+=[]{}';:,<.>/?stST24680~!@#$%^&*()-_+=[]{}"
self.tb2 = "table_2~!@#$%^&*()-_+=[]{}';:,<.>/?stST24680~!@#$%^&*()-_+=[]{}"
tdSql.execute("create stable `%s` (ts timestamp, i int) tags(j int);" %self.stb2)
tdSql.query("describe `%s` ; "%self.stb2)
tdSql.checkRows(3)
tdSql.query("select _block_dist() from `%s` ; " %self.stb2)
tdSql.checkRows(0)
tdSql.query("show create stable `%s` ; " %self.stb2)
tdSql.checkData(0, 0, self.stb2)
tdSql.checkData(0, 1, "create table `%s` (ts TIMESTAMP,i INT) TAGS (j INT)" %self.stb2)
tdSql.execute("create table `table!2` using `%s` tags(1)" %self.stb2)
tdSql.query("describe `table!2` ; ")
tdSql.checkRows(3)
time.sleep(10)
tdSql.query("show create table `table!2` ; ")
tdSql.checkData(0, 0, "table!2")
tdSql.checkData(0, 1, "CREATE TABLE `table!2` USING `%s` TAGS (1)" %self.stb2)
tdSql.execute("insert into `table!2` values(now, 1)")
tdSql.query("select * from `table!2`; ")
tdSql.checkRows(1)
tdSql.query("select count(*) from `table!2`; ")
tdSql.checkData(0, 0, 1)
tdSql.query("select _block_dist() from `%s` ; " %self.stb2)
tdSql.checkRows(1)
tdSql.execute("create table `%s` using `%s` tags(1)" %(self.tb2,self.stb2))
tdSql.query("describe `%s` ; " %self.tb2)
tdSql.checkRows(3)
tdSql.query("show create table `%s` ; " %self.tb2)
tdSql.checkData(0, 0, self.tb2)
tdSql.checkData(0, 1, "CREATE TABLE `%s` USING `%s` TAGS (1)" %(self.tb2,self.stb2))
tdSql.execute("insert into `%s` values(now, 1)" %self.tb2)
tdSql.query("select * from `%s` ; " %self.tb2)
tdSql.checkRows(1)
tdSql.query("select count(*) from `%s`; " %self.tb2)
tdSql.checkData(0, 0, 1)
tdSql.query("select * from `%s` ; " %self.stb2)
tdSql.checkRows(2)
tdSql.query("select count(*) from `%s`; " %self.stb2)
tdSql.checkData(0, 0, 2)
tdSql.query("select * from (select * from `%s`) ; " %self.stb2)
tdSql.checkRows(2)
tdSql.query("select count(*) from (select * from `%s` ); " %self.stb2)
tdSql.checkData(0, 0, 2)
tdSql.query("show stables like 'stable_2%' ")
tdSql.checkRows(1)
tdSql.query("show tables like 'table%' ")
tdSql.checkRows(2)
#TD-10531 tbname is not support
# tdSql.execute("select * from db.`%s` where tbname = db.`%s`;" %(self.stb1,self.tb1))
# tdSql.checkRows(1)
# tdSql.execute("select count(*) from db.`%s` where tbname in (db.`%s`,db.`table!1`);" %(self.stb1,self.tb1))
# tdSql.checkRows(4)
#TD-10536
self.cr_tb2 = "create_table_2~!@#$%^&*()-_+=[]{}';:,<.>/?stST24680~!@#$%^&*()-_+=[]{}"
tdSql.execute("create table `%s` as select * from `%s` ;" %(self.cr_tb2,self.stb2))
tdSql.query("show db.tables like 'create_table_%' ")
tdSql.checkRows(1)
print("==============drop table\stable")
try:
tdSql.execute("drop table `%s` " %self.tb2)
except Exception as e:
tdLog.exit(e)
tdSql.error("select * from `%s`" %self.tb2)
tdSql.query("show stables like 'stable_2%' ")
tdSql.checkRows(1)
try:
tdSql.execute("drop table `%s` " %self.stb2)
except Exception as e:
tdLog.exit(e)
tdSql.error("select * from `%s`" %self.tb2)
tdSql.error("select * from `%s`" %self.stb2)
print("==============step3,#create regular_table; insert regular_table; show regular_table; select regular_table; drop regular_table")
self.regular_table = "regular_table~!@#$%^&*()-_+=[]{}';:,<.>/?stST24680~!@#$%^&*()-_+=[]{}"
#self.regular_table = "regular_table~!@#$%^&*()-_+=[]{}';:,<.>/?stST24680~!@#$%^&*()-_+=[]{}"
tdSql.execute("create table `%s` (ts timestamp,i int) ;" %self.regular_table)
tdSql.query("describe `%s` ; "%self.regular_table)
tdSql.checkRows(2)
tdSql.query("select _block_dist() from `%s` ; " %self.regular_table)
tdSql.checkRows(1)
tdSql.query("show create table `%s` ; " %self.regular_table)
tdSql.checkData(0, 0, self.regular_table)
tdSql.checkData(0, 1, "create table `%s` (ts TIMESTAMP,i INT)" %self.regular_table)
tdSql.execute("insert into `%s` values(now, 1)" %self.regular_table)
tdSql.query("select * from `%s` ; " %self.regular_table)
tdSql.checkRows(1)
tdSql.query("select count(*) from `%s`; " %self.regular_table)
tdSql.checkData(0, 0, 1)
tdSql.query("select _block_dist() from `%s` ; " %self.regular_table)
tdSql.checkRows(1)
tdSql.query("select * from (select * from `%s`) ; " %self.regular_table)
tdSql.checkRows(1)
tdSql.query("select count(*) from (select * from `%s` ); " %self.regular_table)
tdSql.checkData(0, 0, 1)
tdSql.query("show tables like 'regular_table%' ")
tdSql.checkRows(1)
self.crr_tb = "create_r_table~!@#$%^&*()-_+=[]{}';:,<.>/?stST24680~!@#$%^&*()-_+=[]{}"
# tdSql.execute("create table `%s` as select * from `%s` ;" %(self.crr_tb,self.regular_table))
# tdSql.query("show db.tables like 'create_r_table%' ")
# tdSql.checkRows(1)
print("==============drop table\stable")
try:
tdSql.execute("drop table `%s` " %self.regular_table)
except Exception as e:
tdLog.exit(e)
tdSql.error("select * from `%s`" %self.regular_table)
#表名:192个字符,还要包含前面的数据库名
#taosdemo 建数据库表 # 单独放
# self.tsdemo = "tsdemo~!@#$%^&*()-_+=[]{}"
# os.system("%staosdemo -d test -m `%s` -t 10 -n 100 -l 10 -y " % (binPath,self.tsdemo))
# tdSql.execute("use #!#!#!")
# tdSql.query("select count (tbname) from #!#!#!")
# tdSql.checkData(0, 0, 1000)
def stop(self): def stop(self):
tdSql.close() tdSql.close()
tdLog.success("%s successfully executed" % __file__) tdLog.success("%s successfully executed" % __file__)
......
...@@ -34,6 +34,7 @@ class TDTestCase: ...@@ -34,6 +34,7 @@ class TDTestCase:
def run(self): def run(self):
tdSql.prepare() tdSql.prepare()
# test case for TD-2279
print("==============step1") print("==============step1")
tdSql.execute("create table t (ts timestamp, a int)") tdSql.execute("create table t (ts timestamp, a int)")
...@@ -58,6 +59,24 @@ class TDTestCase: ...@@ -58,6 +59,24 @@ class TDTestCase:
tdSql.checkRows(6612) tdSql.checkRows(6612)
tdDnodes.stop(1) tdDnodes.stop(1)
tdDnodes.startWithoutSleep(1)
tdLog.sleep(3)
# test case for https://jira.taosdata.com:18080/browse/TS-402
tdSql.execute("create database test update 1")
tdSql.execute("use test")
tdSql.execute("create table tb (ts timestamp, c1 int, c2 int, c3 int)")
tdSql.execute("insert into tb values(%d, 1, 2, 3)(%d, null, null, 9)" % (self.ts, self.ts))
tdSql.query("select * from tb")
tdSql.checkRows(1)
tdSql.checkData(0, 1, None)
tdSql.checkData(0, 2, None)
tdSql.checkData(0, 3, 9)
def stop(self): def stop(self):
tdSql.close() tdSql.close()
......
...@@ -227,3 +227,4 @@ run general/db/show_create_db.sim ...@@ -227,3 +227,4 @@ run general/db/show_create_db.sim
run general/db/show_create_table.sim run general/db/show_create_table.sim
run general/parser/like.sim run general/parser/like.sim
run general/parser/regex.sim run general/parser/regex.sim
run general/parser/tbname_escape.sim
...@@ -101,9 +101,9 @@ if $data11 != 2 then ...@@ -101,9 +101,9 @@ if $data11 != 2 then
return -1 return -1
endi endi
## tbname in can accpet Upper case table name ## no support tbname in Upper case
sql select count(*) from $stb where tbname in ('ti_tb0', 'TI_tb1', 'TI_TB2') group by t1 order by t1 sql select count(*) from $stb where tbname in ('ti_tb0', 'TI_tb1', 'TI_TB2') group by t1 order by t1
if $rows != 3 then if $rows != 1 then
return -1 return -1
endi endi
if $data00 != 10 then if $data00 != 10 then
...@@ -112,18 +112,6 @@ endi ...@@ -112,18 +112,6 @@ endi
if $data01 != 0 then if $data01 != 0 then
return -1 return -1
endi endi
if $data10 != 10 then
return -1
endi
if $data11 != 1 then
return -1
endi
if $data20 != 10 then
return -1
endi
if $data21 != 2 then
return -1
endi
sql select count(*) from $stb where tbname in ('ti_tb1', 'ti_tb300') and tbname in ('ti_tb5', 'ti_tb1000') group by t1 order by t1 asc sql select count(*) from $stb where tbname in ('ti_tb1', 'ti_tb300') and tbname in ('ti_tb5', 'ti_tb1000') group by t1 order by t1 asc
if $rows != 0 then if $rows != 0 then
......
system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1
system sh/cfg.sh -n dnode1 -c walLevel -v 1
system sh/exec.sh -n dnode1 -s start
sleep 100
sql connect
print ======================== dnode1 start
sql create database dbesc;
sql use dbesc;
sql_error create stable `dbesc`.stba (ts timestamp, f1 int) tags(t1 int);
sql create stable `!.!.!` (ts timestamp, f1 int) tags(t1 int);
sql create stable 'st1' (ts timestamp, f1 int) tags(t1 int) ;
sql create stable `st2` (ts timestamp, f1 int) tags(t1 int) ;
sql create stable dbesc.`st3` (ts timestamp, f1 int) tags(t1 int) ;
sql create table `***` (ts timestamp, f1 int) tags(t1 int);
sql create table `.,@` (ts timestamp, f1 int);
sql_error create table ',?,?,?' using dbesc.`!.!.!` tags(1);
sql_error create table `ab`` using dbesc.`!.!.!` tags(2);
sql create table `,?,?,?` using dbesc.`!.!.!` tags(1);
sql create table `~!@#\$%^&*()_+|\][{}a,./<>?0` using dbesc.`!.!.!` tags(2);
sql_error create table 'tb1' using `dbesc`.`!.!.!` tags(2);
sql create table 'tb2' using `!.!.!` tags(2);
sql create table 'tb3' using 'dbesc'.`!.!.!` tags(3);
sql create table 'tb4' using "dbesc".`!.!.!` tags(3);
sql insert into 'tb5' using 'st1' tags (3) values ('2021-09-22 10:10:11', 1);
sql insert into dbesc.'tb6' using dbesc.'st1' tags (3) values ('2021-09-22 10:10:12', 2);
sql insert into `.....` using `!.!.!` tags (3) values ('2021-09-22 10:10:13', 3);
sql insert into dbesc.`.....,` using dbesc.`!.!.!` tags (4) values ('2021-09-22 10:10:13', 4);
sql insert into "dbesc".`.....,,` using 'dbesc'.`!.!.!` tags (5) values ('2021-09-22 10:10:14', 5);
sql_error insert into `dbesc`.`.....,,,` using 'dbesc'.`!.!.!` tags (6) values ('2021-09-22 10:10:15', 6);
sql_error insert into dbesc.`.....,,,` using `dbesc`.`!.!.!` tags (7) values ('2021-09-22 10:10:16', 7);
sql insert into dbesc.`.....,,,1` using "dbesc".`!.!.!` tags (8) values ('2021-09-22 10:10:17', 8);
sql select * from `.....`;
if $rows != 1 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
sql select `.....`.* from `.....`;
if $rows != 1 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
sql select `.....`.*, `.....,`.* from `.....`,`.....,` where `.....`.ts=`.....,`.ts;
if $rows != 1 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
sql select `.....`.*, `.....,`.* from dbesc.`.....`,dbesc.`.....,` where `.....`.ts=`.....,`.ts;
if $rows != 1 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
sql select a.*, b.* from dbesc.`.....` a,dbesc.`.....,` b where a.ts=b.ts;
if $rows != 1 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
#!!!!
sql select a.*, b.* from dbesc.`.....` 'a',dbesc.`.....,` 'b' where a.ts=b.ts;
if $rows != 1 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
sql select a.*, b.* from `.....` a,`.....,` b where a.ts=b.ts;
if $rows != 1 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
sql insert into dbesc.`.....` values ('2021-09-22 10:10:18', 9);
sql insert into 'dbesc'.`.....` values ('2021-09-22 10:10:19', 10);
sql insert into "dbesc".`.....` values ('2021-09-22 10:10:20', 11);
sql_error select * from `!.!.!` where tbname = `.....`;
sql select * from `!.!.!` where tbname = '.....';
if $rows != 4 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
if $data10 != @21-09-22 10:10:18.000@ then
return -1
endi
if $data20 != @21-09-22 10:10:19.000@ then
return -1
endi
if $data30 != @21-09-22 10:10:20.000@ then
return -1
endi
sql select * from `!.!.!` where tbname = ".....";
if $rows != 4 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
if $data10 != @21-09-22 10:10:18.000@ then
return -1
endi
if $data20 != @21-09-22 10:10:19.000@ then
return -1
endi
if $data30 != @21-09-22 10:10:20.000@ then
return -1
endi
sql select * from `!.!.!` where tbname in (".....");
if $rows != 4 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
if $data10 != @21-09-22 10:10:18.000@ then
return -1
endi
if $data20 != @21-09-22 10:10:19.000@ then
return -1
endi
if $data30 != @21-09-22 10:10:20.000@ then
return -1
endi
sql select * from `!.!.!` where tbname like ".....";
if $rows != 4 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
if $data10 != @21-09-22 10:10:18.000@ then
return -1
endi
if $data20 != @21-09-22 10:10:19.000@ then
return -1
endi
if $data30 != @21-09-22 10:10:20.000@ then
return -1
endi
sql select * from `!.!.!` where tbname like "....%";
if $rows != 7 then
return -1
endi
if $data00 != @21-09-22 10:10:13.000@ then
return -1
endi
if $data10 != @21-09-22 10:10:18.000@ then
return -1
endi
if $data20 != @21-09-22 10:10:19.000@ then
return -1
endi
if $data30 != @21-09-22 10:10:20.000@ then
return -1
endi
if $data40 != @21-09-22 10:10:13.000@ then
return -1
endi
if $data50 != @21-09-22 10:10:14.000@ then
return -1
endi
if $data60 != @21-09-22 10:10:17.000@ then
return -1
endi
sql create table `select * from st1` (ts timestamp, f1 int);
sql create table `'"'"` (ts timestamp, f1 int);
sql create table `''""` using `!.!.!` tags (9);
sql SHOW CREATE TABLE `.....`;
sql SHOW CREATE TABLE dbesc.`.....`;
sql SHOW CREATE TABLE 'dbesc'.`.....`;
sql SHOW CREATE TABLE `!.!.!`;
sql SHOW CREATE TABLE `select * from st1`;
sql SHOW CREATE TABLE `'"'"`;
sql show create table `''""`;
sql_error SHOW CREATE STABLE `.....`;
sql SHOW CREATE STABLE `!.!.!`;
sql SHOW dbesc.TABLES LIKE '***';
if $rows != 0 then
return -1
endi
sql SHOW dbesc.STABLES LIKE '***';
if $rows != 1 then
return -1
endi
sql SHOW dbesc.TABLES LIKE '.....';
if $rows != 1 then
return -1
endi
sql SHOW dbesc.STABLES LIKE '.....';
if $rows != 0 then
return -1
endi
sql_error SHOW dbesc.TABLES LIKE `.....`;
sql_error SHOW dbesc.STABLES LIKE `***`;
sql show tables;
if $rows != 15 then
return -1
endi
sql_error drop table dbesc.'.....,,,1';
sql drop table dbesc.`.....,,,1`;
sql_error drop table dbesc.'.....,,';
sql drop table `.....,,`;
sql drop stable dbesc.'st1';
sql drop stable dbesc.`st2`;
sql drop stable dbesc.st3;
sql describe `.....`;
sql_error desc '.....';
sql_error ALTER TABLE `.....` ADD COLUMN f2 float;
sql ALTER TABLE `!.!.!` ADD COLUMN f2 float;
sql describe `!.!.!`;
if $rows != 4 then
return -1
endi
sql ALTER TABLE `!.!.!` DROP COLUMN f2;
sql_error ALTER TABLE `!.!.!` MODIFY COLUMN f2 int;
sql ALTER TABLE `!.!.!` ADD COLUMN f3 binary(10);
sql ALTER TABLE `!.!.!` MODIFY COLUMN f3 binary(11);
sql ALTER TABLE `!.!.!` ADD TAG t2 int;
sql ALTER TABLE `!.!.!` DROP TAG t2;
sql ALTER TABLE `!.!.!` ADD TAG ta binary(10);
sql ALTER TABLE `!.!.!` CHANGE TAG ta tb;
sql_error ALTER TABLE `!.!.!` SET TAG t1=99;
sql ALTER TABLE `.....` SET TAG t1=99;
sql ALTER TABLE `!.!.!` ADD TAG t3 binary(10);
sql ALTER TABLE `!.!.!` MODIFY TAG t3 binary(11);
sql ALTER STABLE `!.!.!` ADD COLUMN f4 binary(10);
sql ALTER STABLE `!.!.!` DROP COLUMN f4;
sql ALTER STABLE `!.!.!` ADD COLUMN f5 binary(10);
sql ALTER STABLE `!.!.!` MODIFY COLUMN f5 binary(12);
sql ALTER STABLE `!.!.!` ADD TAG t4 double;
sql ALTER STABLE `!.!.!` DROP TAG t4;
sql ALTER STABLE `!.!.!` ADD TAG t5 binary(1);
sql ALTER STABLE `!.!.!` CHANGE TAG t5 t6;
sql_error ALTER STABLE `!.!.!` SET TAG t6=999;
sql ALTER STABLE `!.!.!` MODIFY TAG t6 binary(12);
system sh/exec.sh -n dnode1 -s stop -x SIGINT
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册