MCPcopy
hub / github.com/sqldef/sqldef / parseTypeName

Method parseTypeName

database/postgres/parser.go:1391–1473  ·  view source on GitHub ↗
(node *pgquery.TypeName)

Source from the content-addressed store, hash-verified

1389}
1390
1391func (p PostgresParser) parseTypeName(node *pgquery.TypeName) (parser.ColumnType, error) {
1392 columnType := parser.ColumnType{}
1393 if node.TypeOid != 0 || node.Setof != false || node.PctType != false || node.Typemod != -1 {
1394 return columnType, fmt.Errorf("unhandled node in parseTypeName: %#v", node)
1395 }
1396
1397 if node.ArrayBounds != nil {
1398 columnType.Array = true
1399 }
1400
1401 var typeNames []string
1402 for _, name := range node.Names {
1403 if n, ok := name.Node.(*pgquery.Node_String_); ok {
1404 typeNames = append(typeNames, n.String_.Sval)
1405 } else {
1406 return columnType, fmt.Errorf("non-Node_String_ name in parseCreateStmt: %#v", name)
1407 }
1408 }
1409
1410 if len(typeNames) == 1 || (len(typeNames) == 2 && typeNames[0] == "pg_catalog") {
1411 typeName := typeNames[len(typeNames)-1]
1412 switch typeName {
1413 case "int2":
1414 columnType.Type = "smallint"
1415 case "int4":
1416 columnType.Type = "integer"
1417 case "int8":
1418 columnType.Type = "bigint"
1419 case "float4":
1420 columnType.Type = "real"
1421 case "float8":
1422 columnType.Type = "double precision"
1423 case "bool":
1424 if len(typeNames) == 1 {
1425 // For test compatibility, keep bool as bool.
1426 // TODO: Delete this exception.
1427 columnType.Type = typeName
1428 } else {
1429 columnType.Type = "boolean"
1430 }
1431 case "bpchar":
1432 columnType.Type = "character"
1433 case "boolean", "varchar", "interval", "numeric", "timestamp", "time": // TODO: use this pattern more, fixing failed tests as well
1434 columnType.Type = typeName
1435 case "timetz":
1436 columnType.Type = "time"
1437 columnType.Timezone = true
1438 case "timestamptz":
1439 columnType.Type = "timestamp"
1440 columnType.Timezone = true
1441 case "json":
1442 columnType.Type = "json"
1443 default:
1444 if len(typeNames) == 2 {
1445 return columnType, fmt.Errorf("unhandled type in parseTypeName: %s", typeName)
1446 } else {
1447 // TODO: Whitelist types explicitly. We're missing 'json' and 'text' at least.
1448 columnType.Type = typeName

Callers 2

parseExprMethod · 0.95
parseColumnDefMethod · 0.95

Calls 3

parseTypmodsMethod · 0.95
NewIdentFunction · 0.92
ErrorfMethod · 0.65

Tested by

no test coverage detected