(node *pgquery.TypeName)
| 1389 | } |
| 1390 | |
| 1391 | func (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 |
no test coverage detected