class ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaCreation

:nodoc:

def add_column_options!(sql, options)

def add_column_options!(sql, options)
  if options[:collation]
    sql << " COLLATE \"#{options[:collation]}\""
  end
  if as = options[:as]
    sql << " GENERATED ALWAYS AS (#{as})"
    if options[:stored]
      sql << " STORED"
    else
      raise ArgumentError, <<~MSG
        PostgreSQL currently does not support VIRTUAL (not persisted) generated columns.
        Specify 'stored: true' option for '#{options[:column].name}'
      MSG
    end
  end
  super
end

def table_modifier_in_create(o)

Returns any SQL string to go between CREATE and TABLE. May be nil.
def table_modifier_in_create(o)
  # A table cannot be both TEMPORARY and UNLOGGED, since all TEMPORARY
  # tables are already UNLOGGED.
  if o.temporary
    " TEMPORARY"
  elsif o.unlogged
    " UNLOGGED"
  end
end

def visit_AddForeignKey(o)

def visit_AddForeignKey(o)
  super.dup.tap do |sql|
    if o.deferrable
      sql << " DEFERRABLE"
      sql << " INITIALLY #{o.deferrable.to_s.upcase}" unless o.deferrable == true
    end
    sql << " NOT VALID" unless o.validate?
  end
end

def visit_AlterTable(o)

def visit_AlterTable(o)
  super << o.constraint_validations.map { |fk| visit_ValidateConstraint fk }.join(" ")
end

def visit_ChangeColumnDefinition(o)

def visit_ChangeColumnDefinition(o)
  column = o.column
  column.sql_type = type_to_sql(column.type, **column.options)
  quoted_column_name = quote_column_name(o.name)
  change_column_sql = +"ALTER COLUMN #{quoted_column_name} TYPE #{column.sql_type}"
  options = column_options(column)
  if options[:collation]
    change_column_sql << " COLLATE \"#{options[:collation]}\""
  end
  if options[:using]
    change_column_sql << " USING #{options[:using]}"
  elsif options[:cast_as]
    cast_as_type = type_to_sql(options[:cast_as], **options)
    change_column_sql << " USING CAST(#{quoted_column_name} AS #{cast_as_type})"
  end
  if options.key?(:default)
    if options[:default].nil?
      change_column_sql << ", ALTER COLUMN #{quoted_column_name} DROP DEFAULT"
    else
      quoted_default = quote_default_expression(options[:default], column)
      change_column_sql << ", ALTER COLUMN #{quoted_column_name} SET DEFAULT #{quoted_default}"
    end
  end
  if options.key?(:null)
    change_column_sql << ", ALTER COLUMN #{quoted_column_name} #{options[:null] ? 'DROP' : 'SET'} NOT NULL"
  end
  change_column_sql
end

def visit_CheckConstraintDefinition(o)

def visit_CheckConstraintDefinition(o)
  super.dup.tap { |sql| sql << " NOT VALID" unless o.validate? }
end

def visit_ValidateConstraint(name)

def visit_ValidateConstraint(name)
  "VALIDATE CONSTRAINT #{quote_column_name(name)}"
end