Class: ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
- Includes:
- ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements, ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting, ActiveRecord::ConnectionAdapters::PostgreSQL::ReferentialIntegrity, ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
- Defined in:
- activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
Overview
The PostgreSQL adapter works with the native C (github.com/ged/ruby-pg) driver.
Options:
-
:host
- Defaults to a Unix-domain socket in /tmp. On machines without Unix-domain sockets, the default is to connect to localhost. -
:port
- Defaults to 5432. -
:username
- Defaults to be the same as the operating system name of the user running the application. -
:password
- Password to be used if the server demands password authentication. -
:database
- Defaults to be the same as the username. -
:schema_search_path
- An optional schema search path for the connection given as a string of comma-separated schema names. This is backward-compatible with the:schema_order
option. -
:encoding
- An optional client encoding that is used in aSET client_encoding TO <encoding>
call on the connection. -
:min_messages
- An optional client min messages that is used in aSET client_min_messages TO <min_messages>
call on the connection. -
:variables
- An optional hash of additional parameters that will be used inSET SESSION key = val
calls on the connection. -
:insert_returning
- An optional boolean to control the use ofRETURNING
forINSERT
statements defaults to true.
Any further options are used as connection parameters to libpq. See www.postgresql.org/docs/current/static/libpq-connect.html for the list of parameters.
In addition, default connection parameters of libpq can be set per environment variables. See www.postgresql.org/docs/current/static/libpq-envars.html .
Defined Under Namespace
Classes: MoneyDecoder, StatementPool
Constant Summary collapse
- ADAPTER_NAME =
"PostgreSQL"
- NATIVE_DATABASE_TYPES =
{ primary_key: "bigserial primary key", string: { name: "character varying" }, text: { name: "text" }, integer: { name: "integer", limit: 4 }, bigint: { name: "bigint" }, float: { name: "float" }, decimal: { name: "decimal" }, datetime: {}, # set dynamically based on datetime_type timestamp: { name: "timestamp" }, timestamptz: { name: "timestamptz" }, time: { name: "time" }, date: { name: "date" }, daterange: { name: "daterange" }, numrange: { name: "numrange" }, tsrange: { name: "tsrange" }, tstzrange: { name: "tstzrange" }, int4range: { name: "int4range" }, int8range: { name: "int8range" }, binary: { name: "bytea" }, boolean: { name: "boolean" }, xml: { name: "xml" }, tsvector: { name: "tsvector" }, hstore: { name: "hstore" }, inet: { name: "inet" }, cidr: { name: "cidr" }, macaddr: { name: "macaddr" }, uuid: { name: "uuid" }, json: { name: "json" }, jsonb: { name: "jsonb" }, ltree: { name: "ltree" }, citext: { name: "citext" }, point: { name: "point" }, line: { name: "line" }, lseg: { name: "lseg" }, box: { name: "box" }, path: { name: "path" }, polygon: { name: "polygon" }, circle: { name: "circle" }, bit: { name: "bit" }, bit_varying: { name: "bit varying" }, money: { name: "money" }, interval: { name: "interval" }, oid: { name: "oid" }, enum: {} # special type https://www.postgresql.org/docs/current/datatype-enum.html }
- OID =
:nodoc:
PostgreSQL::OID
Constants inherited from AbstractAdapter
AbstractAdapter::COMMENT_REGEX, AbstractAdapter::EXTENDED_TYPE_MAPS, AbstractAdapter::SIMPLE_INT, AbstractAdapter::TYPE_MAP
Constants included from ActiveSupport::Callbacks
ActiveSupport::Callbacks::CALLBACK_FILTER_TYPES
Instance Attribute Summary
Attributes inherited from AbstractAdapter
#lock, #logger, #owner, #pool, #visitor
Attributes included from QueryCache
#query_cache, #query_cache_enabled
Attributes included from DatabaseStatements
Class Method Summary collapse
- .database_exists?(config) ⇒ Boolean
-
.initialize_type_map(m) ⇒ Object
:nodoc:.
-
.native_database_types ⇒ Object
:nodoc:.
- .new_client(conn_params) ⇒ Object
Instance Method Summary collapse
-
#active? ⇒ Boolean
Is this connection alive and ready for queries?.
-
#build_insert_sql(insert) ⇒ Object
:nodoc:.
-
#check_version ⇒ Object
:nodoc:.
-
#create_enum(name, values) ⇒ Object
Given a name and an array of values, creates an enum type.
-
#create_unlogged_tables ⇒ Object
:singleton-method: PostgreSQL allows the creation of “unlogged” tables, which do not record data in the PostgreSQL Write-Ahead Log.
-
#datetime_type ⇒ Object
:singleton-method: PostgreSQL supports multiple types for DateTimes.
-
#default_index_type?(index) ⇒ Boolean
:nodoc:.
- #disable_extension(name) ⇒ Object
-
#discard! ⇒ Object
:nodoc:.
-
#disconnect! ⇒ Object
Disconnects from the database if already connected.
- #enable_extension(name) ⇒ Object
-
#enum_types ⇒ Object
Returns a list of defined enum types, and their values.
- #extension_available?(name) ⇒ Boolean
- #extension_enabled?(name) ⇒ Boolean
- #extensions ⇒ Object
-
#get_advisory_lock(lock_id) ⇒ Object
:nodoc:.
-
#get_database_version ⇒ Object
Returns the version of the connected PostgreSQL server.
- #index_algorithms ⇒ Object
-
#initialize(connection, logger, connection_parameters, config) ⇒ PostgreSQLAdapter
constructor
Initializes and connects a PostgreSQL adapter.
-
#max_identifier_length ⇒ Object
Returns the configured supported identifier length supported by PostgreSQL.
-
#native_database_types ⇒ Object
:nodoc:.
-
#reconnect!(restore_transactions: false) ⇒ Object
Close then reopen the connection.
-
#release_advisory_lock(lock_id) ⇒ Object
:nodoc:.
-
#reload_type_map ⇒ Object
:nodoc:.
- #reset! ⇒ Object
-
#session_auth=(user) ⇒ Object
Set the authorized user for this session.
- #set_standard_conforming_strings ⇒ Object
- #supports_advisory_locks? ⇒ Boolean
- #supports_bulk_alter? ⇒ Boolean
- #supports_check_constraints? ⇒ Boolean
- #supports_comments? ⇒ Boolean
- #supports_common_table_expressions? ⇒ Boolean
- #supports_datetime_with_precision? ⇒ Boolean
- #supports_ddl_transactions? ⇒ Boolean
- #supports_deferrable_constraints? ⇒ Boolean
- #supports_explain? ⇒ Boolean
- #supports_expression_index? ⇒ Boolean
- #supports_extensions? ⇒ Boolean
- #supports_foreign_keys? ⇒ Boolean
- #supports_foreign_tables? ⇒ Boolean
- #supports_index_sort_order? ⇒ Boolean
- #supports_insert_on_conflict? ⇒ Boolean (also: #supports_insert_on_duplicate_skip?, #supports_insert_on_duplicate_update?, #supports_insert_conflict_target?)
- #supports_insert_returning? ⇒ Boolean
- #supports_json? ⇒ Boolean
- #supports_lazy_transactions? ⇒ Boolean
- #supports_materialized_views? ⇒ Boolean
- #supports_optimizer_hints? ⇒ Boolean
- #supports_partial_index? ⇒ Boolean
- #supports_partitioned_indexes? ⇒ Boolean
- #supports_pgcrypto_uuid? ⇒ Boolean
- #supports_restart_db_transaction? ⇒ Boolean
- #supports_savepoints? ⇒ Boolean
- #supports_transaction_isolation? ⇒ Boolean
- #supports_validate_constraints? ⇒ Boolean
- #supports_views? ⇒ Boolean
- #supports_virtual_columns? ⇒ Boolean
- #use_insert_returning? ⇒ Boolean
Methods included from ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements
#begin_db_transaction, #begin_isolated_db_transaction, #commit_db_transaction, #exec_delete, #exec_insert, #exec_query, #exec_restart_db_transaction, #exec_rollback_db_transaction, #execute, #explain, #high_precision_current_timestamp, #query, #write_query?
Methods included from ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
#add_column, #add_index, #change_column, #change_column_comment, #change_column_default, #change_column_null, #change_table_comment, #check_constraints, #client_min_messages, #client_min_messages=, #collation, #columns_for_distinct, #create_database, #create_schema, #create_schema_dumper, #ctype, #current_database, #current_schema, #default_sequence_name, #drop_database, #drop_schema, #drop_table, #encoding, #foreign_keys, #foreign_table_exists?, #foreign_tables, #index_name_exists?, #indexes, #pk_and_sequence_for, #primary_keys, #recreate_database, #remove_index, #rename_column, #rename_index, #rename_table, #reset_pk_sequence!, #schema_exists?, #schema_names, #schema_search_path, #schema_search_path=, #serial_sequence, #set_pk_sequence!, #table_comment, #table_options, #type_to_sql, #update_table_definition, #validate_check_constraint, #validate_constraint, #validate_foreign_key
Methods included from ActiveRecord::ConnectionAdapters::PostgreSQL::ReferentialIntegrity
#all_foreign_keys_valid?, #disable_referential_integrity
Methods included from ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting
#column_name_matcher, #column_name_with_order_matcher, #escape_bytea, #lookup_cast_type_from_column, #quote, #quote_column_name, #quote_default_expression, #quote_schema_name, #quote_string, #quote_table_name, #quote_table_name_for_assignment, #quoted_binary, #quoted_date, #type_cast, #unescape_bytea
Methods inherited from AbstractAdapter
#adapter_name, #advisory_locks_enabled?, #all_foreign_keys_valid?, #async_enabled?, build_read_query_regexp, #case_insensitive_comparison, #case_sensitive_comparison, #check_if_write_query, #clear_cache!, #close, #connection_class, #database_version, #default_timezone, #default_uniqueness_comparison, #disable_referential_integrity, #expire, extended_type_map, #field_ordered_value, #lease, #migration_context, #migrations_paths, #prefetch_primary_key?, #prepared_statements?, #prepared_statements_disabled_cache, #preventing_writes?, quoted_column_names, quoted_table_names, #raw_connection, register_class_with_precision, #replica?, #requires_reloading?, #role, #savepoint_errors_invalidate_transactions?, #schema_cache, #schema_cache=, #schema_migration, #schema_version, #seconds_idle, #shard, #steal!, #supports_comments_in_create?, #supports_concurrent_connections?, #supports_indexes_in_create?, #throw_away!, type_cast_config_to_boolean, type_cast_config_to_integer, #unprepared_statement, #use_metadata_table?, #valid_type?, validate_default_timezone, #verify!, #with_instrumenter
Methods included from Savepoints
#create_savepoint, #current_savepoint_name, #exec_rollback_to_savepoint, #release_savepoint
Methods included from QueryCache
#cache, #clear_query_cache, dirties_query_cache, #disable_query_cache!, #enable_query_cache!, included, #select_all, #uncached
Methods included from DatabaseLimits
#index_name_length, #table_alias_length
Methods included from Quoting
#column_name_matcher, #column_name_with_order_matcher, #lookup_cast_type_from_column, #quote, #quote_bound_value, #quote_column_name, #quote_default_expression, #quote_string, #quote_table_name, #quote_table_name_for_assignment, #quoted_binary, #quoted_date, #quoted_false, #quoted_time, #quoted_true, #sanitize_as_sql_comment, #type_cast, #unquoted_false, #unquoted_true
Methods included from DatabaseStatements
#add_transaction_record, #begin_db_transaction, #begin_isolated_db_transaction, #cacheable_query, #commit_db_transaction, #default_sequence_name, #delete, #empty_insert_statement_value, #exec_delete, #exec_insert, #exec_insert_all, #exec_query, #exec_restart_db_transaction, #exec_rollback_db_transaction, #exec_update, #execute, #explain, #high_precision_current_timestamp, #insert, #insert_fixture, #insert_fixtures_set, #mark_transaction_written_if_write, #query, #query_value, #query_values, #reset_sequence!, #reset_transaction, #restart_db_transaction, #rollback_db_transaction, #rollback_to_savepoint, #sanitize_limit, #select_all, #select_one, #select_rows, #select_value, #select_values, #to_sql, #transaction, #transaction_isolation_levels, #transaction_open?, #truncate, #truncate_tables, #update, #with_yaml_fallback, #write_query?
Methods included from SchemaStatements
#add_check_constraint, #add_column, #add_columns, #add_foreign_key, #add_index, #add_index_options, #add_reference, #add_timestamps, #assume_migrated_upto_version, #change_column, #change_column_comment, #change_column_default, #change_column_null, #change_table, #change_table_comment, #check_constraint_options, #check_constraints, #column_exists?, #columns, #columns_for_distinct, #create_join_table, #create_schema_dumper, #create_table, #data_source_exists?, #data_sources, #distinct_relation_for_primary_key, #drop_join_table, #drop_table, #dump_schema_information, #foreign_key_column_for, #foreign_key_exists?, #foreign_key_options, #foreign_keys, #index_algorithm, #index_exists?, #index_name, #index_name_exists?, #indexes, #internal_string_options_for_primary_key, #options_include_default?, #primary_key, #quoted_columns_for_index, #remove_check_constraint, #remove_column, #remove_columns, #remove_foreign_key, #remove_index, #remove_reference, #remove_timestamps, #rename_column, #rename_index, #rename_table, #table_alias_for, #table_comment, #table_exists?, #table_options, #tables, #type_to_sql, #update_table_definition, #view_exists?, #views
Methods included from ActiveSupport::Callbacks
Methods included from ActiveSupport::Concern
#append_features, #class_methods, extended, #included, #prepend_features, #prepended
Constructor Details
#initialize(connection, logger, connection_parameters, config) ⇒ PostgreSQLAdapter
Initializes and connects a PostgreSQL adapter.
285 286 287 288 289 290 291 292 293 294 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 285 def initialize(connection, logger, connection_parameters, config) @connection_parameters = connection_parameters || {} @max_identifier_length = nil @type_map = nil super(connection, logger, config) @use_insert_returning = @config.key?(:insert_returning) ? self.class.type_cast_config_to_boolean(@config[:insert_returning]) : true end |
Class Method Details
.database_exists?(config) ⇒ Boolean
296 297 298 299 300 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 296 def self.database_exists?(config) !!ActiveRecord::Base.postgresql_connection(config) rescue ActiveRecord::NoDatabaseError false end |
.initialize_type_map(m) ⇒ Object
:nodoc:
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 543 def initialize_type_map(m) # :nodoc: m.register_type "int2", Type::Integer.new(limit: 2) m.register_type "int4", Type::Integer.new(limit: 4) m.register_type "int8", Type::Integer.new(limit: 8) m.register_type "oid", OID::Oid.new m.register_type "float4", Type::Float.new m.alias_type "float8", "float4" m.register_type "text", Type::Text.new register_class_with_limit m, "varchar", Type::String m.alias_type "char", "varchar" m.alias_type "name", "varchar" m.alias_type "bpchar", "varchar" m.register_type "bool", Type::Boolean.new register_class_with_limit m, "bit", OID::Bit register_class_with_limit m, "varbit", OID::BitVarying m.register_type "date", OID::Date.new m.register_type "money", OID::Money.new m.register_type "bytea", OID::Bytea.new m.register_type "point", OID::Point.new m.register_type "hstore", OID::Hstore.new m.register_type "json", Type::Json.new m.register_type "jsonb", OID::Jsonb.new m.register_type "cidr", OID::Cidr.new m.register_type "inet", OID::Inet.new m.register_type "uuid", OID::Uuid.new m.register_type "xml", OID::Xml.new m.register_type "tsvector", OID::SpecializedString.new(:tsvector) m.register_type "macaddr", OID::Macaddr.new m.register_type "citext", OID::SpecializedString.new(:citext) m.register_type "ltree", OID::SpecializedString.new(:ltree) m.register_type "line", OID::SpecializedString.new(:line) m.register_type "lseg", OID::SpecializedString.new(:lseg) m.register_type "box", OID::SpecializedString.new(:box) m.register_type "path", OID::SpecializedString.new(:path) m.register_type "polygon", OID::SpecializedString.new(:polygon) m.register_type "circle", OID::SpecializedString.new(:circle) m.register_type "numeric" do |_, fmod, sql_type| precision = extract_precision(sql_type) scale = extract_scale(sql_type) # The type for the numeric depends on the width of the field, # so we'll do something special here. # # When dealing with decimal columns: # # places after decimal = fmod - 4 & 0xffff # places before decimal = (fmod - 4) >> 16 & 0xffff if fmod && (fmod - 4 & 0xffff).zero? # FIXME: Remove this class, and the second argument to # lookups on PG Type::DecimalWithoutScale.new(precision: precision) else OID::Decimal.new(precision: precision, scale: scale) end end m.register_type "interval" do |*args, sql_type| precision = extract_precision(sql_type) OID::Interval.new(precision: precision) end end |
.native_database_types ⇒ Object
:nodoc:
367 368 369 370 371 372 373 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 367 def self.native_database_types # :nodoc: @native_database_types ||= begin types = NATIVE_DATABASE_TYPES.dup types[:datetime] = types[datetime_type] types end end |
.new_client(conn_params) ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 77 def new_client(conn_params) PG.connect(**conn_params) rescue ::PG::Error => error if conn_params && conn_params[:dbname] && error..include?(conn_params[:dbname]) raise ActiveRecord::NoDatabaseError.db_error(conn_params[:dbname]) elsif conn_params && conn_params[:user] && error..include?(conn_params[:user]) raise ActiveRecord::DatabaseConnectionError.username_error(conn_params[:user]) elsif conn_params && conn_params[:hostname] && error..include?(conn_params[:hostname]) raise ActiveRecord::DatabaseConnectionError.hostname_error(conn_params[:hostname]) else raise ActiveRecord::ConnectionNotEstablished, error. end end |
Instance Method Details
#active? ⇒ Boolean
Is this connection alive and ready for queries?
303 304 305 306 307 308 309 310 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 303 def active? @lock.synchronize do @raw_connection.query ";" end true rescue PG::Error false end |
#build_insert_sql(insert) ⇒ Object
:nodoc:
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 517 def build_insert_sql(insert) # :nodoc: sql = +"INSERT #{insert.into} #{insert.values_list}" if insert.skip_duplicates? sql << " ON CONFLICT #{insert.conflict_target} DO NOTHING" elsif insert.update_duplicates? sql << " ON CONFLICT #{insert.conflict_target} DO UPDATE SET " if insert.raw_update_sql? sql << insert.raw_update_sql else sql << insert. { |column| "#{insert.model.quoted_table_name}.#{column} IS NOT DISTINCT FROM excluded.#{column}" } sql << insert.updatable_columns.map { |column| "#{column}=excluded.#{column}" }.join(",") end end sql << " RETURNING #{insert.returning}" if insert.returning sql end |
#check_version ⇒ Object
:nodoc:
536 537 538 539 540 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 536 def check_version # :nodoc: if database_version < 9_03_00 # < 9.3 raise "Your version of PostgreSQL (#{database_version}) is too old. Active Record supports PostgreSQL >= 9.3." end end |
#create_enum(name, values) ⇒ Object
Given a name and an array of values, creates an enum type.
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 475 def create_enum(name, values) sql_values = values.map { |s| "'#{s}'" }.join(", ") query = <<~SQL DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_type t WHERE t.typname = '#{name}' ) THEN CREATE TYPE \"#{name}\" AS ENUM (#{sql_values}); END IF; END $$; SQL exec_query(query) end |
#create_unlogged_tables ⇒ Object
:singleton-method: PostgreSQL allows the creation of “unlogged” tables, which do not record data in the PostgreSQL Write-Ahead Log. This can make the tables faster, but significantly increases the risk of data loss if the database crashes. As a result, this should not be used in production environments. If you would like all created tables to be unlogged in the test environment you can add the following line to your test.rb file:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = true
103 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 103 class_attribute :create_unlogged_tables, default: false |
#datetime_type ⇒ Object
:singleton-method: PostgreSQL supports multiple types for DateTimes. By default, if you use datetime
in migrations, Rails will translate this to a PostgreSQL “timestamp without time zone”. Change this in an initializer to use another NATIVE_DATABASE_TYPES. For example, to store DateTimes as “timestamp with time zone”:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :timestamptz
Or if you are adding a custom type:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:my_custom_type] = { name: "my_custom_type_name" }
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :my_custom_type
If you're using :ruby
as your config.active_record.schema_format
and you change this setting, you should immediately run bin/rails db:migrate
to update the types in your schema.rb.
121 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 121 class_attribute :datetime_type, default: :timestamp |
#default_index_type?(index) ⇒ Boolean
:nodoc:
513 514 515 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 513 def default_index_type?(index) # :nodoc: index.using == :btree || super end |
#disable_extension(name) ⇒ Object
442 443 444 445 446 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 442 def disable_extension(name) exec_query("DROP EXTENSION IF EXISTS \"#{name}\" CASCADE").tap { reload_type_map } end |
#discard! ⇒ Object
:nodoc:
357 358 359 360 361 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 357 def discard! # :nodoc: super @raw_connection.socket_io.reopen(IO::NULL) rescue nil @raw_connection = nil end |
#disconnect! ⇒ Object
Disconnects from the database if already connected. Otherwise, this method does nothing.
350 351 352 353 354 355 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 350 def disconnect! @lock.synchronize do super @raw_connection.close rescue nil end end |
#enable_extension(name) ⇒ Object
436 437 438 439 440 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 436 def enable_extension(name) exec_query("CREATE EXTENSION IF NOT EXISTS \"#{name}\"").tap { reload_type_map } end |
#enum_types ⇒ Object
Returns a list of defined enum types, and their values.
461 462 463 464 465 466 467 468 469 470 471 472 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 461 def enum_types query = <<~SQL SELECT type.typname AS name, string_agg(enum.enumlabel, ',' ORDER BY enum.enumsortorder) AS value FROM pg_enum AS enum JOIN pg_type AS type ON (type.oid = enum.enumtypid) GROUP BY type.typname; SQL exec_query(query, "SCHEMA").cast_values end |
#extension_available?(name) ⇒ Boolean
448 449 450 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 448 def extension_available?(name) query_value("SELECT true FROM pg_available_extensions WHERE name = #{quote(name)}", "SCHEMA") end |
#extension_enabled?(name) ⇒ Boolean
452 453 454 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 452 def extension_enabled?(name) query_value("SELECT installed_version IS NOT NULL FROM pg_available_extensions WHERE name = #{quote(name)}", "SCHEMA") end |
#extensions ⇒ Object
456 457 458 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 456 def extensions exec_query("SELECT extname FROM pg_extension", "SCHEMA").cast_values end |
#get_advisory_lock(lock_id) ⇒ Object
:nodoc:
422 423 424 425 426 427 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 422 def get_advisory_lock(lock_id) # :nodoc: unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63 raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer") end query_value("SELECT pg_try_advisory_lock(#{lock_id})") end |
#get_database_version ⇒ Object
Returns the version of the connected PostgreSQL server.
508 509 510 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 508 def get_database_version # :nodoc: @raw_connection.server_version end |
#index_algorithms ⇒ Object
256 257 258 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 256 def index_algorithms { concurrently: "CONCURRENTLY" } end |
#max_identifier_length ⇒ Object
Returns the configured supported identifier length supported by PostgreSQL
493 494 495 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 493 def max_identifier_length @max_identifier_length ||= query_value("SHOW max_identifier_length", "SCHEMA").to_i end |
#native_database_types ⇒ Object
:nodoc:
363 364 365 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 363 def native_database_types # :nodoc: self.class.native_database_types end |
#reconnect!(restore_transactions: false) ⇒ Object
Close then reopen the connection.
325 326 327 328 329 330 331 332 333 334 335 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 325 def reconnect!(restore_transactions: false) @lock.synchronize do begin @raw_connection.reset rescue PG::ConnectionBad connect end super end end |
#release_advisory_lock(lock_id) ⇒ Object
:nodoc:
429 430 431 432 433 434 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 429 def release_advisory_lock(lock_id) # :nodoc: unless lock_id.is_a?(Integer) && lock_id.bit_length <= 63 raise(ArgumentError, "PostgreSQL requires advisory lock ids to be a signed 64 bit integer") end query_value("SELECT pg_advisory_unlock(#{lock_id})") end |
#reload_type_map ⇒ Object
:nodoc:
312 313 314 315 316 317 318 319 320 321 322 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 312 def reload_type_map # :nodoc: @lock.synchronize do if @type_map type_map.clear else @type_map = Type::HashLookupTypeMap.new end initialize_type_map end end |
#reset! ⇒ Object
337 338 339 340 341 342 343 344 345 346 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 337 def reset! @lock.synchronize do unless @raw_connection.transaction_status == ::PG::PQTRANS_IDLE @raw_connection.query "ROLLBACK" end @raw_connection.query "DISCARD ALL" super end end |
#session_auth=(user) ⇒ Object
Set the authorized user for this session
498 499 500 501 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 498 def session_auth=(user) clear_cache! execute("SET SESSION AUTHORIZATION #{user}") end |
#set_standard_conforming_strings ⇒ Object
375 376 377 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 375 def set_standard_conforming_strings execute("SET standard_conforming_strings = on", "SCHEMA") end |
#supports_advisory_locks? ⇒ Boolean
383 384 385 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 383 def supports_advisory_locks? true end |
#supports_bulk_alter? ⇒ Boolean
177 178 179 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 177 def supports_bulk_alter? true end |
#supports_check_constraints? ⇒ Boolean
205 206 207 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 205 def supports_check_constraints? true end |
#supports_comments? ⇒ Boolean
229 230 231 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 229 def supports_comments? true end |
#supports_common_table_expressions? ⇒ Boolean
414 415 416 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 414 def supports_common_table_expressions? true end |
#supports_datetime_with_precision? ⇒ Boolean
221 222 223 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 221 def supports_datetime_with_precision? true end |
#supports_ddl_transactions? ⇒ Boolean
379 380 381 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 379 def supports_ddl_transactions? true end |
#supports_deferrable_constraints? ⇒ Boolean
213 214 215 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 213 def supports_deferrable_constraints? true end |
#supports_explain? ⇒ Boolean
387 388 389 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 387 def supports_explain? true end |
#supports_expression_index? ⇒ Boolean
193 194 195 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 193 def supports_expression_index? true end |
#supports_extensions? ⇒ Boolean
391 392 393 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 391 def supports_extensions? true end |
#supports_foreign_keys? ⇒ Boolean
201 202 203 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 201 def supports_foreign_keys? true end |
#supports_foreign_tables? ⇒ Boolean
399 400 401 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 399 def supports_foreign_tables? true end |
#supports_index_sort_order? ⇒ Boolean
181 182 183 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 181 def supports_index_sort_order? true end |
#supports_insert_on_conflict? ⇒ Boolean Also known as: supports_insert_on_duplicate_skip?, supports_insert_on_duplicate_update?, supports_insert_conflict_target?
245 246 247 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 245 def supports_insert_on_conflict? database_version >= 9_05_00 # >= 9.5 end |
#supports_insert_returning? ⇒ Boolean
241 242 243 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 241 def supports_insert_returning? true end |
#supports_json? ⇒ Boolean
225 226 227 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 225 def supports_json? true end |
#supports_lazy_transactions? ⇒ Boolean
418 419 420 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 418 def supports_lazy_transactions? true end |
#supports_materialized_views? ⇒ Boolean
395 396 397 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 395 def supports_materialized_views? true end |
#supports_optimizer_hints? ⇒ Boolean
407 408 409 410 411 412 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 407 def supports_optimizer_hints? unless defined?(@has_pg_hint_plan) @has_pg_hint_plan = extension_available?("pg_hint_plan") end @has_pg_hint_plan end |
#supports_partial_index? ⇒ Boolean
189 190 191 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 189 def supports_partial_index? true end |
#supports_partitioned_indexes? ⇒ Boolean
185 186 187 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 185 def supports_partitioned_indexes? database_version >= 11_00_00 # >= 11.0 end |
#supports_pgcrypto_uuid? ⇒ Boolean
403 404 405 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 403 def supports_pgcrypto_uuid? database_version >= 9_04_00 # >= 9.4 end |
#supports_restart_db_transaction? ⇒ Boolean
237 238 239 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 237 def supports_restart_db_transaction? database_version >= 12_00_00 # >= 12.0 end |
#supports_savepoints? ⇒ Boolean
233 234 235 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 233 def supports_savepoints? true end |
#supports_transaction_isolation? ⇒ Boolean
197 198 199 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 197 def supports_transaction_isolation? true end |
#supports_validate_constraints? ⇒ Boolean
209 210 211 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 209 def supports_validate_constraints? true end |
#supports_views? ⇒ Boolean
217 218 219 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 217 def supports_views? true end |
#supports_virtual_columns? ⇒ Boolean
252 253 254 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 252 def supports_virtual_columns? database_version >= 12_00_00 # >= 12.0 end |
#use_insert_returning? ⇒ Boolean
503 504 505 |
# File 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb', line 503 def use_insert_returning? @use_insert_returning end |