在 HANA SQL 语句的 PLACEHOLDER 子句中转义单引号
Escaping single quotes in the PLACEHOLDER clause of a HANA SQL statement
我注意到 "HANA SQL" 在 PLACEHOLDER 子句的上下文中转义单引号的方式不一致。例如,考虑以下 PLACEHOLDER 子句片段:
('PLACEHOLDER' = ('$$CC_PARAM$$','''foo'',''an escaped single quote \'' '''))
上面的 PLACEHOLDER 子句包含分配给 CC_PARAM 的多个值。范围。我们可以看到,在第二个参数的 inside 中,我们有一个用反斜杠转义的单引号。然而,我们用另一个单引号将每个参数外的单引号转义(即我们做''
而不是\''
。可以使用\''
格式用于第一种情况,但不可能在第二种情况下使用 ''
格式。
为什么会出现这种差异?它使多输入输入参数中的转义引号变得棘手。我希望以编程方式为 HANA 创建 SQL 查询。我在这里错过了什么吗?在所有情况下都使用 \''
而不是 ''
是否安全?或者我是否需要可以判断单引号出现位置并适当转义的逻辑?
这里的隐含规则 - 由软件的实现方式给出 - 是计算视图的参数值,反斜杠 \
用于转义单引号。
对于所有标准 SQL 字符串出现,使用两次单引号 ''
是区分语法元素和字符串文字的正确方法。
至于原因:
PLACEHOLDER
语法不是 SQL,而是 HANA 特定的命令扩展。因此,当前的实现没有违反通用标准。
鉴于此,此命令扩展已 嵌入 中,分别固定在标准 SQL 语法上,并且必须由相同的解析器处理.
但是参数不仅被 SQL 解析器解析一次,而且还被基于计算视图实例化计算场景的组件再次解析。稍微眯着眼睛不难看出,参数接口是一个通用的键值接口,允许将各种信息交给calc。引擎。
有人可能会争辩说,通过键值对提供参数的整个方法与一般的 SQL 语法方法不一致并且是正确的。另一方面,这种方法允许将新的命令元素添加到 HANA 特定部分的一般灵活性,而无需在结构上更改语法(以及解析器)。
这样做的明显缺点是键名和值都是字符串类型的。为避免丢失 "inner string" 所需的转义,需要使用不同于主 SQL 转义字符串的转义字符串。
这里我们有两种不同的方式来传递字符串值以用作过滤条件。
有趣的是,这两种方法可能仍会导致相同的查询执行计划。
事实上,在很多有入参的场景下,字符串值都会在内部转换成SQL符合的形式。当输入参数用于过滤或用于计算中的表达式时就是这种情况。可以转换为 SQL 表达式的视图。
例如
SELECT
"AAA"
FROM "_SYS_BIC"."sp/ESC"
('PLACEHOLDER' = ('$$IP_TEST$$', 'this is a test\''s test'));
在我的系统上显示以下执行计划
OPERATOR_NAME OPERATOR_DETAILS
PROJECT TEST.AAA
COLUMN TABLE FILTER CONDITION: TEST.AAA = 'this is a test's test'
(DETAIL: ([SCAN] TEST.AAA = 'this is a test's test'))
请注意转义符-\'
是如何被删除的。
总而言之:当使用 PLACEHOLDER
值时,需要使用 \'
转义,而在所有其他情况下,需要使用 ''
转义。
对于查询构建器来说,这应该不是很难实现,因为您可以在处理 PLACEHOLDER
语法时考虑到这一点。
我注意到 "HANA SQL" 在 PLACEHOLDER 子句的上下文中转义单引号的方式不一致。例如,考虑以下 PLACEHOLDER 子句片段:
('PLACEHOLDER' = ('$$CC_PARAM$$','''foo'',''an escaped single quote \'' '''))
上面的 PLACEHOLDER 子句包含分配给 CC_PARAM 的多个值。范围。我们可以看到,在第二个参数的 inside 中,我们有一个用反斜杠转义的单引号。然而,我们用另一个单引号将每个参数外的单引号转义(即我们做''
而不是\''
。可以使用\''
格式用于第一种情况,但不可能在第二种情况下使用 ''
格式。
为什么会出现这种差异?它使多输入输入参数中的转义引号变得棘手。我希望以编程方式为 HANA 创建 SQL 查询。我在这里错过了什么吗?在所有情况下都使用 \''
而不是 ''
是否安全?或者我是否需要可以判断单引号出现位置并适当转义的逻辑?
这里的隐含规则 - 由软件的实现方式给出 - 是计算视图的参数值,反斜杠 \
用于转义单引号。
对于所有标准 SQL 字符串出现,使用两次单引号 ''
是区分语法元素和字符串文字的正确方法。
至于原因:
PLACEHOLDER
语法不是 SQL,而是 HANA 特定的命令扩展。因此,当前的实现没有违反通用标准。鉴于此,此命令扩展已 嵌入 中,分别固定在标准 SQL 语法上,并且必须由相同的解析器处理.
但是参数不仅被 SQL 解析器解析一次,而且还被基于计算视图实例化计算场景的组件再次解析。稍微眯着眼睛不难看出,参数接口是一个通用的键值接口,允许将各种信息交给calc。引擎。
有人可能会争辩说,通过键值对提供参数的整个方法与一般的 SQL 语法方法不一致并且是正确的。另一方面,这种方法允许将新的命令元素添加到 HANA 特定部分的一般灵活性,而无需在结构上更改语法(以及解析器)。 这样做的明显缺点是键名和值都是字符串类型的。为避免丢失 "inner string" 所需的转义,需要使用不同于主 SQL 转义字符串的转义字符串。
这里我们有两种不同的方式来传递字符串值以用作过滤条件。
有趣的是,这两种方法可能仍会导致相同的查询执行计划。
事实上,在很多有入参的场景下,字符串值都会在内部转换成SQL符合的形式。当输入参数用于过滤或用于计算中的表达式时就是这种情况。可以转换为 SQL 表达式的视图。
例如
SELECT
"AAA"
FROM "_SYS_BIC"."sp/ESC"
('PLACEHOLDER' = ('$$IP_TEST$$', 'this is a test\''s test'));
在我的系统上显示以下执行计划
OPERATOR_NAME OPERATOR_DETAILS
PROJECT TEST.AAA
COLUMN TABLE FILTER CONDITION: TEST.AAA = 'this is a test's test'
(DETAIL: ([SCAN] TEST.AAA = 'this is a test's test'))
请注意转义符-\'
是如何被删除的。
总而言之:当使用 PLACEHOLDER
值时,需要使用 \'
转义,而在所有其他情况下,需要使用 ''
转义。
对于查询构建器来说,这应该不是很难实现,因为您可以在处理 PLACEHOLDER
语法时考虑到这一点。