@@ -936,17 +936,22 @@ func (p *Parser) parseDataTypeReference() (ast.DataTypeReference, error) {
936936 sqlOption , isKnownType := getSqlDataTypeOption (typeName )
937937
938938 // Check for multi-word types: CHAR VARYING -> VarChar, DOUBLE PRECISION -> Float
939- // Also handle BINARY VARYING -> VarBinary
940- if upper := strings .ToUpper (typeName ); upper == "CHAR" || upper == "DOUBLE" || upper == "BINARY" {
939+ // Also handle BINARY VARYING -> VarBinary, CHARACTER VARYING -> VarChar
940+ // And NCHAR VARYING -> NVarChar, NCHARACTER VARYING -> NVarChar
941+ if upper := strings .ToUpper (typeName ); upper == "CHAR" || upper == "CHARACTER" || upper == "DOUBLE" || upper == "BINARY" || upper == "NCHAR" || upper == "NCHARACTER" {
941942 nextUpper := strings .ToUpper (p .curTok .Literal )
942- if upper == "CHAR" && nextUpper == "VARYING" {
943+ if ( upper == "CHAR" || upper == "CHARACTER" ) && nextUpper == "VARYING" {
943944 sqlOption = "VarChar"
944945 isKnownType = true
945946 p .nextToken () // consume VARYING
946947 } else if upper == "BINARY" && nextUpper == "VARYING" {
947948 sqlOption = "VarBinary"
948949 isKnownType = true
949950 p .nextToken () // consume VARYING
951+ } else if (upper == "NCHAR" || upper == "NCHARACTER" ) && nextUpper == "VARYING" {
952+ sqlOption = "NVarChar"
953+ isKnownType = true
954+ p .nextToken () // consume VARYING
950955 } else if upper == "DOUBLE" && nextUpper == "PRECISION" {
951956 baseName .BaseIdentifier .Value = "FLOAT" // Use FLOAT for output
952957 sqlOption = "Float"
@@ -997,16 +1002,20 @@ func (p *Parser) parseDataTypeReference() (ast.DataTypeReference, error) {
9971002 baseOption , baseIsKnown := getSqlDataTypeOption (baseTypeName )
9981003
9991004 // Handle multi-word types with schema prefix: sys.Char varying -> VarChar
1000- if baseUpper := strings .ToUpper (baseTypeName ); baseUpper == "CHAR" || baseUpper == "BINARY" {
1005+ if baseUpper := strings .ToUpper (baseTypeName ); baseUpper == "CHAR" || baseUpper == "CHARACTER" || baseUpper == " BINARY" || baseUpper == "NCHAR" || baseUpper == "NCHARACTER " {
10011006 nextUpper := strings .ToUpper (p .curTok .Literal )
1002- if baseUpper == "CHAR" && nextUpper == "VARYING" {
1007+ if ( baseUpper == "CHAR" || baseUpper == "CHARACTER" ) && nextUpper == "VARYING" {
10031008 baseOption = "VarChar"
10041009 baseIsKnown = true
10051010 p .nextToken () // consume VARYING
10061011 } else if baseUpper == "BINARY" && nextUpper == "VARYING" {
10071012 baseOption = "VarBinary"
10081013 baseIsKnown = true
10091014 p .nextToken () // consume VARYING
1015+ } else if (baseUpper == "NCHAR" || baseUpper == "NCHARACTER" ) && nextUpper == "VARYING" {
1016+ baseOption = "NVarChar"
1017+ baseIsKnown = true
1018+ p .nextToken () // consume VARYING
10101019 }
10111020 }
10121021
@@ -1173,6 +1182,7 @@ func getSqlDataTypeOption(typeName string) (string, bool) {
11731182 "TINYINT" : "TinyInt" ,
11741183 "BIT" : "Bit" ,
11751184 "DECIMAL" : "Decimal" ,
1185+ "DEC" : "Decimal" ,
11761186 "NUMERIC" : "Numeric" ,
11771187 "MONEY" : "Money" ,
11781188 "SMALLMONEY" : "SmallMoney" ,
@@ -1185,9 +1195,11 @@ func getSqlDataTypeOption(typeName string) (string, bool) {
11851195 "DATE" : "Date" ,
11861196 "TIME" : "Time" ,
11871197 "CHAR" : "Char" ,
1198+ "CHARACTER" : "Char" ,
11881199 "VARCHAR" : "VarChar" ,
11891200 "TEXT" : "Text" ,
11901201 "NCHAR" : "NChar" ,
1202+ "NCHARACTER" : "NChar" ,
11911203 "NVARCHAR" : "NVarChar" ,
11921204 "NTEXT" : "NText" ,
11931205 "BINARY" : "Binary" ,
0 commit comments