英文:
maxscale rewrite filter with awk
问题
以下是翻译好的部分:
以下的重写规则按预期工作:
%%
regex_grammar: Awk
case_sensitive: false
ignore_whitespace: true
%
SELECT msg FROM mytable WHERE id = 123
%
SELECT msg FROM mytable WHERE id = sha1(123)
现在我的问题是,如何在 regex_grammar: Awk 中使用占位符编写此查询。如果我知道这一点,我将在下一个问题上有所突破。我的实际目标是重写以下查询:
Input:
SELECT msg FROM mytable WHERE id IN (123,456,769)
Output:
SELECT msg FROM mytable WHERE id IN (sha1(123),sha1(456),sha1(769))
我假设这只适用于 regex_grammar: Awk 而不适用于 Native。我是对的吗?
这是我找到的唯一文档:https://mariadb.com/kb/en/mariadb-maxscale-2208-rewrite-filter/
我也接受其他建议或工具!Maxscale 对我来说似乎是最有希望的解决方案。
英文:
The following rewrite rule works as expected:
%%
regex_grammar: Awk
case_sensitive: false
ignore_whitespace: true
%
SELECT msg FROM mytable WHERE id = 123
%
SELECT msg FROM mytable WHERE id = sha1(123)
My question now is, how can I write this query with placeholder in regex_grammer: Awk. If I knew that, I would have a breakthrough for the next problem. My actual goal is to rewrite the following query:
Input:
SELECT msg FROM mytable WHERE id IN (123,456,769)
Output:
SELECT msg FROM mytable WHERE id IN (sha1(123),sha1(456),sha1(769))
I assume that this only works with regex_grammar Awk and not with Native. Am I right?
This is the only documentation that I found: https://mariadb.com/kb/en/mariadb-maxscale-2208-rewrite-filter/
I also accept other suggestions or tools! Maxscale looked the most promising solution to me.
答案1
得分: 0
你正在进行的替换类型需要进行重复的替换,而替换的值数量是不固定的。重写过滤器适用于更简单的用例,其中模式是固定的,不需要复杂的匹配。
然而,你仍然可以使用MaxScale中的regexfilter
来完成这个任务,它允许更自由地使用正则表达式。以下是应该处理IN
列表中的简单值并将它们包装在SHA1
函数调用中的regexfilter
配置:
[regex]
type=filter
module=regexfilter
match=/(?i)(IN\s+\(|,)\s*([^,]+)\s*/
replace=$1 SHA1($2)
这是我用来测试的regex101.com页面。
请注意,这不适用于包含嵌入逗号的字符串,这意味着它并不是一个通用的解决方案。
英文:
The type of replacement you're doing requires repeated substitutions with no fixed amount of values. The rewrite filter is intended for simpler use-cases where the patterns are fixed and do not require complex matching.
However, this can still be done with the regexfilter
in MaxScale that allows more free-form use of regular expressions. The following regexfilter configuration should handle simple values in an IN
list and wrap them in a SHA1
function call.
[regex]
type=filter
module=regexfilter
match=/(?i)(IN\s+\(|,)\s*([^,]+)\s*/
replace=$1 SHA1($2)
Here's the regex101.com page I used to test it.
Note that this won't work with strings with embedded commas in them which means it's not really an universal solution.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论