欢迎光临
我们一直在努力

将postgresql的数独求解SQL移植到kingbase v9

前文已经移植了一版newkid的SQL。 下面移植程宁先生的。 这次在arm64 linux docker版本上测试,其实和amd64版本没什么区别

sudo docker start kingbase
[sudo] kylin 的密码:
kingbase
sudo docker exec -it kingbase bash

Welcome to 4.4.131-20210120.kylin.desktop-generic

System information as of time: Mon 26 Jan 2026 12:35:26 AM UTC

System load: 1.62
Processes: 7
Memory used: 46.9%
Swap used: 0.0%
Usage On: 84%
Users online: 0

[kingbase@b5f05625f399 ~]$ ksql
ksql: error: could not connect to server: could not connect to server: Connection refused
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.KINGBASE.54321"?

连接失败,查看日志

[kingbase@b5f05625f399 ~]$ exit
exit
kylin@kylin-gtj:~/下载$ sudo docker logs kingbase

The database cluster will be initialized with locale "en_US.UTF-8".
The files belonging to this database system will be owned by user "kingbase".
This user must also own the server process.

The default text search configuration will be set to "english".

The comparision of strings is case-insensitive.
Data page checksums are disabled.

fixing permissions on existing directory /home/kingbase/userdata/data … ok
creating subdirectories … ok
selecting dynamic shared memory implementation … posix
selecting default max_connections … 100
selecting default shared_buffers … 128MB
selecting default time zone … UTC
creating configuration files … ok
Begin setup encrypt device
initializing the encrypt device … ok
running bootstrap script … ok
performing post-bootstrap initialization … ok
create security database … ok
load security database … ok
syncing data to disk … ok

initdb: warning: enabling "trust" authentication for local connections
You can change this by editing sys_hba.conf or using the option -A, or
–auth-local and –auth-host, the next time you run initdb.

Success. You can now start the database server using:

/home/kingbase/install/kingbase/bin/sys_ctl -D /home/kingbase/userdata/data -l logfile start

waiting for server to start…. done
server started

sudo: : effective uid is not 0, is /bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?effective uid is not 0, is /bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?

[Tue 21 Jan 2025 04:08:12 AM UTC]data directory:/home/kingbase/userdata/data is not empty,don't need to initdb
sys_ctl: another server might be running; trying to start server anyway
waiting for server to start…. done
server started

其实不是什么uid问题,就是授权过期了。 更新docker容器中的授权有些麻烦,最简单的方法是重新创建一个新容器,用ps -ef可以看到各个服务都正常运行,ksql可以登录。

sudo docker image list -a |grep king
kingbase_v009r001c002b0014_single_arm v1 1ab4246fe450 15 months ago 784MB
sudo docker run -tid –privileged -p 54321:54321 –name kingbase2 -v /shujv/par:/par 1ab4246fe450 /usr/sbin/init
c6f62fe04c6dacb904b6406b854b26034424352cba0544c6b0f8b6b2a6b02e67

sudo ps -ef|grep king
kylin 20729 20709 0 08:47 pts/0 00:00:00 /bin/bash /home/kingbase/docker-entrypoint.sh /usr/sbin/init
kylin 20912 20729 0 08:47 ? 00:00:00 /home/kingbase/install/kingbase/bin/kingbase -D /home/kingbase/userdata/data
kylin 20913 20912 0 08:47 ? 00:00:00 kingbase: logger
kylin 20915 20912 0 08:47 ? 00:00:00 kingbase: checkpointer
kylin 20916 20912 0 08:47 ? 00:00:00 kingbase: background writer
kylin 20917 20912 0 08:47 ? 00:00:00 kingbase: walwriter
kylin 20918 20912 0 08:47 ? 00:00:00 kingbase: autovacuum launcher
kylin 20919 20912 0 08:47 ? 00:00:00 kingbase: archiver last was 000000010000000000000004
kylin 20920 20912 0 08:47 ? 00:00:00 kingbase: stats collector
kylin 20921 20912 0 08:47 ? 00:00:00 kingbase: kwr collector
kylin 20922 20912 0 08:47 ? 00:00:00 kingbase: ksh writer
kylin 20923 20912 0 08:47 ? 00:00:00 kingbase: ksh collector
kylin 20924 20912 0 08:47 ? 00:00:00 kingbase: logical replication launcher
kylin 23789 11203 0 08:53 pts/0 00:00:00 grep –color=auto king

sudo docker exec -it kingbase2 bash

Welcome to 4.4.131-20210120.kylin.desktop-generic

System information as of time: Mon 26 Jan 2026 12:53:59 AM UTC

System load: 3.42
Processes: 19
Memory used: 50.3%
Swap used: 0.0%
Usage On: 84%
Users online: 0

[kingbase@c6f62fe04c6d ~]$ ksql
ksql: error: could not connect to server: FATAL: role "kingbase" does not exist
[kingbase@c6f62fe04c6d ~]$ ksql -Usystem -dkingbase
Type "help" for help.

kingbase=#

查看授权文件,还有90天

