Method: ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements#pk_and_sequence_for

Defined in:
activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb

#pk_and_sequence_for(table) ⇒ Object

Returns a table’s primary key and belonging sequence.



315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
# File 'activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb', line 315

def pk_and_sequence_for(table) # :nodoc:
  # First try looking for a sequence with a dependency on the
  # given table's primary key.
  result = query("    SELECT attr.attname, nsp.nspname, seq.relname\n    FROM pg_class      seq,\n         pg_attribute  attr,\n         pg_depend     dep,\n         pg_constraint cons,\n         pg_namespace  nsp\n    WHERE seq.oid           = dep.objid\n      AND seq.relkind       = 'S'\n      AND attr.attrelid     = dep.refobjid\n      AND attr.attnum       = dep.refobjsubid\n      AND attr.attrelid     = cons.conrelid\n      AND attr.attnum       = cons.conkey[1]\n      AND seq.relnamespace  = nsp.oid\n      AND cons.contype      = 'p'\n      AND dep.classid       = 'pg_class'::regclass\n      AND dep.refobjid      = \#{quote(quote_table_name(table))}::regclass\n  SQL\n\n  if result.nil? || result.empty?\n    result = query(<<~SQL, \"SCHEMA\")[0]\n      SELECT attr.attname, nsp.nspname,\n        CASE\n          WHEN pg_get_expr(def.adbin, def.adrelid) !~* 'nextval' THEN NULL\n          WHEN split_part(pg_get_expr(def.adbin, def.adrelid), '''', 2) ~ '.' THEN\n            substr(split_part(pg_get_expr(def.adbin, def.adrelid), '''', 2),\n                   strpos(split_part(pg_get_expr(def.adbin, def.adrelid), '''', 2), '.')+1)\n          ELSE split_part(pg_get_expr(def.adbin, def.adrelid), '''', 2)\n        END\n      FROM pg_class       t\n      JOIN pg_attribute   attr ON (t.oid = attrelid)\n      JOIN pg_attrdef     def  ON (adrelid = attrelid AND adnum = attnum)\n      JOIN pg_constraint  cons ON (conrelid = adrelid AND adnum = conkey[1])\n      JOIN pg_namespace   nsp  ON (t.relnamespace = nsp.oid)\n      WHERE t.oid = \#{quote(quote_table_name(table))}::regclass\n        AND cons.contype = 'p'\n        AND pg_get_expr(def.adbin, def.adrelid) ~* 'nextval|uuid_generate|gen_random_uuid'\n    SQL\n  end\n\n  pk = result.shift\n  if result.last\n    [pk, PostgreSQL::Name.new(*result)]\n  else\n    [pk, nil]\n  end\nrescue\n  nil\nend\n", "SCHEMA")[0]