• Etsuro Fujita's avatar
    postgres_fdw: Fix issues with generated columns in foreign tables. · 588d3f59
    Etsuro Fujita authored
    postgres_fdw imported generated columns from the remote tables as plain
    columns, and caused failures like "ERROR: cannot insert a non-DEFAULT
    value into column "foo"" when inserting into the foreign tables, as it
    tried to insert values into the generated columns.  To fix, we do the
    following under the assumption that generated columns in a postgres_fdw
    foreign table are defined so that they represent generated columns in
    the underlying remote table:
    
    * Send DEFAULT for the generated columns to the foreign server on insert
      or update, not generated column values computed on the local server.
    * Add to postgresImportForeignSchema() an option "import_generated" to
      include column generated expressions in the definitions of foreign
      tables imported from a foreign server.  The option is true by default.
    
    The assumption seems reasonable, because that would make a query of the
    postgres_fdw foreign table return values for the generated columns that
    are consistent with the generated expression.
    
    While here, fix another issue in postgresImportForeignSchema(): it tried
    to include column generated expressions as column default expressions in
    the foreign table definitions when the import_default option was enabled.
    
    Per bug #16631 from Daniel Cherniy.  Back-patch to v12 where generated
    columns were added.
    
    Discussion: https://postgr.es/m/16631-e929fe9db0ffc7cf%40postgresql.org
    588d3f59
deparse.c 96.9 KB