(columnDef *pgquery.ColumnDef, tableName parser.TableName)
| 1164 | } |
| 1165 | |
| 1166 | func (p PostgresParser) parseColumnDef(columnDef *pgquery.ColumnDef, tableName parser.TableName) (*parser.ColumnDefinition, *parser.ForeignKeyDefinition, error) { |
| 1167 | if columnDef.Inhcount != 0 || columnDef.Identity != "" || columnDef.Generated != "" || columnDef.Storage != "" || columnDef.CollClause != nil { |
| 1168 | return nil, nil, fmt.Errorf("unhandled node in parseColumnDef: %#v", columnDef) |
| 1169 | } |
| 1170 | |
| 1171 | columnType, err := p.parseTypeName(columnDef.TypeName) |
| 1172 | if err != nil { |
| 1173 | return nil, nil, err |
| 1174 | } |
| 1175 | |
| 1176 | var foreignKey *parser.ForeignKeyDefinition |
| 1177 | |
| 1178 | for _, columnConstraint := range columnDef.Constraints { |
| 1179 | constraint := columnConstraint.Node.(*pgquery.Node_Constraint).Constraint |
| 1180 | switch constraint.Contype { |
| 1181 | case pgquery.ConstrType_CONSTR_NULL: |
| 1182 | columnType.NotNull = parser.NewBoolVal(false) |
| 1183 | case pgquery.ConstrType_CONSTR_NOTNULL: |
| 1184 | columnType.NotNull = parser.NewBoolVal(true) |
| 1185 | case pgquery.ConstrType_CONSTR_DEFAULT: |
| 1186 | defaultValue, err := p.parseDefaultValue(constraint.RawExpr) |
| 1187 | if err != nil { |
| 1188 | return nil, nil, err |
| 1189 | } |
| 1190 | columnType.Default = defaultValue |
| 1191 | case pgquery.ConstrType_CONSTR_CHECK: |
| 1192 | check, err := p.parseCheckConstraint(constraint) |
| 1193 | if err != nil { |
| 1194 | return nil, nil, err |
| 1195 | } |
| 1196 | columnType.Check = check |
| 1197 | case pgquery.ConstrType_CONSTR_PRIMARY: |
| 1198 | columnType.KeyOpt = parser.ColumnKeyOption(1) |
| 1199 | case pgquery.ConstrType_CONSTR_UNIQUE: |
| 1200 | columnType.KeyOpt = parser.ColumnKeyOption(3) |
| 1201 | case pgquery.ConstrType_CONSTR_FOREIGN: |
| 1202 | foreignKey, err = p.parseForeignKey(constraint) |
| 1203 | if err != nil { |
| 1204 | return nil, nil, err |
| 1205 | } |
| 1206 | foreignKey.IndexColumns = []parser.Ident{parser.NewIdent(columnDef.Colname, false)} |
| 1207 | case pgquery.ConstrType_CONSTR_ATTR_DEFERRABLE: |
| 1208 | foreignKey.ConstraintOptions.Deferrable = true |
| 1209 | case pgquery.ConstrType_CONSTR_ATTR_NOT_DEFERRABLE: |
| 1210 | foreignKey.ConstraintOptions.Deferrable = false |
| 1211 | case pgquery.ConstrType_CONSTR_ATTR_DEFERRED: |
| 1212 | foreignKey.ConstraintOptions.InitiallyDeferred = true |
| 1213 | case pgquery.ConstrType_CONSTR_ATTR_IMMEDIATE: |
| 1214 | foreignKey.ConstraintOptions.InitiallyDeferred = false |
| 1215 | case pgquery.ConstrType_CONSTR_GENERATED: |
| 1216 | expr, err := p.parseExpr(constraint.RawExpr) |
| 1217 | if err != nil { |
| 1218 | return nil, nil, err |
| 1219 | } |
| 1220 | columnType.Generated = &parser.GeneratedColumn{ |
| 1221 | Expr: expr, |
| 1222 | // Postgres only supports stored generated column |
| 1223 | GeneratedType: "STORED", |
no test coverage detected