diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index dc434a8f0..da9ff1ad1 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -55,8 +55,12 @@ pub enum DataType { UnsignedSmallInt(Option), /// Integer with optional display width e.g. INT or INT(11) Int(Option), + /// Integer with optional display width e.g. INTEGER or INTEGER(11) + Integer(Option), /// Unsigned integer with optional display width e.g. INT UNSIGNED or INT(11) UNSIGNED UnsignedInt(Option), + /// Unsigned integer with optional display width e.g. INTGER UNSIGNED or INTEGER(11) UNSIGNED + UnsignedInteger(Option), /// Big integer with optional display width e.g. BIGINT or BIGINT(20) BigInt(Option), /// Unsigned big integer with optional display width e.g. BIGINT UNSIGNED or BIGINT(20) UNSIGNED @@ -134,6 +138,12 @@ impl fmt::Display for DataType { DataType::UnsignedInt(zerofill) => { format_type_with_optional_length(f, "INT", zerofill, true) } + DataType::Integer(zerofill) => { + format_type_with_optional_length(f, "INTEGER", zerofill, false) + } + DataType::UnsignedInteger(zerofill) => { + format_type_with_optional_length(f, "INTEGER", zerofill, true) + } DataType::BigInt(zerofill) => { format_type_with_optional_length(f, "BIGINT", zerofill, false) } diff --git a/src/parser.rs b/src/parser.rs index 626540dbc..7b53652b9 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2885,7 +2885,7 @@ impl<'a> Parser<'a> { Ok(DataType::SmallInt(optional_precision?)) } } - Keyword::INT | Keyword::INTEGER => { + Keyword::INT => { let optional_precision = self.parse_optional_precision(); if self.parse_keyword(Keyword::UNSIGNED) { Ok(DataType::UnsignedInt(optional_precision?)) @@ -2893,6 +2893,14 @@ impl<'a> Parser<'a> { Ok(DataType::Int(optional_precision?)) } } + Keyword::INTEGER => { + let optional_precision = self.parse_optional_precision(); + if self.parse_keyword(Keyword::UNSIGNED) { + Ok(DataType::UnsignedInteger(optional_precision?)) + } else { + Ok(DataType::Integer(optional_precision?)) + } + } Keyword::BIGINT => { let optional_precision = self.parse_optional_precision(); if self.parse_keyword(Keyword::UNSIGNED) { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index c9359444b..8bb2dd56a 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -35,7 +35,7 @@ fn parse_create_table_with_defaults() { activebool boolean DEFAULT true NOT NULL, create_date date DEFAULT now()::text NOT NULL, last_update timestamp without time zone DEFAULT now() NOT NULL, - active integer NOT NULL + active int NOT NULL ) WITH (fillfactor = 20, user_catalog_table = true, autovacuum_vacuum_threshold = 100)"; match pg_and_generic().one_statement_parses_to(sql, "") { Statement::CreateTable { @@ -55,7 +55,7 @@ fn parse_create_table_with_defaults() { vec![ ColumnDef { name: "customer_id".into(), - data_type: DataType::Int(None), + data_type: DataType::Integer(None), collation: None, options: vec![ColumnOptionDef { name: None, @@ -201,10 +201,10 @@ fn parse_create_table_from_pg_dump() { create_date1 date DEFAULT 'now'::TEXT::date NOT NULL, last_update timestamp without time zone DEFAULT now(), release_year public.year, - active integer + active int )"; pg().one_statement_parses_to(sql, "CREATE TABLE public.customer (\ - customer_id INT DEFAULT nextval(CAST('public.customer_customer_id_seq' AS REGCLASS)) NOT NULL, \ + customer_id INTEGER DEFAULT nextval(CAST('public.customer_customer_id_seq' AS REGCLASS)) NOT NULL, \ store_id SMALLINT NOT NULL, \ first_name CHARACTER VARYING(45) NOT NULL, \ last_name CHARACTER VARYING(45) NOT NULL, \