| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 【openGauss】用plpgsql实现sha256算法(踩坑填坑实录) -> 正文阅读 |
|
[大数据]【openGauss】用plpgsql实现sha256算法(踩坑填坑实录) |
前言在开发中,经常会使用类似MD5/ SHA-1/ SHA-2这样的hash算法来对数据进行处理,以防原始信息泄露,比如密码的存储。
但是,如果是基于postgresql的openGauss(2.1.0),事情就没这么简单了,需要搭建编译环境、下载源码、编译等一系列操作。 开始进行适配二话不说,先直接往openGauss里干,注意数据库要为A兼容模式。(参考https://www.modb.pro/db/239429) 结果当然是报错了。 首先,这个包使用了utl_raw这个包,这在openGauss里是不会自带的,不过我在compat-tools里增加了这个包,因此需要先安装compat-tools,或者单独安装utl_raw这个包 1. type table 不支持
这是定义一列number类型的表作为类型,既然报错,那么去掉ta_number的定义,把下面的引用了ta_number的全部改成number[] 2. PL/pgSQL functions cannot accept type record
去掉包内的tr_ctx定义,创建个单独的type(注意重名冲突问题)
3. 不支持参数的 NOCOPY属性
直接把nocopy全部替换成空。
而且不说是哪一行(在oracle中会提示错误的具体位置),只能逐段注释编译,最终发现了一个其实没有语法问题的位置 4. syntax error at end of input
这一段单独放在其他过程里面是不会有问题的,但是在这里报错了,原因不明,疑似bug。起初我以为是add关键词的原因,但改了后报相同的错。直接改成select into就好了
然后包体也编译过去了。不过事情还没完,尝试调用这个包计算sha256,报错 5. ERROR: schema “ctx” does not exist经翻阅相关文档,发现复合类型此处会存在一个歧义,文档中说是要用(ctx).col这种方式来避免歧义,但实测此方法此处不适用,因为这么改了后会提示 "("附近的语法有错误。然后我尝试把所有取数组指定位置元素的()改成了[],比如
改成
注意,要改动的地方多达五十多处,一个都不能漏 6. ERROR: invalid number format model
这里是因为openGauss的to_number不支持 ‘0x’这个格式,其实这个和’xx’是一样的,因此把所有的’0x’直接替换成’xx’ . 7. ERROR: function “sha256_finish_ctx” with 1 parameters doesn’t exist
这个目测和pg内核有关,这明明是个PROCEDURE,报错提示却是个function;而且调用这个过程时明明是传的两个参数,提示却说不存在1个参数的它,当我把resbuf这个参数也改成 in out,这个错就不报了,但又报了个新的错误 8. ERROR: array value must start with “{” or dimension information我跟踪到,还是此处的问题
res这个参数,在此过程内部,最后得到了准确的值,但是一跳出这个过程,这个参数就变成了空。 测试至此,这个包终于可以调用成功了,检查输出结果
但是,我发现个很严重的问题,上述的这个sql,我在oracle中查询只需要0.277秒,但是在openGauss中查询则需要3秒。 总结虽然计算耗时比较严重,但是对一些速度要求不高的非频繁计算请求,有了总比没有好。上面列了8个点的问题,这也没有对这个包整体的逻辑进行大幅调整,即可"正常"使用,这也说明了openGauss对oracle语法强大的兼容性。 最后附上我修改完的代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:39:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |