Skip to content

SQLGraphExplorer‐9

Xin edited this page Dec 26, 2023 · 3 revisions

修修补补

procedure 生成

针对每一个源表,生成一个 procedure,其参数是 tuple

table alias 优化

  • 将表别名的映射关系抽象成 TableAlias 类,并交给 Tools 工具箱管理
  • 之前不支持表别名,会将条件中的表别名识别为不是该表,从而发生错误的消除
  • 目前通过 TableAlias 可以进行正确识别

Simplifier

增加了重复律的简化:B AND/OR B -> B

问题

CASE

CASE 不包含在 Relational Algebra 中(找不到 CASE 对应的 RA 表示),所以该如何 inverse case 呢?

case syntax

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;

example

SELECT
  A.A1 AS C1
  CASE
    WHEN A.A2 = '0101' THEN B.B1
    ELSE B.B2
  END AS C2 /* case_expression */
FROM
  A JOIN B
$$rename_{[C1,C2]}(projection_{[A.A1,case\_expression]}(A×B))$$

原来的 projection 只能选择“一个”列,而 case_expression 的存在会导致多个列(在满足对应条件的情况下)被映射到一个目标 rename 列的情况(多对一)。

那么我尝试进行 inverse 推导(下面的推导结果有误):

$$[(C.C1:c1,C.C2:c2),T] \\\ [(A.A1:c1,B.B1\&B.B2:c2),T] \\\ [(A.A1:c1,B.B1:c2),A.A2 = '0101'],[(A.A1:c1,B.B2:c2),A.A2 \neq '0101'] \\\ [(A.A1:c1),A.A2 = '0101'],[(B.B1:c2),T],[(B.B2:c2),T]$$

在推导过程中,由于 case 的存在引入了以下问题:

  1. case 的出现,导致了 c2 在 rename 的逆运算过后,其对应 schema 是两个(B.B1 & B.B2)
  2. 我在推导过程中,将 case 中的条件放入了 Constraint 中,但是 case 中的条件的“作用域”仅限于 C2,不应影响 C1。这导致结果中不应含有该条件

function

sql 中有许多函数可供调用,假设我们有函数 add(a,b)

example

SELECT
  ADD(A.A1,B.B1) AS C1
FROM
  A JOIN B
$$rename_{[C1]}(projection_{[ADD(A.A1,B.B1)]}(A×B))$$

同样尝试进行 inverse 推导:

$$[(C.C1:c1),T]\\\ [(ADD(A.A1,B.B1):c1),T]\\\ [(A.A1:c1-b?),T],[(B.B1,c1-a?),T]$$

存在问题如下:

  • 想要进行函数求逆,我们需要直到该函数的语义,并求出其精确的逆函数。
  • 我们只有目标表中的结果 tuple(c1),但我们还需要其他表的某一列的所有值,从而推导出 c1 对应的所有可能值。这就类似于论文中的 difference 问题了。

Clone this wiki locally