Skip to content

Enhance insert() API to support SELECT with input() for computed columns v2 #2726

@suman-tercept

Description

@suman-tercept

Current Limitation

The insert() method only supports direct table insertion, not SELECT statements
with transformations.

Desired Enhancement

Allow insert() to accept SELECT statements with input() function:

client.insert()
    .table("target_table")
    .query("SELECT col1, col2, col1 + col2 as computed FROM input('col1 Int32, col2 Int32')")
    .data(inputStream)
    .format(ClickHouseFormat.CSV)
    .send();

Or alternative syntax:

client.insert("INSERT INTO target_table SELECT col1, col2, col1 + col2 as computed FROM input('col1 Int32, col2 Int32')")
    .data(inputStream)
    .format(ClickHouseFormat.CSV)
    .send();

Use Case

We need to stream data with computed columns during insertion:

  • Stream large datasets efficiently
  • Apply transformations/computed columns on the fly
  • Leverage ClickHouse's input() function capabilities
  • Maintain the performance benefits of the streaming insert() API

Business Value

This is a common pattern in ClickHouse for ETL workloads where data needs
transformation during insertion without materializing intermediate results.

Current Workaround (Working but Undocumented)

We're successfully using this pattern in production:

String loadQuery = tableName + "(" + headers + ")" +
    " select " + parametersQuery + "* from input('" + csvHeadersStructure + "')";

try (InputStream inputStream = Files.newInputStream(Paths.get(filepath))) {
    InsertResponse response = client.insert(loadQuery, inputStream, ClickHouseFormat.CSVWithNames)
        .get(1200, TimeUnit.SECONDS);
}

This works but:

  • Not documented in official API docs
  • Unclear if this is intended behavior or might break in future versions
  • No IDE autocomplete/type safety for this pattern

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions