Skip to content

Commit ef00a6a

Browse files
kyleconroyclaude
andcommitted
Add multi-word data type support for CHARACTER VARYING, NCHAR VARYING
Add CHARACTER, DEC, and NCHARACTER to the SQL data type map. Handle multi-word types CHARACTER VARYING, NCHAR VARYING, and NCHARACTER VARYING to map to VarChar and NVarChar respectively. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 5950417 commit ef00a6a

2 files changed

Lines changed: 18 additions & 6 deletions

File tree

parser/parse_statements.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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",
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}

0 commit comments

Comments
 (0)