@@ -1618,56 +1618,82 @@ if Code.ensure_loaded?(Postgrex) do
16181618 defp column_type ( { :array , type } , opts ) ,
16191619 do: [ column_type ( type , opts ) , "[]" ]
16201620
1621- defp column_type ( type , _opts ) when type in ~w( time utc_datetime naive_datetime) a ,
1622- do: [ ecto_to_db ( type ) , "(0)" ]
1621+ defp column_type ( type , opts ) when type in ~w( time utc_datetime naive_datetime) a do
1622+ generated = Keyword . get ( opts , :generated )
1623+ [ ecto_to_db ( type ) , "(0)" , generated_expr ( generated ) ]
1624+ end
16231625
16241626 defp column_type ( type , opts )
16251627 when type in ~w( time_usec utc_datetime_usec naive_datetime_usec) a do
16261628 precision = Keyword . get ( opts , :precision )
1629+ generated = Keyword . get ( opts , :generated )
16271630 type_name = ecto_to_db ( type )
16281631
1629- if precision do
1630- [ type_name , ?( , to_string ( precision ) , ?) ]
1631- else
1632- type_name
1633- end
1632+ type =
1633+ if precision do
1634+ [ type_name , ?( , to_string ( precision ) , ?) ]
1635+ else
1636+ type_name
1637+ end
1638+
1639+ [ type , generated_expr ( generated ) ]
16341640 end
16351641
16361642 defp column_type ( :identity , opts ) do
16371643 start_value = [ Keyword . get ( opts , :start_value ) ]
16381644 increment = [ Keyword . get ( opts , :increment ) ]
1645+ generated = Keyword . get ( opts , :generated )
16391646 type_name = ecto_to_db ( :identity )
16401647
1641- cleanup = fn v -> is_integer ( v ) and v > 0 end
1648+ if generated do
1649+ [ type_name , generated_expr ( generated ) ]
1650+ else
1651+ cleanup = fn v -> is_integer ( v ) and v > 0 end
16421652
1643- sequence =
1644- start_value
1645- |> Enum . filter ( cleanup )
1646- |> Enum . map ( & "START WITH #{ & 1 } " )
1647- |> Kernel . ++ (
1648- increment
1653+ sequence =
1654+ start_value
16491655 |> Enum . filter ( cleanup )
1650- |> Enum . map ( & "INCREMENT BY #{ & 1 } " )
1651- )
1652-
1653- case sequence do
1654- [ ] -> [ type_name , " GENERATED BY DEFAULT AS IDENTITY" ]
1655- _ -> [ type_name , " GENERATED BY DEFAULT AS IDENTITY(" , Enum . join ( sequence , " " ) , ") " ]
1656+ |> Enum . map ( & "START WITH #{ & 1 } " )
1657+ |> Kernel . ++ (
1658+ increment
1659+ |> Enum . filter ( cleanup )
1660+ |> Enum . map ( & "INCREMENT BY #{ & 1 } " )
1661+ )
1662+
1663+ case sequence do
1664+ [ ] -> [ type_name , " GENERATED BY DEFAULT AS IDENTITY" ]
1665+ _ -> [ type_name , " GENERATED BY DEFAULT AS IDENTITY(" , Enum . join ( sequence , " " ) , ") " ]
1666+ end
16561667 end
16571668 end
16581669
16591670 defp column_type ( type , opts ) do
16601671 size = Keyword . get ( opts , :size )
16611672 precision = Keyword . get ( opts , :precision )
16621673 scale = Keyword . get ( opts , :scale )
1674+ generated = Keyword . get ( opts , :generated )
16631675 type_name = ecto_to_db ( type )
16641676
1665- cond do
1666- size -> [ type_name , ?( , to_string ( size ) , ?) ]
1667- precision -> [ type_name , ?( , to_string ( precision ) , ?, , to_string ( scale || 0 ) , ?) ]
1668- type == :string -> [ type_name , "(255)" ]
1669- true -> type_name
1670- end
1677+ type =
1678+ cond do
1679+ size -> [ type_name , ?( , to_string ( size ) , ?) ]
1680+ precision -> [ type_name , ?( , to_string ( precision ) , ?, , to_string ( scale || 0 ) , ?) ]
1681+ type == :string -> [ type_name , "(255)" ]
1682+ true -> type_name
1683+ end
1684+
1685+ [ type , generated_expr ( generated ) ]
1686+ end
1687+
1688+ defp generated_expr ( nil ) , do: [ ]
1689+
1690+ defp generated_expr ( expr ) when is_binary ( expr ) do
1691+ [ " GENERATED " , expr ]
1692+ end
1693+
1694+ defp generated_expr ( other ) do
1695+ raise ArgumentError ,
1696+ "the `:generated` option only accepts strings, received: #{ inspect ( other ) } "
16711697 end
16721698
16731699 defp reference_expr ( % Reference { } = ref , table , name ) do
0 commit comments