Skip to content

[Bug] Lineage is empty when logical plan has no child #6706

Open
@vinayakmalik95

Description

@vinayakmalik95

Code of Conduct

Search before asking

  • I have searched in the issues and found no similar issues.

Describe the bug

Lineage is returned as empty since we dont return the parentColumnLineage

but an empty AttributeSet()

case p if p.children.isEmpty => ListMapAttribute, AttributeSet
Screenshot 2024-09-19 at 6 18 23 PM

where as it should be

case p if p.children.isEmpty => parentColumnsLineage
Screenshot 2024-09-19 at 6 17 02 PM

Affects Version(s)

https://github.com/apache/kyuubi/releases/tag/v1.9.2

Kyuubi Server Log Output

No error in server logs, you can test it simply by running test cases like

  test("columns lineage extract - AppendData/OverwriteByExpression") {
    val ddls =
      """
        |create table v2_catalog.db.tb0(col1 int, col2 string) partitioned by(col2)
        |""".stripMargin
    ddls.split("\n").filter(_.nonEmpty).foreach(spark.sql(_).collect())
    withTable("v2_catalog.db.tb0") { _ =>
      val ret0 =
        extractLineage(
          s"insert into table v2_catalog.db.tb0 " +
            s"select key as col1, value as col2 from test_db0.test_table0")
      assert(ret0 == Lineage(
        List(s"$DEFAULT_CATALOG.test_db0.test_table0"),
        List("v2_catalog.db.tb0"),
        List(
          ("v2_catalog.db.tb0.col1", Set(s"$DEFAULT_CATALOG.test_db0.test_table0.key")),
          ("v2_catalog.db.tb0.col2", Set(s"$DEFAULT_CATALOG.test_db0.test_table0.value")))))

      val ret1 =
        extractLineage(
          s"insert overwrite table v2_catalog.db.tb0 partition(col2) " +
            s"select key as col1, value as col2 from test_db0.test_table0")
      assert(ret1 == Lineage(
        List(s"$DEFAULT_CATALOG.test_db0.test_table0"),
        List("v2_catalog.db.tb0"),
        List(
          ("v2_catalog.db.tb0.col1", Set(s"$DEFAULT_CATALOG.test_db0.test_table0.key")),
          ("v2_catalog.db.tb0.col2", Set(s"$DEFAULT_CATALOG.test_db0.test_table0.value")))))

      val ret2 =
        extractLineage(
          s"insert overwrite table v2_catalog.db.tb0 partition(col2 = 'bb') " +
            s"select key as col1 from test_db0.test_table0")
      assert(ret2 == Lineage(
        List(s"$DEFAULT_CATALOG.test_db0.test_table0"),
        List("v2_catalog.db.tb0"),
        List(
          ("v2_catalog.db.tb0.col1", Set(s"$DEFAULT_CATALOG.test_db0.test_table0.key")),
          ("v2_catalog.db.tb0.col2", Set()))))
    }
  }

Kyuubi Engine Log Output

Empty Lineage returned : 

inputTables(List())
outputTables(List())
columnLineage(List())

### Whereas it should return lineage like
Lineage(
        List(s"$DEFAULT_CATALOG.test_db0.test_table0"),
        List("v2_catalog.db.tb0"),
        List(
          ("v2_catalog.db.tb0.col1", Set(s"$DEFAULT_CATALOG.test_db0.test_table0.key")),
          ("v2_catalog.db.tb0.col2", Set(s"$DEFAULT_CATALOG.test_db0.test_table0.value")))))


this test fails 

### Test name :   test("columns lineage extract - AppendData/OverwriteByExpression")

Kyuubi Server Configurations

No response

Kyuubi Engine Configurations

No response

Additional context

By uddating the logic when

case p if p.children.isEmpty

we should return the parentColumnLineage instead of empty ListMapAttribute, AttributeSet

Are you willing to submit PR?

  • Yes. I would be willing to submit a PR with guidance from the Kyuubi community to fix.
  • No. I cannot submit a PR at this time.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions