在 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 语法时考虑到这一点。