diff --git a/sqlglot/expressions.py b/sqlglot/expressions.py index e18cc376cc..068345e728 100644 --- a/sqlglot/expressions.py +++ b/sqlglot/expressions.py @@ -2386,6 +2386,7 @@ class Insert(DDL, DML): "partition": False, "settings": False, "source": False, + "default": False, } def with_( diff --git a/sqlglot/generator.py b/sqlglot/generator.py index b55ca7e570..60ba6c7f0e 100644 --- a/sqlglot/generator.py +++ b/sqlglot/generator.py @@ -1952,10 +1952,11 @@ def insert_sql(self, expression: exp.Insert) -> str: on_conflict = self.sql(expression, "conflict") on_conflict = f" {on_conflict}" if on_conflict else "" by_name = " BY NAME" if expression.args.get("by_name") else "" + default_values = "DEFAULT VALUES" if expression.args.get("default") else "" returning = self.sql(expression, "returning") if self.RETURNING_END: - expression_sql = f"{expression_sql}{on_conflict}{returning}" + expression_sql = f"{expression_sql}{on_conflict}{default_values}{returning}" else: expression_sql = f"{returning}{expression_sql}{on_conflict}" diff --git a/sqlglot/parser.py b/sqlglot/parser.py index 8aed947167..8b3b180a94 100644 --- a/sqlglot/parser.py +++ b/sqlglot/parser.py @@ -2962,6 +2962,7 @@ def _parse_insert(self) -> t.Union[exp.Insert, exp.MultitableInserts]: where=self._match_pair(TokenType.REPLACE, TokenType.WHERE) and self._parse_assignment(), partition=self._match(TokenType.PARTITION_BY) and self._parse_partitioned_by(), settings=self._match_text_seq("SETTINGS") and self._parse_settings_property(), + default=self._match_text_seq("DEFAULT", "VALUES"), expression=self._parse_derived_table_values() or self._parse_ddl_select(), conflict=self._parse_on_conflict(), returning=returning or self._parse_returning(), diff --git a/tests/dialects/test_duckdb.py b/tests/dialects/test_duckdb.py index 049a07d93f..b0ba70d1b8 100644 --- a/tests/dialects/test_duckdb.py +++ b/tests/dialects/test_duckdb.py @@ -292,6 +292,7 @@ def test_duckdb(self): self.validate_identity( "ARG_MAX(keyword_name, keyword_category, 3 ORDER BY keyword_name DESC)" ) + self.validate_identity("INSERT INTO t DEFAULT VALUES RETURNING (c1)") self.validate_identity("CREATE TABLE notes (watermark TEXT)") self.validate_identity("SELECT LIST_TRANSFORM([5, NULL, 6], LAMBDA x : COALESCE(x, 0) + 1)") self.validate_identity("SELECT LIST_TRANSFORM(nbr, LAMBDA x : x + 1) FROM article AS a")