From 480c59957e82a9a40a6582f465524d7570fb21f2 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Thu, 12 Nov 2026 17:45:17 +0100 Subject: [PATCH 1/2] DuckDB: Parse UINTEGER as an unsigned integer type --- src/ast/data_type.rs | 5 +++++ src/keywords.rs | 1 + src/parser/mod.rs | 1 + tests/sqlparser_duckdb.rs | 22 ++++++++++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index 164eb8d620..00fab02396 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -290,6 +290,8 @@ pub enum DataType { Int4Unsigned(Option), /// Unsigned integer with optional display width, e.g. INTEGER UNSIGNED or INTEGER(11) UNSIGNED. IntegerUnsigned(Option), + /// Unsigned integer, e.g. UINTEGER. + UInteger, /// 128-bit integer type, e.g. HUGEINT. HugeInt, /// Unsigned 128-bit integer type, e.g. UHUGEINT. @@ -689,6 +691,9 @@ impl fmt::Display for DataType { DataType::USmallInt => { write!(f, "USMALLINT") } + DataType::UInteger => { + write!(f, "UINTEGER") + } DataType::UBigInt => { write!(f, "UBIGINT") } diff --git a/src/keywords.rs b/src/keywords.rs index 2f943d9e6f..225d48d600 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -1146,6 +1146,7 @@ define_keywords!( UINT32, UINT64, UINT8, + UINTEGER, UNBOUNDED, UNCACHE, UNCOMMITTED, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 76bd114071..0bddab93f7 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -13817,6 +13817,7 @@ impl<'a> Parser<'a> { Keyword::HUGEINT => Ok(DataType::HugeInt), Keyword::UBIGINT => Ok(DataType::UBigInt), Keyword::UHUGEINT => Ok(DataType::UHugeInt), + Keyword::UINTEGER => Ok(DataType::UInteger), Keyword::USMALLINT => Ok(DataType::USmallInt), Keyword::UTINYINT => Ok(DataType::UTinyInt), Keyword::UINT8 => Ok(DataType::UInt8), diff --git a/tests/sqlparser_duckdb.rs b/tests/sqlparser_duckdb.rs index 216d514713..a3b47aee6c 100644 --- a/tests/sqlparser_duckdb.rs +++ b/tests/sqlparser_duckdb.rs @@ -374,6 +374,7 @@ fn test_duckdb_specific_int_types() { let duckdb_dtypes = vec![ ("UTINYINT", DataType::UTinyInt), ("USMALLINT", DataType::USmallInt), + ("UINTEGER", DataType::UInteger), ("UBIGINT", DataType::UBigInt), ("UHUGEINT", DataType::UHugeInt), ("HUGEINT", DataType::HugeInt), @@ -976,3 +977,24 @@ fn display_create_macro_propagates_argument_list_errors() { } } } + +#[test] +fn parse_create_table_with_uinteger_column() { + let sql = "CREATE TABLE t (uinteger UINTEGER)"; + match duckdb_and_generic().verified_stmt(sql) { + Statement::CreateTable(CreateTable { columns, .. }) => { + assert_eq!(columns[0].name.value, "uinteger"); + assert_eq!(columns[0].data_type, DataType::UInteger); + } + statement => panic!("unexpected statement: {statement:?}"), + } + + assert_eq!( + duckdb_and_generic() + .parse_sql_statements("CREATE TABLE t (c UINTEGER(10))") + .unwrap_err(), + ParserError::ParserError( + "Expected: ',' or ')' after column definition, found: (".to_string() + ) + ); +} From 0cc9cd59dedae6c27978b5c3dbcadbc26717d6e3 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Thu, 12 Nov 2026 17:55:06 +0100 Subject: [PATCH 2/2] Add DuckDB UINTEGER fuzz seed --- fuzz/fuzz_seeds/duckdb_2948_uinteger.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 fuzz/fuzz_seeds/duckdb_2948_uinteger.sql diff --git a/fuzz/fuzz_seeds/duckdb_2948_uinteger.sql b/fuzz/fuzz_seeds/duckdb_2948_uinteger.sql new file mode 100644 index 0000000000..6e9dd09d72 --- /dev/null +++ b/fuzz/fuzz_seeds/duckdb_2948_uinteger.sql @@ -0,0 +1 @@ +SELECT 1::UINTEGER;