select get_license_info();
get_license_info
——————————————————————
License Type — /home/kingbase/install/kingbase/bin/license.dat+
+
License序列号 — 启用 — 3F9B777C-3457-11EF-AACD-000C29CBE49F +
生产日期 — 启用 — 2024-06-27 +
产品名称 — 启用 — KingbaseES V8 +
细分版本模板名 — 启用 — SALES-企业版 V9R1 +
产品版本号 — 启用 — V009R001C +
浮动基准日期 —— 启用 +
有效期间 — 启用 — 90 +
用户名称 — 启用 — 官方网站试用授权 +
项目名称 — 启用 — 官方网站试用授权 +
CPU检查 — 启用 — 0 +
容器名称 — 禁用 — 0 +
MAC地址 — 启用 — 00:00:00:00:00:00 +
最大连接数 — 启用 — 0 +
分区 — 启用 — 0 +
物理同步 — 启用 — 0 +
读写分离模块 — 启用 — 0 +
恢复到指定时间点 — 启用 — 0 +
集群对网络故障的容错 — 启用 — 0 +
快速加载 — 启用 — 0 +
日志压缩 — 启用 — 0 +
全文检索 — 启用 — 0 +
性能优化包(性能诊断) — 启用 — 0 +
性能优化包(性能调优) — 启用 — 0 +
保密通讯协议 — 启用 — 0 +
审计 — 启用 — 0 +
三权分立 — 启用 — 0 +
透明加密 — 启用 — 0 +
强制访问控制 — 启用 — 0 +
列加密 — 启用 — 0 +
密码复杂度 — 启用 — 0 +
用户锁定 — 启用 — 0 +
集群管理软件 — 启用 — 0 +
集群配置工具 — 启用 — 0 +
集群高级管理包 — 启用 — 0 +
并行查询 — 启用 — 0 +
并行备份还原 — 启用 — 0 +
异构数据源 — 启用 — 0 +
日志解析 — 启用 — 0 +
GIS — 启用 — 0 +
日志解析为SQL — 启用 — 0 +
操作系统类型 — 启用 — 0 +
数据守护集群 — 启用 — 0 +
多活共享存储集群 — 启用 — 0 +

(1 row)

对程宁先生的SQL主要修改了3处,第一处是和前文一样的,加入floor函数和强制转换。 第二处涉及正则表达式函数regexp_split_to_array。 原来的写法在postgresql 17中可正常执行,但在kingbase就返回空值。查看了文档,https://docs.kingbase.com.cn/cn/KES-V9R1C10/application/application-develop-guide/reference/oracle/sql/other/Regular_Expression ,把第二个参数由''改为'\\s*'就可以了。

kingbase=# select regexp_split_to_array(E'8000000000036','');
regexp_split_to_array
———————–

(1 row)

Time: 0.292 ms
kingbase=# select regexp_split_to_array(E'8000000000036','\\s*');
regexp_split_to_array
—————————–
{8,0,0,0,0,0,0,0,0,0,0,3,6}

奇怪的是,postgresql 17文档中这个参数也是'\\s*',但实际上''是可以用的。 第三处涉及array_to_string函数,同样也是空字符串参数问题。数组明明有值,转成字符串就是空的。

kingbase=# \\i /par/1224/0126/0112en2kb.txt
id | pz | result

—-+———————————————————————————–+—————————————————————————————————–
—————————————————————-
3 | 800000000003600000070090200050007000000045700000100030001000068008500010090000400 | {8,1,2,7,5,3,6,4,9,9,4,3,6,8,2,1,7,5,6,7,5,4,9,1,2,8,3,1,5,4,2,3,7,8,9,6,3,6,9,8,4,5,7,2,1,2,8,7,1,6
,9,5,3,4,5,2,1,9,7,4,3,6,8,4,3,8,5,2,6,9,1,7,7,9,6,3,1,8,4,5,2}
(1 row)

Time: 1753.161 ms (00:01.753)

将array_to_string(,'')改为array_to_string(,' '),就能输出值了。这样出来的结果中间插入了空格,如果不想要,可以用replace函数去掉。

kingbase=# \\i /par/1224/0126/0112en2kb.txt
id | pz | result
—-+———————————————————————————–+——————–
3 | 800000000003600000070090200050007000000045700000100030001000068008500010090000400 | 8 1 2 7 5 3 6 4 9 +
| | 9 4 3 6 8 2 1 7 5 +
| | 6 7 5 4 9 1 2 8 3 +
| | 1 5 4 2 3 7 8 9 6 +
| | 3 6 9 8 4 5 7 2 1 +
| | 2 8 7 1 6 9 5 3 4 +
| | 5 2 1 9 7 4 3 6 8 +
| | 4 3 8 5 2 6 9 1 7 +
| | 7 9 6 3 1 8 4 5 2
(1 row)

Time: 1756.606 ms (00:01.757)

再来移植德哥的版本。 除了floor函数的问题,德哥版本选点时用到了计算二进制数中1的个数的bit_count函数,这在kingbase中不存在。查看postgresql文档,这个函数是第14版引入的,而kingbase v9采用的是postgresql 12内核,不知道为什么也没有自己加。 那么就改写成效率低点的length(replace(11::bit(9),'0','')), 这个问题就解决了。 但是还有一个问题,怎么也解决不了。

kingbase=# \\i /par/1224/0126/ltpg0104fcdbkb.txt
ksql:/par/1224/0126/ltpg0104fcdbkb.txt:92: ERROR: there is no parameter $1
LINE 1: WITH RECURSIVE
^

我在金仓社区的微信群提问,热心网友说 “应该是$1这个东西,kes解析完之后,认为这里应该有一个parameter,但是又没有找到参数,譬如这个语句: WITH RECURSIVE t AS ( SELECT * FROM mytable WHERE id = $ 1 )$ 1代表着这里是个占位符,要传入参数,但在执行时没有传入任何参数,所以报错” 可是我的语句中根本没有$这个字符,估计还是postgresql 12内核版本太老的问题。

赞(0)
未经允许不得转载:171主机测评 » 将postgresql的数独求解SQL移植到kingbase v9
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址