PostgreSQL pgbench : 冒号处理

860 阅读3分钟
原文链接: click.aliyun.com

PostgreSQL pgbench : 冒号处理

德哥 2017-12-22 13:37:20 浏览67 评论0 发表于: 阿里云数据库ApsaraDB

数据存储与数据库 PostgreSQL SQL string test timestamp

摘要: 标签 PostgreSQL , pgbench , 变量 , 常量带冒号 -- 背景 pgbench 的自定义测试脚本中,冒号有特殊的含义,可以用于变量名的前面,表示这个位置使用变?刻婊弧? /*---------- * Join arguments with whitespace separators.

标签

PostgreSQL , pgbench , 变量 , 常量带冒号

--

背景

pgbench 的自定义测试脚本中,冒号有特殊的含义,可以用于变量名的前面,表示这个位置使用变?刻婊弧?

        /*----------  
         * Join arguments with whitespace separators. Arguments starting with  
         * exactly one colon are treated as variables:  
         *      name - append a string "name"  
         *      :var - append a variable named 'var'  
         *      ::name - append a string ":name"  
         *----------  
         */  
        for (i = 0; i < argc; i++)  
        {  
                char       *arg;  
                int                     arglen;  
  
                if (argv[i][0] != ':')  
                {  
                        arg = argv[i];          /* a string literal */  
                }  
                else if (argv[i][1] == ':')  
                {  
                        arg = argv[i] + 1;      /* a string literal starting 
with colons */  
                }  
                else if ((arg = getVariable(st, argv[i] + 1)) == NULL)  
                {  
                        fprintf(stderr, "%s: undefined variable \"%s\"\n",  
                                        argv[0], argv[i]);  
                        return false;  
                }  
  
                arglen = strlen(arg);  
                if (len + arglen + (i > 0 ? 1 : 0) >= SHELL_COMMAND_SIZE - 1)  
                {  
                        fprintf(stderr, "%s: shell command is too long\n", 
argv[0]);  
                        return false;  
                }  
  
                if (i > 0)  
                        command[len++] = ' ';  
                memcpy(command + len, arg, arglen);  
                len += arglen;  
        }  

例如,

1、以下ab为变量名,:ab表示这个地方用变量替换。

vi test.sql  
  
\set ab random(1,100000)  
select * from tbl where id=:ab;  

2、如果要输入一个冒号开头的常量,可以输入两个冒号。

::name表示:name常量。  

3、如果在字符中间输入,两个冒号,直接输入两个冒号即可。

4、

如果要在字符串中间使用冒号,怎么写呢?

vi test.sql  
  
select * from tbl where ts > '2017-01-01 10:10:10';  

这样不行,会将:10和:10都翻译成变量10的值。

这样也不行,字符串中两个冒号就是两个冒号,不会变成一个。

vi test.sql  
  
select * from tbl where ts > '2017-01-01 10::10::10';  

冒号作为字符串中的内容

1、使用-D参数,适合所有无法正常解析customer script的场景。

使用pgbench -D参数,输入的变量,不需要过customer script的parser ,所以可以避免问题。

vi test.sql  
  
select now() > :a::timestamp;  
  
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 56 -j 56 -T 120 -D a="1999-1-
1 10:1:1"  

达到的效果是

select now() > '1999-1-1 10:1:1'::timestamp;  

2、使用格式化函数,适合某些场景。

前面那条SQL可以改成

vi test.sql  
  
select now() > to_timestamp('2017-01-01 10::10::10','yyyy-mm-dd hh24::mi::ss')
;  
  
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 56 -j 56 -T 120  

参考

www.postgresql.org/docs/10/sta…

本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.alibaba-inc.com;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

用云栖社区APP,舒服~

【云栖快讯】中办国办印发《推进互联网协议第六版(IPv6)规模部署行动计划》加快推进基于 IPv6 的下一代互联网规模部署,计划指出2025年末中国 IPv6 规模要达到世界第一,阿里云也第一时间宣布了将全面提供IPv6服务,那么在全面部署 IPV6 前,你需要了解都在这儿  详情请点击 评论文章 (0) (0) (0)

相关文章

网友评论