Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support INSERT INTO [TABLE] FUNCTION of Clickhouse #1633

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

byte-sourcerer
Copy link
Contributor

Support INSERT INTO [TABLE] FUNCTION of Clickhouse.

Copy link
Contributor

@iffyio iffyio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @byte-sourcerer!

@@ -470,8 +470,7 @@ pub struct Insert {
/// INTO - optional keyword
pub into: bool,
/// TABLE
#[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
pub table_name: ObjectName,
pub table_object: TableObject,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
pub table_object: TableObject,
pub table: TableObject,

#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
pub enum TableObject {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we include a doc comment mentionign this is the target of an insert table statement? And then for the variants that it can either be a tablename or function with example SQL? That would make it easy for folks to get an overview of the struct without having to dig into the code or test out manually

@@ -8857,6 +8857,23 @@ impl<'a> Parser<'a> {
}
}

pub fn parse_table_object(
&mut self,
in_table_clause: bool,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the in_table_clause flag needed? I imagine it'll always be false

@@ -8857,6 +8857,23 @@ impl<'a> Parser<'a> {
}
}

pub fn parse_table_object(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we add a doc comment for this given its a public method?

&mut self,
in_table_clause: bool,
) -> Result<TableObject, ParserError> {
if dialect_of!(self is ClickHouseDialect) && self.parse_keyword(Keyword::FUNCTION) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use a dialect method for this? e.g.

if self.dialect.supports_function_table_objects() && self.parse_keyword(keyword::FUNCTION)

Comment on lines +8872 to +8875
pub fn parse_table_function(&mut self) -> Result<Function, ParserError> {
let fn_name = self.parse_object_name(false)?;
self.parse_function_call(fn_name)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm wondering if its worth having this as a standalone method? It looks like it can be inlined given its only 2 LOC?

@@ -222,6 +222,11 @@ fn parse_create_table() {
);
}

#[test]
fn parse_insert_into_function() {
clickhouse().verified_stmt(r#"INSERT INTO TABLE FUNCTION remote('localhost', default.simple_table) VALUES (100, 'inserted via remote()')"#);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we add a similar test case without the TABLE keyword?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants